chenxin
2020-10-26 6f16dfb8bcebe67aeb95ded0d8b644af4932e690
无尽模式新手步骤到水元素放置塔位完成
4 files added
26 files modified
1528 ■■■■■ changed files
Assets/Materials/Guide/RectGuidance.mat 6 ●●●● patch | view | raw | blame | history
Assets/Resources/UI/Guide/GuidePanel.prefab 2 ●●● patch | view | raw | blame | history
Assets/Scenes/Levels/Battle/Endless.unity 4 ●●●● patch | view | raw | blame | history
Assets/Scripts/Common/GameConfig.cs 14 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Data/EndlessPortData.cs 102 ●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventType.cs 2 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Guide/ImageWater.cs 3 ●●●● patch | view | raw | blame | history
Assets/Scripts/Net/NetExtends/Common.cs 391 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/NetExtends/Game.cs 122 ●●●● patch | view | raw | blame | history
Assets/Scripts/Net/NetExtends/Table.cs 142 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs 3 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Agents/Agent.cs 8 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Level/AgentInsManager.cs 24 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs 54 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Level/EndlessWave.cs 12 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs 24 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs 241 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs 4 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs 6 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs 66 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/Towers/Tower.cs 11 ●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs 8 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs 221 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs 32 ●●●●● patch | view | raw | blame | history
Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs 8 ●●●●● patch | view | raw | blame | history
Assets/StreamingAssets/Table/battle.json 2 ●●● patch | view | raw | blame | history
Assets/StreamingAssets/Table/donaterule.json 1 ●●●● patch | view | raw | blame | history
Assets/StreamingAssets/Table/donaterule.json.meta 7 ●●●●● patch | view | raw | blame | history
Assets/StreamingAssets/Table/endless_teachport.json 1 ●●●● patch | view | raw | blame | history
Assets/StreamingAssets/Table/endless_teachport.json.meta 7 ●●●●● patch | view | raw | blame | history
Assets/Materials/Guide/RectGuidance.mat
@@ -69,8 +69,8 @@
    - _OcclusionStrength: 1
    - _Parallax: 0.02
    - _Slider: 81.39478
    - _SliderX: 75.32526
    - _SliderY: 80.29174
    - _SliderX: 75.0423
    - _SliderY: 0.045161847
    - _SmoothnessTextureChannel: 0
    - _SpecularHighlights: 1
    - _SrcBlend: 1
@@ -83,7 +83,7 @@
    - _UseUIAlphaClip: 0
    - _ZWrite: 1
    m_Colors:
    - _Center: {r: -150, g: -198, b: 0, a: 0}
    - _Center: {r: -150, g: -59.99974, b: 0, a: 0}
    - _Color: {r: 1, g: 1, b: 1, a: 1}
    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
  m_BuildTextureStacks: []
Assets/Resources/UI/Guide/GuidePanel.prefab
@@ -109,7 +109,7 @@
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
  m_IsActive: 0
--- !u!224 &4359018530067976343
RectTransform:
  m_ObjectHideFlags: 0
Assets/Scenes/Levels/Battle/Endless.unity
@@ -12915,6 +12915,10 @@
    x: 5
    y: 4
  gridSize: 1.109
  towerBulletUIPrefab: {fileID: 4636030447447409971, guid: f6edf4c41f0dac54d94e67945bca23f0,
    type: 3}
  towerEnergyUIPrefab: {fileID: 4636030447447409971, guid: 0d97566feabc1d644862df3fb52071a3,
    type: 3}
--- !u!65 &1632078504
BoxCollider:
  m_ObjectHideFlags: 2
Assets/Scripts/Common/GameConfig.cs
@@ -17,5 +17,19 @@
        public static string LoginUrl = "http://172.16.1.52:9000/user/login";
        public static bool OpenDebug = true;
        /// <summary>
        /// PVE无尽模式,是否可以点击购买新的宝石
        /// </summary>
        public static bool CanBuyNewTower = false;
        /// <summary>
        /// 是否可以点击金币购买新的塔位
        /// </summary>
        public static bool CanOpenNewTower = true;
        /// <summary>
        /// 是否是新手
        /// </summary>
        public static bool IsNewbie = true;
    }
}
Assets/Scripts/Data/EndlessPortData.cs
@@ -33,7 +33,17 @@
        /// </summary>
        private static List<endless_port> endlessPortList;
        /// <summary>
        /// 无尽模式新手关卡配置表
        /// </summary>
        private static List<endless_port> endlessTeachPortList;
        private static List<EndlessPortConfig> portConfigList;
        /// <summary>
        /// 新手用
        /// </summary>
        private static List<EndlessPortConfig> teachPortConfigList;
        private static Random random;
@@ -52,11 +62,77 @@
        /// </summary>
        public static void Init()
        {
            random = new Random();
            InitPortConfig();
            InitTeachPortConfig();
            List<List<EndlessPortConfig>> list = GetLevelWaveData(1);
        }
        /// <summary>
        /// 初始化关卡配置
        /// </summary>
        private static void InitPortConfig()
        {
            endlessPortList = JsonDataCenter.GetList<endless_port>();
            portConfigList = new List<EndlessPortConfig>();
            random = new Random();
            InitPortList(portConfigList, endlessPortList);
        }
            foreach (endless_port data in endlessPortList)
        /// <summary>
        /// 初始化新手的关卡配置
        /// </summary>
        private static void InitTeachPortConfig()
        {
            List<endless_teachport> list = JsonDataCenter.GetList<endless_teachport>();
            endlessTeachPortList = new List<endless_port>();
            foreach (endless_teachport data in list)
            {
                endless_port newData = new endless_port();
                newData.id = data.id;
                newData.level = data.level;
                newData.boss_name = data.boss_name;
                newData.resource = data.resource;
                newData.wave = data.wave;
                newData.tunel = data.tunel;
                newData.enemy_id = data.enemy_id;
                newData.amount = data.amount;
                newData.interval = data.interval;
                newData.b_hp = data.b_hp;
                newData.b_speed = data.b_speed;
                newData.b_coin = data.b_coin;
                newData.cooldown = data.cooldown;
                List<reward> rewardList = new List<reward>();
                foreach (reward r in rewardList)
                {
                    reward nr = new reward();
                    nr.type = r.type;
                    nr.id = r.id;
                    nr.count = r.count;
                    rewardList.Add(nr);
                }
                newData.drop = rewardList;
                List<int> rateList = new List<int>();
                foreach (int r in rateList)
                {
                    rateList.Add(r);
                }
                newData.drop_rate = rateList;
                newData.tunel_bg = data.tunel_bg;
                endlessTeachPortList.Add(newData);
            }
            teachPortConfigList = new List<EndlessPortConfig>();
            InitPortList(teachPortConfigList, endlessTeachPortList);
        }
        private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList)
        {
            foreach (endless_port data in srcList)
            {
                if (data.level > maxLevel)
                    maxLevel = data.level;
@@ -72,24 +148,8 @@
                }
                param.DropTotalWeight = totalWeight;
                portConfigList.Add(param);
                list.Add(param);
            }
        }
        /// <summary>
        /// 根据关卡等级获取boss资源id
        /// </summary>
        /// <param name="level">关卡等级</param>
        /// <returns>如果返回-1查找失败</returns>
        public static int GetResIdByLevel(int level)
        {
            foreach (endless_port data in endlessPortList)
            {
                if (data.level == level)
                    return data.resource;
            }
            return -1;
        }
        /// <summary>
