示例#1
0
		private void TestFloat(IMessageQueue q, int pos, float value)
		{
			q.WriteFloat(pos, value);
			Assert.AreEqual(value, q.ReadFloat(pos));
		}
示例#2
0
		public void Send(IMessageQueue queue, LuaObject luaObject)
		{
			var id = (int)luaObject[LuaObject.FromString("MessageId")].AsNumber();
			var message = this.registry.GetDefinition(id);

			var table = luaObject.AsTable();

			int dynamicSize = 0;
			int foundProperties = 0;
			foreach (var property in message.Properties)
			{
				var serializer = this.luaTypeRegistry.GetSerializer(property.PropertyType);
				LuaObject propertyValue;
				if (table.TryGetValue(LuaObject.FromString(property.Name), out propertyValue))
				{
					++foundProperties;
				}
				dynamicSize += serializer.GetDynamicSize(queue, propertyValue);
			}
			var position = queue.Allocate(message.MinSize + dynamicSize);

			foreach (var keyValue in table)
			{
				var keyObject = keyValue.Key;
				int propertyKey = 0;
				if (keyObject.IsNumber)
				{
					propertyKey = (int)keyObject.AsNumber();
				}
				else
				{
					propertyKey = Hash.Eval(keyObject.AsString());
				}

				var property = message.GetPropertyById(propertyKey);
				switch (property.PropertyType)
				{
					case PropertyTypes.Int32:
						queue.WriteInt32(position + property.Offset, (int)keyValue.Value.AsNumber());
						break;
					case PropertyTypes.Single:
						queue.WriteFloat(position + property.Offset, (float)keyValue.Value.AsNumber());
						break;
					case PropertyTypes.String:
						queue.WriteInt32(position + property.Offset, message.MinSize);
						queue.WriteStringContent(position + message.MinSize, keyValue.Value.AsString());
						break;
					default:
						throw new NotImplementedException();
				}
			}
			queue.Commit(position);
		}