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"); } }
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(); }
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); }); }