@@ -106,7 +166,9 @@
                ret.Add(new List<EndlessPortConfig>());
            }
            foreach (EndlessPortConfig data in portConfigList)
            List<EndlessPortConfig> list = GameConfig.IsNewbie ? teachPortConfigList : portConfigList;
            foreach (EndlessPortConfig data in list)
            {
                if (data.Config.level != level || data.Config.amount == 0) continue;
Assets/Scripts/Event/EventType.cs
@@ -35,6 +35,8 @@
        SkillRelease,
        //释放技能完毕
        SkillReleaseDone,
        // 火元素塔充能使用结束
        FireTowerChargeEnd,
    }
}
Assets/Scripts/Guide/ImageWater.cs
@@ -51,10 +51,9 @@
        {
            //生成一个1级的水元素塔
            Debug.Log("生成一个1级的水元素塔");
            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateWaterLv1);
            gameObject.SetActive(false);
            target.GetComponent<Image>().sprite = tmpImage.sprite;
            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateWaterLv1);
        }
        else
        {
Assets/Scripts/Net/NetExtends/Common.cs
@@ -23,81 +23,81 @@
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Cgxjb21tb24ucHJvdG8SCHByb3RvYnVmIjUKBkdlbU1zZxINCgVnZW1JZBgB",
            "IAEoBRINCgVsZXZlbBgCIAEoBRINCgVjb3VudBgDIAEoBSKIAwoLVXNlckRh",
            "IAEoBRINCgVsZXZlbBgCIAEoBRINCgVjb3VudBgDIAEoBSLrAgoLVXNlckRh",
            "dGFNc2cSEAoIdXNlcm5hbWUYASABKAkSEAoIbmlja25hbWUYAiABKAkSDwoH",
            "aGVhZGltZxgDIAEoBRIRCglzaW5nYXR1cmUYBCABKAkSDQoFbGV2ZWwYBSAB",
            "KAUSDAoEcmFuaxgGIAEoBRINCgVzY29yZRgHIAEoBRILCgNleHAYCCABKAUS",
            "DQoFbW9uZXkYCSABKAUSDAoEZ29sZBgKIAEoBRIeCgRnZW1zGAsgAygLMhAu",
            "cHJvdG9idWYuR2VtTXNnEhAKCGdlbWRlY2sxGAwgAygFEhAKCGdlbWRlY2sy",
            "GA0gAygFEhAKCGdlbWRlY2szGA4gAygFEg4KBmRlY2tpZBgPIAEoBRIUCgxh",
            "Y2NlcHRmcmllbmQYECABKAgSFAoMbmFtZWRjaGFuZ2VkGBEgASgIEg8KB2Fy",
            "ZWFleHAYEiABKAUSKAoJYXJlYWJveGVzGBMgAygLMhUucHJvdG9idWYuQXJl",
            "bmFCb3hNc2cSDgoGZG9uYXRlGBQgASgFIp8BCglGcmllbmRNc2cSEAoIdXNl",
            "cm5hbWUYASABKAkSEAoIbmlja25hbWUYAiABKAkSDwoHaGVhZGltZxgDIAEo",
            "BRINCgVsZXZlbBgFIAEoBRIMCgRyYW5rGAYgASgFEg0KBXNjb3JlGAcgASgF",
            "Eg4KBm9ubGluZRgIIAEoCBIhCgdnZW1kZWNrGAkgAygLMhAucHJvdG9idWYu",
            "R2VtTXNnIlYKDFN0b3JlQXJlYU1zZxIKCgJpZBgBIAEoBRITCgtyZWZyZXNo",
            "VGltZRgCIAEoBRIlCgVpdGVtcxgDIAMoCzIWLnByb3RvYnVmLlN0b3JlSXRl",
            "bU1zZyIsCgxTdG9yZUl0ZW1Nc2cSCgoCaWQYASABKAUSEAoIYnV5Q291bnQY",
            "AiABKAUiOAoNUmV3YXJkSXRlbU1zZxIMCgR0eXBlGAEgASgFEgoKAmlkGAIg",
            "ASgFEg0KBWNvdW50GAMgASgFIj0KC0FyZW5hQm94TXNnEgsKA3BvcxgBIAEo",
            "BRINCgVib3hpZBgCIAEoBRISCgpleHBpcmVUaW1lGAMgASgFItIBCg9GYW1p",
            "bHlNZW1iZXJNc2cSEAoIdXNlcm5hbWUYASABKAkSEAoIbmlja25hbWUYAiAB",
            "KAkSDwoHaGVhZGltZxgDIAEoBRIQCghwb3NpdGlvbhgEIAEoBRIOCgZvbmxp",
            "bmUYBSABKAgSDQoFc2NvcmUYBiABKAUSDQoFbGV2ZWwYByABKAUSEgoKd2Vl",
            "a0RvbmF0ZRgIIAEoBRITCgt0b3RhbERvbmF0ZRgJIAEoBRIhCgdnZW1kZWNr",
            "GAogAygLMhAucHJvdG9idWYuR2VtTXNnIjwKE0ZhbWlseURvbmF0ZUl0ZW1N",
            "c2cSEAoIdXNlcm5hbWUYASABKAkSEwoLZG9uYXRlQ291bnQYAiABKAUikgMK",
            "DUZhbWlseUNoYXRNc2cSEQoJbWVzc2FnZUlkGAEgASgFEhAKCHVzZXJuYW1l",
            "GAIgASgJEhAKCG5pY2tuYW1lGAMgASgJEg8KB2hlYWRpbWcYBCABKAUSEgoK",
            "Y3JlYXRlVGltZRgFIAEoBRIPCgdjb250ZW50GAYgASgJEiQKCGNoYXRUeXBl",
            "GAcgASgOMhIucHJvdG9idWYuQ2hhdFR5cGUSDQoFZ2VtSWQYCCABKAUSMQoK",
            "ZG9uYXRlbGlzdBgJIAMoCzIdLnByb3RvYnVmLkZhbWlseURvbmF0ZUl0ZW1N",
            "c2cSFAoMcmVjZWl2ZUNvdW50GAogASgFEhIKClRvdGFsQ291bnQYCyABKAUS",
            "EAoIbm90aWNlSWQYDCABKAUSDgoGcGFyYW1zGA0gAygJEhMKC25ld1VzZXJu",
            "YW1lGA4gASgJEhMKC25ld05pY2tuYW1lGA8gASgJEhIKCm5ld0hlYWRpbWcY",
            "ECABKAUSEAoIbmV3TGV2ZWwYESABKAUSEAoIbmV3U2NvcmUYEiABKAUi0gEK",
            "CUZhbWlseU1zZxILCgN1aWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRkZXNj",
            "GAMgASgJEg0KBWljb25zGAQgAygFEg0KBXNjb3JlGAUgASgFEhMKC3Njb3Jl",
            "c2hvcElkGAYgASgFEhgKEHNjb3Jlc2hvcEV4cGlyZWQYByABKAUSEAoIZnJl",
            "ZUpvaW4YCCABKAUSEQoJbmVlZFNjb3JlGAkgASgFEioKB21lbWJlcnMYCiAD",
            "KAsyGS5wcm90b2J1Zi5GYW1pbHlNZW1iZXJNc2cimgEKE0ZhbWlseVNlYXJj",
            "aEl0ZW1Nc2cSCwoDdWlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFaWNvbnMY",
            "AyADKAUSEwoLbWVtYmVyQ291bnQYBCABKAUSEAoIaXNBY3RpdmUYBSABKAgS",
            "EgoKaXNGcmllbmRJbhgGIAEoCBINCgVpc05ldxgHIAEoCBIPCgdpc0FwcGx5",
            "GAggASgIKmgKCENVUlJFTkNZEhIKDkNVUlJFTkNZX0JFR0lOEAASCQoFTU9O",
            "RVkQARIICgRHT0xEEAISBwoDUk1CEAMSBwoDR0VNEAQSBwoDQk9YEAUSDAoI",
            "QVJFTkFFWFAQBhIKCgZET05BVEUQByomCglDaGFubmVsSUQSEQoNQ0hBTk5F",
            "TF9CRUdJThAAEgYKAkdNEAEqrwUKCUVycm9yQ29kZRILCgdTdWNjZXNzEAAS",
            "FQoRQ2hhbm5lbElkX05vRXhpc3QQARIUChBVc2VyTmFtZV9JbnZhbGlkEAIS",
            "GAoUVXNlclBhc3NXb3JkX0ludmFsaWQQAxIQCgxVbmtub3dfRXJyb3IQBBIR",
            "Cg1JbnB1dF9JbnZhbGlkEAUSCwoHVGltZW91dBAGEhYKElNlc3Npb25LZXlf",
            "SW52YWxpZBAHEhAKDExvZ2luX05vVXNlchAIEhMKD05vdEVub3VnaF9Nb25l",
            "eRAJEhIKDk5vdEVub3VnaF9Hb2xkEAoSEQoNTm90RW5vdWdoX0dlbRALEhMK",
            "D05vdEZvdW5kX0ZyaWVuZBAMEhIKDkFscmVhZHlfRnJpZW5kEA0SEgoOSW5C",
            "bG9ja19GcmllbmQQDhIOCgpNYXhfRnJpZW5kEA8SEAoMTWF4X05pY2tOYW1l",
            "EBASFAoQSW52YWxpZF9OaWNrTmFtZRAREhIKDk1heF9TdG9yZUxpbWl0EBIS",
            "FgoSTm90RW5vdWdoX1N0b3JlQnV5EBMSFAoQTm90T3Blbl9QYXNzUG9ydBAU",
            "EhQKEEFscmVhZHlfUGFzc1BvcnQQFRIcChhOZWVkVmlwX1Bhc3NQb3J0VGFr",
            "ZUl0ZW0QFhIeChpOZWVkTGV2ZWxfUGFzc1BvcnRUYWtlSXRlbRAXEhwKGEFs",
            "cmVhZHlfUGFzc1BvcnRUYWtlSXRlbRAYEhwKGEludmFsaWRfUGFzc1BvcnRC",
            "dXlMZXZlbBAZEhYKEkhhc1VubG9ja19BcmVuYUJveBAaEhsKF090aGVyVW5s",
            "b2NraW5nX0FyZW5hQm94EBsSGAoUTm90VGltZVRha2VfQXJlbmFCb3gQHBIg",
            "ChxOb3RFbm91Z2hfTGV2ZWxfQ3JlYXRlRmFtaWx5EB0qcQoIQ2hhdFR5cGUS",
            "EgoOQ2hhdFR5cGVfQmVnaW4QABIRCg1DaGF0VHlwZV9UZXh0EAESFgoSQ2hh",
            "dFR5cGVfRG9uYXRlR2VtEAISEwoPQ2hhdFR5cGVfU3lzdGVtEAMSEQoNQ2hh",
            "dFR5cGVfSm9pbhAEYgZwcm90bzM="));
            "KAUSCwoDZXhwGAYgASgFEg0KBW1vbmV5GAcgASgFEgwKBGdvbGQYCCABKAUS",
            "HgoEZ2VtcxgJIAMoCzIQLnByb3RvYnVmLkdlbU1zZxIQCghnZW1kZWNrMRgK",
            "IAMoBRIQCghnZW1kZWNrMhgLIAMoBRIQCghnZW1kZWNrMxgMIAMoBRIOCgZk",
            "ZWNraWQYDSABKAUSFAoMYWNjZXB0ZnJpZW5kGA4gASgIEhQKDG5hbWVkY2hh",
            "bmdlZBgPIAEoCBIPCgdhcmVhZXhwGBAgASgFEigKCWFyZWFib3hlcxgRIAMo",
            "CzIVLnByb3RvYnVmLkFyZW5hQm94TXNnEg4KBmRvbmF0ZRgSIAEoBSKhAQoJ",
            "RnJpZW5kTXNnEhAKCHVzZXJuYW1lGAEgASgJEhAKCG5pY2tuYW1lGAIgASgJ",
            "Eg8KB2hlYWRpbWcYAyABKAUSDQoFbGV2ZWwYBSABKAUSDAoEcmFuaxgGIAEo",
            "BRIPCgdhcmVhZXhwGAcgASgFEg4KBm9ubGluZRgIIAEoCBIhCgdnZW1kZWNr",
            "GAkgAygLMhAucHJvdG9idWYuR2VtTXNnIlYKDFN0b3JlQXJlYU1zZxIKCgJp",
            "ZBgBIAEoBRITCgtyZWZyZXNoVGltZRgCIAEoBRIlCgVpdGVtcxgDIAMoCzIW",
            "LnByb3RvYnVmLlN0b3JlSXRlbU1zZyIsCgxTdG9yZUl0ZW1Nc2cSCgoCaWQY",
            "ASABKAUSEAoIYnV5Q291bnQYAiABKAUiOAoNUmV3YXJkSXRlbU1zZxIMCgR0",
            "eXBlGAEgASgFEgoKAmlkGAIgASgFEg0KBWNvdW50GAMgASgFIj0KC0FyZW5h",
            "Qm94TXNnEgsKA3BvcxgBIAEoBRINCgVib3hpZBgCIAEoBRISCgpleHBpcmVU",
            "aW1lGAMgASgFItQBCg9GYW1pbHlNZW1iZXJNc2cSEAoIdXNlcm5hbWUYASAB",
            "KAkSEAoIbmlja25hbWUYAiABKAkSDwoHaGVhZGltZxgDIAEoBRIQCghwb3Np",
            "dGlvbhgEIAEoBRIOCgZvbmxpbmUYBSABKAgSDwoHYXJlYWV4cBgGIAEoBRIN",
            "CgVsZXZlbBgIIAEoBRISCgp3ZWVrRG9uYXRlGAkgASgFEhMKC3RvdGFsRG9u",
            "YXRlGAogASgFEiEKB2dlbWRlY2sYCyADKAsyEC5wcm90b2J1Zi5HZW1Nc2ci",
            "PAoTRmFtaWx5RG9uYXRlSXRlbU1zZxIQCgh1c2VybmFtZRgBIAEoCRITCgtk",
            "b25hdGVDb3VudBgCIAEoBSKSAwoNRmFtaWx5Q2hhdE1zZxIRCgltZXNzYWdl",
            "SWQYASABKAUSEAoIdXNlcm5hbWUYAiABKAkSEAoIbmlja25hbWUYAyABKAkS",
            "DwoHaGVhZGltZxgEIAEoBRISCgpjcmVhdGVUaW1lGAUgASgFEg8KB2NvbnRl",
            "bnQYBiABKAkSJAoIY2hhdFR5cGUYByABKA4yEi5wcm90b2J1Zi5DaGF0VHlw",
            "ZRINCgVnZW1JZBgIIAEoBRIxCgpkb25hdGVsaXN0GAkgAygLMh0ucHJvdG9i",
            "dWYuRmFtaWx5RG9uYXRlSXRlbU1zZxIUCgxyZWNlaXZlQ291bnQYCiABKAUS",
            "EgoKVG90YWxDb3VudBgLIAEoBRIQCghub3RpY2VJZBgMIAEoBRIOCgZwYXJh",
            "bXMYDSADKAkSEwoLbmV3VXNlcm5hbWUYDiABKAkSEwoLbmV3Tmlja25hbWUY",
            "DyABKAkSEgoKbmV3SGVhZGltZxgQIAEoBRIQCghuZXdMZXZlbBgRIAEoBRIQ",
            "CghuZXdTY29yZRgSIAEoBSLSAQoJRmFtaWx5TXNnEgsKA3VpZBgBIAEoCRIM",
            "CgRuYW1lGAIgASgJEgwKBGRlc2MYAyABKAkSDQoFaWNvbnMYBCADKAUSDQoF",
            "c2NvcmUYBSABKAUSEwoLc2NvcmVzaG9wSWQYBiABKAUSGAoQc2NvcmVzaG9w",
            "RXhwaXJlZBgHIAEoBRIQCghmcmVlSm9pbhgIIAEoBRIRCgluZWVkU2NvcmUY",
            "CSABKAUSKgoHbWVtYmVycxgKIAMoCzIZLnByb3RvYnVmLkZhbWlseU1lbWJl",
            "ck1zZyKaAQoTRmFtaWx5U2VhcmNoSXRlbU1zZxILCgN1aWQYASABKAkSDAoE",
            "bmFtZRgCIAEoCRINCgVpY29ucxgDIAMoBRITCgttZW1iZXJDb3VudBgEIAEo",
            "BRIQCghpc0FjdGl2ZRgFIAEoCBISCgppc0ZyaWVuZEluGAYgASgIEg0KBWlz",
            "TmV3GAcgASgIEg8KB2lzQXBwbHkYCCABKAgqaAoIQ1VSUkVOQ1kSEgoOQ1VS",
            "UkVOQ1lfQkVHSU4QABIJCgVNT05FWRABEggKBEdPTEQQAhIHCgNSTUIQAxIH",
            "CgNHRU0QBBIHCgNCT1gQBRIMCghBUkVOQUVYUBAGEgoKBkRPTkFURRAHKiYK",
            "CUNoYW5uZWxJRBIRCg1DSEFOTkVMX0JFR0lOEAASBgoCR00QASrNBQoJRXJy",
            "b3JDb2RlEgsKB1N1Y2Nlc3MQABIVChFDaGFubmVsSWRfTm9FeGlzdBABEhQK",
            "EFVzZXJOYW1lX0ludmFsaWQQAhIYChRVc2VyUGFzc1dvcmRfSW52YWxpZBAD",
            "EhAKDFVua25vd19FcnJvchAEEhEKDUlucHV0X0ludmFsaWQQBRILCgdUaW1l",
            "b3V0EAYSFgoSU2Vzc2lvbktleV9JbnZhbGlkEAcSEAoMTG9naW5fTm9Vc2Vy",
            "EAgSEwoPTm90RW5vdWdoX01vbmV5EAkSEgoOTm90RW5vdWdoX0dvbGQQChIR",
            "Cg1Ob3RFbm91Z2hfR2VtEAsSEwoPTm90Rm91bmRfRnJpZW5kEAwSEgoOQWxy",
            "ZWFkeV9GcmllbmQQDRISCg5JbkJsb2NrX0ZyaWVuZBAOEg4KCk1heF9Gcmll",
            "bmQQDxIQCgxNYXhfTmlja05hbWUQEBIUChBJbnZhbGlkX05pY2tOYW1lEBES",
            "EgoOTWF4X1N0b3JlTGltaXQQEhIWChJOb3RFbm91Z2hfU3RvcmVCdXkQExIU",
            "ChBOb3RPcGVuX1Bhc3NQb3J0EBQSFAoQQWxyZWFkeV9QYXNzUG9ydBAVEhwK",
            "GE5lZWRWaXBfUGFzc1BvcnRUYWtlSXRlbRAWEh4KGk5lZWRMZXZlbF9QYXNz",
            "UG9ydFRha2VJdGVtEBcSHAoYQWxyZWFkeV9QYXNzUG9ydFRha2VJdGVtEBgS",
            "HAoYSW52YWxpZF9QYXNzUG9ydEJ1eUxldmVsEBkSFgoSSGFzVW5sb2NrX0Fy",
            "ZW5hQm94EBoSGwoXT3RoZXJVbmxvY2tpbmdfQXJlbmFCb3gQGxIYChROb3RU",
            "aW1lVGFrZV9BcmVuYUJveBAcEhMKD05vdEVub3VnaF9MZXZlbBAdEhQKEEFs",
            "cmVhZHlJbl9GYW1pbHkQHhITCg9Ob3RFeGlzdF9GYW1pbHkQHypxCghDaGF0",
            "VHlwZRISCg5DaGF0VHlwZV9CZWdpbhAAEhEKDUNoYXRUeXBlX1RleHQQARIW",
            "ChJDaGF0VHlwZV9Eb25hdGVHZW0QAhITCg9DaGF0VHlwZV9TeXN0ZW0QAxIR",
            "Cg1DaGF0VHlwZV9Kb2luEARiBnByb3RvMw=="));
      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
          new pbr::FileDescriptor[] { },
          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Protobuf.CURRENCY), typeof(global::Protobuf.ChannelID), typeof(global::Protobuf.ErrorCode), typeof(global::Protobuf.ChatType), }, new pbr::GeneratedClrTypeInfo[] {
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.GemMsg), global::Protobuf.GemMsg.Parser, new[]{ "GemId", "Level", "Count" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.UserDataMsg), global::Protobuf.UserDataMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Singature", "Level", "Rank", "Score", "Exp", "Money", "Gold", "Gems", "Gemdeck1", "Gemdeck2", "Gemdeck3", "Deckid", "Acceptfriend", "Namedchanged", "Areaexp", "Areaboxes", "Donate" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FriendMsg), global::Protobuf.FriendMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Level", "Rank", "Score", "Online", "Gemdeck" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.UserDataMsg), global::Protobuf.UserDataMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Singature", "Level", "Exp", "Money", "Gold", "Gems", "Gemdeck1", "Gemdeck2", "Gemdeck3", "Deckid", "Acceptfriend", "Namedchanged", "Areaexp", "Areaboxes", "Donate" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FriendMsg), global::Protobuf.FriendMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Level", "Rank", "Areaexp", "Online", "Gemdeck" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.StoreAreaMsg), global::Protobuf.StoreAreaMsg.Parser, new[]{ "Id", "RefreshTime", "Items" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.StoreItemMsg), global::Protobuf.StoreItemMsg.Parser, new[]{ "Id", "BuyCount" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.RewardItemMsg), global::Protobuf.RewardItemMsg.Parser, new[]{ "Type", "Id", "Count" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.ArenaBoxMsg), global::Protobuf.ArenaBoxMsg.Parser, new[]{ "Pos", "Boxid", "ExpireTime" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMemberMsg), global::Protobuf.FamilyMemberMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Position", "Online", "Score", "Level", "WeekDonate", "TotalDonate", "Gemdeck" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMemberMsg), global::Protobuf.FamilyMemberMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Position", "Online", "Areaexp", "Level", "WeekDonate", "TotalDonate", "Gemdeck" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyDonateItemMsg), global::Protobuf.FamilyDonateItemMsg.Parser, new[]{ "Username", "DonateCount" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyChatMsg), global::Protobuf.FamilyChatMsg.Parser, new[]{ "MessageId", "Username", "Nickname", "Headimg", "CreateTime", "Content", "ChatType", "GemId", "Donatelist", "ReceiveCount", "TotalCount", "NoticeId", "Params", "NewUsername", "NewNickname", "NewHeadimg", "NewLevel", "NewScore" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMsg), global::Protobuf.FamilyMsg.Parser, new[]{ "Uid", "Name", "Desc", "Icons", "Score", "ScoreshopId", "ScoreshopExpired", "FreeJoin", "NeedScore", "Members" }, null, null, null),
@@ -276,9 +276,17 @@
    /// </summary>
    [pbr::OriginalName("NotTimeTake_ArenaBox")] NotTimeTakeArenaBox = 28,
    /// <summary>
    /// 创建公会失败,等级不足
    /// 等级不足
    /// </summary>
    [pbr::OriginalName("NotEnough_Level_CreateFamily")] NotEnoughLevelCreateFamily = 29,
    [pbr::OriginalName("NotEnough_Level")] NotEnoughLevel = 29,
    /// <summary>
    /// 已经在工会中
    /// </summary>
    [pbr::OriginalName("AlreadyIn_Family")] AlreadyInFamily = 30,
    /// <summary>
    /// !工会不存在
    /// </summary>
    [pbr::OriginalName("NotExist_Family")] NotExistFamily = 31,
  }
  public enum ChatType {
@@ -521,8 +529,6 @@
      headimg_ = other.headimg_;
      singature_ = other.singature_;
      level_ = other.level_;
      rank_ = other.rank_;
      score_ = other.score_;
      exp_ = other.exp_;
      money_ = other.money_;
      gold_ = other.gold_;
@@ -607,38 +613,11 @@
      }
    }
    /// <summary>Field number for the "rank" field.</summary>
    public const int RankFieldNumber = 6;
    private int rank_;
    /// <summary>
    /// 段位
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Rank {
      get { return rank_; }
      set {
        rank_ = value;
      }
    }
    /// <summary>Field number for the "score" field.</summary>
    public const int ScoreFieldNumber = 7;
    private int score_;
    /// <summary>
    /// 分数
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Score {
      get { return score_; }
      set {
        score_ = value;
      }
    }
    /// <summary>Field number for the "exp" field.</summary>
    public const int ExpFieldNumber = 8;
    public const int ExpFieldNumber = 6;
    private int exp_;
    /// <summary>
    /// int32  score =7;
    /// !经验
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -650,7 +629,7 @@
    }
    /// <summary>Field number for the "money" field.</summary>
    public const int MoneyFieldNumber = 9;
    public const int MoneyFieldNumber = 7;
    private int money_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Money {
@@ -661,7 +640,7 @@
    }
    /// <summary>Field number for the "gold" field.</summary>
    public const int GoldFieldNumber = 10;
    public const int GoldFieldNumber = 8;
    private int gold_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Gold {
@@ -672,9 +651,9 @@
    }
    /// <summary>Field number for the "gems" field.</summary>
    public const int GemsFieldNumber = 11;
    public const int GemsFieldNumber = 9;
    private static readonly pb::FieldCodec<global::Protobuf.GemMsg> _repeated_gems_codec
        = pb::FieldCodec.ForMessage(90, global::Protobuf.GemMsg.Parser);
        = pb::FieldCodec.ForMessage(74, global::Protobuf.GemMsg.Parser);
    private readonly pbc::RepeatedField<global::Protobuf.GemMsg> gems_ = new pbc::RepeatedField<global::Protobuf.GemMsg>();
    /// <summary>
    /// *已有宝石列表
