Пример #1
0
        private void ProcessCommandMessage(CliClient client, string domain, ConcurrentDictionary <ulong, MessageEntry> messages, ObjectCommandEnvelope commandEnvelope)
        {
            BaseCommand responseCommand = null;

            switch ((CommandType)commandEnvelope.Command.Type)
            {
            case CommandType.ObjectCreate:
                responseCommand = new ObjectCreateCommand(commandEnvelope.Command);
                break;

            case CommandType.ObjectUpdatePosition:
                responseCommand = new ObjectUpdatePositionCommand(commandEnvelope.Command);
                break;

            case CommandType.ObjectDestroy:
                responseCommand = new ObjectDestroyCommand(commandEnvelope.Command);
                break;
            }
            if (!messages.ContainsKey(commandEnvelope.ToObjectId))
            {
                Log.WriteLine($"[{client.ClientId} ERROR: {domain} mMessage {commandEnvelope.ToObjectId} is missing");
                return;
            }
            messages[commandEnvelope.ToObjectId].ResponseTimeStamp = DateTime.Now;
            messages[commandEnvelope.ToObjectId].ResponseCount++;
            byte[] responseData = commandEnvelope.Serialize();
            byte[] requestData  = messages[commandEnvelope.ToObjectId].CommandEnvelope.Serialize();
            if (!ComparyBinary(responseData, requestData))
            {
                Log.WriteLine($"{client.ClientId} ERROR: {domain} message {commandEnvelope.ToObjectId} invalid response");
            }
        }
Пример #2
0
        public void ActorMustIgnoreAnyNonOwnerCommand()
        {
            //setup
            const uint LOCKOWNER       = 9999;
            const uint NONLOCKOWNER    = 8888;
            var        areaRegionProbe = CreateTestProbe();
            IActorRef  testeeRef       = CreateDefaultObjectActor(areaRegionProbe);
            var        cmdLock         = new ObjectLockCommand(
                objectId: DEFAULTOBJECTID,
                lockOwnerId: LOCKOWNER,
                timeout: TimeSpan.FromMinutes(2)
                );
            var cmdEnvLock = new ObjectCommandEnvelope(LOCKOWNER, cmdLock, DEFAULTOBJECTID);

            var cmdUpdatePosition = new ObjectUpdatePositionCommand(
                DEFAULTOBJECTID,
                targetPosition: new AVector3
            {
                X = 10.0f,
                Y = 20.0f,
                Z = 30.0f,
            },
                targetOrientation: new AQuaternion
            {
                X = 40.0f,
                Y = 50.0f,
                Z = 60.0f,
                W = 70.0f,
            },
                startFrameTick: 0,
                stopFrameTick: 0
                );
            var cmdEnvUpdatePosition = new ObjectCommandEnvelope(NONLOCKOWNER, cmdUpdatePosition, DEFAULTOBJECTID);

            //execute
            testeeRef.Tell(cmdEnvLock);

            //verify - update position in new are
            areaRegionProbe.ExpectMsg <AreaCommandEnvelope>(m =>
            {
                Assert.Equal(CommandType.ObjectLock, m.ObjectCommandEnvelope.Command.Type);
                Assert.Equal(Locator.GetAreaIdFromWorldPosition(DEFAULTVECTOR), m.ToAreaId);
            });

            //execute
            testeeRef.Tell(cmdEnvUpdatePosition);

            areaRegionProbe.ExpectNoMsg();
        }
Пример #3
0
        public void ActorMustUpdateLocationMustInformOldAndNewArea()
        {
            //setup
            var       areaRegionProbe = CreateTestProbe();
            IActorRef testeeRef       = CreateDefaultObjectActor(areaRegionProbe);
            float     newPosX         = 3000.0f;
            float     newPosY         = 4000.0f;
            float     newPosZ         = 5000.0f;

            var cmdUpdatePosition = new ObjectUpdatePositionCommand(
                DEFAULTOBJECTID,
                targetPosition: new AVector3
            {
                X = newPosX,
                Y = newPosY,
                Z = newPosZ
            },
                targetOrientation: new AQuaternion
            {
                X = 40.0f,
                Y = 50.0f,
                Z = 60.0f,
                W = 70.0f
            },
                startFrameTick: 0,
                stopFrameTick: 0
                );
            var cmdEnvUpdatePosition = new ObjectCommandEnvelope(0, cmdUpdatePosition, DEFAULTOBJECTID);
            var expectedOldAreaId    = Locator.GetAreaIdFromWorldPosition(DEFAULTVECTOR);
            var expectedNewAreaId    = Locator.GetAreaIdFromWorldPosition(cmdUpdatePosition.TargetPosition);

            //execute
            testeeRef.Tell(cmdEnvUpdatePosition);

            //verify - update position in old area
            areaRegionProbe.ExpectMsg <AreaCommandEnvelope>(m =>
            {
                Assert.Equal(CommandType.ObjectUpdatePosition, m.ObjectCommandEnvelope.Command.Type);
                Assert.Equal(expectedOldAreaId, m.ToAreaId);
            });

            //verify - notify enter new area
            areaRegionProbe.ExpectMsg <ObjectEnterAreaCommand>(m =>
            {
                Assert.Equal(expectedNewAreaId, m.AreaId);
                Assert.Equal(cmdEnvUpdatePosition.ToObjectId, m.ObjectId);
            });

            //verify - notify leave old area
            areaRegionProbe.ExpectMsg <ObjectLeaveAreaCommand>(m =>
            {
                Assert.Equal(expectedOldAreaId, m.AreaId);
                Assert.Equal(cmdEnvUpdatePosition.ToObjectId, m.ObjectId);
            });

            //verify - update position in new are
            areaRegionProbe.ExpectMsg <AreaCommandEnvelope>(m =>
            {
                Assert.Equal(CommandType.ObjectUpdatePosition, m.ObjectCommandEnvelope.Command.Type);
                Assert.Equal(expectedNewAreaId, m.ToAreaId);
            });
        }