示例#1
0
        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);
        }