@@ -685,9 +664,9 @@
    }
    /// <summary>Field number for the "gemdeck1" field.</summary>
    public const int Gemdeck1FieldNumber = 12;
    public const int Gemdeck1FieldNumber = 10;
    private static readonly pb::FieldCodec<int> _repeated_gemdeck1_codec
        = pb::FieldCodec.ForInt32(98);
        = pb::FieldCodec.ForInt32(82);
    private readonly pbc::RepeatedField<int> gemdeck1_ = new pbc::RepeatedField<int>();
    /// <summary>
    /// 编队
@@ -698,9 +677,9 @@
    }
    /// <summary>Field number for the "gemdeck2" field.</summary>
    public const int Gemdeck2FieldNumber = 13;
    public const int Gemdeck2FieldNumber = 11;
    private static readonly pb::FieldCodec<int> _repeated_gemdeck2_codec
        = pb::FieldCodec.ForInt32(106);
        = pb::FieldCodec.ForInt32(90);
    private readonly pbc::RepeatedField<int> gemdeck2_ = new pbc::RepeatedField<int>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public pbc::RepeatedField<int> Gemdeck2 {
@@ -708,9 +687,9 @@
    }
    /// <summary>Field number for the "gemdeck3" field.</summary>
    public const int Gemdeck3FieldNumber = 14;
    public const int Gemdeck3FieldNumber = 12;
    private static readonly pb::FieldCodec<int> _repeated_gemdeck3_codec
        = pb::FieldCodec.ForInt32(114);
        = pb::FieldCodec.ForInt32(98);
    private readonly pbc::RepeatedField<int> gemdeck3_ = new pbc::RepeatedField<int>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public pbc::RepeatedField<int> Gemdeck3 {
@@ -718,7 +697,7 @@
    }
    /// <summary>Field number for the "deckid" field.</summary>
    public const int DeckidFieldNumber = 15;
    public const int DeckidFieldNumber = 13;
    private int deckid_;
    /// <summary>
    /// 默认编队索引0,1,2
@@ -732,7 +711,7 @@
    }
    /// <summary>Field number for the "acceptfriend" field.</summary>
    public const int AcceptfriendFieldNumber = 16;
    public const int AcceptfriendFieldNumber = 14;
    private bool acceptfriend_;
    /// <summary>
    ///  是否接受好友申请
@@ -746,7 +725,7 @@
    }
    /// <summary>Field number for the "namedchanged" field.</summary>
    public const int NamedchangedFieldNumber = 17;
    public const int NamedchangedFieldNumber = 15;
    private bool namedchanged_;
    /// <summary>
    ///  true 表示改过名字,false没有改过
@@ -760,7 +739,7 @@
    }
    /// <summary>Field number for the "areaexp" field.</summary>
    public const int AreaexpFieldNumber = 18;
    public const int AreaexpFieldNumber = 16;
    private int areaexp_;
    /// <summary>
    /// !竞技场经验
@@ -774,9 +753,9 @@
    }
    /// <summary>Field number for the "areaboxes" field.</summary>
    public const int AreaboxesFieldNumber = 19;
    public const int AreaboxesFieldNumber = 17;
    private static readonly pb::FieldCodec<global::Protobuf.ArenaBoxMsg> _repeated_areaboxes_codec
        = pb::FieldCodec.ForMessage(154, global::Protobuf.ArenaBoxMsg.Parser);
        = pb::FieldCodec.ForMessage(138, global::Protobuf.ArenaBoxMsg.Parser);
    private readonly pbc::RepeatedField<global::Protobuf.ArenaBoxMsg> areaboxes_ = new pbc::RepeatedField<global::Protobuf.ArenaBoxMsg>();
    /// <summary>
    /// !竞技宝箱列表
@@ -787,7 +766,7 @@
    }
    /// <summary>Field number for the "donate" field.</summary>
    public const int DonateFieldNumber = 20;
    public const int DonateFieldNumber = 18;
    private int donate_;
    /// <summary>
    /// 工会捐赠积分
@@ -818,8 +797,6 @@
      if (Headimg != other.Headimg) return false;
      if (Singature != other.Singature) return false;
      if (Level != other.Level) return false;
      if (Rank != other.Rank) return false;
      if (Score != other.Score) return false;
      if (Exp != other.Exp) return false;
      if (Money != other.Money) return false;
      if (Gold != other.Gold) return false;
@@ -844,8 +821,6 @@
      if (Headimg != 0) hash ^= Headimg.GetHashCode();
      if (Singature.Length != 0) hash ^= Singature.GetHashCode();
      if (Level != 0) hash ^= Level.GetHashCode();
      if (Rank != 0) hash ^= Rank.GetHashCode();
      if (Score != 0) hash ^= Score.GetHashCode();
      if (Exp != 0) hash ^= Exp.GetHashCode();
      if (Money != 0) hash ^= Money.GetHashCode();
      if (Gold != 0) hash ^= Gold.GetHashCode();
