Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -25,6 +25,7 @@ public static void Init() { // 登记相应的数据体及对应的数据转逻辑类 Register(typeof(HB215_tagMCFBBuyBuffInfo), typeof(DTCB215_tagMCFBBuyBuffInfo)); Register(typeof(HA718_tagMCCollectAwardItemInfo), typeof(DTCA718_tagMCCollectAwardItemInfo)); Register(typeof(HB214_tagMCCuntomFBPrizeInfo), typeof(DTCB214_tagMCCuntomFBPrizeInfo)); Register(typeof(HA307_tagMCFairyAdventuresInfo), typeof(DTCA307_tagMCFairyAdventuresInfo)); Core/GameEngine/Model/Config/DungeonUseBuffConfig.cs
New file @@ -0,0 +1,211 @@ //-------------------------------------------------------- // [Author]: Fish // [ Date ]: Tuesday, April 16, 2019 //-------------------------------------------------------- using System.Collections.Generic; using System.IO; using System.Threading; using System; using UnityEngine; [XLua.LuaCallCSharp] public partial class DungeonUseBuffConfig { public readonly int ID; public readonly int DataMapId; public readonly int MoneyCnt; public readonly int BuffID; public readonly int CD; public DungeonUseBuffConfig() { } public DungeonUseBuffConfig(string input) { try { var tables = input.Split('\t'); int.TryParse(tables[0],out ID); int.TryParse(tables[1],out DataMapId); int.TryParse(tables[2],out MoneyCnt); int.TryParse(tables[3],out BuffID); int.TryParse(tables[4],out CD); } catch (Exception ex) { DebugEx.Log(ex); } } static Dictionary<string, DungeonUseBuffConfig> configs = new Dictionary<string, DungeonUseBuffConfig>(); public static DungeonUseBuffConfig Get(string id) { if (!inited) { Debug.Log("DungeonUseBuffConfig 还未完成初始化。"); return null; } if (configs.ContainsKey(id)) { return configs[id]; } DungeonUseBuffConfig config = null; if (rawDatas.ContainsKey(id)) { config = configs[id] = new DungeonUseBuffConfig(rawDatas[id]); rawDatas.Remove(id); } return config; } public static DungeonUseBuffConfig Get(int id) { return Get(id.ToString()); } public static List<string> GetKeys() { var keys = new List<string>(); keys.AddRange(configs.Keys); keys.AddRange(rawDatas.Keys); return keys; } public static List<DungeonUseBuffConfig> GetValues() { var values = new List<DungeonUseBuffConfig>(); values.AddRange(configs.Values); var keys = new List<string>(rawDatas.Keys); foreach (var key in keys) { values.Add(Get(key)); } return values; } public static bool Has(string id) { return configs.ContainsKey(id) || rawDatas.ContainsKey(id); } public static bool Has(int id) { return Has(id.ToString()); } public static bool inited { get; private set; } protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>(); public static void Init(bool sync=false) { inited = false; var path = string.Empty; if (AssetSource.refdataFromEditor) { path = ResourcesPath.CONFIG_FODLER +"/DungeonUseBuff.txt"; } else { path = AssetVersionUtility.GetAssetFilePath("config/DungeonUseBuff.txt"); } var tempConfig = new DungeonUseBuffConfig(); var preParse = tempConfig is IConfigPostProcess; if (sync) { var lines = File.ReadAllLines(path); if (!preParse) { rawDatas = new Dictionary<string, string>(lines.Length - 3); } for (int i = 3; i < lines.Length; i++) { try { var line = lines[i]; var index = line.IndexOf("\t"); if (index == -1) { continue; } var id = line.Substring(0, index); if (preParse) { var config = new DungeonUseBuffConfig(line); configs[id] = config; (config as IConfigPostProcess).OnConfigParseCompleted(); } else { rawDatas[id] = line; } } catch (System.Exception ex) { Debug.LogError(ex); } } inited = true; } else { ThreadPool.QueueUserWorkItem((object _object) => { var lines = File.ReadAllLines(path); if (!preParse) { rawDatas = new Dictionary<string, string>(lines.Length - 3); } for (int i = 3; i < lines.Length; i++) { try { var line = lines[i]; var index = line.IndexOf("\t"); if (index == -1) { continue; } var id = line.Substring(0, index); if (preParse) { var config = new DungeonUseBuffConfig(line); configs[id] = config; (config as IConfigPostProcess).OnConfigParseCompleted(); } else { rawDatas[id] = line; } } catch (System.Exception ex) { Debug.LogError(ex); } } inited = true; }); } } } Core/GameEngine/Model/Config/DungeonUseBuffConfig.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 443e9762aa0f4cd4b8551575e1b8bbb9 timeCreated: 1555415806 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Core/NetworkPackage/ClientPack/ClientToMapServer/CB1_ActionMap/CB10A_tagCMFBBuyBuff.cs
New file @@ -0,0 +1,20 @@ using UnityEngine; using System.Collections; // B1 0A 副本购买buff #tagCMFBBuyBuff public class CB10A_tagCMFBBuyBuff : GameNetPackBasic { public uint MapID; public ushort MoneyCnt; public CB10A_tagCMFBBuyBuff () { combineCmd = (ushort)0x03FE; _cmd = (ushort)0xB10A; } public override void WriteToBytes () { WriteBytes (MapID, NetDataType.DWORD); WriteBytes (MoneyCnt, NetDataType.WORD); } } Core/NetworkPackage/ClientPack/ClientToMapServer/CB1_ActionMap/CB10A_tagCMFBBuyBuff.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 8ae3d7fd5cd37de44b90243da6d1c531 timeCreated: 1555420339 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Core/NetworkPackage/DTCFile/ServerPack/HB2_ActionMap/DTCB215_tagMCFBBuyBuffInfo.cs
New file @@ -0,0 +1,26 @@ //-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, April 16, 2019 //-------------------------------------------------------- using Snxxz.UI; using System; using System.Collections; using System.Collections.Generic; public class DTCB215_tagMCFBBuyBuffInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); var package = vNetPack as HB215_tagMCFBBuyBuffInfo; ModelCenter.Instance.GetModel<DungeonUseBuffModel>().ReceivePackage(package); } } Core/NetworkPackage/DTCFile/ServerPack/HB2_ActionMap/DTCB215_tagMCFBBuyBuffInfo.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 639360f931dc64a45bcb25f90776d4bd timeCreated: 1555420417 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Core/NetworkPackage/ServerPack/HB2_ActionMap/HB215_tagMCFBBuyBuffInfo.cs
New file @@ -0,0 +1,31 @@ using UnityEngine; using System.Collections; // B2 15 副本买buff信息通知 #tagMCFBBuyBuffInfo public class HB215_tagMCFBBuyBuffInfo : GameNetPackBasic { public byte Cnt; public tagMCFBBuyBuffTime[] InfoList; public HB215_tagMCFBBuyBuffInfo () { _cmd = (ushort)0xB215; } public override void ReadFromBytes (byte[] vBytes) { TransBytes (out Cnt, vBytes, NetDataType.BYTE); InfoList = new tagMCFBBuyBuffTime[Cnt]; for (int i = 0; i < Cnt; i ++) { InfoList[i] = new tagMCFBBuyBuffTime(); TransBytes (out InfoList[i].MapID, vBytes, NetDataType.DWORD); TransBytes (out InfoList[i].MoneyCnt, vBytes, NetDataType.WORD); TransBytes (out InfoList[i].BuyTime, vBytes, NetDataType.DWORD); } } public struct tagMCFBBuyBuffTime { public uint MapID; public ushort MoneyCnt; public uint BuyTime; } } Core/NetworkPackage/ServerPack/HB2_ActionMap/HB215_tagMCFBBuyBuffInfo.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 4c40e169a5e64ef44adfc36bd3da6cdd timeCreated: 1555420384 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/Dungeon/DungeonFightWin.cs
@@ -34,6 +34,7 @@ [SerializeField] GameObject m_Container_WHYJ; [SerializeField] DungenWHYJ m_DungenWHYJ; [SerializeField] GatherSoulDungeonBehaviour m_GatherSoulDungeonBehaviour; [SerializeField] DungeonReturnBloodBehaviour m_DungeonReturnBlood; bool excutedAutoExit = false; float timer = 0f; DateTime endTime = DateTime.Now; @@ -49,6 +50,7 @@ RuneTowerModel runeTowerModel { get { return ModelCenter.Instance.GetModel<RuneTowerModel>(); } } BossHomeModel bossHomeModel { get { return ModelCenter.Instance.GetModel<BossHomeModel>(); } } TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } } DungeonUseBuffModel dungeonUseBuffModel { get { return ModelCenter.Instance.GetModel<DungeonUseBuffModel>(); } } #region Built-in protected override void BindController() @@ -80,6 +82,16 @@ m_BossInfosContainer.gameObject.SetActive( dataMapId == ElderGodAreaModel.ELDERGODAREA_MAPID || dataMapId == BossHomeModel.BOSSHOME_MAPID); if (dungeonUseBuffModel.IsDungeonUseBuff(dataMapId)) { m_DungeonReturnBlood.gameObject.SetActive(true); m_DungeonReturnBlood.Display(dataMapId); } else { m_DungeonReturnBlood.gameObject.SetActive(false); } m_GatherSoulDungeonBehaviour.gameObject.SetActive(dataMapId == GatherSoulDungeonModel.DUNGEON_MAPID); switch (dataMapId) @@ -160,6 +172,7 @@ m_BossInfosContainer.Dispose(); m_AncientKing.UnInit(); m_GatherSoulDungeonBehaviour.Dispose(); m_DungeonReturnBlood.Dispose(); DropItemManager.pickUpCallBack -= OnPickItem; MainInterfaceWin.Event_Duplicates -= OnChangeFuncBtnPosEvent; model.dungeonCoolDownEvent -= OnLeaveMapTimeEvent; System/Dungeon/DungeonReturnBloodBehaviour.cs
@@ -8,16 +8,226 @@ { public class DungeonReturnBloodBehaviour : MonoBehaviour { [SerializeField] Button m_ReturnBlood; [SerializeField] Button m_MoneyReturnBlood; [SerializeField] ReturnBloodBeha m_MoneyReturnBeha; [SerializeField] Button m_FreeReturnBlood; [SerializeField] ReturnBloodBeha m_FreeReturnBeha; int mapId = 0; int moneyReturnId = 0; int freeReturnId = 0; DungeonUseBuffModel model { get { return ModelCenter.Instance.GetModel<DungeonUseBuffModel>(); } } private void Awake() { m_ReturnBlood.AddListener(OnReturnBlood); m_FreeReturnBlood.AddListener(FreeReturnBlood); m_MoneyReturnBlood.AddListener(MoneyReturnBlood); } private void OnReturnBlood() public void Display(int mapId) { this.mapId = mapId; moneyReturnId = 0; freeReturnId = 0; var list = model.GetDungeonUseBuffs(mapId); for (int i = 0; i < list.Count; i++) { var config = DungeonUseBuffConfig.Get(list[i]); if (config.MoneyCnt != 0) { moneyReturnId = list[i]; } else { freeReturnId = list[i]; } } m_MoneyReturnBlood.gameObject.SetActive(moneyReturnId != 0); if (moneyReturnId != 0) { m_MoneyReturnBeha.Display(moneyReturnId); } m_FreeReturnBlood.gameObject.SetActive(freeReturnId != 0); if (freeReturnId != 0) { m_FreeReturnBeha.Display(freeReturnId); } DisplayTime(); model.onUseBuffTimeRefresh += OnUseBuffTimeRefresh; } void DisplayTime() { if (moneyReturnId != 0) { var seconds = GetBuffSeconds(moneyReturnId); m_MoneyReturnBeha.SetCoolDown(seconds); } if (freeReturnId != 0) { var seconds = GetBuffSeconds(freeReturnId); m_FreeReturnBeha.SetCoolDown(seconds); } } private void LateUpdate() { if (m_FreeReturnBlood.gameObject.activeSelf) { m_FreeReturnBeha.OnUpdate(); } if (m_MoneyReturnBlood.gameObject.activeSelf) { m_MoneyReturnBeha.OnUpdate(); } } float GetBuffSeconds(int id) { var config = DungeonUseBuffConfig.Get(id); var tick = model.GetUseBuffTime(config.DataMapId, config.MoneyCnt); var useTime = TimeUtility.GetTime(tick); var seconds = Mathf.Max(0f, config.CD - (float)(TimeUtility.ServerNow - useTime).TotalSeconds); return seconds; } private void MoneyReturnBlood() { if (moneyReturnId != 0) { var config = DungeonUseBuffConfig.Get(moneyReturnId); var seconds = GetBuffSeconds(moneyReturnId); if (seconds <= 0) { if (model.moneyCostRemind) { ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get(""), Language.Get("InspireNoMention"), (bool isOk, bool toggle) => { if (toggle) { model.moneyCostRemind = false; } if (isOk) { if (PlayerDatas.Instance.baseData.diamond < config.MoneyCnt) { WindowCenter.Instance.Open<RechargeTipWin>(); return; } var pak = new CB10A_tagCMFBBuyBuff(); pak.MapID = (uint)config.DataMapId; pak.MoneyCnt = (ushort)config.MoneyCnt; GameNetSystem.Instance.SendInfo(pak); } }); } else { var pak = new CB10A_tagCMFBBuyBuff(); pak.MapID = (uint)config.DataMapId; pak.MoneyCnt = (ushort)config.MoneyCnt; GameNetSystem.Instance.SendInfo(pak); } } } } private void FreeReturnBlood() { if (freeReturnId != 0) { var config = DungeonUseBuffConfig.Get(freeReturnId); var seconds = GetBuffSeconds(freeReturnId); if (seconds <= 0) { var pak = new CB10A_tagCMFBBuyBuff(); pak.MapID = (uint)config.DataMapId; pak.MoneyCnt = (ushort)config.MoneyCnt; GameNetSystem.Instance.SendInfo(pak); } } } private void OnUseBuffTimeRefresh() { DisplayTime(); } public void Dispose() { model.onUseBuffTimeRefresh -= OnUseBuffTimeRefresh; } [Serializable] public class ReturnBloodBeha { [SerializeField] Image m_Mask; [SerializeField] Text m_Time; [SerializeField] Text m_Cost; [SerializeField] Text m_Effect; int id = 0; float seconds = 0f; public void Display(int id) { this.id = id; var config = DungeonUseBuffConfig.Get(id); if (config.MoneyCnt != 0) { m_Cost.text = config.MoneyCnt.ToString(); } m_Mask.gameObject.SetActive(false); } public void SetCoolDown(float seconds) { this.seconds = seconds; if (seconds <= 0 && m_Mask.gameObject.activeSelf) { m_Mask.gameObject.SetActive(false); } } void DisplayMask() { var config = DungeonUseBuffConfig.Get(id); var progress = Mathf.Clamp01(seconds / config.CD); m_Mask.fillAmount = progress; if (!m_Mask.gameObject.activeSelf) { m_Mask.gameObject.SetActive(true); } m_Time.text = ((int)seconds).ToString(); } public void OnUpdate() { if (seconds > 0f) { seconds -= Time.deltaTime; DisplayMask(); if (seconds <= 0f) { m_Mask.gameObject.SetActive(false); } } } } } } System/Dungeon/DungeonUseBuffModel.cs
New file @@ -0,0 +1,96 @@ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Snxxz.UI { public class DungeonUseBuffModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk { Dictionary<int, List<int>> m_UseBuffMaps = new Dictionary<int, List<int>>(); Dictionary<int, Dictionary<int, uint>> m_UseBuffTimes = new Dictionary<int, Dictionary<int, uint>>(); public bool moneyCostRemind { get; set; } public event Action onUseBuffTimeRefresh; public override void Init() { ParseConfig(); StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; } public void OnBeforePlayerDataInitialize() { m_UseBuffTimes.Clear(); } public void OnPlayerLoginOk() { } public override void UnInit() { StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish; } private void OnStageLoadFinish() { moneyCostRemind = true; } void ParseConfig() { var configs = DungeonUseBuffConfig.GetValues(); foreach (var config in configs) { List<int> ids = null; if (!m_UseBuffMaps.TryGetValue(config.DataMapId, out ids)) { ids = new List<int>(); m_UseBuffMaps.Add(config.DataMapId, ids); } ids.Add(config.ID); } } public bool IsDungeonUseBuff(int mapId) { return m_UseBuffMaps.ContainsKey(mapId); } public List<int> GetDungeonUseBuffs(int mapId) { return m_UseBuffMaps.ContainsKey(mapId) ? m_UseBuffMaps[mapId] : null; } public uint GetUseBuffTime(int mapId, int moneyCnt) { if (m_UseBuffTimes.ContainsKey(mapId) && m_UseBuffTimes[mapId].ContainsKey(moneyCnt)) { return m_UseBuffTimes[mapId][moneyCnt]; } return 0; } public void ReceivePackage(HB215_tagMCFBBuyBuffInfo package) { for (int i = 0; i < package.Cnt; i++) { var data = package.InfoList[i]; Dictionary<int, uint> dict = null; if (!m_UseBuffTimes.TryGetValue((int)data.MapID, out dict)) { dict = new Dictionary<int, uint>(); m_UseBuffTimes.Add((int)data.MapID, dict); } dict[data.MoneyCnt] = data.BuyTime; } if (onUseBuffTimeRefresh != null) { onUseBuffTimeRefresh(); } } } } System/Dungeon/DungeonUseBuffModel.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: b96475bae31cb2f49b91ee730474aa55 timeCreated: 1555415547 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/WindowBase/ModelCenter.cs
@@ -234,6 +234,7 @@ RegisterModel<HazyRegionModel>(); RegisterModel<HazyDemonKingModel>(); RegisterModel<HazyGrassModel>(); RegisterModel<DungeonUseBuffModel>(); inited = true; } Utility/ConfigInitiator.cs
@@ -292,6 +292,7 @@ normalTasks.Add(new ConfigInitTask("HazyRegionConfig", () => { HazyRegionConfig.Init(); }, () => { return HazyRegionConfig.inited; })); normalTasks.Add(new ConfigInitTask("AdventureDialogueConfig", () => { AdventureDialogueConfig.Init(); }, () => { return AdventureDialogueConfig.inited; })); normalTasks.Add(new ConfigInitTask("MapNpcRefreshConfig", () => { MapNpcRefreshConfig.Init(); }, () => { return MapNpcRefreshConfig.inited; })); normalTasks.Add(new ConfigInitTask("DungeonUseBuffConfig", () => { DungeonUseBuffConfig.Init(); }, () => { return DungeonUseBuffConfig.inited; })); } static List<ConfigInitTask> doingTasks = new List<ConfigInitTask>();