薛之猫大王
17 hours ago da45ccae4c4b03fa50308b442a04ccfd3de160e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns;
using System;
using LitJson;
using PureMVC.Patterns.Facade;
using Skyunion;
using PureMVC.Patterns.Mediator;
using PureMVC.Interfaces;
using Sproto;
using SprotoType;
using PureMVC.Patterns.Observer;
//命令总入口文件,所有的命令都需要在这里注册
namespace Game
{
    public class AppFacade : Facade//外观模式,给外部提供一个统一的接口
    {
        public const string STARTUP = "AppFacade.StartUp";//启动命令
 
        private Dictionary<ViewBinder, IMediator> m_viewMap = new Dictionary<ViewBinder, IMediator>();//视图映射
        private Dictionary<string, IMediator> m_MediatorMap = new Dictionary<string, IMediator>();//中介者映射
        private Dictionary<string, Mediator> m_globalMap = new Dictionary<string, Mediator>();//全局中介者映射
 
        public static AppFacade GetInstance()//获取实例
        {
            return GetInstance(() => new AppFacade()) as AppFacade;
        }
 
        public static void Destroy()
        {
            instance = null;
            PureMVC.Core.View.Destroy();
            PureMVC.Core.Model.Destroy();
            PureMVC.Core.Controller.Destroy();
        }
        /// <summary>
        /// 命令模式:将请求封装为对象,支持参数化,队列化,日志化,撤销
        /// 工作原理:
        /// 注册:将通知名称与命令类绑定
        ///   RegisterCommand("LoginAccount", () => new LoginCommand());
        /// 触发:发送通知时自动创建并执行命令
        ///   AppFacade.GetInstance().SendNotification("LoginAccount", loginData);
        /// 执行:命令类实现 Execute 方法处理业务逻辑
        /// 优势:
        /// 解耦:发送者不需要知道具体执行者
        /// 可扩展:新增命令只需注册,无需修改现有代码
        /// 可撤销:可记录命令历史,支持撤销/重做
        /// 可组合:可组合多个命令形成宏命令
        /// </summary>
        protected override void InitializeController()//初始化控制器
        {
            base.InitializeController();
            #region "薛之猫专用"
            RegisterCommand(STARTUP, ()=>new StartUpCommand());
            RegisterCommand(CmdConstant.ReloadGame, () => new ReloadGameCMD());
            RegisterCommand(CmdConstant.ExitGame, () => new ExitGameCMD());
 
 
            RegisterCommand(CmdConstant.AgreementCheck, () => new AgreementCMD());
            RegisterCommand(CmdConstant.LoadAppConfig, () => new LoadAppConfigCMD());
            RegisterCommand(CmdConstant.AutoLogin, () => new LoginCommand());
            RegisterCommand(CmdConstant.LoginAccount, () => new LoginCommand());
            RegisterCommand(CmdConstant.SwitchAccount, () => new LoginCommand());
            RegisterCommand(CmdConstant.BindindAccount, () => new LoginCommand());
            RegisterCommand(CmdConstant.LoadAccountProfile, () => new LoginCommand());
            RegisterCommand(CmdConstant.AccountBan, () => new LoginCommand());
            RegisterCommand(CmdConstant.SwitchAccountFinished, () => new LoginCommand());
            
            RegisterCommand(CmdConstant.OpenAppRating, () => new AppRatingCMD());
 
            RegisterCommand(CmdConstant.MaintainCheck, () => new MaintainCMD());
            RegisterCommand(CmdConstant.MaintainCheckSingleServer, () => new MaintainCMD());
            RegisterCommand(CmdConstant.PackageUpdateCheck, () => new MaintainCMD());
            RegisterCommand(CmdConstant.HotfixUpteCheck, () => new MaintainCMD());
            RegisterCommand(CmdConstant.HotfixDownCompleted, () => new MaintainCMD());
 
            RegisterCommand(CmdConstant.MoveCameraCmd, () => new CameraCmd());
            
            #endregion
 
 
            CoreUtils.uiManager.AddShowUIListener(OnShowUI);
            CoreUtils.uiManager.AddCloseUIListener(OnCloseUI);
 
            // 在这里注册所有的 Command
            //RegisterCommand(CmdConstant.NetWorkError, new NetCommand());
 
            RegisterCommand(CmdConstant.SwitchMainCityCmd, () => new SwitchMainCityCmd());
            RegisterCommand(CmdConstant.ResetSceneCmd, () => new ResetSceneCmd());
            RegisterCommand(Item_ItemInfo.TagName, () => new PlayerCmd());
            RegisterCommand(Build_BuildingInfo.TagName, () => new PlayerCmd());
            RegisterCommand(Item_ItemUse.TagName, () => new PlayerCmd());
            RegisterCommand(CmdConstant.SystemDayTimeChange, () => new PlayerCmd());
            RegisterCommand(Map_ObjectInfo.TagName, () => new MapObjCmd());
            RegisterCommand(Map_ObjectDelete.TagName, () => new MapObjCmd());
            RegisterCommand(Build_GetBuildResources.TagName,()=>new CurrencyCMD());
            //RegisterCommand(CmdConstant.GuideForceShowResCollect, ()=>new CurrencyCMD());
            RegisterCommand(Role_Heart.TagName, () => new ServerTimeCommand());
            RegisterCommand(Hero_HeroInfo.TagName, () => new HeroCmd());
            RegisterCommand(CmdConstant.GetNewHero, () => new HeroCmd());
            
            //邮件
            RegisterCommand(Email_GetEmails.TagName, () => new EmailCMD());
            RegisterCommand(Email_EmailList.TagName, () => new EmailCMD());
            RegisterCommand(Email_TakeEnclosure.TagName, () => new EmailCMD());
            RegisterCommand(Email_CollectEmail.TagName, () => new EmailCMD());
            RegisterCommand(Email_DeleteEmail.TagName, () => new EmailCMD());
            RegisterCommand(CmdConstant.SystemHourChange, () => new EmailCMD());
 
            //加速
            RegisterCommand(CmdConstant.SpeedUp,()=>new SpeedUpCMD());
            //奖励展示
            
            RegisterCommand(CmdConstant.RewardGet, () => new RewardGetCMD());
            //章节
            RegisterCommand(CmdConstant.ChapterTimelineShow, ()=>new TaskCMD());
            RegisterCommand(CmdConstant.ChapterIdChange,()=>new TaskCMD());
            RegisterCommand(CmdConstant.OnChapterDiaglogEnd, ()=>new TaskCMD());
             RegisterCommand(CmdConstant.TaskRewardEnd, ()=>new TaskCMD());
            //工人小屋
            RegisterCommand (CmdConstant.buildQueueChange, () => new WorkerCMD());
   
            //开场剧情对话
            RegisterCommand(CmdConstant.ShowNPCDiaglog,()=>new NPCDialogCMD());
            //章节对白
            RegisterCommand(CmdConstant.ShowChapterDiaglog,()=>new NPCDialogCMD());
 
            //科技研究完成
            RegisterCommand(Technology_ResearchTechnology.TagName,()=>new ResearchCMD());
 
            //特效层遮罩
            RegisterCommand(CmdConstant.ShowMask,()=>new StoryCMD());
            RegisterCommand(CmdConstant.HideMask, () => new StoryCMD());
            RegisterCommand(CmdConstant.OnMysteryStoreRefresh, () => new StoryCMD());
            RegisterCommand(Role_MysteryStore.TagName, () => new StoryCMD());
 
            //斥候
            RegisterCommand(Map_Scouts.TagName, () => new ScoutCMD());
            RegisterCommand(Map_ScoutsBack.TagName, () => new ScoutCMD());
 
            //玩家属性相关
            RegisterCommand(CmdConstant.UpdatePlayerCountry, () => new PlayerAttributeCmd());
            RegisterCommand(CmdConstant.technologyChange, () => new PlayerAttributeCmd());
            RegisterCommand(CmdConstant.CityBuildinginfoFirst, () => new PlayerAttributeCmd());
            RegisterCommand(CmdConstant.CityBuildinginfoChange, () => new PlayerAttributeCmd());
            RegisterCommand(CmdConstant.UpdateHero, () => new PlayerAttributeCmd());
            RegisterCommand(CmdConstant.VipLevelUP, () => new PlayerAttributeCmd());
            RegisterCommand(Guild_GuildTechnologies.TagName,() => new PlayerAttributeCmd()); 
            RegisterCommand(CmdConstant.AllianceEixtEx, () => new PlayerAttributeCmd()); 
            RegisterCommand(CmdConstant.GuildOfficerInfoChange, () => new PlayerAttributeCmd()); 
 
 
            //聊天
            RegisterCommand(Chat_PushMsg.TagName, () => new ChatCMD());
            RegisterCommand(CmdConstant.ChatClientNetEvent,()=>new ChatCMD());
            RegisterCommand(CmdConstant.OnCityLoadFinished,()=>new ChatCMD());
            RegisterCommand(Guild_CreateGuild.TagName, ()=>new ChatCMD());
            RegisterCommand(Guild_ApplyJoinGuild.TagName, ()=>new ChatCMD());
            RegisterCommand(CmdConstant.AllianceEixt, ()=>new ChatCMD());
            RegisterCommand(Chat_Msg2GSQueryPrivateChatLst.TagName, () => new ChatCMD());
            RegisterCommand(Chat_Msg2GSQueryPrivateChatByRid.TagName, () => new ChatCMD());
            RegisterCommand(Chat_SendMsg.TagName, () => new ChatCMD());
            
            //城市buff
            RegisterCommand(CmdConstant.CityBuffChange,()=>new CityBuffCMD());
 
            //OpenUI
            RegisterCommand(CmdConstant.OpenUI,()=>new OpenUICMD());
            RegisterCommand(CmdConstant.OpenUI2, () => new OpenUICMD());
 
            RegisterCommand(Activity_Reward.TagName, ()=>new ActivityCMD());        
            RegisterCommand(Activity_RewardBox.TagName, ()=>new ActivityCMD());        
            RegisterCommand(Activity_ScheduleInfo.TagName, ()=>new ActivityCMD());
            RegisterCommand(Activity_Exchange.TagName, ()=>new ActivityCMD());
            RegisterCommand(CmdConstant.ItemInfoChange, ()=>new ActivityCMD());
            RegisterCommand(CmdConstant.SystemDayChange, ()=>new ActivityCMD());
            RegisterCommand(Activity_Rank.TagName, ()=>new ActivityCMD());
            RegisterCommand(CmdConstant.ActivityActivePointUpdate, ()=>new ActivityCMD());
            RegisterCommand(Activity_TurnTable.TagName, ()=>new ActivityCMD()); 
            RegisterCommand(Activity_ClickActivity.TagName, ()=>new ActivityCMD()); 
 
            //小地图
            RegisterCommand(Guild_GuildMemberPos.TagName, () => new MinimapCMD());
 
            //角色模块通知
            RegisterCommand(Role_RoleNotify.TagName, () => new RoleNotify());
            //资源运输
            RegisterCommand(Transport_GetTransport.TagName, () => new AssitResCMD());
            RegisterCommand(Transport_CreateTransport.TagName, () => new AssitResCMD());
            RegisterCommand(Transport_TransportSuccess.TagName, () => new AssitResCMD());
            //战争预警
            RegisterCommand(Role_EarlyWarningInfo.TagName, () => new WarWarningCMD());
            //跑马灯
            RegisterCommand(Chat_MarqueeNotify.TagName,()=>new ScrollMessageCMD());
            
            //充值
            RegisterCommand(Recharge_RechargeInfo.TagName, () => new RechargeCMD());
            RegisterCommand(Map_MoveCity.TagName, () => new MoveCityCMD());
            RegisterCommand(CmdConstant.EventTracking, () => new EventTrackingCMD());
 
            //地图书签
            RegisterCommand(Map_AddMarker.TagName, () => new MapMarkerCMD());
            RegisterCommand(Map_ModifyMarker.TagName, () => new MapMarkerCMD());
            RegisterCommand(Map_DeleteMarker.TagName, () => new MapMarkerCMD());
            RegisterCommand(CmdConstant.PersonMapMarkerInfoChanged, () => new MapMarkerCMD());
            RegisterCommand(CmdConstant.GuildMapMarkerInfoChanged, () => new MapMarkerCMD());
        }
 