@@ -889,24 +864,16 @@
        output.WriteRawTag(40);
        output.WriteInt32(Level);
      }
      if (Rank != 0) {
        output.WriteRawTag(48);
        output.WriteInt32(Rank);
      }
      if (Score != 0) {
        output.WriteRawTag(56);
        output.WriteInt32(Score);
      }
      if (Exp != 0) {
        output.WriteRawTag(64);
        output.WriteRawTag(48);
        output.WriteInt32(Exp);
      }
      if (Money != 0) {
        output.WriteRawTag(72);
        output.WriteRawTag(56);
        output.WriteInt32(Money);
      }
      if (Gold != 0) {
        output.WriteRawTag(80);
        output.WriteRawTag(64);
        output.WriteInt32(Gold);
      }
      gems_.WriteTo(output, _repeated_gems_codec);
@@ -914,24 +881,24 @@
      gemdeck2_.WriteTo(output, _repeated_gemdeck2_codec);
      gemdeck3_.WriteTo(output, _repeated_gemdeck3_codec);
      if (Deckid != 0) {
        output.WriteRawTag(120);
        output.WriteRawTag(104);
        output.WriteInt32(Deckid);
      }
      if (Acceptfriend != false) {
        output.WriteRawTag(128, 1);
        output.WriteRawTag(112);
        output.WriteBool(Acceptfriend);
      }
      if (Namedchanged != false) {
        output.WriteRawTag(136, 1);
        output.WriteRawTag(120);
        output.WriteBool(Namedchanged);
      }
      if (Areaexp != 0) {
        output.WriteRawTag(144, 1);
        output.WriteRawTag(128, 1);
        output.WriteInt32(Areaexp);
      }
      areaboxes_.WriteTo(output, _repeated_areaboxes_codec);
      if (Donate != 0) {
        output.WriteRawTag(160, 1);
        output.WriteRawTag(144, 1);
        output.WriteInt32(Donate);
      }
    }
@@ -954,12 +921,6 @@
      if (Level != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
      }
      if (Rank != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
      }
      if (Score != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
      }
      if (Exp != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Exp);
      }
@@ -977,10 +938,10 @@
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Deckid);
      }
      if (Acceptfriend != false) {
        size += 2 + 1;
        size += 1 + 1;
      }
      if (Namedchanged != false) {
        size += 2 + 1;
        size += 1 + 1;
      }
      if (Areaexp != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
@@ -1011,12 +972,6 @@
      }
      if (other.Level != 0) {
        Level = other.Level;
      }
      if (other.Rank != 0) {
        Rank = other.Rank;
      }
      if (other.Score != 0) {
        Score = other.Score;
      }
      if (other.Exp != 0) {
        Exp = other.Exp;
@@ -1078,65 +1033,57 @@
            break;
          }
          case 48: {
            Rank = input.ReadInt32();
            break;
          }
          case 56: {
            Score = input.ReadInt32();
            break;
          }
          case 64: {
            Exp = input.ReadInt32();
            break;
          }
          case 72: {
          case 56: {
            Money = input.ReadInt32();
            break;
          }
          case 80: {
          case 64: {
            Gold = input.ReadInt32();
            break;
          }
          case 90: {
          case 74: {
            gems_.AddEntriesFrom(input, _repeated_gems_codec);
            break;
          }
          case 82:
          case 80: {
            gemdeck1_.AddEntriesFrom(input, _repeated_gemdeck1_codec);
            break;
          }
          case 90:
          case 88: {
            gemdeck2_.AddEntriesFrom(input, _repeated_gemdeck2_codec);
            break;
          }
          case 98:
          case 96: {
            gemdeck1_.AddEntriesFrom(input, _repeated_gemdeck1_codec);
            break;
          }
          case 106:
          case 104: {
            gemdeck2_.AddEntriesFrom(input, _repeated_gemdeck2_codec);
            break;
          }
          case 114:
          case 112: {
            gemdeck3_.AddEntriesFrom(input, _repeated_gemdeck3_codec);
            break;
          }
          case 120: {
          case 104: {
            Deckid = input.ReadInt32();
            break;
          }
          case 128: {
          case 112: {
            Acceptfriend = input.ReadBool();
            break;
          }
          case 136: {
          case 120: {
            Namedchanged = input.ReadBool();
            break;
          }
          case 144: {
          case 128: {
            Areaexp = input.ReadInt32();
            break;
          }
          case 154: {
          case 138: {
            areaboxes_.AddEntriesFrom(input, _repeated_areaboxes_codec);
            break;
          }
          case 160: {
          case 144: {
            Donate = input.ReadInt32();
            break;
          }
@@ -1178,7 +1125,7 @@
      headimg_ = other.headimg_;
      level_ = other.level_;
      rank_ = other.rank_;
      score_ = other.score_;
      areaexp_ = other.areaexp_;
      online_ = other.online_;
      gemdeck_ = other.gemdeck_.Clone();
    }
@@ -1249,17 +1196,17 @@
      }
    }
    /// <summary>Field number for the "score" field.</summary>
    public const int ScoreFieldNumber = 7;
    private int score_;
    /// <summary>Field number for the "areaexp" field.</summary>
    public const int AreaexpFieldNumber = 7;
    private int areaexp_;
    /// <summary>
    /// 分数
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Score {
      get { return score_; }
    public int Areaexp {
      get { return areaexp_; }
      set {
        score_ = value;
        areaexp_ = value;
      }
    }
@@ -1305,7 +1252,7 @@
      if (Headimg != other.Headimg) return false;
      if (Level != other.Level) return false;
      if (Rank != other.Rank) return false;
      if (Score != other.Score) return false;
      if (Areaexp != other.Areaexp) return false;
      if (Online != other.Online) return false;
      if(!gemdeck_.Equals(other.gemdeck_)) return false;
      return true;
@@ -1319,7 +1266,7 @@
      if (Headimg != 0) hash ^= Headimg.GetHashCode();
      if (Level != 0) hash ^= Level.GetHashCode();
      if (Rank != 0) hash ^= Rank.GetHashCode();
      if (Score != 0) hash ^= Score.GetHashCode();
      if (Areaexp != 0) hash ^= Areaexp.GetHashCode();
      if (Online != false) hash ^= Online.GetHashCode();
      hash ^= gemdeck_.GetHashCode();
      return hash;
@@ -1352,9 +1299,9 @@
        output.WriteRawTag(48);
        output.WriteInt32(Rank);
      }
      if (Score != 0) {
      if (Areaexp != 0) {
        output.WriteRawTag(56);
        output.WriteInt32(Score);
        output.WriteInt32(Areaexp);
      }
      if (Online != false) {
        output.WriteRawTag(64);
@@ -1381,8 +1328,8 @@
      if (Rank != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
      }
      if (Score != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
      if (Areaexp != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
      }
      if (Online != false) {
        size += 1 + 1;
@@ -1411,8 +1358,8 @@
      if (other.Rank != 0) {
        Rank = other.Rank;
      }
      if (other.Score != 0) {
        Score = other.Score;
      if (other.Areaexp != 0) {
        Areaexp = other.Areaexp;
      }
      if (other.Online != false) {
        Online = other.Online;
@@ -1449,7 +1396,7 @@
            break;
          }
          case 56: {
            Score = input.ReadInt32();
            Areaexp = input.ReadInt32();
            break;
          }
          case 64: {
@@ -2196,7 +2143,7 @@
      headimg_ = other.headimg_;
      position_ = other.position_;
      online_ = other.online_;
      score_ = other.score_;
      areaexp_ = other.areaexp_;
      level_ = other.level_;
      weekDonate_ = other.weekDonate_;
      totalDonate_ = other.totalDonate_;
@@ -2266,22 +2213,22 @@
      }
    }
    /// <summary>Field number for the "score" field.</summary>
    public const int ScoreFieldNumber = 6;
    private int score_;
    /// <summary>Field number for the "areaexp" field.</summary>
    public const int AreaexpFieldNumber = 6;
    private int areaexp_;
    /// <summary>
    /// 分数
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Score {
      get { return score_; }
    public int Areaexp {
      get { return areaexp_; }
      set {
        score_ = value;
        areaexp_ = value;
      }
    }
    /// <summary>Field number for the "level" field.</summary>
    public const int LevelFieldNumber = 7;
    public const int LevelFieldNumber = 8;
    private int level_;
    /// <summary>
    /// 等级
@@ -2295,7 +2242,7 @@
    }
    /// <summary>Field number for the "weekDonate" field.</summary>
    public const int WeekDonateFieldNumber = 8;
    public const int WeekDonateFieldNumber = 9;
    private int weekDonate_;
    /// <summary>
    ///  本周和总捐献数
@@ -2309,7 +2256,7 @@
    }
    /// <summary>Field number for the "totalDonate" field.</summary>
    public const int TotalDonateFieldNumber = 9;
    public const int TotalDonateFieldNumber = 10;
    private int totalDonate_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int TotalDonate {
@@ -2320,9 +2267,9 @@
    }
    /// <summary>Field number for the "gemdeck" field.</summary>
    public const int GemdeckFieldNumber = 10;
    public const int GemdeckFieldNumber = 11;
    private static readonly pb::FieldCodec<global::Protobuf.GemMsg> _repeated_gemdeck_codec
        = pb::FieldCodec.ForMessage(82, global::Protobuf.GemMsg.Parser);
        = pb::FieldCodec.ForMessage(90, global::Protobuf.GemMsg.Parser);
    private readonly pbc::RepeatedField<global::Protobuf.GemMsg> gemdeck_ = new pbc::RepeatedField<global::Protobuf.GemMsg>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public pbc::RepeatedField<global::Protobuf.GemMsg> Gemdeck {
@@ -2347,7 +2294,7 @@
      if (Headimg != other.Headimg) return false;
      if (Position != other.Position) return false;
      if (Online != other.Online) return false;
      if (Score != other.Score) return false;
      if (Areaexp != other.Areaexp) return false;
      if (Level != other.Level) return false;
      if (WeekDonate != other.WeekDonate) return false;
      if (TotalDonate != other.TotalDonate) return false;
@@ -2363,7 +2310,7 @@
      if (Headimg != 0) hash ^= Headimg.GetHashCode();
      if (Position != 0) hash ^= Position.GetHashCode();
      if (Online != false) hash ^= Online.GetHashCode();
      if (Score != 0) hash ^= Score.GetHashCode();
      if (Areaexp != 0) hash ^= Areaexp.GetHashCode();
      if (Level != 0) hash ^= Level.GetHashCode();
      if (WeekDonate != 0) hash ^= WeekDonate.GetHashCode();
      if (TotalDonate != 0) hash ^= TotalDonate.GetHashCode();
@@ -2398,20 +2345,20 @@
        output.WriteRawTag(40);
        output.WriteBool(Online);
      }
      if (Score != 0) {
      if (Areaexp != 0) {
        output.WriteRawTag(48);
        output.WriteInt32(Score);
        output.WriteInt32(Areaexp);
      }
      if (Level != 0) {
        output.WriteRawTag(56);
        output.WriteRawTag(64);
        output.WriteInt32(Level);
      }
      if (WeekDonate != 0) {
        output.WriteRawTag(64);
        output.WriteRawTag(72);
        output.WriteInt32(WeekDonate);
      }
      if (TotalDonate != 0) {
        output.WriteRawTag(72);
        output.WriteRawTag(80);
        output.WriteInt32(TotalDonate);
      }
      gemdeck_.WriteTo(output, _repeated_gemdeck_codec);
@@ -2435,8 +2382,8 @@
      if (Online != false) {
        size += 1 + 1;
      }
      if (Score != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
      if (Areaexp != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
      }
      if (Level != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
@@ -2471,8 +2418,8 @@
      if (other.Online != false) {
        Online = other.Online;
      }
      if (other.Score != 0) {
        Score = other.Score;
      if (other.Areaexp != 0) {
        Areaexp = other.Areaexp;
      }
      if (other.Level != 0) {
        Level = other.Level;
@@ -2515,22 +2462,22 @@
            break;
          }
          case 48: {
            Score = input.ReadInt32();
            break;
          }
          case 56: {
            Level = input.ReadInt32();
            Areaexp = input.ReadInt32();
            break;
          }
          case 64: {
            WeekDonate = input.ReadInt32();
            Level = input.ReadInt32();
            break;
          }
          case 72: {
            WeekDonate = input.ReadInt32();
            break;
          }
          case 80: {
            TotalDonate = input.ReadInt32();
            break;
          }
          case 82: {
          case 90: {
            gemdeck_.AddEntriesFrom(input, _repeated_gemdeck_codec);
            break;
          }
Assets/Scripts/Net/NetExtends/Game.cs
@@ -108,12 +108,13 @@
            "bmRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIjCgZmYW1pbHkYAiABKAsyEy5w",
            "cm90b2J1Zi5GYW1pbHlNc2ciHQoORmFtaWx5Sm9pbl9DMlMSCwoDdWlkGAEg",
            "ASgJIjAKDkZhbWlseUpvaW5fUzJDEhEKCWVycm9yY29kZRgBIAEoBRILCgN1",
            "aWQYAiABKAkiIgoRRmFtaWx5R2V0Q2hhdF9DMlMSDQoFbGltaXQYASABKAUi",
            "ZgoRRmFtaWx5R2V0Q2hhdF9TMkMSEQoJZXJyb3Jjb2RlGAEgASgFEikKCG1l",
            "c3NhZ2VzGAIgAygLMhcucHJvdG9idWYuRmFtaWx5Q2hhdE1zZxITCgtvbmxp",
            "bmVDb3VudBgEIAEoBSJMChNGYW1pbHlTdGFydENoYXRfQzJTEiQKCGNoYXRU",
            "eXBlGAEgASgOMhIucHJvdG9idWYuQ2hhdFR5cGUSDwoHY29udGVudBgCIAEo",
            "CSJSChNGYW1pbHlTdGFydENoYXRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIo",
            "aWQYAiABKAkiMQoRRmFtaWx5R2V0Q2hhdF9DMlMSDQoFc3RhcnQYASABKAUS",
            "DQoFbGltaXQYAiABKAUidQoRRmFtaWx5R2V0Q2hhdF9TMkMSEQoJZXJyb3Jj",
            "b2RlGAEgASgFEikKCG1lc3NhZ2VzGAIgAygLMhcucHJvdG9idWYuRmFtaWx5",
            "Q2hhdE1zZxINCgV0b3RhbBgDIAEoBRITCgtvbmxpbmVDb3VudBgEIAEoBSJb",
            "ChNGYW1pbHlTdGFydENoYXRfQzJTEiQKCGNoYXRUeXBlGAEgASgOMhIucHJv",
            "dG9idWYuQ2hhdFR5cGUSDwoHY29udGVudBgCIAEoCRINCgVnZW1JZBgDIAEo",
            "BSJSChNGYW1pbHlTdGFydENoYXRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIo",
            "CgdtZXNzYWdlGAIgASgLMhcucHJvdG9idWYuRmFtaWx5Q2hhdE1zZyIqChVG",
            "YW1pbHlTdGFydERvbmF0ZV9DMlMSEQoJbWVzc2FnZUlkGAEgASgFIlQKFUZh",
            "bWlseVN0YXJ0RG9uYXRlX1MyQxIRCgllcnJvcmNvZGUYASABKAUSKAoHbWVz",
@@ -202,9 +203,9 @@
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyFind_S2C), global::Protobuf.FamilyFind_S2C.Parser, new[]{ "Errorcode", "Family" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyJoin_C2S), global::Protobuf.FamilyJoin_C2S.Parser, new[]{ "Uid" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyJoin_S2C), global::Protobuf.FamilyJoin_S2C.Parser, new[]{ "Errorcode", "Uid" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_C2S), global::Protobuf.FamilyGetChat_C2S.Parser, new[]{ "Limit" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_S2C), global::Protobuf.FamilyGetChat_S2C.Parser, new[]{ "Errorcode", "Messages", "OnlineCount" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_C2S), global::Protobuf.FamilyStartChat_C2S.Parser, new[]{ "ChatType", "Content" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_C2S), global::Protobuf.FamilyGetChat_C2S.Parser, new[]{ "Start", "Limit" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_S2C), global::Protobuf.FamilyGetChat_S2C.Parser, new[]{ "Errorcode", "Messages", "Total", "OnlineCount" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_C2S), global::Protobuf.FamilyStartChat_C2S.Parser, new[]{ "ChatType", "Content", "GemId" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_S2C), global::Protobuf.FamilyStartChat_S2C.Parser, new[]{ "Errorcode", "Message" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartDonate_C2S), global::Protobuf.FamilyStartDonate_C2S.Parser, new[]{ "MessageId" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartDonate_S2C), global::Protobuf.FamilyStartDonate_S2C.Parser, new[]{ "Errorcode", "Message" }, null, null, null),
@@ -8716,6 +8717,9 @@
    /// <summary>Field number for the "errorcode" field.</summary>
    public const int ErrorcodeFieldNumber = 1;
    private int errorcode_;
    /// <summary>
    /// NotEnough_Level,Input_Invalid
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Errorcode {
      get { return errorcode_; }
@@ -8987,6 +8991,9 @@
    /// <summary>Field number for the "errorcode" field.</summary>
    public const int ErrorcodeFieldNumber = 1;
    private int errorcode_;
    /// <summary>
    ///  NotEnough_Level,AlreadyIn_Family
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Errorcode {
      get { return errorcode_; }
@@ -9258,6 +9265,9 @@
    /// <summary>Field number for the "errorcode" field.</summary>
    public const int ErrorcodeFieldNumber = 1;
    private int errorcode_;
    /// <summary>
    ///  NotEnough_Level,AlreadyIn_Family,NotExist_Family
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Errorcode {
      get { return errorcode_; }
@@ -9394,6 +9404,7 @@
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public FamilyGetChat_C2S(FamilyGetChat_C2S other) : this() {
      start_ = other.start_;
      limit_ = other.limit_;
    }
@@ -9402,13 +9413,23 @@
      return new FamilyGetChat_C2S(this);
    }
    /// <summary>Field number for the "limit" field.</summary>
    public const int LimitFieldNumber = 1;
    private int limit_;
    /// <summary>Field number for the "start" field.</summary>
    public const int StartFieldNumber = 1;
    private int start_;
    /// <summary>
    ///  0是最后一页,1倒数第二页
    /// int32 start = 1;
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Start {
      get { return start_; }
      set {
        start_ = value;
      }
    }
    /// <summary>Field number for the "limit" field.</summary>
    public const int LimitFieldNumber = 2;
    private int limit_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Limit {
      get { return limit_; }
@@ -9430,6 +9451,7 @@
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (Start != other.Start) return false;
      if (Limit != other.Limit) return false;
      return true;
    }
@@ -9437,6 +9459,7 @@
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public override int GetHashCode() {
      int hash = 1;
      if (Start != 0) hash ^= Start.GetHashCode();
      if (Limit != 0) hash ^= Limit.GetHashCode();
      return hash;
    }
@@ -9448,8 +9471,12 @@
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public void WriteTo(pb::CodedOutputStream output) {
      if (Limit != 0) {
      if (Start != 0) {
        output.WriteRawTag(8);
        output.WriteInt32(Start);
      }
      if (Limit != 0) {
        output.WriteRawTag(16);
        output.WriteInt32(Limit);
      }
    }
@@ -9457,6 +9484,9 @@
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int CalculateSize() {
      int size = 0;
      if (Start != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Start);
      }
      if (Limit != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Limit);
      }
@@ -9467,6 +9497,9 @@
    public void MergeFrom(FamilyGetChat_C2S other) {
      if (other == null) {
        return;
      }
      if (other.Start != 0) {
        Start = other.Start;
      }
      if (other.Limit != 0) {
        Limit = other.Limit;
@@ -9482,6 +9515,10 @@
            input.SkipLastField();
            break;
          case 8: {
            Start = input.ReadInt32();
            break;
          }
          case 16: {
            Limit = input.ReadInt32();
            break;
          }
@@ -9517,6 +9554,7 @@
    public FamilyGetChat_S2C(FamilyGetChat_S2C other) : this() {
      errorcode_ = other.errorcode_;
      messages_ = other.messages_.Clone();
      total_ = other.total_;
      onlineCount_ = other.onlineCount_;
    }
@@ -9546,11 +9584,21 @@
      get { return messages_; }
    }
    /// <summary>Field number for the "total" field.</summary>
    public const int TotalFieldNumber = 3;
    private int total_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int Total {
      get { return total_; }
      set {
        total_ = value;
      }
    }
    /// <summary>Field number for the "onlineCount" field.</summary>
    public const int OnlineCountFieldNumber = 4;
    private int onlineCount_;
    /// <summary>
    /// int32 total=3;
    ///  公会在线玩家数
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9576,6 +9624,7 @@
      }
      if (Errorcode != other.Errorcode) return false;
      if(!messages_.Equals(other.messages_)) return false;
      if (Total != other.Total) return false;
      if (OnlineCount != other.OnlineCount) return false;
      return true;
    }
@@ -9585,6 +9634,7 @@
      int hash = 1;
      if (Errorcode != 0) hash ^= Errorcode.GetHashCode();
      hash ^= messages_.GetHashCode();
      if (Total != 0) hash ^= Total.GetHashCode();
      if (OnlineCount != 0) hash ^= OnlineCount.GetHashCode();
      return hash;
    }
@@ -9601,6 +9651,10 @@
        output.WriteInt32(Errorcode);
      }
      messages_.WriteTo(output, _repeated_messages_codec);
      if (Total != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(Total);
      }
      if (OnlineCount != 0) {
        output.WriteRawTag(32);
        output.WriteInt32(OnlineCount);
@@ -9614,6 +9668,9 @@
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Errorcode);
      }
      size += messages_.CalculateSize(_repeated_messages_codec);
      if (Total != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Total);
      }
      if (OnlineCount != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(OnlineCount);
      }
@@ -9629,6 +9686,9 @@
        Errorcode = other.Errorcode;
      }
      messages_.Add(other.messages_);
      if (other.Total != 0) {
        Total = other.Total;
      }
      if (other.OnlineCount != 0) {
        OnlineCount = other.OnlineCount;
      }
@@ -9648,6 +9708,10 @@
          }
          case 18: {
            messages_.AddEntriesFrom(input, _repeated_messages_codec);
            break;
          }
          case 24: {
            Total = input.ReadInt32();
            break;
          }
          case 32: {
@@ -9689,6 +9753,7 @@
    public FamilyStartChat_C2S(FamilyStartChat_C2S other) : this() {
      chatType_ = other.chatType_;
      content_ = other.content_;
      gemId_ = other.gemId_;
    }
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9718,6 +9783,17 @@
      }
    }
    /// <summary>Field number for the "gemId" field.</summary>
    public const int GemIdFieldNumber = 3;
    private int gemId_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public int GemId {
      get { return gemId_; }
      set {
        gemId_ = value;
      }
    }
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public override bool Equals(object other) {
      return Equals(other as FamilyStartChat_C2S);
@@ -9733,6 +9809,7 @@
      }
      if (ChatType != other.ChatType) return false;
      if (Content != other.Content) return false;
      if (GemId != other.GemId) return false;
      return true;
    }
@@ -9741,6 +9818,7 @@
      int hash = 1;
      if (ChatType != 0) hash ^= ChatType.GetHashCode();
      if (Content.Length != 0) hash ^= Content.GetHashCode();
      if (GemId != 0) hash ^= GemId.GetHashCode();
      return hash;
    }
@@ -9759,6 +9837,10 @@
        output.WriteRawTag(18);
        output.WriteString(Content);
      }
      if (GemId != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(GemId);
      }
    }
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9769,6 +9851,9 @@
      }
      if (Content.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Content);
      }
      if (GemId != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GemId);
      }
      return size;
    }
