using UnityEngine; using System.Collections.Generic; using System; using Snxxz.UI; [XLua.LuaCallCSharp] 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(); 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(); } } 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 crossServerTick; public event Action worldLevelUpdateEvent; public event Action OnSwitchAttackMode; 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); HangUpSetModel.Instance.SetOfflinePluginTime((int)baseData.hangTime); if (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } } public void UpdatePlayerData(HA112_tagMCDBPlayer data) { baseData.UpdateData(data); if (hero != null) { hero.InitBornPos(baseData.PosX, baseData.PosY); CameraController.Instance.Apply(); } if (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } } public void FightRefreshPlayerHp(uint hp) { RefreshProperty(false, PlayerDataType.HP, hp); if (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } if (playerDataRefreshEvent != null) { playerDataRefreshEvent(PlayerDataType.HP); } } public void RefreshPlayerData(H0418_tagObjInfoRefresh vNetData) { UpdatePlayerData(vNetData); StoreModel.RefreshTCBPlayerData(vNetData); if (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } } public void RefreshPlayerData(HA709_tagObjInfoListRefresh vNetData) { if (baseData == null || vNetData.ObjID != PlayerId) { return; } for (int i = 0; i < vNetData.Count; i++) { if (CrossServerUtility.IsCrossServer()) { if (vNetData.socketType == ServerType.Main) { if (vNetData.RefreshType[i].RefreshType == (int)PlayerDataType.HP || vNetData.RefreshType[i].RefreshType == (int)PlayerDataType.MaxHP || vNetData.RefreshType[i].RefreshType == (int)PlayerDataType.MaxProDef || vNetData.RefreshType[i].RefreshType == (int)PlayerDataType.ExAttr4) { continue; } } } if (ClientDungeonStageUtility.isClientDungeon #if UNITY_EDITOR || RuntimeLogUtility.TEST_CLIENT_PVP #endif ) { if (vNetData.RefreshType[i].RefreshType == (int)PlayerDataType.HP) { continue; } } var data = new H0418_tagObjInfoRefresh(); data.socketType = vNetData.socketType; 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 (playerDataUpdateEvent != null) { playerDataUpdateEvent(); } } private void UpdatePlayerData(H0418_tagObjInfoRefresh vNetData) { if (baseData != null && vNetData.ObjID == baseData.PlayerID) { var deltaValue = -1; switch ((PlayerDataType)vNetData.RefreshType) { case PlayerDataType.MaxHP: deltaValue = (int)(vNetData.Value - extersion.MaxHP); break; case PlayerDataType.MAXATK: deltaValue = (int)(vNetData.Value - extersion.MAXATK); break; case PlayerDataType.MINATK: deltaValue = (int)(vNetData.Value - extersion.MINATK); break; case PlayerDataType.DEF: deltaValue = (int)(vNetData.Value - extersion.DEF); break; case PlayerDataType.HIT: deltaValue = (int)(vNetData.Value - extersion.HIT); break; case PlayerDataType.Miss: deltaValue = (int)(vNetData.Value - extersion.Miss); break; case PlayerDataType.BattleValEx1: deltaValue = (int)(vNetData.Value - extersion.battleValEx1); break; case PlayerDataType.SpeedValue: deltaValue = (int)(vNetData.Value - extersion.SpeedValue); break; default: deltaValue = -1; break; } if (deltaValue > 0 && attributePromoteEvent != null) { attributePromoteEvent((PlayerDataType)vNetData.RefreshType, deltaValue); } var recordSp = -1L; if ((PlayerDataType)vNetData.RefreshType == PlayerDataType.ExAttr7 || (PlayerDataType)vNetData.RefreshType == PlayerDataType.ExAttr8) { recordSp = baseData.treasurePotentialSp; } RefreshProperty(vNetData.socketType == ServerType.Main, (PlayerDataType)vNetData.RefreshType, vNetData.Value); if (recordSp > 0 && spNewGetEvent != null) { var deltaSp = baseData.treasurePotentialSp - recordSp; if (deltaSp > 0) { spNewGetEvent(deltaSp); } } if (PlayerDataDict.ContainsKey((PlayerDataType)vNetData.RefreshType)) { PlayerDataDict[(PlayerDataType)vNetData.RefreshType] = (int)vNetData.Value; } else { PlayerDataDict.Add((PlayerDataType)vNetData.RefreshType, (int)vNetData.Value); } if (playerDataRefreshEvent != null) { playerDataRefreshEvent((PlayerDataType)vNetData.RefreshType); } } } public void RefreshProperty(bool isMainServerData, PlayerDataType _type, uint value) { switch (_type) { case PlayerDataType.AccountID: baseData.AccID = value.ToString(); break; case PlayerDataType.PlayerID: baseData.PlayerID = value; break; case PlayerDataType.PlayerName: break; case PlayerDataType.Sex: break; case PlayerDataType.Job: baseData.Job = (byte)value; break; case PlayerDataType.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 PlayerDataType.TotalExp: baseData.TotalExp = value; break; case PlayerDataType.Family: baseData.FamilyId = value; if (hero != null) { hero.ActorInfo.familyID = value; ReCheckAttackTarget(); } break; case PlayerDataType.TeamHornor: break; case PlayerDataType.PKValue: break; case PlayerDataType.FamilyHornor: break; case PlayerDataType.FamilyActiveValue: break; case PlayerDataType.CountryHornor: break; case PlayerDataType.Mate: break; case PlayerDataType.Gold: baseData.diamond = value; break; case PlayerDataType.GoldPaper: break; case PlayerDataType.Silver: baseData.copper = value; break; case PlayerDataType.SilverPaper: break; case PlayerDataType.FightPoint: break; case PlayerDataType.HappyPoint: baseData.hangTime = value; DebugEx.Log("脱机挂时间" + (int)value); break; case PlayerDataType.MapID: baseData.MapID = (ushort)value; if (isMainServerData) { baseData.mainServerMapIdRecord = baseData.MapID; } break; case PlayerDataType.PosX: baseData.PosX = (ushort)value;//角色坐标x break; case PlayerDataType.PosY: baseData.PosY = (ushort)value;//角色坐标y break; case PlayerDataType.State: break; case PlayerDataType.MaxHP: extersion.MaxHP = (int)value; if (hero != null) { hero.ActorInfo.ResetHp(-1, -1, (int)value); } break; case PlayerDataType.HP: if (CrossServerUtility.IsCrossServer()) { if (!isMainServerData) { baseData.HP = value; } } else { baseData.HP = value; } break; case PlayerDataType.MaxMP: extersion.MaxMP = (int)value; break; case PlayerDataType.XP: break; case PlayerDataType.HPRestoreSetting: break; case PlayerDataType.MPRestoreSetting: 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.MAtkMin: break; case PlayerDataType.MAtkMax: break; case PlayerDataType.MDef: break; case PlayerDataType.HIT: extersion.HIT = (int)value; break; case PlayerDataType.POISIONATK: break; case PlayerDataType.FIREATK: break; case PlayerDataType.REALATK: extersion.realATK = (int)value; break; case PlayerDataType.THUNDERATK: break; case PlayerDataType.WINDATK: break; case PlayerDataType.POISIONDEF: break; case PlayerDataType.FIREDEF: break; case PlayerDataType.REALDEF: extersion.realDEF = (int)value; break; case PlayerDataType.THUNDERDEF: break; case PlayerDataType.WINDDEF: break; case PlayerDataType.Miss: extersion.Miss = (int)value; break; case PlayerDataType.SuperHit: extersion.SuperHit = (int)value; break; case PlayerDataType.Buff: break; case PlayerDataType.Skill: break; case PlayerDataType.Mark: break; case PlayerDataType.SettingH: break; case PlayerDataType.SettingV: break; case PlayerDataType.FightPK: break; case PlayerDataType.ActiveValue: 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.CountryLastWeekHornor: break; case PlayerDataType.LastWeekOnlineTime: break; case PlayerDataType.LastWeekFamilyActiveValue: break; case PlayerDataType.FBID: baseData.FBID = (byte)value; break; case PlayerDataType.FamilyLV: break; case PlayerDataType.RealMapID: extersion.RealMapID = (int)value; break; case PlayerDataType.GMLevel: baseData.GMLevel = (byte)value; break; case PlayerDataType.TeamID: if (hero != null) { hero.ActorInfo.teamID = value; ReCheckAttackTarget(); } break; case PlayerDataType.TeamLV: break; case PlayerDataType.FightPower: baseData.FightPoint = value; ModelCenter.Instance.GetModel().PowerAdd((int)value); break; case PlayerDataType.RebornMapID: break; case PlayerDataType.RebornPosX: break; case PlayerDataType.RebornPosY: break; case PlayerDataType.Coin: break; case PlayerDataType.BillboardLV: break; case PlayerDataType.Tick: #if UNITY_EDITOR DebugEx.LogFormat("---- 收到服务端Tick: {0}", value); if (isMainServerData) { 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秒"); } } } else { if (crossServerTick != 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 if (isMainServerData) { extersion.Tick = value; } else { crossServerTick = value; } m_Tick = Environment.TickCount; break; case PlayerDataType.CurrentPlayerType: break; case PlayerDataType.FriendFavor: break; case PlayerDataType.BackpackLV: break; case PlayerDataType.ReincarnationLV: break; case PlayerDataType.BaseSTR: break; case PlayerDataType.BasePNE: break; case PlayerDataType.BasePHY: break; case PlayerDataType.BaseCON: break; case PlayerDataType.ReceivedSalary: break; case PlayerDataType.WarehouseLV: break; case PlayerDataType.EquipShowSwitch: baseData.equipShowSwitch = value; if (hero != null) { hero.SwitchSuit(); } break; case PlayerDataType.LuckValue: extersion.luckValue = (int)value; break; case PlayerDataType.ExAttr1: break; case PlayerDataType.ExAttr2: baseData.teamAutoOperateFlag = value; break; case PlayerDataType.ExAttr3: baseData.dungeonLineId = (int)value; break; case PlayerDataType.ExAttr4: baseData.shield = value; break; case PlayerDataType.ExAttr5: var oldExAttr5 = baseData.CrossServerFlag; baseData.CrossServerFlag = value; if (oldExAttr5 > 2 && value <= 2) { if (GameNetSystem.Instance.crossServerConnected_Loigc) { GameNetSystem.Instance.crossServerConnected_Loigc = false; GameNetSystem.Instance.DisconnectCrossServer(); if (hero != null) { StatusMgr.Instance.ReleaseActor(hero.ServerInstID); } extersion.pkState = 0; baseData.MapID = baseData.mainServerMapIdRecord; baseData.dungeonLineId = 0; ModelCenter.Instance.GetModel().ResetBufData(); StageLoad.Instance.PushSceneLoadCommand(new StageLoad.StageLoadCommand() { toMapId = baseData.MapID, toLineId = 0, needEmpty = true, needLoadResource = true, serverType = ServerType.CrossSever, isClientLoadMap = true }); } } break; case PlayerDataType.Faction: baseData.faction = value; if (hero != null) { hero.ActorInfo.faction = (int)value; ReCheckAttackTarget(); hero.SetFairyLeagueHeadUp(baseData.MapID == FairyLeagueModel.FAIRY_LEAGUE_DUNGEON); } break; case PlayerDataType.InfamyValue: break; case PlayerDataType.RealmLevel: baseData.realmLevel = (byte)value; break; case PlayerDataType.IsFindByLabel: break; case PlayerDataType.IsCloseFriendLabel: break; case PlayerDataType.ChangeCoinPointTotal: baseData.coinPointTotal = value; break; case PlayerDataType.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 PlayerDataType.ExAttr6: baseData.copperExtend = value; break; case PlayerDataType.ExAttr7: baseData.sp = value; break; case PlayerDataType.ExAttr8: baseData.spExtend = value; break; case PlayerDataType.ExAttr9: break; case PlayerDataType.ExAttr10: baseData.bubbleId = value; break; case PlayerDataType.ModelMark: break; case PlayerDataType.PrizeCoin: break; case PlayerDataType.ExAttr11: baseData.ExAttr11 = value; break; case PlayerDataType.ExAttr12: break; case PlayerDataType.ExAttr13: baseData.ServerGroupId = value; break; case PlayerDataType.ExAttr14: break; case PlayerDataType.BattleValEx1: extersion.battleValEx1 = (int)value; if (hero != null) { hero.CalculateAtkSpeed((ushort)extersion.battleValEx1); } 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.FamilyContribution: method.CepaContribution((int)value); break; case PlayerDataType.FamilyStoreScore: 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.Damageper: extersion.DamagePer = (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; if (hero != null) { hero.CalculateMoveSpeed((ushort)extersion.SpeedValue); } break; case PlayerDataType.LuckPer: 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; if (baseData.MapID != 31220) { 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 PlayerDataType.IsAttackBossState: extersion.bossState = (int)value; if (hero != null) { if (extersion.bossState == 0) { hero.atkBossID = 0; } } 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; ModelCenter.Instance.GetModel().ServerForbidenChat(extersion.forbidenTalk == 1); break; case PlayerDataType.CDBPlayerRefresh_TalentPoint: extersion.talentPoint = (int)value; break; case PlayerDataType.CDBPlayerRefresh_GodWeaponLV_1: baseData.godWeaponLV_1 = (int)value; break; case PlayerDataType.CDBPlayerRefresh_GodWeaponLV_2: baseData.godWeaponLV_2 = (int)value; break; case PlayerDataType.CDBPlayerRefresh_GodWeaponLV_3: baseData.godWeaponLV_3 = (int)value; break; case PlayerDataType.CDBPlayerRefresh_GodWeaponLV_4: baseData.godWeaponLV_4 = (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: 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; } } public int GetPlayerDataByType(PlayerDataType 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 (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(); if (CrossServerUtility.IsCrossServer()) { GameNetSystem.Instance.SendToCrossServer(_proto); } else { GameNetSystem.Instance.SendInfo(_proto); } } public void ClearTick() { extersion.Tick = 0; crossServerTick = 0; } public bool IsTickVaild() { if (CrossServerUtility.IsCrossServer()) { return crossServerTick != 0; } else { return extersion.Tick != 0; } } public uint GetWorldTick() { int _currentTick = Environment.TickCount - m_Tick; uint _tick = CrossServerUtility.IsCrossServer() ? crossServerTick + (uint)_currentTick : extersion.Tick + (uint)_currentTick; return _tick; } }