        public void StartUp()
        {
            SendNotification(STARTUP);//发送启动命令
        }
        /// <summary>
        /// 中介者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过中介者协调
        /// 工作原理:
        /// 注册:将中介者与视图绑定
        ///   RegisterMediator(new PlayerMediator());
        /// 触发:发送通知时通知中介者处理
        ///   AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData);
        /// 处理:中介者实现 HandleNotification 方法处理业务逻辑
        /// 优势:
        /// 解耦:对象间解耦,互不直接依赖
        /// 可扩展:新增中介者只需注册,无需修改现有代码
        /// 可维护:统一管理对象关系,易于维护
        /// 但是这里的中介者更像视图控制器
        /// </summary>
        public override void RegisterMediator(IMediator mediator)////注册视图控制器中介者
        {
            ViewBinder vb = null;
            if (mediator.ViewComponent != null)
            {
                vb = ((GameObject) mediator.ViewComponent).GetComponent<ViewBinder>();
            }
 
            if (vb != null)
            {
                m_viewMap[vb] = mediator;
            }
 
            if (!m_MediatorMap.ContainsKey(mediator.MediatorName))
            {
                m_MediatorMap[mediator.MediatorName] = mediator;
            }
 
            base.RegisterMediator(mediator);
        }
 
        public override IMediator RetrieveMediator(string mediatorName)
        {
            if (m_MediatorMap.ContainsKey(mediatorName))
            {
                return m_MediatorMap[mediatorName];
            }
 
            return base.RetrieveMediator(mediatorName);
        }
 