@@ -9783,6 +9868,9 @@
      }
      if (other.Content.Length != 0) {
        Content = other.Content;
      }
      if (other.GemId != 0) {
        GemId = other.GemId;
      }
    }
@@ -9802,6 +9890,10 @@
            Content = input.ReadString();
            break;
          }
          case 24: {
            GemId = input.ReadInt32();
            break;
          }
        }
      }
    }
Assets/Scripts/Net/NetExtends/Table.cs
@@ -42,6 +42,8 @@
            "endless_buff.json",
            "endless_enemy.json",
            "endless_port.json",
            "endless_teachport.json",
            "donaterule.json",
            "scoreshop.json",
            "donateshop.json",
            "gemcost.json",
@@ -197,6 +199,28 @@
                    foreach (JsonData item in data)
                    {
                        endless_port tmp = endless_port.CreateFromJson(item);
                        allData.Add(tmp as tabledata);
                    }
                    JsonDataCenter.allData.Add(tablename, allData);
                    break;
                case "endless_teachport":
                    //allData.Clear();
                    foreach (JsonData item in data)
                    {
                        endless_teachport tmp = endless_teachport.CreateFromJson(item);
                        allData.Add(tmp as tabledata);
                    }
                    JsonDataCenter.allData.Add(tablename, allData);
                    break;
                case "donaterule":
                    //allData.Clear();
                    foreach (JsonData item in data)
                    {
                        donaterule tmp = donaterule.CreateFromJson(item);
                        allData.Add(tmp as tabledata);
                    }
                    JsonDataCenter.allData.Add(tablename, allData);
