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 ActorMustNotifyAreaRegionOnCreationAndDestruction() { //setup var areRegionProbe = CreateTestProbe(); var localShardRegionResolver = new Mock <IShardRegionResolver>(); localShardRegionResolver.Setup(m => m.GetShardRegion(ShardRegions.AREAREGION)).Returns(areRegionProbe); var testeeRef = Sys.ActorOf(Props.Create(() => new ObjectActor(localShardRegionResolver.Object)), DEFAULTOBJECTID.ToString(CultureInfo.InvariantCulture)); Watch(testeeRef); var cmdCreate = new ObjectCreateCommand( frameTick: 0, objectId: DEFAULTOBJECTID, parentObjectId: 0, ownerId: 0, typeId: 0, 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, }); var cmdEnvCreate = new ObjectCommandEnvelope(0, cmdCreate, DEFAULTOBJECTID); var cmdDestroy = new ObjectDestroyCommand( frameTick: 0, objectId: DEFAULTOBJECTID, targetPosition: new AVector3 { X = 10.0f, Y = 20.0f, Z = 30.0f }); var cmdEnvDestroy = new ObjectCommandEnvelope(0, cmdDestroy, DEFAULTOBJECTID); //execute testeeRef.Tell(cmdEnvCreate); //verify - object enters area areRegionProbe.ExpectMsg <ObjectEnterAreaCommand>(m => { Assert.Equal(DEFAULTOBJECTID, m.ObjectId); Assert.Equal(Locator.GetAreaIdFromWorldPosition(cmdCreate.TargetPosition), m.AreaId); }); //create reaches area subscribers areRegionProbe.ExpectMsg <AreaCommandEnvelope>(m => { Assert.Equal(Locator.GetAreaIdFromWorldPosition(cmdCreate.TargetPosition), m.ToAreaId); Assert.Equal(CommandType.ObjectCreate, m.ObjectCommandEnvelope.Command.Type); }); //execute testeeRef.Tell(cmdEnvDestroy); //verify - object leaves area areRegionProbe.ExpectMsg <ObjectLeaveAreaCommand>(m => { Assert.Equal(DEFAULTOBJECTID, m.ObjectId); Assert.Equal(Locator.GetAreaIdFromWorldPosition(cmdDestroy.TargetPosition), m.AreaId); }); //verify - destroy reaches area subscribers areRegionProbe.ExpectMsg <AreaCommandEnvelope>(m => { Assert.Equal(Locator.GetAreaIdFromWorldPosition(cmdCreate.TargetPosition), m.ToAreaId); Assert.Equal(CommandType.ObjectDestroy, m.ObjectCommandEnvelope.Command.Type); }); ExpectTerminated(testeeRef); }