        public override IMediator RemoveMediator(string mediatorName)
        {
            if (m_MediatorMap.ContainsKey(mediatorName))
            {
                m_MediatorMap.Remove(mediatorName);
            }
 
            return base.RemoveMediator(mediatorName);
        }
 
        public void RemoveView(ViewBinder view)
        {
            if (m_viewMap.ContainsKey(view))
            {
                IMediator md = m_viewMap[view];
                AppFacade.GetInstance().RemoveMediator(md.MediatorName);
            }
        }
 
        public void RegisterGlobalMediator(Mediator mediator)
        {
            m_globalMap.Add(mediator.MediatorName, mediator);
            base.RegisterMediator(mediator);
        }
 
        public void RemoveGlobalMediator(string mediatorName)
        {
            if (m_globalMap.ContainsKey(mediatorName))
            {
                Mediator md = m_globalMap[mediatorName];
                AppFacade.GetInstance().RemoveMediator(md.MediatorName);
                m_globalMap.Remove(mediatorName);
            }
        }
        /// <summary>
        /// 观察者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过观察者协调
        /// 工作原理:
        /// 注册:将观察者与被观察者绑定
        ///   RegisterObserver(new Observer());
        /// 触发:被观察者状态改变时通知观察者
        ///   AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData);
        /// 处理:观察者实现 HandleNotification 方法处理业务逻辑
        /// 优势:
        /// 解耦:对象间解耦,互不直接依赖
        /// </summary>
        public override void SendNotification(string notificationName, object body = null, string type = null)
        {
            base.SendNotification(notificationName, body, type);
            SubViewManager.Instance.NotifyObervers(new Notification(notificationName, body, type));
        }
 
        public void SendSproto(SprotoTypeBase obj)
        {
            var net = AppFacade.GetInstance().RetrieveProxy(NetProxy.ProxyNAME) as NetProxy;
            net.SendSproto(obj);
        }
 
        private void OnShowUI(UIInfo ui)
        {
            AppFacade.GetInstance().SendNotification(CmdConstant.OnShowUI, ui);
        }
 
        private void OnCloseUI(UIInfo ui)
        {
            AppFacade.GetInstance().SendNotification(CmdConstant.OnCloseUI, ui);
        }
    }
}