private static void PopulateSpecial(ref VehicleControlData data, ref SensorData sensorData, VehicleDefinition vehicleDefinition) { if (vehicleDefinition.MaxAcceleration != null) { data.maxAcceleration = (float)vehicleDefinition.MaxAcceleration; } if (vehicleDefinition.MaxSpeed != null) { data.maxSpeed = (float)vehicleDefinition.MaxSpeed; } if (vehicleDefinition.PanicDistance != null) { data.panicDistance = (float)vehicleDefinition.PanicDistance; } if (vehicleDefinition.ReactionTime != null) { data.reactionTime = (int)vehicleDefinition.ReactionTime; } if (vehicleDefinition.ResponseScaling != null) { data.responseScaling = (float)vehicleDefinition.ResponseScaling; } if (vehicleDefinition.SensorRange != null) { sensorData.sensorRange = (float)vehicleDefinition.SensorRange; } if (vehicleDefinition.Colour != null) { data.colourRed = vehicleDefinition.Colour.Value.r; data.colourGreen = vehicleDefinition.Colour.Value.g; data.colourBlue = vehicleDefinition.Colour.Value.b; } }
/// <summary> /// Parses an IDE file from a byte array. /// </summary> /// <param name="data">The IDE data to read in an array of bytes.</param> /// <param name="errorCount">The number of errors.</param> public void Parse(byte[] data, out int errorCount) { string parserData = Encoding.UTF8.GetString(data); string[] lines = parserData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); string mode = null; errorCount = 0; foreach (string line in lines) { if (line.StartsWith("#", StringComparison.InvariantCultureIgnoreCase) || line.Trim().Length == 0) { continue; } if (mode == null) { if (line.StartsWith("objs", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("tobj", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("anim", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("cars", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("weap", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("peds", StringComparison.InvariantCultureIgnoreCase) || // unused line.StartsWith("hier", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("path", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("2dfx", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith("txdp", StringComparison.InvariantCultureIgnoreCase)) { mode = line.Substring(0, 4).ToLowerInvariant(); } continue; } else { if (line.StartsWith("end", StringComparison.InvariantCultureIgnoreCase)) { mode = null; continue; } var parts = line.Split(new char[] { ',', ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < parts.Length; i++) { parts[i] = parts[i].Trim(' ', '\t', '\r', ','); } try { if (mode == "objs") { var element = new ObjectsIDEElement(); if (parts.Length == 5) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[3]); element.Flags = (IDEFlags)UInt32.Parse(parts[4]); } else if (parts.Length == 6) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[4]); element.Flags = (IDEFlags)UInt32.Parse(parts[5]); } else if (parts.Length == 7) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[5]); element.Flags = (IDEFlags)UInt32.Parse(parts[6]); } else if (parts.Length >= 8) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[6]); element.Flags = (IDEFlags)UInt32.Parse(parts[7]); } var obj = new ObjectDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName }; MasterDictionary.ObjectDefinitions.Add((int)element.Id, obj); } else if (mode == "tobj") { var element = new ObjectsIDEElement(); if (parts.Length == 7) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[3]); element.Flags = (IDEFlags)UInt32.Parse(parts[4]); element.TimeOn = UInt32.Parse(parts[5]); element.TimeOff = UInt32.Parse(parts[6]); } else if (parts.Length == 8) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[3]); element.Flags = (IDEFlags)UInt32.Parse(parts[5]); element.TimeOn = UInt32.Parse(parts[6]); element.TimeOff = UInt32.Parse(parts[7]); } else if (parts.Length == 9) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[3]); element.Flags = (IDEFlags)UInt32.Parse(parts[6]); element.TimeOn = UInt32.Parse(parts[7]); element.TimeOff = UInt32.Parse(parts[8]); } else if (parts.Length >= 10) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.DrawDistance = float.Parse(parts[3]); element.Flags = (IDEFlags)UInt32.Parse(parts[7]); element.TimeOn = UInt32.Parse(parts[8]); element.TimeOff = UInt32.Parse(parts[9]); } var obj = new ObjectDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName }; MasterDictionary.ObjectDefinitions.Add((int)element.Id, obj); } else if (mode == "anim") { var element = new ObjectsIDEElement(); if (parts.Length >= 6) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.AnimationName = parts[3]; element.DrawDistance = float.Parse(parts[4]); element.Flags = (IDEFlags)UInt32.Parse(parts[5]); } var obj = new ObjectDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName, AnimationName = element.AnimationName }; MasterDictionary.ObjectDefinitions.Add((int)element.Id, obj); } else if (mode == "cars") { var element = new CarsIDEElement(); if (parts.Length >= 11) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.Type = VehicleTypeFromString(parts[3]); element.Handling = parts[4]; element.GXTKey = parts[5]; element.Anims = parts[6]; element.Class = VehicleClassFromString(parts[7]); element.Frequency = parts[8]; element.Unknown = parts[9]; element.Comprules = parts[10]; } if (parts.Length >= 15) { element.WheelId = Int32.Parse(parts[11]); element.WheelScaleFront = float.Parse(parts[12]); element.WheelScaleRear = float.Parse(parts[13]); element.WheelUpgradeClass = Int32.Parse(parts[14]); } var veh = new VehicleDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName, Type = element.Type, WheelScaleFront = element.WheelScaleFront, WheelScaleRear = element.WheelScaleRear }; MasterDictionary.VehicleDefinitions.Add((int)element.Id, veh); } else if (mode == "weap") { var element = new WeaponsIDEElement(); if (parts.Length >= 6) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.AnimationName = parts[3]; element.MeshCount = UInt32.Parse(parts[4]); element.DrawDistance = UInt32.Parse(parts[5]); } var wep = new WeaponDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName, AnimationName = element.AnimationName }; MasterDictionary.WeaponDefinitions.Add((int)element.Id, wep); } else if (mode == "peds") { var element = new PedsIDEElement(); if (parts.Length >= 14) { element.Id = UInt32.Parse(parts[0]); element.ModelName = parts[1]; element.TextureDictionaryName = parts[2]; element.Type = PedestrianTypeFromString(parts[3]); element.Behavior = parts[4]; element.AnimationGroup = parts[5]; element.CarsCanDrive = parts[6]; element.Flags = UInt32.Parse(parts[7]); element.AnimationFile = parts[8]; element.Radio1 = UInt32.Parse(parts[9]); element.Radio2 = UInt32.Parse(parts[10]); element.VoiceArchive = parts[11]; element.Voice1 = parts[12]; element.Voice2 = parts[13]; } var skin = new SkinDefinition() { ModelName = element.ModelName, TextureDictionaryName = element.TextureDictionaryName, AnimationGroupName = element.AnimationGroup, Type = element.Type }; MasterDictionary.SkinDefinitions.Add((int)element.Id, skin); } } catch { errorCount++; } } } }