@@ -1000,6 +1024,124 @@
    }
    //! 生成文件 endless_teachport(无尽模式新手引导关卡).xlsx
    public class endless_teachport : tabledata {
        public int getid(){
            return id;
        }
        // id
        public int id;
        // 关卡等级
        public int level;
        // Boss名称
        public string boss_name;
        // Boss资源id
        public int resource;
        // 波次
        public int wave;
        // 赛道
        public int tunel;
        // 敌人id
        public int enemy_id;
        // 本波次敌人数量
        public int amount;
        // 本赛道出怪间隔
        public int interval;
        // 怪物基础血量
        public int b_hp;
        // 怪物基础速度
        public float b_speed;
        // 掉落基础金币
        public int b_coin;
        // 波次间隔
        public int cooldown;
        // 怪物掉落
        public List<reward> drop;
        // 掉落概率
        public List<int> drop_rate;
        // 法阵图片
        public int tunel_bg;
        public static endless_teachport CreateFromJson(JsonData item)
        {
            endless_teachport _endless_teachport = new endless_teachport();
            int index = 0;
            _endless_teachport.id = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.level = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.boss_name = GameUtils.GetString(item[index++].ToString());
            _endless_teachport.resource = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.wave = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.tunel = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.enemy_id = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.amount = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.interval = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.b_hp = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.b_speed = float.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.b_coin = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.cooldown = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _endless_teachport.drop = GameUtils.GetRewardList(item[index++]);
            _endless_teachport.drop_rate = GameUtils.GetIntList(item[index++]);
            _endless_teachport.tunel_bg = int.Parse(GameUtils.GetString(item[index++].ToString()));
            return _endless_teachport;
        }
    }
    //! 生成文件 G_donaterule(公会捐赠卡规则).xlsx
    public class donaterule : tabledata {
        public int getid(){
            return id;
        }
        // 标识符
        public int id;
        // 竞技场等级
        public List<int> ranklevle;
        // 发起请求后可获得的卡牌数
        public List<string> canreward;
        // 可捐赠给他人的卡牌数
        public List<string> candonate;
        public static donaterule CreateFromJson(JsonData item)
        {
            donaterule _donaterule = new donaterule();
            int index = 0;
            _donaterule.id = int.Parse(GameUtils.GetString(item[index++].ToString()));
            _donaterule.ranklevle = GameUtils.GetIntList(item[index++]);
            _donaterule.canreward = GameUtils.GetStringList(item[index++]);
            _donaterule.candonate = GameUtils.GetStringList(item[index++]);
            return _donaterule;
        }
    }
    //! 生成文件 G_公会积分商店.xlsx
    public class scoreshop : tabledata {
        public int getid(){
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -8,6 +8,7 @@
using TowerDefense.Towers;
using TowerDefense.Towers.Projectiles;
using UnityEngine;
using KTGMGemClient;
namespace TowerDefense.Affectors
{
@@ -112,7 +113,6 @@
        protected float energyCalTime = 0;
        protected float fInEnergy = 0;
        protected float fBackupTimer = 0.0f;
        /// <summary>
        /// Gets the search rate from the targetter
        /// </summary>
@@ -274,6 +274,7 @@
                    fInEnergy -= Time.deltaTime;
                    if( fInEnergy <= 0)
                    {
                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                        fInEnergy = 0.0f;
                        this.energyCalTime = 0.0f;    
                        towerPtr.energyCtl.SetEnergyProgress(0);
Assets/Scripts/TowerDefense/Agents/Agent.cs
@@ -193,6 +193,12 @@
        protected bool bInDeathAct = false;
        /// <summary>
        /// 原地罚站
        /// </summary>
        /// <param name="can"></param>
        public bool CanMove { get; set; } = true;
        /// <summary>
        /// Gets the attached nav mesh agent velocity
        /// </summary>
        public override Vector3 velocity
@@ -848,7 +854,7 @@
            this.UpdateAction();
            // 处理死亡状态了,不必再移动:
            if (bInDeathAct) return;
            if (bInDeathAct || !CanMove) return;
            m_Destination = initNode.GetNextNode();
            updateAgentPos(Time.deltaTime);
Assets/Scripts/TowerDefense/Level/AgentInsManager.cs
@@ -223,6 +223,30 @@
        return agentWaveLineArray;
    }
    /// <summary>
    /// 设置某条兵线的所有小兵的移动状态
    /// </summary>
    /// <param name="waveLineId">兵线id 1~5, 如果是-1则设置所有兵线的状态</param>
    /// <param name="canMove">是否可以移动</param>
    /// <param name="isOppo">是否是敌方</param>
    public void SetWaveLineCanMove(int waveLineId, bool canMove, bool isOppo)
    {
        WaveLineAgentInsMgr[] waveLineAgents = isOppo ? getOppoWaveLineList() : GetWaveLineList();
        for (int i = 0; i < waveLineAgents.Length; ++i)
        {
            if (i == waveLineId - 1 || waveLineId == -1)
            {
                List<Agent> list = waveLineAgents[i].listAgent;
                for (int j = 0; j < list.Count; ++j)
                {
                    list[j].CanMove = canMove;
                }
            }
        }
    }
    public List<Agent> agentList
    {
        get { return this.agentInsList; }
Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
@@ -156,6 +156,11 @@
        private bool isBuffSelectCompleted = true;
        /// <summary>
        /// 新手第一关是否完成
        /// </summary>
        private bool isFirstLevelCompleted = false;
        /// <summary>
        /// 切换基地
        /// </summary>
        /// <param name="index">列索引</param>
@@ -306,8 +311,19 @@
            // 本关卡所有波次全部生成完成 && 敌人全部被清理了,然后就去尝试进入下一关
            if (EndlessLeveltate == LevelState.SpawningEnemies && IsAllWaveCompleted && NumberOfEnemies == 0)
            {
                if (!UpdateLevel())
                    ChangeLevelState(LevelState.AllEnemiesSpawned);
                // 新手的话,第一关完了暂停
                if (!GameConfig.IsNewbie)
                {
                    if (!UpdateLevel())
                        ChangeLevelState(LevelState.AllEnemiesSpawned);
                }
                else if (!isFirstLevelCompleted)
                {
                    isFirstLevelCompleted = true;
                    EndlessUIStart.instance.Pause();
                    // 第一关的怪全部被杀光
                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone);
                }
            }
        }
@@ -344,9 +360,6 @@
            ++CurrentLevel;
            IsAllWaveCompleted = false;
            // 进入boss虚弱状态
            Debug.Log("--------------------- 进入boss虚弱状态 ---------------------");
            // 所有关卡全部结束
            if (CurrentLevel > EndlessPortData.MaxLevel)
                return false;
@@ -372,7 +385,14 @@
        private void BeginLevel()
        {
            if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
            ShowSelectBuffUI();
            if (!GameConfig.IsNewbie)
                ShowSelectBuffUI();
            else
            {
                EndlessUIStart.instance.Restart();
                WaveManager.StartWaves(CurrentLevel);
            }
        }
        /// <summary>
@@ -497,5 +517,27 @@
                --WaveManager.TotalWaveLines;
            }
        }
        /// <summary>
        /// 暂停波次,小怪停止移动,塔停止攻击
        /// </summary>
        public void PauseWave()
        {
            EndlessUIStart.instance.Pause();
            AgentInsManager.instance.SetWaveLineCanMove(-1, false, false);
            WaveManager.PauseAllWave();
            EndlessGameUI.instance.SetAttackingTowerState(false);
        }
        /// <summary>
        /// 恢复波次,小怪
        /// </summary>
        public void RestartWave()
        {
            EndlessUIStart.instance.Restart();
            AgentInsManager.instance.SetWaveLineCanMove(-1, true, false);
            WaveManager.RestartAllWave();
            EndlessGameUI.instance.SetAttackingTowerState(true);
        }
    }
}
Assets/Scripts/TowerDefense/Level/EndlessWave.cs
@@ -99,6 +99,18 @@
            isWaveStoped = true;
        }
        public void PauseWave()
        {
            PauseTimer(spawnTimer);
            isWaveStoped = true;
        }
        public void RestartWave()
        {
            StartTimer(spawnTimer);
            isWaveStoped = false;
        }
        /// <summary>
        /// Handles spawning the current agent and sets up the next agent for spawning
        /// 在场景内孵化出来一个Boss,这个核心函数最后被规则性的数据接管
Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs
@@ -226,6 +226,30 @@
        }
        /// <summary>
        /// 暂停所有兵线出兵
        /// </summary>
        public void PauseAllWave()
        {
            foreach (EndlessPortConfig data in waveData)
            {
                if (waves[data.Config.tunel - 1].LineState == EndlessWaveLineState.Spawning)
                    waves[data.Config.tunel - 1].PauseWave();
            }
        }
        /// <summary>
        /// 恢复所有兵线出兵
        /// </summary>
        public void RestartAllWave()
        {
            foreach (EndlessPortConfig data in waveData)
            {
                if (waves[data.Config.tunel - 1].LineState == EndlessWaveLineState.Spawning)
                    waves[data.Config.tunel - 1].RestartWave();
            }
        }
        /// <summary>
        /// 一波结束了
        /// </summary>
        private void OneWaveCompleted()
Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs
@@ -3,145 +3,146 @@
namespace TowerDefense.Towers.Placement
{
    /// <summary>
    /// An interface for a placement area that can contain a tower
    /// </summary>
    public interface IPlacementArea
    {
        /// <summary>
        /// Gets this object's transform
        /// </summary>
        Transform transform { get; }
    /// <summary>
    /// An interface for a placement area that can contain a tower
    /// </summary>
    public interface IPlacementArea
    {
        /// <summary>
        /// Gets this object's transform
        /// </summary>
        Transform transform { get; }
        /// <summary>
        /// 获取当前PlaceMentArea的Size.
        /// </summary>
        IntVector2 getdimsize();
        /// <summary>
        /// 获取当前PlaceMentArea的Size.
        /// </summary>
        IntVector2 getdimsize();
        /// <summary>
        /// 获取一个可以放置塔防的位置.
        /// </summary>
        /// <returns></returns>
        IntVector2 getFreePos(int xdim,int ydim,bool forceGet = false );
        /// <summary>
        /// 获取一个可以放置塔防的位置.
        /// </summary>
        /// <returns></returns>
        IntVector2 getFreePos(int xdim, int ydim, bool forceGet = false);
        /// <summary>
        /// 获取对应位置的充能子弹界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        BulletUICtl GetBulletUICtl(int x);
        /// <summary>
        /// 获取对应位置的充能子弹界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        BulletUICtl GetBulletUICtl(int x, int y);
        /// <summary>
        /// 获取对应位置的能量条界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        EnergyUICtl GetEnergyUICtl(int x);
        /// <summary>
        /// 获取对应位置的能量条界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        EnergyUICtl GetEnergyUICtl(int x, int y);
        /// <summary>
        /// 是否空置的攻击位
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isFreeAtackPos(int x, int y);
        /// <summary>
        /// 是否空置的攻击位
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isFreeAtackPos(int x, int y);
        /// <summary>
        /// 是否有已开启的可放置攻击位置。
        /// </summary>
        /// <returns></returns>
        bool hasFreeAttackPos();
        /// <summary>
        /// 是否有已开启的可放置攻击位置。
        /// </summary>
        /// <returns></returns>
        bool hasFreeAttackPos();
        /// <summary>
        /// 是否是等待购买的攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isWaitBuyGrid(int x, int y);
        /// <summary>
        /// 是否是等待购买的攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isWaitBuyGrid(int x, int y);
        void startCoinGenMode();
        void startCoinGenMode();
        /// <summary>
        /// 购买对应的待购攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool buyWaitBuyGrid(int x, int y);
        /// <summary>
        /// 购买对应的待购攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool buyWaitBuyGrid(int x, int y);
        /// <summary>
        /// 设置某一个格子为已破坏塔位。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetDestroyedGrid(int x, int y );
        /// <summary>
        /// 设置某一个格子为已破坏塔位。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetDestroyedGrid(int x, int y);
        /// <summary>
        /// 设置格子为合成状态。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetComboGrid(int x, int y);
        /// <summary>
        /// 设置格子为合成状态。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetComboGrid(int x, int y);
        /// <summary>
        /// 设置塔位的血条血量数据
        /// </summary>
        /// <param name="ix"></param>
        /// <param name="health"></param>
        void setTowerPosHealth(int ix, float health);
        /// <summary>
        /// 设置塔位的血条血量数据
        /// </summary>
        /// <param name="ix"></param>
        /// <param name="health"></param>
        void setTowerPosHealth(int ix, float health);
        /// <summary>
        /// Calculates the grid position from a given world position, offset to center for a specific size object
        /// </summary>
        IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset);
        /// <summary>
        /// Calculates the grid position from a given world position, offset to center for a specific size object
        /// </summary>
        IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset);
        /// <summary>
        /// Calculates the snapped world position from a given grid position
        /// </summary>
        Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset);
        /// <summary>
        /// Calculates the snapped world position from a given grid position
        /// </summary>
        Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset);
        /// <summary>
        /// 当前是否是反方的TowerPlacementGrid.
        /// </summary>
        bool isOpponent();
        /// <summary>
        /// 当前是否是反方的TowerPlacementGrid.
        /// </summary>
        bool isOpponent();
        /// <summary>
        /// Gets whether an object of a given size would fit on this grid at the given location
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        /// <returns>True if the item would fit at <paramref name="gridPos"/></returns>
        TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size);
        /// <summary>
        /// Gets whether an object of a given size would fit on this grid at the given location
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        /// <returns>True if the item would fit at <paramref name="gridPos"/></returns>
        TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size);
        /// <summary>
        /// Occupy the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Occupy(IntVector2 gridPos, IntVector2 size);
        /// <summary>
        /// Occupy the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Occupy(IntVector2 gridPos, IntVector2 size);
        /// <summary>
        /// Clear the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Clear(IntVector2 gridPos, IntVector2 size);
    }
        /// <summary>
        /// Clear the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Clear(IntVector2 gridPos, IntVector2 size);
    }
    public static class PlacementAreaExtensions
    {
        /// <summary>
        /// Snaps a given world positionn to this grid
        /// </summary>
        public static Vector3 Snap(this IPlacementArea placementArea, Vector3 worldPosition, IntVector2 sizeOffset)
        {
            // Calculate the nearest grid location and then change that back to world space
            return placementArea.GridToWorld(placementArea.WorldToGrid(worldPosition, sizeOffset), sizeOffset);
        }
    }
    public static class PlacementAreaExtensions
    {
        /// <summary>
        /// Snaps a given world positionn to this grid
        /// </summary>
        public static Vector3 Snap(this IPlacementArea placementArea, Vector3 worldPosition, IntVector2 sizeOffset)
        {
            // Calculate the nearest grid location and then change that back to world space
            return placementArea.GridToWorld(placementArea.WorldToGrid(worldPosition, sizeOffset), sizeOffset);
        }
    }
}
Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs
@@ -76,7 +76,7 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public BulletUICtl GetBulletUICtl(int x)
        public BulletUICtl GetBulletUICtl(int x, int y)
        {
            return null;
        }
