public static BaseWorldMessage ReadMessage(IncomingMessage inMessage)
 {
     BaseWorldMessage rv;
     long oid = inMessage.ReadInt64();
     WorldMessageType messageType = inMessage.ReadMessageType();
     switch (messageType) {
         case WorldMessageType.LoginResponse:
             rv = new LoginResponseMessage();
             break;
         case WorldMessageType.Comm:
             rv = new CommMessage();
             break;
         case WorldMessageType.Direction:
             rv = new DirectionMessage();
             break;
         case WorldMessageType.Orientation:
             rv = new OrientationMessage();
             break;
         case WorldMessageType.TerrainConfig:
             rv = new TerrainConfigMessage();
             break;
         case WorldMessageType.SkyboxMaterial:
             rv = new SkyboxMaterialMessage();
             break;
         case WorldMessageType.NewObject:
             rv = new NewObjectMessage();
             break;
         case WorldMessageType.FreeObject:
             rv = new FreeObjectMessage();
             break;
         case WorldMessageType.AcquireResponse:
             rv = new AcquireResponseMessage();
             break;
         case WorldMessageType.EquipResponse:
             rv = new EquipResponseMessage();
             break;
         case WorldMessageType.UnequipResponse:
             rv = new UnequipResponseMessage();
             break;
         case WorldMessageType.Attach:
             rv = new AttachMessage();
             break;
         case WorldMessageType.Detach:
             rv = new DetachMessage();
             break;
         case WorldMessageType.StatUpdate:
             rv = new StatUpdateMessage();
             break;
         case WorldMessageType.Damage:
             rv = new DamageMessage();
             break;
         case WorldMessageType.Animation:
             rv = new AnimationMessage();
             break;
         case WorldMessageType.Sound:
             rv = new SoundMessage();
             break;
         case WorldMessageType.AmbientSound:
             rv = new AmbientSoundMessage();
             break;
         case WorldMessageType.FollowTerrain:
             rv = new FollowTerrainMessage();
             break;
         case WorldMessageType.Portal:
             rv = new PortalMessage();
             break;
         case WorldMessageType.AmbientLight:
             rv = new AmbientLightMessage();
             break;
         case WorldMessageType.NewLight:
             rv = new NewLightMessage();
             break;
         case WorldMessageType.TradeStartRequest:
             rv = new TradeStartRequestMessage();
             break;
         case WorldMessageType.TradeStart:
             rv = new TradeStartMessage();
             break;
         case WorldMessageType.TradeOfferRequest:
             rv = new TradeOfferRequestMessage();
             break;
         case WorldMessageType.TradeComplete:
             rv = new TradeCompleteMessage();
             break;
         case WorldMessageType.TradeOfferUpdate:
             rv = new TradeOfferUpdateMessage();
             break;
         case WorldMessageType.StateMessage:
             rv = new StateMessage();
             break;
         case WorldMessageType.QuestInfoRequest:
             rv = new QuestInfoRequestMessage();
             break;
         case WorldMessageType.QuestInfoResponse:
             rv = new QuestInfoResponseMessage();
             break;
         case WorldMessageType.QuestResponse:
             rv = new QuestResponseMessage();
             break;
         case WorldMessageType.RegionConfig:
             rv = new RegionConfigMessage();
             break;
         case WorldMessageType.InventoryUpdate:
             rv = new InventoryUpdateMessage();
             break;
         case WorldMessageType.QuestLogInfo:
             rv = new QuestLogInfoMessage();
             break;
         case WorldMessageType.QuestStateInfo:
             rv = new QuestStateInfoMessage();
             break;
         case WorldMessageType.RemoveQuestRequest:
             rv = new RemoveQuestRequestMessage();
             break;
         case WorldMessageType.RemoveQuestResponse:
             rv = new RemoveQuestResponseMessage();
             break;
         case WorldMessageType.GroupInfo:
             rv = new GroupInfoMessage();
             break;
         case WorldMessageType.UiTheme:
             rv = new UiThemeMessage();
             break;
         case WorldMessageType.LootAll:
             rv = new LootAllMessage();
             break;
         case WorldMessageType.OldModelInfo:
             rv = new OldModelInfoMessage();
             break;
         case WorldMessageType.FragmentMessage:
             rv = new FragmentMessage();
             break;
         case WorldMessageType.RoadInfo:
             rv = new RoadInfoMessage();
             break;
         case WorldMessageType.Fog:
             rv = new FogMessage();
             break;
         case WorldMessageType.AbilityInfo:
             rv = new AbilityInfoMessage();
             break;
         case WorldMessageType.AbilityUpdate:
             rv = new AbilityUpdateMessage();
             break;
         case WorldMessageType.OldObjectProperty:
             rv = new OldObjectPropertyMessage();
             break;
         case WorldMessageType.ObjectProperty:
             rv = new ObjectPropertyMessage();
             break;
         case WorldMessageType.AddParticleEffect:
             rv = new AddParticleEffectMessage();
             break;
         case WorldMessageType.RemoveParticleEffect:
             rv = new RemoveParticleEffectMessage();
             break;
         case WorldMessageType.TrackObjectInterpolation:
             rv = new TrackObjectInterpolationMessage();
             break;
         case WorldMessageType.TrackLocationInterpolation:
             rv = new TrackLocationInterpolationMessage();
             break;
         case WorldMessageType.OldExtension:
             rv = new OldExtensionMessage();
             break;
         case WorldMessageType.Extension:
             rv = new ExtensionMessage();
             break;
         case WorldMessageType.InvokeEffect:
             rv = new InvokeEffectMessage();
             break;
         case WorldMessageType.MobPath:
             rv = new MobPathMessage();
             break;
         case WorldMessageType.AggregatedRDP:
             rv = new AggregatedRDPMessage();
             break;
         case WorldMessageType.NewDecal:
             rv = new NewDecalMessage();
             break;
         case WorldMessageType.FreeDecal:
             rv = new FreeDecalMessage();
             break;
         case WorldMessageType.ModelInfo:
             rv = new ModelInfoMessage();
             break;
         case WorldMessageType.SoundControl:
             rv = new SoundControlMessage();
             break;
         case WorldMessageType.DirLocOrient:
             rv = new DirLocOrientMessage();
             break;
         case WorldMessageType.AuthorizedLogin:
             rv = new AuthorizedLoginMessage();
             break;
         case WorldMessageType.AuthorizedLoginResponse:
             rv = new AuthorizedLoginResponseMessage();
             break;
         case WorldMessageType.LoadingState:
             rv = new LoadingStateMessage();
             break;
         default:
             log.ErrorFormat("Unhandled world message type: {0}", messageType);
             return null;
     }
     rv.ParseWorldMessage(oid, inMessage);
     return rv;
 }