using UnityEngine; using System.Collections.Generic; using System; using LitJson; public class PlayerDatas : Singleton { public uint PlayerId { get { return baseData.PlayerID; } } PlayerBaseData m_Base = new PlayerBaseData(); public PlayerBaseData baseData { get { return m_Base; } } PlayerExtersionData m_Extersion = new PlayerExtersionData(); public PlayerExtersionData extersion { get { return m_Extersion; } } //仙盟 public PlayerFairyData fairyData = new PlayerFairyData(); // PlayerSkillDatas m_Skill = new PlayerSkillDatas(); // public PlayerSkillDatas skill { get { return m_Skill; } } // PlayerMethodData method { get { return ModelCenter.Instance.GetModel(); } } // StoreModel StoreModel { get { return ModelCenter.Instance.GetModel(); } } // DungeonAssistModel assistModel { get { return ModelCenter.Instance.GetModel(); } } public int totalExpRate { get; set; } public uint worldLv { get; private set; } public uint worldExpRate { get; private set; } public List maliciousAtkPlayer = new List();// 发动恶意攻击的玩家列表 private int m_Tick; public uint changeLV = 0; //当前升x级 public event Action worldLevelUpdateEvent; public event Action playerDataUpdateEvent; // 无区别更新,慎用 public event Action playerDataRefreshEvent; public event Action attributePromoteEvent; public event Action spNewGetEvent; private Dictionary PlayerDataDict = new Dictionary(); public void InitPlayerData(H0102_tagCDBPlayer data) { baseData.UpdateData(data); if (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } } public void RefreshPlayerData(H0418_tagObjInfoRefresh vNetData) { UpdatePlayerData(vNetData); //StoreModel.RefreshTCBPlayerData(vNetData); } private void UpdatePlayerData(H0418_tagObjInfoRefresh vNetData) { if (baseData != null && vNetData.ObjID == baseData.PlayerID) { RefreshProperty((PlayerDataType)vNetData.RefreshType, vNetData.Value, vNetData.ValueEx); if (PlayerDataDict.ContainsKey((PlayerDataType)vNetData.RefreshType)) { PlayerDataDict[(PlayerDataType)vNetData.RefreshType] = vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue; } else { PlayerDataDict.Add((PlayerDataType)vNetData.RefreshType, vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue); } if (playerDataRefreshEvent != null) { playerDataRefreshEvent((PlayerDataType)vNetData.RefreshType); } } } public void RefreshProperty(PlayerDataType _type, uint value, uint valueEx) { switch (_type) { case PlayerDataType.AccountID: baseData.AccID = value.ToString(); break; case PlayerDataType.PlayerID: baseData.PlayerID = value; break; case PlayerDataType.Job: baseData.Job = (byte)value; break; case PlayerDataType.LV: changeLV = value - baseData.LV; baseData.LV = (ushort)value; if (changeLV > 0) { SDKUtils.Instance.RoleLevelUp(); } break; case PlayerDataType.TotalExp: baseData.TotalExp = value; break; case PlayerDataType.Family: baseData.FamilyId = value; if (LocalSave.GetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID) == 0) { SDKUtils.Instance.TraceEvent("joinalliance", "", false); LocalSave.SetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID, 1); } break; case PlayerDataType.Gold: baseData.diamond = value; break; case PlayerDataType.GoldPaper: baseData.bindDiamond = value; break; case PlayerDataType.Silver: baseData.copper = value; break; case PlayerDataType.MapID: baseData.MapID = (ushort)value; break; case PlayerDataType.PosX: baseData.PosX = (ushort)value;//角色坐标x break; case PlayerDataType.PosY: baseData.PosY = (ushort)value;//角色坐标y break; case PlayerDataType.ExpRate: extersion.ExpRate = (int)value; break; case PlayerDataType.DEF: extersion.DEF = (int)value; break; case PlayerDataType.FreePoint: baseData.FreePoint = value; break; case PlayerDataType.FreeSkillPoint: baseData.FreeSkillPoint = value; break; case PlayerDataType.STR: baseData.STR = (int)value; break; case PlayerDataType.PNE: baseData.PNE = (int)value; break; case PlayerDataType.PHY: baseData.PHY = (int)value; break; case PlayerDataType.CON: baseData.CON = (int)value; break; case PlayerDataType.MINATK: extersion.MINATK = (int)value; break; case PlayerDataType.MAXATK: extersion.MAXATK = (int)value; break; case PlayerDataType.HIT: extersion.HIT = (int)value; break; case PlayerDataType.REALATK: extersion.realATK = (int)value; break; case PlayerDataType.REALDEF: extersion.realDEF = (int)value; break; case PlayerDataType.Miss: extersion.Miss = (int)value; break; case PlayerDataType.SuperHit: extersion.SuperHit = (int)value; break; case PlayerDataType.NameColor: case PlayerDataType.AtkInterval: extersion.AtkInterval = (int)value; break; case PlayerDataType.Speed: extersion.Speed = (int)value; break; case PlayerDataType.SuperHitRate: extersion.SuperHitRate = (int)value; break; case PlayerDataType.PickupDist: extersion.PickupDist = (int)value; break; case PlayerDataType.FBID: baseData.FBID = (byte)value; break; case PlayerDataType.RealMapID: extersion.RealMapID = (int)value; break; case PlayerDataType.GMLevel: baseData.GMLevel = (byte)value; break; case PlayerDataType.TeamID: break; case PlayerDataType.TeamLV: break; case PlayerDataType.FightPower: baseData.FightPoint = value + valueEx * Constants.ExpPointValue; // TODO YYL // ModelCenter.Instance.GetModel().PowerAdd(baseData.FightPoint); break; case PlayerDataType.Tick: #if UNITY_EDITOR Debug.LogFormat("---- 收到服务端Tick: {0}", value); if (extersion.Tick != 0) { uint _curWorldTick = GetWorldTick(); uint _diffValue = value > _curWorldTick ? value - _curWorldTick : _curWorldTick - value; Debug.LogFormat(" |-------- 当前客户端Tick: {0}, 差异: {1}", _curWorldTick, _diffValue); if (_diffValue > 5000) { Debug.LogFormat(" |-------- 收到服务端WorldTick与当前的客户端Tick差异超过5秒"); } } #endif extersion.Tick = value; m_Tick = Environment.TickCount; break; case PlayerDataType.EquipShowSwitch: baseData.equipShowSwitch = value; break; case PlayerDataType.LuckValue: extersion.luckValue = (int)value; break; case PlayerDataType.ExAttr1: baseData.ExAttr1 = value; break; case PlayerDataType.ExAttr2: baseData.teamAutoOperateFlag = value; break; case PlayerDataType.ExAttr3: baseData.dungeonLineId = (int)value % 1000; baseData.dungeonMapId = (int)value / 1000; break; case PlayerDataType.ExAttr4: baseData.shield = value; break; case PlayerDataType.Faction: baseData.faction = value; break; case PlayerDataType.RealmLevel: baseData.realmLevel = (byte)value; break; case PlayerDataType.ChangeCoinPointTotal: baseData.coinPointTotal = value; break; case PlayerDataType.VIPLv: baseData.VIPLv = (byte)value; break; case PlayerDataType.ExAttr6: baseData.copperExtend = value; break; case PlayerDataType.ExAttr10: baseData.bubbleId = value; break; case PlayerDataType.ExAttr11: baseData.ExAttr11 = value; break; case PlayerDataType.ExAttr13: baseData.ServerGroupId = value; break; case PlayerDataType.BattleValEx1: extersion.battleValEx1 = (int)value; break; case PlayerDataType.BattleValEx3: extersion.battleValEx3 = (int)value; break; case PlayerDataType.DamageReduceRate: extersion.damageReduceRate = (int)value; break; case PlayerDataType.LuckyHitRate: extersion.luckHitRate = (int)value; break; case PlayerDataType.LuckyHitVal: extersion.luckHitVal = (int)value; break; case PlayerDataType.ExpPoint: baseData.ExpPoint = value; break; case PlayerDataType.Rune: extersion.runeChip = (int)value; break; case PlayerDataType.RuneSplinters: extersion.runeEssence = (int)value; break; case PlayerDataType.SuperHitReduce: extersion.SuperHitReduce = (int)value; break; case PlayerDataType.LuckyHitRateReduce: extersion.LuckyHitRateReduce = (int)value; break; case PlayerDataType.SkillAtkRateReduce: extersion.skillAtkRateReduce = (int)value; break; case PlayerDataType.SkillAtkRate: extersion.SkillAtkRate = (int)value; break; case PlayerDataType.DamagePVP: extersion.DamagePVP = (int)value; break; case PlayerDataType.HPRestorePer: extersion.HPRestorePer = (int)value; break; case PlayerDataType.DamageBackRate: extersion.DamageBackRate = (int)value; break; case PlayerDataType.SpeedValue: extersion.SpeedValue = (int)value; break; case PlayerDataType.PetDamPer: extersion.PetDamPer = (int)value; break; case PlayerDataType.IgnoreDefRate: extersion.IgnoreDefRate = (int)value; break; case PlayerDataType.IgnoreDefRateReduce: extersion.IgnoreDefRateReduce = (int)value; break; case PlayerDataType.DamChanceDef: extersion.DamChanceDef = (int)value; break; case PlayerDataType.BleedDamage: extersion.BleedDamage = (int)value; break; case PlayerDataType.BattleValEx2: extersion.BattleValEx2 = (int)value; break; case PlayerDataType.FaintRate: extersion.FaintRate = (int)value; break; case PlayerDataType.FaintDefRate: extersion.FaintDefRate = (int)value; break; case PlayerDataType.FinalHurt: extersion.FinalHurt = (int)value; break; case PlayerDataType.FinalHurtReduce: extersion.FinalHurtReduce = (int)value; break; case PlayerDataType.DamagePerPVP: extersion.DamagePerPVP = (int)value; break; case PlayerDataType.DamagePerPVPReduce: extersion.DamagePerPVPReduce = (int)value; break; case PlayerDataType.ComboDamPer: extersion.ComboDamPer = (int)value; break; case PlayerDataType.MaxProDef: extersion.MaxProDef = (int)value; break; case PlayerDataType.ComboDamRate: extersion.ComboDamPerRate = (int)value; break; case PlayerDataType.RealmPoint: extersion.realmPoint = (int)value; break; case PlayerDataType.MagicEssence: extersion.magicEssence = (int)value; break; case PlayerDataType.PlayerPKState: extersion.pkState = (int)value; break; case PlayerDataType.IsAttackBossState: extersion.bossState = (int)value; break; case PlayerDataType.BasicsMinimum: baseData.BasicsMinimum = (int)value; break; case PlayerDataType.BasicsMaxAttack: baseData.BasicsMaxAttack = (int)value; break; case PlayerDataType.BasicsLife: baseData.BasicsLife = (int)value; break; case PlayerDataType.BasicsDefense: baseData.BasicsDefense = (int)value; break; case PlayerDataType.BasicsScoreAHit: baseData.BasicsScoreAHit = (int)value; break; case PlayerDataType.BasicsDodge: baseData.BasicsDodge = (int)value; break; case PlayerDataType.OnlyFinalHurt: extersion.OnlyFinalHurt = (int)value; break; case PlayerDataType.CDBPlayerRefresh_NPCHurtAddPer: extersion.NpcHurtAddPer = (int)value; break; case PlayerDataType.FunalHurtPer: extersion.FunalHurtPer = (int)value; break; case PlayerDataType.CDBPlayerRefresh_ForbidenTalk: extersion.forbidenTalk = (int)value; //与服务端约定 0 单角色解封 1 单角色禁言,2设备禁言,3设备解封 if (value == 2) { LocalSave.SetBool("ServerForbidenChatDevice1", true); } else if (value == 3) { //任意账号解封 LocalSave.SetBool("ServerForbidenChatDevice1", false); } //ModelCenter.Instance.GetModel().ServerForbidenChat(extersion.forbidenTalk == 1); break; case PlayerDataType.CDBPlayerRefresh_TalentPoint: extersion.talentPoint = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SoulDust: extersion.soulDust = value; break; case PlayerDataType.CDBPlayerRefresh_SoulSplinters: extersion.soulSplinters = value; break; case PlayerDataType.CDBPlayerRefresh_SoulCore: extersion.soulCore = value; break; case PlayerDataType.CDBPlayerRefresh_Honor: extersion.honorValue = (int)value; break; case PlayerDataType.CDBPlayerRefresh_ZhuxianRate: baseData.ExAttr16 = value; break; case PlayerDataType.CDBPlayerRefresh_Mater: baseData.mater = (int)value; break; case PlayerDataType.CDBPlayerRefresh_Wood: baseData.wood = (int)value; break; case PlayerDataType.CDBPlayerRefresh_Water: baseData.water = (int)value; break; case PlayerDataType.CDBPlayerRefresh_Fire: baseData.fire = (int)value; break; case PlayerDataType.CDBPlayerRefresh_Earth: baseData.earth = (int)value; break; case PlayerDataType.CDBPlayerRefresh_NormalHurt: baseData.NormalHurt = (int)value; break; case PlayerDataType.CDBPlayerRefresh_NormalHurtPer: baseData.NormalHurtPer = (int)value; break; case PlayerDataType.CDBPlayerRefresh_FabaoHurt: baseData.FabaoHurt = (int)value; break; case PlayerDataType.CDBPlayerRefresh_FabaoHurtPer: baseData.FabaoHurtPer = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SuperHitRateReduce: baseData.reduceCrit = (int)value; break; case PlayerDataType.CDBPlayerRefresh_LuckyHitReduce: baseData.reduceHeartHurt = (int)value; break; case PlayerDataType.CDBPlayerRefresh_FinalHurtReducePer: baseData.reduceFinalHurt = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerA: baseData.skillAddPerA = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerB: baseData.skillAddPerB = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerC: baseData.skillAddPerC = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerD: baseData.skillAddPerD = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerE: baseData.skillAddPerE = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerF: baseData.skillAddPerF = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillAddPerG: baseData.skillAddPerG = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerA: baseData.skillReducePerA = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerB: baseData.skillReducePerB = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerC: baseData.skillReducePerC = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerD: baseData.skillReducePerD = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerE: baseData.skillReducePerE = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerF: baseData.skillReducePerF = (int)value; break; case PlayerDataType.CDBPlayerRefresh_SkillReducePerG: baseData.skillReducePerG = (int)value; break; case PlayerDataType.default9: baseData.mapRealmSelect = (int)value; break; case PlayerDataType.default10: baseData.leaveFamilyTime = (int)value; break; case PlayerDataType.Face: baseData.face = (int)value; break; case PlayerDataType.FacePic: baseData.facePic = (int)value; break; } } public ulong GetPlayerDataByType(PlayerDataType type) { ulong value = 0; PlayerDataDict.TryGetValue(type, out value); return value; } public void ClearPlayerData() { PlayerDataDict.Clear(); } public void OnRefreshWorldLV(uint worldLv, uint worldExpRate) { this.worldLv = worldLv; this.worldExpRate = worldExpRate; if (worldLevelUpdateEvent != null) { worldLevelUpdateEvent(); } } public void OnRecv_SwitchAttackMode(byte attackMode) { // baseData.AttackMode = attackMode; // if (OnSwitchAttackMode != null) // { // OnSwitchAttackMode((E_AttackMode)attackMode); // } // if (hero == null) // { // return; // } // ReCheckAttackTarget(); } public void ReCheckAttackTarget(/*GA_Player _player = null*/) { // if (hero == null) // { // return; // } // if (_player == null) // { // _player = hero.SelectTarget as GA_Player; // } // if (_player != null) // { // if (_player.CanAtked()) // { // SelectionManager.Request(SelectionManager.E_Type.Red, _player); // } // else // { // SelectionManager.Request(SelectionManager.E_Type.Green, _player); // if (hero.aiHandler.IsAuto()) // { // hero.LockTarget = null; // } // else if (hero.aiHandler.currentType == E_HeroAIType.KillUntilDie) // { // hero.Behaviour.StopKillUntilDieAI(); // } // } // } // hero.SwitchTarget(); } /// /// 是否是装备, 这里的装备指的是: 武器, 帽子, 衣服, 下装, 鞋子, 腰带 /// /// public bool IsEquip(ItemType itemType) { return itemType >= ItemType.Equip_Weapon && itemType <= ItemType.Equip_Shoes; } public void RequestWorldTick() { CA102_tagCMWorldTick _proto = new CA102_tagCMWorldTick(); GameNetSystem.Instance.SendInfo(_proto); } public void ClearTick() { extersion.Tick = 0; } public bool IsTickVaild() { return extersion.Tick != 0; } public uint GetWorldTick() { int _currentTick = Environment.TickCount - m_Tick; return extersion.Tick + (uint)_currentTick; } }