@@ -87,7 +87,7 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public EnergyUICtl GetEnergyUICtl(int x)
        public EnergyUICtl GetEnergyUICtl(int x, int y)
        {
            return null;
        }
Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs
@@ -176,7 +176,7 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public BulletUICtl GetBulletUICtl(int x)
        public BulletUICtl GetBulletUICtl(int x, int y)
        {
            return this.arrTowerBulletUi[x];
        }
@@ -186,7 +186,7 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public EnergyUICtl GetEnergyUICtl(int x)
        public EnergyUICtl GetEnergyUICtl(int x, int y)
        {
            return this.arrTowerEnergyUi[x];
        }
@@ -768,7 +768,7 @@
                img.transform.SetAsFirstSibling();
                EnergyUICtl euc = img.GetComponent<EnergyUICtl>();
                arrTowerEnergyUi[x] = euc;
                euc.gameObject.SetActive(false);
                // euc.gameObject.SetActive(false);
            }
            return;
Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs
@@ -106,6 +106,26 @@
        public int AttackRowNumbers { get; } = 2;
        /// <summary>
        /// 攻击塔位对应的子弹UI位置信息.
        /// </summary>
        private Vector2[,] m_arrTowerBulletUIPos;
        private BulletUICtl[,] arrTowerBulletUi;
        private EnergyUICtl[,] arrTowerEnergyUi;
        /// <summary>
        /// 此位置上塔对应的子弹充能Prefab.塔放置到当前的塔位后,如果是对应的塔防类型,需要把
        /// 相应的界面指针传到塔防的数据结构内。
        /// </summary>
        public GameObject towerBulletUIPrefab;
        /// <summary>
        /// 充能条对应的界面
        /// </summary>
        public GameObject towerEnergyUIPrefab;
        /// <summary>
        /// Converts a location in world space into local grid coordinates.
        /// </summary>
        /// <param name="worldLocation"><see cref="Vector3"/> indicating world space coordinates to convert.</param>
@@ -147,9 +167,9 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public BulletUICtl GetBulletUICtl(int x)
        public BulletUICtl GetBulletUICtl(int x, int y)
        {
            return null;
            return arrTowerBulletUi[x, 3 - y];
        }
        /// <summary>
@@ -157,9 +177,9 @@
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public EnergyUICtl GetEnergyUICtl(int x)
        public EnergyUICtl GetEnergyUICtl(int x, int y)
        {
            return null;
            return arrTowerEnergyUi[x, 3 - y];
        }
@@ -618,12 +638,19 @@
            arrTowerBloodUi = new TowerBloodVis[dimensions.x, AttackRowNumbers];
            int dy = dimensions.y - 1;
            // 处理攻击塔位对应的血条
            m_arrTowerBulletUIPos = new Vector2[dimensions.x, AttackRowNumbers];
            arrTowerBulletUi = new BulletUICtl[dimensions.x, AttackRowNumbers];
            arrTowerEnergyUi = new EnergyUICtl[dimensions.x, AttackRowNumbers];
            for (int x = 0; x < dimensions.x; x++)
            {
                for (int y = 0; y < AttackRowNumbers; ++y)
                {
                    m_arrTowerBloodUIPos[x, y].x = arrGridCentPos[x, dy - y].x;
                    m_arrTowerBloodUIPos[x, y].y = arrGridCentPos[x, dy - y].y;
                    m_arrTowerBulletUIPos[x, y].x = arrGridCentPos[x, dy - y].x;
                    m_arrTowerBulletUIPos[x, y].y = arrGridCentPos[x, dy - y].y;
                    GameObject img = Instantiate(towerBloodUIPrefab);
                    GameObject container = GameObject.Find("BuyButtonContainer");
@@ -631,7 +658,7 @@
                    Vector3 tpos = img.transform.position;
                    tpos.x = m_arrTowerBloodUIPos[x, y].x;
                    tpos.z = m_arrTowerBloodUIPos[x, y].y + 4.2f - y * 1.66f;
                    tpos.y = 30;
                    tpos.y = 30f;
                    img.transform.position = tpos;
                    img.transform.localScale = Vector3.one;
                    img.transform.localRotation = Quaternion.identity;
@@ -639,6 +666,35 @@
                    TowerBloodVis tbv = img.GetComponent<TowerBloodVis>();
                    arrTowerBloodUi[x, y] = tbv;
                    tbv.gameObject.SetActive(false);
                    img = Instantiate(towerBulletUIPrefab);
                    img.transform.SetParent(container.transform, true);
                    tpos = img.transform.position;
                    tpos.x = m_arrTowerBulletUIPos[x, y].x + 4.2f;
                    tpos.z = m_arrTowerBulletUIPos[x, y].y + 1.1f -  y * 1.66f;
                    tpos.y = 30f;
                    img.transform.position = tpos;
                    img.transform.localScale = Vector3.one;
                    img.transform.localRotation = Quaternion.identity;
                    BulletUICtl buc = img.GetComponent<BulletUICtl>();
                    arrTowerBulletUi[x, y] = buc;
                    buc.gameObject.SetActive(false);
                    // 把充能条也创建出来了.
                    img = Instantiate(towerEnergyUIPrefab);
                    img.transform.SetParent(container.transform);
                    tpos = img.transform.position;
                    tpos.x = m_arrTowerBulletUIPos[x, y].x + 4.2f;
                    tpos.z = m_arrTowerBulletUIPos[x, y].y + 1.1f - y * 1.66f;
                    tpos.y = 30f;
                    img.transform.position = tpos;
                    img.transform.localScale = Vector3.one;
                    img.transform.localRotation = Quaternion.identity;
                    EnergyUICtl euc = img.GetComponent<EnergyUICtl>();
                    arrTowerEnergyUi[x, y] = euc;
                    euc.gameObject.SetActive(false);
                }
            }
        }
Assets/Scripts/TowerDefense/Towers/Tower.cs
@@ -140,7 +140,7 @@
        {
            if (!materialTowerAttackSelf) return;
            if( opponentSide)
            if (opponentSide)
            {
                if (attack && (this.curActionState != 2))
                {
@@ -150,7 +150,7 @@
                if ((!attack) && (this.curActionState != 1))
                {
                    currentTowerLevel.SetTowerMonsterMat( materialTowerWaitOppo );
                    currentTowerLevel.SetTowerMonsterMat(materialTowerWaitOppo);
                    this.curActionState = 1;
                }
            }
@@ -224,9 +224,8 @@
        protected void OnTowerUICtrl()
        {
            //
            // 根据是否是子弹塔防来决定是否显示相应的界面
            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x);
            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
            if (buc == null) return;
@@ -245,8 +244,8 @@
            }
            // 根据是否是能量充能来决定是否显示相应的界面.
            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x);
            if( (eTowerFuntion == ETowerFuntion.ENERGY) &&(euc != null ))
            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
            if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
            {
                // 设置数据
                euc.gameObject.SetActive(true);
Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs
@@ -52,6 +52,14 @@
    {
        if (bWaitOpen) return;
        if (GameConfig.IsNewbie)
        {
            if (!GameConfig.CanOpenNewTower) return;
            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.GetOneTowerPos);
        }
        if (towerGrid != null)
        {
            float cashToOpen = TowerPlacementGridEndless.GRID_OPENCASH;
Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs
@@ -1,4 +1,5 @@
using Core.Utilities;
using TowerDefense.Towers;
using Core.Utilities;
using System;
using TMPro;
using UnityEngine;
@@ -6,6 +7,7 @@
using MoreMountains.NiceVibrations;
using TowerDefense.Level;
using KTGMGemClient;
using TowerDefense.UI.HUD;
/// <summary>
/// 无尽模式用自己的EndlessUIStart
@@ -63,25 +65,89 @@
        //查询是否已经做过了新手引导
        int guide = PlayerPrefs.GetInt("GemBattleGuide");
        // if (guide == 0)
        // {
        //     Debug.Log("需要进行新手引导");
        //     Pause();
        GameConfig.IsNewbie = guide == 0;
        //     uiStartMssk.gameObject.SetActive(false);
        //     countDownTextNew.text = "";
        //     countDownTextNew.gameObject.SetActive(false);
        if (guide == 0)
        {
            Pause();
            uiStartMssk.gameObject.SetActive(false);
            countDownTextNew.text = "";
            countDownTextNew.gameObject.SetActive(false);
        //     Instantiate(Resources.Load<GameObject>("UI/Guide/GuidePanel"), this.transform);
        //     //bGameStart = true;
        //     // 开始关卡
        //     //EndlessLevelManager.instance.StartLevel();
        //     //timeTextNew.gameObject.SetActive(true);
            Instantiate(Resources.Load<GameObject>("UI/Guide/GuidePanel"), this.transform);
            AddGuideEvent();
            //bGameStart = true;
            // 开始关卡
            //EndlessLevelManager.instance.StartLevel();
            //timeTextNew.gameObject.SetActive(true);
        //     // 开始播放背景音乐.
        //     // if (bgMusic != null)
        //     //     bgMusic.Play();
        // }
            // 开始播放背景音乐.
            // if (bgMusic != null)
            //     bgMusic.Play();
        }
    }
    /// <summary>
    /// 添加新手引导事件
    /// </summary>
    private void AddGuideEvent()
    {
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateFireLv2, CreateFireLv2);
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateFirstWave, CreateFirstWave);
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.RestartWave, RestartWave);
        EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.AddGold, AddGold);
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateWaterLv1, CreateWaterLv1);
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateSecondWave, CreateSecondWave);
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.SkillRelease, SkillRelease);
    }
    /// <summary>
    /// 在(2,3)位置放置一个火元素的塔
    /// </summary>
    private void CreateFireLv2()
    {
        Tower aTower = EndlessRandomTower.instance.getTowerByName("GrowUpTower");
        EndlessGameUI.instance.PlaceTowerForce(aTower, new IntVector2(2, 3), 2);
    }
    private void CreateFirstWave()
    {
        Restart();
        EventCenter.Ins.Add((int)KTGMGemClient.EventType.FireTowerChargeEnd, OnFireTowerChargeEnd);
    }
    private void OnFireTowerChargeEnd()
    {
        Pause();
        EndlessLevelManager.instance.PauseWave();
        EventCenter.Ins.Remove((int)KTGMGemClient.EventType.FireTowerChargeEnd, OnFireTowerChargeEnd);
        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.ChargingEnd);
    }
    private void RestartWave()
    {
        Restart();
        EndlessLevelManager.instance.RestartWave();
    }
    private void AddGold(int gold)
    {
        EndlessLevelManager.instance.Currency.AddCurrency(gold);
    }
    private void CreateWaterLv1()
    {
        Tower aTower = EndlessRandomTower.instance.getTowerByName("CopyCatTower");
        EndlessGameUI.instance.PlaceTowerForce(aTower, new IntVector2(1, 3), 1);
    }
    private void CreateSecondWave()
    {
    }
    private void SkillRelease()
    {
    }
