public virtual bool LeaveScene(Scene _this, ObjBase obj, ReasonType reason = ReasonType.VisibilityChanged) { if (_this.mTicking) { _this.mNeedToRemoveObjDict.Add(obj.ObjId, obj); obj.Active = false; return(true); } var zone = obj.Zone; if (null != zone) { obj.BroadcastDestroyMe(reason); zone.RemoveObj(obj); //Uint64Array array = new Uint64Array(); //array.Items.Add(obj.ObjId); //SceneServer.Instance.ServerControl.DeleteObj(zone.EnumAllVisiblePlayerIdExclude(obj.ObjId), array, (uint)reason); } obj.SetZone(null); if (obj.IsCharacter()) { var character = obj as ObjCharacter; character.ClearRetinue(); foreach (var pair in _this.mAreaDict) { if (pair.Value.Cantains(character)) { pair.Value.Remove(character); } } if (obj.GetObjType() == ObjType.PLAYER) { _this.OnPlayerLeave(obj as ObjPlayer); } else if (obj.GetObjType() == ObjType.NPC) { if (_this.SpeMonsterToWorldBossId.ContainsKey(obj)) { Log(_this, Logger, "Special monster killed!Type = {0}", obj.TypeId); var worldBossId = _this.SpeMonsterToWorldBossId[obj]; --_this.SpeMonsterAlwaysRecords[worldBossId]; _this.SpeMonsterToWorldBossId.Remove(obj); } } } obj.LeavelScene(); _this.RemoveObj(obj); return(true); }