using UnityEngine; using System.Collections.Generic; using System; using Snxxz.UI; public class PlayerDatas : Singleton { public GA_Hero hero = null; public H0309_tagPlayerLoginInfo loginInfo; 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(); public PlayerMarketData market = new PlayerMarketData(); public PlayerRealmData realm = new PlayerRealmData(); PlayerSkillDatas m_Skill = new PlayerSkillDatas(); public PlayerSkillDatas skill { get { return m_Skill; } } PlayerStrengthengDatas m_StrengthengModel; PlayerStrengthengDatas strengthengmodel { get { return m_StrengthengModel ?? (m_StrengthengModel = ModelCenter.Instance.GetModel()); } } PlayerMethodData M_Method; PlayerMethodData method { get { return M_Method ?? (M_Method = ModelCenter.Instance.GetModel()); } } PlayerRankData m_Rank = new PlayerRankData(); public PlayerRankData rank { get { return m_Rank; } } StoreModel m_StoreModel; StoreModel StoreModel { get { return m_StoreModel ?? (m_StoreModel = 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 event Action OnRoleAttrRefresh; public event Action OnSwitchAttackMode; public event Action InitPlayerInfoEvent; public event Action RefreshPlayerInfoEvent; public event Action PlayerDataRefreshInfoEvent; public event Action attributePromoteEvent; public event Action PlayerDataRefreshEvent; public event Action spNewGetEvent; private Dictionary PlayerDataDict = new Dictionary(); public void InitPlayerData(H0102_tagCDBPlayer data) { baseData.UpdateData(data); HangUpSetModel.Instance.SetOfflinePluginTime((int)baseData.HappyPoint); if (InitPlayerInfoEvent != null) { InitPlayerInfoEvent(); } } public void FightRefreshPlayerHp(uint hp) { RefreshProperty(PlayerDataRefresh.HP, hp); if (RefreshPlayerInfoEvent != null) { RefreshPlayerInfoEvent(); } if (PlayerDataRefreshInfoEvent != null) { PlayerDataRefreshInfoEvent(PlayerDataRefresh.HP); } } public void RefreshPlayerData(H0418_tagObjInfoRefresh vNetData) { UpdatePlayerData(vNetData); StoreModel.RefreshTCBPlayerData(vNetData); if (RefreshPlayerInfoEvent != null) { RefreshPlayerInfoEvent(); } } public void RefreshPlayerData(HA709_tagObjInfoListRefresh vNetData) { if (baseData == null || vNetData.ObjID != PlayerId) { return; } for (int i = 0; i < vNetData.Count; i++) { var data = new H0418_tagObjInfoRefresh(); data.ObjID = vNetData.ObjID; data.ObjType = vNetData.ObjType; data.RefreshType = vNetData.RefreshType[i].RefreshType; data.Value = vNetData.RefreshType[i].Value; StoreModel.RefreshTCBPlayerData(data); UpdatePlayerData(data); } if (RefreshPlayerInfoEvent != null) { RefreshPlayerInfoEvent(); } } private void UpdatePlayerData(H0418_tagObjInfoRefresh vNetData) { if (baseData != null && vNetData.ObjID == baseData.PlayerID) { var deltaValue = -1; switch ((PlayerDataRefresh)vNetData.RefreshType) { case PlayerDataRefresh.MaxHP: deltaValue = (int)(vNetData.Value - extersion.MaxHP); break; case PlayerDataRefresh.MAXATK: deltaValue = (int)(vNetData.Value - extersion.MAXATK); break; case PlayerDataRefresh.MINATK: deltaValue = (int)(vNetData.Value - extersion.MINATK); break; case PlayerDataRefresh.DEF: deltaValue = (int)(vNetData.Value - extersion.DEF); break; case PlayerDataRefresh.HIT: deltaValue = (int)(vNetData.Value - extersion.HIT); break; case PlayerDataRefresh.Miss: deltaValue = (int)(vNetData.Value - extersion.Miss); break; case PlayerDataRefresh.BattleValEx1: deltaValue = (int)(vNetData.Value - extersion.battleValEx1); break; case PlayerDataRefresh.SpeedValue: deltaValue = (int)(vNetData.Value - extersion.SpeedValue); break; default: deltaValue = -1; break; } if (deltaValue > 0 && attributePromoteEvent != null) { attributePromoteEvent((PlayerDataRefresh)vNetData.RefreshType, deltaValue); } var recordSp = -1L; if ((PlayerDataRefresh)vNetData.RefreshType == PlayerDataRefresh.ExAttr7 || (PlayerDataRefresh)vNetData.RefreshType == PlayerDataRefresh.ExAttr8) { recordSp = baseData.treasurePotentialSp; } RefreshProperty((PlayerDataRefresh)vNetData.RefreshType, vNetData.Value); if (recordSp > 0 && spNewGetEvent != null) { var deltaSp = baseData.treasurePotentialSp - recordSp; if (deltaSp > 0) { spNewGetEvent(deltaSp); } } if (PlayerDataDict.ContainsKey((PlayerDataRefresh)vNetData.RefreshType)) { PlayerDataDict[(PlayerDataRefresh)vNetData.RefreshType] = (int)vNetData.Value; } else { PlayerDataDict.Add((PlayerDataRefresh)vNetData.RefreshType, (int)vNetData.Value); } if (PlayerDataRefreshInfoEvent != null) { PlayerDataRefreshInfoEvent((PlayerDataRefresh)vNetData.RefreshType); } if (PlayerDataRefreshEvent != null) { PlayerDataRefreshEvent((PlayerDataRefresh)vNetData.RefreshType, (int)vNetData.Value); } } } public void RefreshProperty(PlayerDataRefresh _type, uint value) { switch (_type) { case PlayerDataRefresh.AccountID: baseData.AccID = value.ToString(); break; case PlayerDataRefresh.PlayerID: baseData.PlayerID = value; break; case PlayerDataRefresh.PlayerName: break; case PlayerDataRefresh.Sex: baseData.Sex = (byte)value; break; case PlayerDataRefresh.Job: baseData.Job = (byte)value; break; case PlayerDataRefresh.LV: if (baseData.LV != 0 && value > baseData.LV) { if (hero != null) { if (PlayerDatas.Instance.baseData.MapID == 31080) { SFXPlayUtility.Instance.PlayBattleEffect(1156, hero); } else { SFXPlayUtility.Instance.PlayBattleEffect(1039, hero); } } } baseData.LV = (ushort)value; break; case PlayerDataRefresh.TotalExp: baseData.TotalExp = value; break; case PlayerDataRefresh.Family: baseData.Family = value; if (hero != null) { hero.ActorInfo.familyID = value; ReCheckAttackTarget(); } break; case PlayerDataRefresh.TeamHornor: break; case PlayerDataRefresh.PKValue: break; case PlayerDataRefresh.FamilyHornor: break; case PlayerDataRefresh.FamilyActiveValue: break; case PlayerDataRefresh.CountryHornor: break; case PlayerDataRefresh.Mate: break; case PlayerDataRefresh.Gold: baseData.Gold = value; break; case PlayerDataRefresh.GoldPaper: baseData.GoldPaper = value; break; case PlayerDataRefresh.Silver: baseData.Silver = value; strengthengmodel.MoneyData(); break; case PlayerDataRefresh.SilverPaper: baseData.SilverPaper = value; break; case PlayerDataRefresh.FightPoint: baseData.FightPoint = value; ModelCenter.Instance.GetModel().PowerAdd((int)value); break; case PlayerDataRefresh.HappyPoint: baseData.HappyPoint = value; DebugEx.LogError("脱机挂时间" + (int)value); break; case PlayerDataRefresh.MapID: baseData.MapID = (ushort)value; break; case PlayerDataRefresh.PosX: baseData.PosX = (ushort)value;//角色坐标x break; case PlayerDataRefresh.PosY: baseData.PosY = (ushort)value;//角色坐标y break; case PlayerDataRefresh.State: baseData.State = (byte)value; break; case PlayerDataRefresh.MaxHP: extersion.MaxHP = (int)value; if (hero != null) { hero.ActorInfo.ResetHp(-1, -1, (int)value); } break; case PlayerDataRefresh.HP: baseData.HP = value; if (hero != null) { hero.ActorInfo.ResetHp((int)value); } break; case PlayerDataRefresh.MaxMP: extersion.MaxMP = (int)value; break; case PlayerDataRefresh.XP: baseData.XP = value; break; case PlayerDataRefresh.HPRestoreSetting: break; case PlayerDataRefresh.MPRestoreSetting: break; case PlayerDataRefresh.ExpRate: extersion.ExpRate = (int)value; break; case PlayerDataRefresh.DEF: extersion.DEF = (int)value; break; case PlayerDataRefresh.FreePoint: baseData.FreePoint = value; break; case PlayerDataRefresh.FreeSkillPoint: baseData.FreeSkillPoint = value; break; case PlayerDataRefresh.STR: baseData.STR = (int)value; break; case PlayerDataRefresh.PNE: baseData.PNE = (int)value; break; case PlayerDataRefresh.PHY: baseData.PHY = (int)value; break; case PlayerDataRefresh.CON: baseData.CON = (int)value; break; case PlayerDataRefresh.MINATK: extersion.MINATK = (int)value; break; case PlayerDataRefresh.MAXATK: extersion.MAXATK = (int)value; break; case PlayerDataRefresh.MAtkMin: break; case PlayerDataRefresh.MAtkMax: break; case PlayerDataRefresh.MDef: break; case PlayerDataRefresh.HIT: extersion.HIT = (int)value; break; case PlayerDataRefresh.POISIONATK: break; case PlayerDataRefresh.FIREATK: break; case PlayerDataRefresh.REALATK: extersion.realATK = (int)value; break; case PlayerDataRefresh.THUNDERATK: break; case PlayerDataRefresh.WINDATK: break; case PlayerDataRefresh.POISIONDEF: break; case PlayerDataRefresh.FIREDEF: break; case PlayerDataRefresh.REALDEF: extersion.realDEF = (int)value; break; case PlayerDataRefresh.THUNDERDEF: break; case PlayerDataRefresh.WINDDEF: break; case PlayerDataRefresh.Miss: extersion.Miss = (int)value; break; case PlayerDataRefresh.SuperHit: extersion.SuperHit = (int)value; break; case PlayerDataRefresh.Buff: break; case PlayerDataRefresh.Skill: break; case PlayerDataRefresh.Mark: break; case PlayerDataRefresh.SettingH: break; case PlayerDataRefresh.SettingV: break; case PlayerDataRefresh.FightPK: break; case PlayerDataRefresh.ActiveValue: break; case PlayerDataRefresh.NameColor: case PlayerDataRefresh.AtkInterval: extersion.AtkInterval = (int)value; break; case PlayerDataRefresh.Speed: extersion.Speed = (int)value; break; case PlayerDataRefresh.SuperHitRate: extersion.SuperHitRate = (int)value; break; case PlayerDataRefresh.PickupDist: extersion.PickupDist = (int)value; break; case PlayerDataRefresh.CountryLastWeekHornor: break; case PlayerDataRefresh.LastWeekOnlineTime: break; case PlayerDataRefresh.LastWeekFamilyActiveValue: break; case PlayerDataRefresh.FBID: baseData.FBID = (byte)value; break; case PlayerDataRefresh.FamilyLV: break; case PlayerDataRefresh.RealMapID: extersion.RealMapID = (int)value; break; case PlayerDataRefresh.GMLevel: baseData.GMLevel = (byte)value; break; case PlayerDataRefresh.TeamID: if (hero != null) { hero.ActorInfo.teamID = value; ReCheckAttackTarget(); } break; case PlayerDataRefresh.TeamLV: break; case PlayerDataRefresh.FightPower: baseData.FightPoint = value; ModelCenter.Instance.GetModel().PowerAdd((int)value); break; case PlayerDataRefresh.RebornMapID: break; case PlayerDataRefresh.RebornPosX: break; case PlayerDataRefresh.RebornPosY: break; case PlayerDataRefresh.Coin: break; case PlayerDataRefresh.BillboardLV: break; case PlayerDataRefresh.Tick: #if UNITY_EDITOR DebugEx.LogFormat("---- 收到服务端Tick: {0}", value); if (extersion.Tick != 0) { uint _curWorldTick = GetWorldTick(); uint _diffValue = value > _curWorldTick ? value - _curWorldTick : _curWorldTick - value; DebugEx.LogFormat(" |-------- 当前客户端Tick: {0}, 差异: {1}", _curWorldTick, _diffValue); if (_diffValue > 5000) { DebugEx.LogFormat(" |-------- 收到服务端WorldTick与当前的客户端Tick差异超过5秒"); } } #endif extersion.Tick = value; m_Tick = Environment.TickCount; break; case PlayerDataRefresh.CurrentPlayerType: break; case PlayerDataRefresh.FriendFavor: break; case PlayerDataRefresh.BackpackLV: break; case PlayerDataRefresh.ReincarnationLV: break; case PlayerDataRefresh.BaseSTR: break; case PlayerDataRefresh.BasePNE: break; case PlayerDataRefresh.BasePHY: break; case PlayerDataRefresh.BaseCON: break; case PlayerDataRefresh.ReceivedSalary: break; case PlayerDataRefresh.WarehouseLV: break; case PlayerDataRefresh.EquipShowSwitch: break; case PlayerDataRefresh.LuckValue: break; case PlayerDataRefresh.ExAttr1: baseData.ExAttr1 = value; break; case PlayerDataRefresh.ExAttr2: baseData.ExAttr2 = value; break; case PlayerDataRefresh.ExAttr3: baseData.dungeonLineId = (int)value; break; case PlayerDataRefresh.ExAttr4: baseData.ExAttr4 = value; break; case PlayerDataRefresh.ExAttr5: baseData.ExAttr5 = value; break; case PlayerDataRefresh.Faction: baseData.faction = value; if (hero != null) { hero.ActorInfo.faction = (int)value; ReCheckAttackTarget(); hero.SetFairyLeagueHeadUp(baseData.MapID == FairyLeagueModel.FAIRY_LEAGUE_DUNGEON); } break; case PlayerDataRefresh.InfamyValue: break; case PlayerDataRefresh.OfficialRank: baseData.realmLevel = (byte)value; break; case PlayerDataRefresh.IsFindByLabel: break; case PlayerDataRefresh.IsCloseFriendLabel: break; case PlayerDataRefresh.ChangeCoinPointTotal: baseData.coinPointTotal = value; break; case PlayerDataRefresh.VIPLv: if (baseData.VIPLv <= 0 && value > 0) { ModelCenter.Instance.GetModel().SetVipPushNotify((int)value); } else if (value <= 0) { ModelCenter.Instance.GetModel().SetVipPushNotify(0); } baseData.VIPLv = (byte)value; break; case PlayerDataRefresh.ExAttr6: baseData.ExAttr6 = value; strengthengmodel.MoneyData(); break; case PlayerDataRefresh.ExAttr7: baseData.ExAttr7 = value; break; case PlayerDataRefresh.ExAttr8: baseData.ExAttr8 = value; break; case PlayerDataRefresh.ExAttr9: baseData.ExAttr9 = value; break; case PlayerDataRefresh.ExAttr10: baseData.ExAttr10 = value; break; case PlayerDataRefresh.ModelMark: break; case PlayerDataRefresh.PrizeCoin: break; case PlayerDataRefresh.ExAttr11: baseData.ExAttr11 = value; break; case PlayerDataRefresh.ExAttr12: baseData.ExAttr12 = value; break; case PlayerDataRefresh.ExAttr13: baseData.ExAttr13 = value; break; case PlayerDataRefresh.ExAttr14: baseData.ExAttr14 = value; break; case PlayerDataRefresh.BattleValEx1: extersion.battleValEx1 = (int)value; if (hero != null) { hero.CalculateAtkSpeed((ushort)extersion.battleValEx1); } break; case PlayerDataRefresh.BattleValEx3: extersion.battleValEx3 = (int)value; break; case PlayerDataRefresh.DamageReduceRate: extersion.damageReduceRate = (int)value; break; case PlayerDataRefresh.LuckyHitRate: extersion.luckHitRate = (int)value; break; case PlayerDataRefresh.LuckyHitVal: extersion.luckHitVal = (int)value; break; case PlayerDataRefresh.ExpPoint: baseData.ExpPoint = (ushort)value; break; case PlayerDataRefresh.Rune: ModelCenter.Instance.GetModel().SetRuneChip((int)value); break; case PlayerDataRefresh.RuneSplinters: ModelCenter.Instance.GetModel().SetRuneSplinters((int)value); break; case PlayerDataRefresh.FamilyContribution: method.CepaContribution((int)value); break; case PlayerDataRefresh.FamilyStoreScore: ModelCenter.Instance.GetModel().FairyAuIntegral((int)value); break; case PlayerDataRefresh.SuperHitReduce: extersion.SuperHitReduce = (int)value; break; case PlayerDataRefresh.LuckyHitRateReduce: extersion.LuckyHitRateReduce = (int)value; break; case PlayerDataRefresh.SkillAtkRateReduce: extersion.skillAtkRateReduce = (int)value; break; case PlayerDataRefresh.SkillAtkRate: extersion.SkillAtkRate = (int)value; break; case PlayerDataRefresh.Damageper: extersion.DamagePer = (int)value; break; case PlayerDataRefresh.HPRestorePer: extersion.HPRestorePer = (int)value; break; case PlayerDataRefresh.DamageBackRate: extersion.DamageBackRate = (int)value; break; case PlayerDataRefresh.SpeedValue: extersion.SpeedValue = (int)value; if (hero != null) { hero.CalculateMoveSpeed((ushort)extersion.SpeedValue); } break; case PlayerDataRefresh.DungeonLineId: break; case PlayerDataRefresh.PetDamPer: extersion.PetDamPer = (int)value; break; case PlayerDataRefresh.IgnoreDefRate: extersion.IgnoreDefRate = (int)value; break; case PlayerDataRefresh.IgnoreDefRateReduce: extersion.IgnoreDefRateReduce = (int)value; break; case PlayerDataRefresh.DamChanceDef: extersion.DamChanceDef = (int)value; break; case PlayerDataRefresh.BleedDamage: extersion.BleedDamage = (int)value; break; case PlayerDataRefresh.BattleValEx2: extersion.BattleValEx2 = (int)value; break; case PlayerDataRefresh.FaintRate: extersion.FaintRate = (int)value; break; case PlayerDataRefresh.FaintDefRate: extersion.FaintDefRate = (int)value; break; case PlayerDataRefresh.FinalHurt: extersion.FinalHurt = (int)value; break; case PlayerDataRefresh.FinalHurtReduce: extersion.FinalHurtReduce = (int)value; break; case PlayerDataRefresh.DamagePerPVP: extersion.DamagePerPVP = (int)value; break; case PlayerDataRefresh.DamagePerPVPReduce: extersion.DamagePerPVPReduce = (int)value; break; case PlayerDataRefresh.ComboDamPer: extersion.ComboDamPer = (int)value; break; case PlayerDataRefresh.ComboDamRate: extersion.ComboDamPerRate = (int)value; break; case PlayerDataRefresh.RealmPoint: extersion.realmPoint = (int)value; break; case PlayerDataRefresh.MagicEssence: extersion.magicEssence = (int)value; break; case PlayerDataRefresh.PlayerPKState: extersion.pkState = (int)value; if (hero != null) { if (value == 1) { if (MapArea.IsOutMapArea(hero.CurMapArea, MapArea.E_Type.Neutral)) { hero.SwitchGrayName(true); } } else if (value == 0) { hero.SwitchGrayName(false); if (StatusMgr.Instance.IsExist(PlayerId, StatusMgr.Instance.redNameBuffID)) { hero.SwitchRedName(true); } } } break; case PlayerDataRefresh.IsAttackBossState: extersion.bossState = (int)value; if (hero != null) { if (extersion.bossState == 0) { hero.atkBossID = 0; } } break; case PlayerDataRefresh.BasicsMinimum: baseData.BasicsMinimum = (int)value; break; case PlayerDataRefresh.BasicsMaxAttack: baseData.BasicsMaxAttack = (int)value; break; case PlayerDataRefresh.BasicsLife: baseData.BasicsLife = (int)value; break; case PlayerDataRefresh.BasicsDefense: baseData.BasicsDefense = (int)value; break; case PlayerDataRefresh.BasicsScoreAHit: baseData.BasicsScoreAHit = (int)value; break; case PlayerDataRefresh.BasicsDodge: baseData.BasicsDodge = (int)value; break; case PlayerDataRefresh.OnlyFinalHurt: extersion.OnlyFinalHurt = (int)value; break; } } public int GetPlayerDataByType(PlayerDataRefresh type) { int value = 0; PlayerDataDict.TryGetValue(type, out value); return value; } public void OnRefreshWorldLV(uint worldLv, uint worldExpRate) { this.worldLv = worldLv; this.worldExpRate = worldExpRate; if (OnRoleAttrRefresh != null) { OnRoleAttrRefresh(); } } 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(E_ItemType itemType) { return itemType >= E_ItemType.Equip_Weapon && itemType <= E_ItemType.Equip_Shoes; } public void RequestWorldTick() { CA102_tagCMWorldTick _proto = new CA102_tagCMWorldTick(); GameNetSystem.Instance.SendInfo(_proto); } public uint GetWorldTick() { int _currentTick = Environment.TickCount - m_Tick; uint _tick = extersion.Tick + (uint)_currentTick; return _tick; } }