@@ -149,66 +215,85 @@
            timeTextNew.text = ConvertTime((float)Math.Ceiling(startTime));
        }
        if (!bFirstLoaded && !bGameStart)
        if (!GameConfig.IsNewbie)
        {
            bFirstLoaded = true;
            secToDo = 4;
            if (!bFirstLoaded && !bGameStart)
            {
                bFirstLoaded = true;
                secToDo = 4;
            }
            if (bFirstLoaded && !bGameStart)
            {
                secToDo -= Time.deltaTime;
                countDownTextNew.gameObject.SetActive(true);
                if (secToDo >= 3)
                {
                    countDownTextNew.text = "3";
                    if (!bVibrate[3])
                    {
                        bVibrate[3] = true;
                        MMVibrationManager.Haptic(HapticTypes.SoftImpact);
                    }
                }
                else if (secToDo >= 2)
                {
                    countDownTextNew.text = "2";
                    if (!bVibrate[2])
                    {
                        bVibrate[2] = true;
                        MMVibrationManager.Haptic(HapticTypes.MediumImpact);
                    }
                }
                else if (secToDo >= 1)
                {
                    countDownTextNew.text = "1";
                    if (!bVibrate[1])
                    {
                        bVibrate[1] = true;
                        MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
                    }
                }
                else if (secToDo < 1)
                {
                    countDownTextNew.text = "GO!";
                    if (!bVibrate[0])
                    {
                        bVibrate[0] = true;
                        MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
                    }
                }
                // 开启游戏,且隐藏中间的数字.
                if (secToDo <= 0)
                {
                    uiStartMssk.gameObject.SetActive(false);
                    countDownTextNew.text = "";
                    countDownTextNew.gameObject.SetActive(false);
                    bGameStart = true;
                    // 开始关卡
                    EndlessLevelManager.instance.StartLevel();
                    timeTextNew.gameObject.SetActive(true);
                    // 开始播放背景音乐.
                    if (bgMusic != null)
                        bgMusic.Play();
                }
            }
        }
        if (bFirstLoaded && !bGameStart)
        else
        {
            secToDo -= Time.deltaTime;
            countDownTextNew.gameObject.SetActive(true);
            // 新手走的流程
            if (!bFirstLoaded && !bGameStart)
                bFirstLoaded = true;
            if (secToDo >= 3)
            if (bFirstLoaded && !bGameStart)
            {
                countDownTextNew.text = "3";
                if (!bVibrate[3])
                {
                    bVibrate[3] = true;
                    MMVibrationManager.Haptic(HapticTypes.SoftImpact);
                }
            }
            else if (secToDo >= 2)
            {
                countDownTextNew.text = "2";
                if (!bVibrate[2])
                {
                    bVibrate[2] = true;
                    MMVibrationManager.Haptic(HapticTypes.MediumImpact);
                }
            }
            else if (secToDo >= 1)
            {
                countDownTextNew.text = "1";
                if (!bVibrate[1])
                {
                    bVibrate[1] = true;
                    MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
                }
            }
            else if (secToDo < 1)
            {
                countDownTextNew.text = "GO!";
                if (!bVibrate[0])
                {
                    bVibrate[0] = true;
                    MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
                }
            }
            // 开启游戏,且隐藏中间的数字.
            if (secToDo <= 0)
            {
                uiStartMssk.gameObject.SetActive(false);
                countDownTextNew.text = "";
                countDownTextNew.gameObject.SetActive(false);
                bGameStart = true;
                // 开始关卡
                EndlessLevelManager.instance.StartLevel();
                timeTextNew.gameObject.SetActive(true);
                // 开始播放背景音乐.
                if (bgMusic != null)
                    bgMusic.Play();
            }
Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
@@ -14,6 +14,7 @@
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TowerDefense.Nodes;
using TowerDefense.Affectors;
namespace TowerDefense.UI.HUD
{
@@ -284,6 +285,18 @@
        public bool towerInList(Tower t)
        {
            return m_listTower.Contains(t);
        }
        /// <summary>
        /// 设置已经上阵的所有塔的攻击状态,是否可以攻击
        /// </summary>
        /// <param name="canAttack"></param>
        public void SetAttackingTowerState(bool canAttack)
        {
            foreach (Tower tower in m_listTower)
            {
                tower.bInAttackMode = canAttack;
            }
        }
        public void delTower(Tower t)
@@ -801,6 +814,25 @@
                CancelPlaceTower(pointerInfo);
        }
        /// <summary>
        /// 强制放置塔,主要是用于新手
        /// </summary>
        /// <param name="newTower"></param>
        /// <param name="pos"></param>
        /// <param name="level">塔的等级</param>
        public void PlaceTowerForce(Tower newTower, IntVector2 pos, int level)
        {
            TowerPlacementGhost currentTower = Instantiate(newTower.towerGhostPrefab);
            currentTower.Initialize(newTower);
            Tower controller = currentTower.controller;
            Tower createdTower = Instantiate(controller);
            createdTower.Initialize(m_CurrentArea, pos);
            createdTower.SetLevel(level - 1);
            addTower(createdTower);
            Destroy(currentTower.gameObject);
        }
        protected bool SkillPlayEndDrag(PointerInfo pointer)
        {
            // 我操,终于可以了!ATTENTION TO OPP:
Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs
@@ -282,6 +282,8 @@
    /// </summary>
    public void onClick()
    {
        if (GameConfig.IsNewbie && !GameConfig.CanBuyNewTower) return;
        // 还没到技能时间,忽略掉技能宝石
        Tower newTower = GetRandomTower(EndlessUIStart.instance.GameStartTime <= SKILL_TOWER_TIME);
@@ -295,7 +297,7 @@
    /// 随机找一个空白位置放置塔防
    /// </summary>
    /// <param name="tower"></param>
    public bool RandomPlaceTower(Tower tower, int level = -1, int cost = -1)
    public bool RandomPlaceTower(Tower tower, int level = -1, int cost = -1, int posx = - 1, int posy = -1)
    {
        EndlessGameUI gameUI = EndlessGameUI.instance;
@@ -303,9 +305,9 @@
            gameUI.CancelGhostPlacement();
        if (EndlessUIStart.instance.GameStartTime >= LEVELUP_TOWER_TIME)
            return gameUI.RandomPlaceTower(tower, -1, -1, level == -1 ? 1 : level, cost);
            return gameUI.RandomPlaceTower(tower, posx, posy, level == -1 ? 1 : level, cost);
        else
            return gameUI.RandomPlaceTower(tower, -1, -1, level == -1 ? 0 : level, cost);
            return gameUI.RandomPlaceTower(tower, posx, posy, level == -1 ? 0 : level, cost);
    }
    /// <summary>
Assets/StreamingAssets/Table/battle.json
@@ -1 +1 @@
[[1,"skilltime",30,[],"","生成技能宝石的时间(秒)"],[2,"initialgold",100,[],"","战斗内初始金币"],[3,"doublegem",180,[],"","购买宝石直接获得2级宝石的时间(秒)"],[4,"initialmoney",5000,[],"","初始金币"],[5,"initialgems","",["101:1:100","102:3:200","103:6:200","104:9:200","105:1:200","106:3:200","107:9:200","109:1:200"],"","宝石id:等级:个数 三个一组,每组用逗号分隔"],[6,"initialdeck","",["101","102","103","105","109"],"","上阵的宝石id列表.必须是初始宝石里面的"],[7,"buildtime",10,[],"","解锁塔位所需时间(秒)"],[8,"gemcountdown",10,[],"","购买获得2级宝石倒计时(秒)"],[9,"skillchance",20,[],"","购买获得技能宝石的概率(百分比)"],[10,"changenameprice",100,[],"","非首次改名的花费(100钻石)"],[11,"gemlevelup",30,[],"","塔防区宝石升级时变换类型的概率"],[12,"familymaxcount",50,[],"","工会最大人数"],[13,"scoreShopRefreshTime",7,[],"","工会积分商城刷新时间7天,从创建开始算"],[14,"SpeedUpFrist","",["180:0.75:1.5"],"","第一次提速时间,间隔倍率,移速倍率"],[15,"SpeedUpSecond","",["300:0.5:2"],"","第二次提速时间,间隔倍率,移速倍率"],[16,"donateShopRefreshTime",7,[],"","工会捐赠商城刷新时间7天,从创建开始算"],[17,"guildRankRequest","",["0","300","600","900","1200","1500","1800","2100","2400","2700","3000"],"","加入公会的排位分数限制(超过该值才能进入)"],[18,"guildNameDay",7,[],"","修改公会名:间隔7天1次"],[19,"guildNameCost",500,[],"","修改公会名:每次花费500金币(money)"],[20,"guildicon",30,[],"","修改公会图标:间隔30天1次"],[21,"guildCreateMinLevel",5,[],"","工会创建最小等级"]]
[[1,"skilltime",30,[],"","生成技能宝石的时间(秒)"],[2,"initialgold",100,[],"","战斗内初始金币"],[3,"doublegem",180,[],"","购买宝石直接获得2级宝石的时间(秒)"],[4,"initialmoney",5000,[],"","初始金币"],[5,"initialgems","",["101:1:100","102:3:200","103:6:200","104:9:200","105:1:200","106:3:200","107:9:200","109:1:200"],"","宝石id:等级:个数 三个一组,每组用逗号分隔"],[6,"initialdeck","",["101","102","103","105","109"],"","上阵的宝石id列表.必须是初始宝石里面的"],[7,"buildtime",0,[],"","解锁塔位所需时间(秒)"],[8,"gemcountdown",10,[],"","购买获得2级宝石倒计时(秒)"],[9,"skillchance",20,[],"","购买获得技能宝石的概率(百分比)"],[10,"changenameprice",100,[],"","非首次改名的花费(100钻石)"],[11,"gemlevelup",30,[],"","塔防区宝石升级时变换类型的概率"],[12,"familymaxcount",50,[],"","工会最大人数"],[13,"scoreShopRefreshTime",7,[],"","工会积分商城刷新时间7天,从创建开始算"],[14,"SpeedUpFrist","",["180:0.75:1.5"],"","第一次提速时间,间隔倍率,移速倍率"],[15,"SpeedUpSecond","",["300:0.5:2"],"","第二次提速时间,间隔倍率,移速倍率"],[16,"donateShopRefreshTime",7,[],"","工会捐赠商城刷新时间7天,从创建开始算"],[17,"guildRankRequest","",["0","300","600","900","1200","1500","1800","2100","2400","2700","3000"],"","加入公会的排位分数限制(超过该值才能进入)"],[18,"guildNameDay",7,[],"","修改公会名:间隔7天1次"],[19,"guildNameCost",500,[],"","修改公会名:每次花费500金币(money)"],[20,"guildicon",30,[],"","修改公会图标:间隔30天1次"],[21,"guildCreateMinLevel",5,[],"","工会创建最小等级"]]
Assets/StreamingAssets/Table/donaterule.json
New file
@@ -0,0 +1 @@
[[1,[1,2,3],["10:1","1:2"],["2:1","1:2"]],[2,[4,5,6],["20:1","2:2"],["4:1","1:2"]],[3,[7,8,9],["30:1","3:2"],["6:1","2:2"]],[4,[10,11,12,13],["40:1","4:2"],["8:1","2:2"]]]
Assets/StreamingAssets/Table/donaterule.json.meta
New file
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 92ca1981883b916439a7239e6e562e5c
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/StreamingAssets/Table/endless_teachport.json
New file
@@ -0,0 +1 @@
[[1,1,"史莱姆大王",1,1,1,0,0,0,200,1.5,2,3000,["0"],[0],0],[2,1,"史莱姆大王",1,1,2,0,0,0,200,1.5,2,3000,["0"],[0],0],[3,1,"史莱姆大王",1,1,3,1,10,1800,200,1.5,2,3000,["0"],[0],1],[4,1,"史莱姆大王",1,1,4,0,0,0,200,1.5,2,3000,["0"],[0],0],[5,1,"史莱姆大王",1,1,5,0,0,0,200,1.5,2,3000,["0"],[0],0],[6,1,"史莱姆大王",1,2,1,0,0,0,350,1.5,2,3000,["0"],[0],0],[7,1,"史莱姆大王",1,2,2,0,0,0,350,1.5,2,3000,["0"],[0],0],[8,1,"史莱姆大王",1,2,3,3,6,3000,350,1.5,2,3000,["0"],[0],3],[9,1,"史莱姆大王",1,2,4,0,0,0,350,1.5,2,3000,["0"],[0],0],[10,1,"史莱姆大王",1,2,5,0,0,0,350,1.5,2,3000,["0"],[0],0]]
Assets/StreamingAssets/Table/endless_teachport.json.meta
New file
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 557946068ebd0464e88cf9958a2485d9
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant: