Пример #1
0
        public void RemoveObject(IServerDistributedObject obj)
        {
            base.RemoveObject(obj);

            DistributedObjectId doId = obj.DistributedObjectId;

            // Remove from object zones dict
            ZoneId zone = null;

            mDistributedObjectIdToObjectZones.TryGetValue(doId, out zone);
            mDistributedObjectIdToObjectZones.Remove(doId);

            // Remove from zone dict
            List <IServerDistributedObject> objList = null;

            if (zone != null && mZoneDict.TryGetValue(zone, out objList))
            {
                objList.Remove(obj);
            }

            //remove from mSessionIdsToDistributedObjectIds
            foreach (KeyValuePair <Guid, List <DistributedObjectId> > sessionIdToDistributedObjectIds in mSessionIdsToDistributedObjectIds)
            {
                sessionIdToDistributedObjectIds.Value.Remove(doId);
            }
        }
Пример #2
0
        public void BroadcastDistributedObjectUpdateMessageToZone(Message message, DistributedObjectId serverDistributedObjectId)
        {
            ZoneId      zoneId = this.GetZone(serverDistributedObjectId);
            List <Guid> sessionIdsToSendMessage = mServerStateMachine.SessionManager.GetSessionIdsInterestedInZoneId(zoneId);

            mServerStateMachine.SendMessageToReflector(message, sessionIdsToSendMessage);
        }
Пример #3
0
        public void AddAndRemoveObject()
        {
            ObjectRepository objRepo = new ObjectRepository();

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            // Object should not be present
            Assert.IsFalse(objRepo.ContainsObject(obj));
            Assert.IsFalse(objRepo.ContainsObject(doId));
            Assert.IsTrue(objRepo.GetObject(doId) == null);

            // Add obj
            objRepo.AddObject(obj);
            Assert.IsTrue(objRepo.ContainsObject(obj));
            Assert.IsTrue(objRepo.ContainsObject(doId));
            Assert.AreEqual((IDistributedObject)objRepo.GetObject(doId), (IDistributedObject)obj);

            // Remove obj
            objRepo.RemoveObject(obj);
            Assert.IsFalse(objRepo.ContainsObject(obj));

            // Try to remove an object already removed
            objRepo.RemoveObject(obj);
        }
Пример #4
0
        private AvatarDistributedObject BuildLocalAvatarDistributedObject(DistributedObjectId id, List <object> messageData)
        {
            AvatarDistributedObject av = new LocalAvatarDistributedObject(mSendMessage, id, messageData);

            GameFacade.Instance.RegisterProxy(new LocalAvatarProxy((LocalAvatarDistributedObject)av));
            return(av);
        }
Пример #5
0
        public IClientDistributedObject CreateDistributedObject(DistributedObjectId distributedObjectId, List <object> messageData)
        {
            DistributedObjectTypes type = CheckType.TryAssignType <DistributedObjectTypes>(messageData[0]);

            IClientDistributedObject clientDistributedObject = null;

            switch (type)
            {
            case DistributedObjectTypes.Avatar:
                Guid localSessionId = CheckType.TryAssignType <Guid>(messageData[2]);
                if (mLocalSessionId == localSessionId)
                {
                    clientDistributedObject = BuildLocalAvatarDistributedObject(distributedObjectId, messageData);
                }
                else
                {
                    clientDistributedObject = BuildForeignAvatarDistributedObject(distributedObjectId, messageData);
                }
                break;

            case DistributedObjectTypes.Room:
                clientDistributedObject = BuildRoomDistributedObject(distributedObjectId, messageData);
                break;

            case DistributedObjectTypes.MockObject:
                clientDistributedObject = BuildMockDistributedObject(distributedObjectId, messageData);
                break;

            default:
                throw new NotImplementedException(type.ToString());
            }
            return(clientDistributedObject);
        }
Пример #6
0
        // Returns the zone that this object is currently in.
        public ZoneId GetZone(DistributedObjectId doId)
        {
            ZoneId zoneId = null;

            mDistributedObjectIdToObjectZones.TryGetValue(doId, out zoneId);
            return(zoneId);
        }
Пример #7
0
 public void RegisterForeignAvatar(AvatarEntity foreignAvatar, DistributedObjectId doId)
 {
     mForeignAvatarEntities.Add(new KeyValuePair <DistributedObjectId, AvatarEntity>(doId, foreignAvatar));
     if (mHideForeignAvatars)
     {
         HideForeignAvatars();
     }
 }
Пример #8
0
        private void BeginRoomLoading(Message receivedMessage)
        {
            RoomId currentRoomId = CheckType.TryAssignType <RoomId>(receivedMessage.Data[0]);

            mCurrentRoomDistributedObjectId = CheckType.TryAssignType <DistributedObjectId>(receivedMessage.Data[1]);

            GameFacade.Instance.SendNotification(GameFacade.ROOM_LOADING_STARTED, currentRoomId);
        }
Пример #9
0
        /*******************************/
        // IMessageRouter Functions
        /*******************************/
        public void ReceiveMessage(Message message)
        {
            switch (message.MessageType)
            {
            case MessageType.Create:
                IClientDistributedObject distributedObject = mDistributedObjectFactory.CreateDistributedObject(message.DistributedObjectId, message.Data);
                if (distributedObject != null)
                {
                    this.AddObject(distributedObject);
                    List <System.Action <IClientDistributedObject> > requestedObjectCallbacks = null;
                    if (mAnticipatedDistributedObjectIdsToCallbacks.TryGetValue(distributedObject.DistributedObjectId, out requestedObjectCallbacks))
                    {
                        foreach (System.Action <IClientDistributedObject> requestedObjectCallback in requestedObjectCallbacks)
                        {
                            requestedObjectCallback(distributedObject);
                        }
                        mAnticipatedDistributedObjectIdsToCallbacks.Remove(distributedObject.DistributedObjectId);
                    }
                }
                break;

            case MessageType.Update:
                DistributedObjectId doId         = message.DistributedObjectId;
                IDistributedObject  updateObject = null;
                if (mObjectIds.TryGetValue(doId, out updateObject))
                {
                    updateObject.ProcessMessage(message);
                }
                else
                {
                    Console.LogError("Message update but objectId " + doId + " not found in repository");
                }
                break;

            case MessageType.Delete:
                DistributedObjectId deletedoId = message.DistributedObjectId;
                IDistributedObject  deleteObject;

                if (mObjectIds.TryGetValue(deletedoId, out deleteObject))
                {
                    if (deleteObject is ClientDistributedObject)
                    {
                        ClientDistributedObject deleteClientObject = deleteObject as ClientDistributedObject;
                        if (deleteClientObject != null)
                        {
                            deleteClientObject.Dispose();
                        }
                    }
                    this.RemoveObject(deleteObject);
                }
                else
                {
                    Console.LogError("Message delete but objectId " + deletedoId.ToString() + " not found in repository");
                }
                break;
            }
        }
Пример #10
0
        public bool GetRoomDistributedObjectId(RoomId roomId, out DistributedObjectId distributedObjectId)
        {
            distributedObjectId = null;
            IServerDistributedRoom serverDistributedRoom = null;

            if (mRoomIdToRoomDistributedObject.TryGetValue(roomId, out serverDistributedRoom))
            {
                distributedObjectId = serverDistributedRoom.DistributedObjectId;
                return(true);
            }
            return(false);
        }
Пример #11
0
 public void RemoveLocalAvatarEntity(DistributedObjectId localAvatarDistributedObjectId)
 {
     if (mLocalAvatarEntity.First == localAvatarDistributedObjectId)
     {
         mLocalAvatarEntity.Second.Dispose();
         mLocalAvatarEntity = null;
     }
     else
     {
         throw new System.Exception("Error: trying to remove an avatar that is not our current local avatar.");
     }
 }
Пример #12
0
        // Add this DistributedObject to the repository.
        public void AddObjectToSessionId(Guid sessionId, IServerDistributedObject obj)
        {
            if (!mSessionIdsToDistributedObjectIds.ContainsKey(sessionId))
            {
                mSessionIdsToDistributedObjectIds[sessionId] = new List <DistributedObjectId>();
            }
            DistributedObjectId doId = obj.DistributedObjectId;

            mSessionIdsToDistributedObjectIds[sessionId].Add(doId);
            // Store in the dictionary of objects
            mObjectIds[doId] = obj;
        }
        public ClientDistributedGreenScreenRoom(SendMessageCallback sendMessage, DistributedObjectId doId, List <object> messageData)
            : base(sendMessage, doId)
        {
            mRoomName           = CheckType.TryAssignType <string>(messageData[5]);
            mRoomId             = CheckType.TryAssignType <RoomId>(messageData[7]);
            mRoomOwnerAccountId = CheckType.TryAssignType <AccountId>(messageData[8]);

            BuildEntity();

            string roomItemsXmlString = CheckType.TryAssignType <string>(messageData[3]);

            SetupAssetsFromItemsXml(roomItemsXmlString);
        }
        // Get an object update but the object is not in the repository
        public void ReceiveMessageForMissingObject()
        {
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            ServerObjectRepository objectRepo         = new ServerObjectRepository(serverStateMachine);

            DistributedObjectId doId = new DistributedObjectId(100);

            Message       updateMessage = new Message();
            List <object> data          = new List <object>();

            data.Add("Test");
            updateMessage.UpdateObjectMessage(true, false, doId, (int)MessageSubType.Chat, data);

            objectRepo.ReceiveRequest(updateMessage, Guid.Empty);
        }
Пример #15
0
        public void RemoveForeignAvatarEntity(DistributedObjectId foreignAvatarDistributedObjectId)
        {
            AvatarEntity        foreignAvatarEntity    = null;
            List <AvatarEntity> foreignAvatarsToRemove = new List <AvatarEntity>();

            if (mForeignAvatarEntities.TryGetValue(foreignAvatarDistributedObjectId, out foreignAvatarEntity))
            {
                foreignAvatarsToRemove.Add(foreignAvatarEntity);
                foreignAvatarEntity.Dispose();
            }

            mForeignAvatarEntities.Remove(foreignAvatarDistributedObjectId);

            foreignAvatarsToRemove.Clear();
        }
        public void ZoneHandling()
        {
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            ServerObjectRepository objRepo            = new ServerObjectRepository(serverStateMachine);

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            ZoneId zoneId1 = new ZoneId(100);
            ZoneId zoneId2 = new ZoneId(200);

            objRepo.AddObject(obj);

            // No zone set yet
            Assert.IsTrue(objRepo.GetZone(obj) == null);
            Assert.IsTrue(objRepo.GetZone(doId) == null);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);

            // Set the first zone
            objRepo.SetObjectZone(obj, zoneId1);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId1);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId1);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 1);

            // Now change to the second zone
            objRepo.SetObjectZone(obj, zoneId2);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId2);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId2);
            // Should no longer be in the first zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);
            // Should be in the second zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 1);

            // Try setting the same zone again
            objRepo.SetObjectZone(obj, zoneId2);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId2);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId2);
            // Should be in the second zone, only once
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 1);

            // Remove obj
            objRepo.RemoveObject(obj);
            Assert.IsFalse(objRepo.ContainsObject(obj));
            // Should not be in either zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 0);
        }
Пример #17
0
 public void AddLocalAvatarEntity(LocalAvatarEntity localAvatar, DistributedObjectId doId)
 {
     if (mLocalAvatarEntity != null)
     {
         Console.LogError("The local avatar should only be built once.  if we are seeing this message then this function be being used incorrectly.  this system is flimsy and the assumption that mLocalAvatarEntity has to be null might be incorrect.  if you see this message and it's still not crunch month look into this.");
     }
     if (localAvatar == null)
     {
         throw new ArgumentNullException("localAvatar");
     }
     if (doId == null)
     {
         throw new ArgumentNullException("doId");
     }
     mLocalAvatarEntity = new Pair <DistributedObjectId, LocalAvatarEntity>(doId, localAvatar);
 }
