/// <summary> /// Subscribes an item. /// </summary> /// <param name = "item"> /// The mmo item. /// </param> /// <param name = "operation"> /// The operation. /// </param> /// <param name = "interestArea"> /// The interestArea. /// </param> /// <returns> /// Ok or ItemNotFound /// </returns> private OperationResponse ItemOperationSubscribeItem(Item item, SubscribeItem operation, InterestArea interestArea) { if (item.Disposed) { return operation.GetOperationResponse((int)ReturnCode.ItemNotFound, "ItemNotFound"); } lock (interestArea.SyncRoot) { interestArea.SubscribeItem(item); } if (operation.PropertiesRevision.HasValue == false || operation.PropertiesRevision.Value != item.PropertiesRevision) { var properties = new ItemPropertiesSet { ItemId = item.Id, ItemType = item.Type, PropertiesRevision = item.PropertiesRevision, PropertiesSet = new Hashtable(item.Properties) }; var eventData = new EventData((byte)EventCode.ItemPropertiesSet, properties); this.Peer.SendEvent(eventData, new SendParameters { ChannelId = Settings.ItemEventChannel }); } // don't send response operation.OnComplete(); return null; }
/// <summary> /// Spawns an item. /// </summary> /// <param name = "item"> /// The mmo item. /// </param> /// <param name = "operation"> /// The operation. /// </param> /// <param name = "interestArea"> /// The interest Area. /// </param> /// <returns> /// error code ok /// </returns> private OperationResponse ItemOperationSpawn(MmoItem item, SpawnItem operation, InterestArea interestArea) { // this should always return Ok MethodReturnValue result = this.CheckAccess(item); if (result) { item.Rotation = operation.Rotation; item.Spawn(operation.Position); ((MmoWorld)this.World).Radar.AddItem(item, operation.Position); if (interestArea != null) { lock (interestArea.SyncRoot) { interestArea.SubscribeItem(item); } } } operation.OnComplete(); return operation.GetOperationResponse(result); }