Пример #18
0
        private void GetDistributedObjectReference(DistributedObjectId requestedDistributedObjectId, System.Action <IClientDistributedObject> retrieveDistributedObjectCallback)
        {
            IClientDistributedObject clientDistributedObject = this.GetObject(requestedDistributedObjectId) as IClientDistributedObject;

            //if the resulting object is null, we need to cache this request for when the object is eventually downloaded
            if (clientDistributedObject == null)
            {
                if (!mAnticipatedDistributedObjectIdsToCallbacks.ContainsKey(requestedDistributedObjectId))
                {
                    mAnticipatedDistributedObjectIdsToCallbacks.Add(requestedDistributedObjectId, new List <System.Action <IClientDistributedObject> >());
                }
                mAnticipatedDistributedObjectIdsToCallbacks[requestedDistributedObjectId].Add(retrieveDistributedObjectCallback);
            }
            else
            {
                retrieveDistributedObjectCallback(clientDistributedObject);
            }
        }
Пример #19
0
        public ServerDistributedAvatar(DistributedObjectId doId, AvatarId avatarId, Guid localSessionId, string nickname, XmlDocument itemIdXml, ServerAccount serverAccount, ServerObjectRepository serverObjectRepository, ServerAssetRepository serverAssetRepository)
            : base(serverObjectRepository, doId)
        {
            mCurrentTelemetryData  = new List <object>();
            mObjectType            = DistributedObjectTypes.Avatar;
            mAvatarId              = avatarId;
            mAvatarName            = nickname;
            mServerAccount         = serverAccount;
            mServerAssetRepository = serverAssetRepository;

            mObjectData.Add(mObjectType);
            mObjectData.Add("Avatar/Avatar Rig");
            //UNCOMMENT THIS TO SEE WHICH SESSION THIS AVATAR BELONGS TO
            //Console.Write("creating server distributed avatar data with session id: " + localSessionId);
            mObjectData.Add(localSessionId);
            mObjectData.Add(itemIdXml.InnerXml);
            mObjectData.Add(mAvatarName);
        }
Пример #20
0
        private void GetAvatarServiceResponse(XmlNode avatarXmlNode, string nickname, Guid sessionId, ZoneId zoneId, Action <bool> gotAvatarServiceResponse)
        {
            List <ItemId> itemIds = null;
            AvatarId      avatarId;

            try
            {
                if (AvatarXmlUtil.GetAvatarInfoFromAvatarXmlNode(avatarXmlNode, out avatarId, out itemIds))
                {
                    Dna savedDna = mServerAssetRepository.GetDna(itemIds);

                    // Create an updated dna by starting with the reference dna and updating it with the savedDna
                    GetReferenceAvatar(delegate(Dna referenceAvatarDna)
                    {
                        Dna avatarDna = new Dna(mReferenceAvatarDna);
                        avatarDna.UpdateDna(savedDna);
                        // TODO?  If UpdateDna overwrites something or fills in missing data we should save the dna back to the db

                        // Get xml from updated avatar dna
                        XmlDocument dnaXml = mServerAssetRepository.GetXmlDna(avatarDna.GetItemIdList());

                        DistributedObjectId distributedObjectId = mDistributedObjectIdManager.GetNewId();

                        ServerAccount serverAccount = mServerStateMachine.SessionManager.GetServerAccountFromSessionId(sessionId);
                        ServerDistributedAvatar serverDistributedAvatar = new ServerDistributedAvatar(distributedObjectId, avatarId, sessionId, nickname, dnaXml, serverAccount, mServerObjectRepository, mServerAssetRepository);
                        //register object with object repository
                        mServerObjectRepository.AddObjectToSessionId(sessionId, serverDistributedAvatar);
                        //register object with session manager
                        mServerEngine.ProcessZoneChange(serverDistributedAvatar, zoneId);
                        gotAvatarServiceResponse(true);
                    });
                }
                else
                {
                    gotAvatarServiceResponse(false);
                }
            }
            catch (System.Exception ex)
            {
                StateServerAssert.Assert(ex);
                gotAvatarServiceResponse(false);
            }
        }
Пример #21
0
        public AvatarDistributedObject(SendMessageCallback sendMessage, DistributedObjectId doId, List <object> messageData)
            : base(sendMessage, doId)
        {
            mScheduler = GameFacade.Instance.RetrieveMediator <SchedulerMediator>().Scheduler;
            mPath      = (string)messageData[1];

            string xmlString = (string)messageData[3];

            mAvatarDna.LoadXml(xmlString);

            mAvatarName = (string)messageData[4];

            if (this.AvatarDna == null)
            {
                throw new Exception("this.AvatarDna is null when trying to Build Local Avatar Entity.");
            }

            BuildEntity();
        }
Пример #22
0
        // This object is changing zones, so record the new zone
        public void SetObjectZone(IServerDistributedObject obj, ZoneId zone)
        {
            // Record this object as moving into this new zone.
            // Cleanup any references to the old zone it was in.

            DistributedObjectId doId = obj.DistributedObjectId;

            // First grab the old zone
            ZoneId oldZone = null;

            mDistributedObjectIdToObjectZones.TryGetValue(doId, out oldZone);

            // Now store the new zone
            mDistributedObjectIdToObjectZones[doId] = zone;

            // If it had a zone before, remove it from the ZoneDict's list
            if (oldZone != null)
            {
                // Remove obj from the old zone list
                List <IServerDistributedObject> objList = null;
                if (mZoneDict.TryGetValue(oldZone, out objList))
                {
                    objList.Remove(obj);
                    // We don't remove an empty list here because the assumption
                    // is that it will be used again in the near future...
                }
            }

            // Now add this object to the ZoneDict's list in the new zone
            if (zone != null)
            {
                // Create an object list for this zone if it is not there already...
                List <IServerDistributedObject> objList = null;
                if (!mZoneDict.TryGetValue(zone, out objList))
                {
                    // New zone being used, create a new list
                    objList = new List <IServerDistributedObject>();
                    mZoneDict.Add(zone, objList);
                }
                objList.Add(obj);
            }
        }
Пример #23
0
        private IClientDistributedRoom BuildRoomDistributedObject(DistributedObjectId id, List <object> messageData)
        {
            RoomType roomType = CheckType.TryAssignType <RoomType>(messageData[2]);

            IClientDistributedRoom clientDistributedRoom = null;

            switch (roomType)
            {
            case RoomType.GreenScreenRoom:
                clientDistributedRoom = new ClientDistributedGreenScreenRoom(mSendMessage, id, messageData);
                break;

            case RoomType.MiniGameRoom:
                throw new System.Exception("we shouldn't be creating these anymore in this way!! talk to matt!");
            }
            RoomManagerProxy roomManagerProxy = GameFacade.Instance.RetrieveProxy <RoomManagerProxy>();

            roomManagerProxy.UpdateCurrentRoomReference(clientDistributedRoom);
            return(clientDistributedRoom);
        }
Пример #24
0
        public void ObjectZoneChangingWithNobodyListening()
        {
            // Setup the server engine and its required dependencies
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            SessionManager         sessionManager     = new SessionManager();
            ServerObjectRepository objectRepo         = new ServerObjectRepository(serverStateMachine);
            ServerEngine           serverEngine       = new ServerEngine(sessionManager, objectRepo, MockSendMessageToReflector);

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            ZoneId zoneId1 = new ZoneId(100);
            ZoneId zoneId2 = new ZoneId(200);

            // Start by putting the object in the first zone
            serverEngine.ProcessZoneChange(obj, zoneId1);
            Assert.IsTrue(objectRepo.GetZone(obj) == zoneId1);

            // Test changing to the zone the object is already in
            serverEngine.ProcessZoneChange(obj, zoneId1);
            Assert.IsTrue(objectRepo.GetZone(obj) == zoneId1);

            // Now change to a new zone
            serverEngine.ProcessZoneChange(obj, zoneId2);
            Assert.IsTrue(objectRepo.GetZone(obj) == zoneId2);

            // Now remove the object from the zone
            Assert.IsTrue(serverEngine.RemoveObjectFromZone(obj) == zoneId2);
            Assert.IsTrue(objectRepo.GetZone(obj) == null);

            // Try a duplicate removal - should be safe to do
            Assert.IsTrue(serverEngine.RemoveObjectFromZone(obj) == null);
            Assert.IsTrue(objectRepo.GetZone(obj) == null);

            // Now put the object back in the first zone
            serverEngine.ProcessZoneChange(obj, zoneId1);
            Assert.IsTrue(objectRepo.GetZone(obj) == zoneId1);
        }
Пример #25
0
        public void DisconnectSession()
        {
            // Setup the server engine and its required dependencies
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            SessionManager         sessionManager     = new SessionManager();
            ServerObjectRepository objectRepo         = new ServerObjectRepository(serverStateMachine);
            ServerEngine           serverEngine       = new ServerEngine(sessionManager, objectRepo, MockSendMessageToReflector);

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            ZoneId zoneId    = new ZoneId(200);
            Guid   sessionId = new Guid();

            Assert.IsTrue(sessionManager.AddSession(sessionId, new ServerAccount(new AccountId(0), 0, "0", "0", "schmear", "mein", "schmeer", null)));
            objectRepo.AddObjectToSessionId(sessionId, obj);

            serverEngine.ProcessOpenZoneInterest(sessionId, zoneId);
            serverEngine.ProcessZoneChange(obj, zoneId);

            serverEngine.ProcessDisconnectSession(sessionId);

            // See if the object repo got cleaned up
            // Object repo should no longer have the object
            Assert.IsFalse(objectRepo.ContainsObject(obj));
            Assert.IsTrue(objectRepo.GetObject(doId) == null);
            // Object should not be in the zone
            Assert.IsFalse(objectRepo.GetObjectsInZone(zoneId).Contains(obj));
            Assert.IsTrue(objectRepo.GetDistributedObjectIdsOwnedBySessionId(sessionId).Count == 0);

            // See if the session manager got cleaned up
            // Session manager should no longer have the session
            Assert.IsFalse(sessionManager.ContainsSession(sessionId));
            // Zone interest should be cleaned up
            Assert.IsFalse(sessionManager.SessionIdHasInterest(sessionId, zoneId));
            Assert.IsFalse(sessionManager.GetSessionIdsInterestedInZoneId(zoneId).Contains(sessionId));
            Assert.IsFalse(sessionManager.GetZoneIdsFromInterestedSessionId(sessionId).Contains(zoneId));
        }
 public ClientMockDistributedObject(SendMessageCallback sendMessage, DistributedObjectId doId) : base(sendMessage, doId)
 {
 }
 public DistributedTestObject(DistributedObjectId doId) : base(null, doId)
 {
 }
 public ForeignAvatarDistributedObject(SendMessageCallback sendMessage, DistributedObjectId doId, List <object> messageData)
     : base(sendMessage, doId, messageData)
 {
 }
 public ClientDistributedMiniGameRoom(SendMessageCallback sendMessage, DistributedObjectId doId, List <object> messageData)
     : base(sendMessage, doId)
 {
     BuildEntity();
 }
Пример #30
0
 public ServerDistributedObject(ServerObjectRepository serverObjectRepository, DistributedObjectId doId)
     : base(doId)
 {
     mServerObjectRepository = serverObjectRepository;
 }