Exemplo n.º 1
0
Arquivo: Map.cs Projeto: ipud2/OWLib
            public void Write(Stream output)
            {
                using (BinaryWriter writer = new BinaryWriter(output)) {
                    writer.Write((ushort)1);  // version major
                    writer.Write((ushort)2);  // version minor

                    if (Name.Length == 0)
                    {
                        writer.Write((byte)0);
                    }
                    else
                    {
                        writer.Write(Name);
                    }

                    writer.Write(ModelGroups.Header.PlaceableCount); // nr objects

                    int entitiesWithModelCount = 0;
                    STUModelComponent[][] modelComponentSets = new STUModelComponent[Entities.Header.PlaceableCount][];

                    for (int i = 0; i < Entities.Header.PlaceableCount; i++)
                    {
                        // todo: wtf is this code

                        teMapPlaceableEntity entity = (teMapPlaceableEntity)Entities.Placeables[i];
                        var modelComponents         = GetInstances <STUModelComponent>(entity.Header.EntityDefinition).Where(component => teResourceGUID.Index(component.m_model) > 1);
                        if (modelComponents.Count() == 0)
                        {
                            foreach (STUComponentInstanceData instanceData in entity.InstanceData)
                            {
                                if (instanceData is STUStatescriptComponentInstanceData statescriptComponentInstanceData)
                                {
                                    if (statescriptComponentInstanceData.m_6D10093E != null)
                                    {
                                        foreach (STUStatescriptGraphWithOverrides graphWithOverrides in statescriptComponentInstanceData.m_6D10093E)
                                        {
                                            FindLogic.Combo.Find(Info, graphWithOverrides);
                                        }
                                    }

                                    if (statescriptComponentInstanceData.m_2D9815BA != null)
                                    {
                                        // todo: ??
                                    }
                                }
                            }
                            continue;
                        }
                        modelComponentSets[i]   = new STUModelComponent[modelComponents.Count()];
                        entitiesWithModelCount += modelComponentSets[i].Length;
                        modelComponentSets[i]   = modelComponents.ToArray();
                    }

                    writer.Write((uint)(SingleModels.Header.PlaceableCount + Models.Header.PlaceableCount +
                                        entitiesWithModelCount)); // nr details
                    writer.Write(Lights.Header.PlaceableCount);   // nr Lights

                    foreach (IMapPlaceable mapPlaceable in ModelGroups.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableModelGroup modelGroup = (teMapPlaceableModelGroup)mapPlaceable;

                        FindLogic.Combo.Find(Info, modelGroup.Header.Model);
                        FindLogic.Combo.ModelInfoNew modelInfo = Info.Models[modelGroup.Header.Model];
                        string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        writer.Write(modelFn);
                        writer.Write(modelGroup.Header.GroupCount);
                        for (int j = 0; j < modelGroup.Header.GroupCount; ++j)
                        {
                            teMapPlaceableModelGroup.Group group = modelGroup.Groups[j];
                            FindLogic.Combo.Find(Info, group.ModelLook, null,
                                                 new FindLogic.Combo.ComboContext {
                                Model = modelGroup.Header.Model
                            });
                            FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[group.ModelLook];
                            string materialFn =
                                $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                            writer.Write(materialFn);
                            writer.Write(group.EntryCount);
                            for (int k = 0; k < group.EntryCount; ++k)
                            {
                                teMapPlaceableModelGroup.Entry record = modelGroup.Entries[j][k];

                                writer.Write(record.Translation);
                                writer.Write(record.Scale);
                                writer.Write(record.Rotation);
                            }
                        }
                    }

                    foreach (IMapPlaceable mapPlaceable in SingleModels.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableSingleModel singleModel = (teMapPlaceableSingleModel)mapPlaceable;

                        FindLogic.Combo.Find(Info, singleModel.Header.Model);
                        FindLogic.Combo.Find(Info, singleModel.Header.ModelLook, null,
                                             new FindLogic.Combo.ComboContext {
                            Model = singleModel.Header.Model
                        });

                        FindLogic.Combo.ModelInfoNew  modelInfo     = Info.Models[singleModel.Header.Model];
                        FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[singleModel.Header.ModelLook];
                        string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        string matFn   =
                            $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                        writer.Write(modelFn);
                        writer.Write(matFn);
                        writer.Write(singleModel.Header.Translation);
                        writer.Write(singleModel.Header.Scale);
                        writer.Write(singleModel.Header.Rotation);
                    }

                    foreach (IMapPlaceable mapPlaceable in Models.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableModel placeableModel = (teMapPlaceableModel)mapPlaceable;

                        FindLogic.Combo.Find(Info, placeableModel.Header.Model);
                        FindLogic.Combo.Find(Info, placeableModel.Header.ModelLook, null,
                                             new FindLogic.Combo.ComboContext {
                            Model = placeableModel.Header.Model
                        });

                        FindLogic.Combo.ModelInfoNew  modelInfo     = Info.Models[placeableModel.Header.Model];
                        FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[placeableModel.Header.ModelLook];
                        string modelFn =
                            $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        string matFn =
                            $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                        writer.Write(modelFn);
                        writer.Write(matFn);
                        writer.Write(placeableModel.Header.Translation);
                        writer.Write(placeableModel.Header.Scale);
                        writer.Write(placeableModel.Header.Rotation);
                    }

                    for (int i = 0; i < Entities.Placeables?.Length; i++)
                    {
                        var entity = (teMapPlaceableEntity)Entities.Placeables[i];

                        STUModelComponent[] modelComponents = modelComponentSets[i];
                        if (modelComponents == null)
                        {
                            continue;
                        }

                        FindLogic.Combo.Find(Info, entity.Header.EntityDefinition);

                        foreach (var modelComponent in modelComponents)
                        {
                            ulong model        = modelComponent.m_model;
                            var   modelLookSet = new List <ulong> {
                                modelComponent.m_look
                            };

                            foreach (STUComponentInstanceData instanceData in entity.InstanceData)
                            {
                                if (!(instanceData is STUModelComponentInstanceData modelComponentInstanceData))
                                {
                                    continue;
                                }
                                if (modelComponentInstanceData.m_look != 0)
                                {
                                    modelLookSet.Add(modelComponentInstanceData.m_look);
                                }
                            }

                            FindLogic.Combo.Find(Info, model);
                            foreach (var modelLook in modelLookSet)
                            {
                                FindLogic.Combo.Find(Info, modelLook, null, new FindLogic.Combo.ComboContext {
                                    Model = model
                                });
                            }

                            FindLogic.Combo.ModelInfoNew modelInfo = Info.Models[model];
                            string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                            if (Info.Entities.ContainsKey(entity.Header.EntityDefinition))
                            {
                                modelFn = $"Entities\\{Info.Entities[entity.Header.EntityDefinition].GetName()}\\{Info.Entities[entity.Header.EntityDefinition].GetName()}.owentity";
                            }
                            string matFn = "null";
                            try {
                                FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[modelLookSet.First(x => x > 0)];
                                matFn = $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";
                            }
                            catch { }

                            writer.Write(modelFn);
                            writer.Write(matFn);
                            writer.Write(entity.Header.Translation);
                            writer.Write(entity.Header.Scale);
                            writer.Write(entity.Header.Rotation);
                        }
                    }

                    // Extension 1.1 - Lights
                    foreach (IMapPlaceable mapPlaceable in Lights.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        var light = (teMapPlaceableLight)mapPlaceable;

                        writer.Write(light.Header.Translation);
                        writer.Write(light.Header.Rotation);

                        writer.Write((uint)light.Header.Type);
                        writer.Write(light.Header.LightFOV);
                        writer.Write(light.Header.Color);

                        writer.Write(light.Header.Unknown1A);
                        writer.Write(light.Header.Unknown1B);
                        writer.Write(light.Header.Unknown2A);
                        writer.Write(light.Header.Unknown2B);
                        writer.Write(light.Header.Unknown2C);
                        writer.Write(light.Header.Unknown2D);
                        writer.Write(light.Header.Unknown3A);
                        writer.Write(light.Header.Unknown3B);

                        writer.Write(light.Header.UnknownPos1);
                        writer.Write(light.Header.UnknownQuat1);
                        writer.Write(light.Header.UnknownPos2);
                        writer.Write(light.Header.UnknownQuat2);
                        writer.Write(light.Header.UnknownPos3);
                        writer.Write(light.Header.UnknownQuat3);

                        writer.Write(light.Header.Unknown4A);
                        writer.Write(light.Header.Unknown4B);
                        writer.Write(light.Header.Unknown5);
                        writer.Write(light.Header.Unknown6A);
                        writer.Write(light.Header.Unknown6B);
                        writer.Write(light.Header.Unknown7A);
                        writer.Write(light.Header.Unknown7B);
                    }

                    writer.Write(Sounds.Header.PlaceableCount); // nr Sounds

                    // Extension 1.2 - Sounds
                    foreach (IMapPlaceable mapPlaceable in Sounds.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        var sound = (teMapPlaceableSound)mapPlaceable;
                        FindLogic.Combo.Find(Info, sound.Header.Sound);
                        writer.Write(sound.Header.Translation);
                        if (!Info.Sounds.ContainsKey(sound.Header.Sound) || Info.Sounds[sound.Header.Sound].SoundFiles == null)
                        {
                            writer.Write(0);
                            continue;
                        }
                        writer.Write(Info.Sounds[sound.Header.Sound].SoundFiles.Count);
                        foreach (var soundfile in Info.Sounds[sound.Header.Sound].SoundFiles?.Values)
                        {
                            writer.Write($@"Sounds\{Info.SoundFiles[soundfile].GetName()}.ogg");
                        }
                    }

                    // Extension 1.3 - Effects
                    foreach (IMapPlaceable mapPlaceable in Effects.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        var effect = (teMapPlaceableEffect)mapPlaceable;
                        FindLogic.Combo.Find(Info, effect.Header.Effect);
                        // todo: wtf
                    }
                }
            }
Exemplo n.º 2
0
            public void Write(Stream output)
            {
                using (BinaryWriter writer = new BinaryWriter(output)) {
                    writer.Write((ushort)1);  // version major
                    writer.Write((ushort)1);  // version minor

                    if (Name.Length == 0)
                    {
                        writer.Write((byte)0);
                    }
                    else
                    {
                        writer.Write(Name);
                    }

                    writer.Write(ModelGroups.Header.PlaceableCount); // nr objects

                    int entitiesWithModelCount          = 0;
                    STUModelComponent[] modelComponents = new STUModelComponent[Entities.Header.PlaceableCount];

                    for (int i = 0; i < Entities.Header.PlaceableCount; i++)
                    {
                        teMapPlaceableEntity entity    = (teMapPlaceableEntity)Entities.Placeables[i];
                        STUModelComponent    component = GetInstance <STUModelComponent>(entity.Header.EntityDefinition);
                        if (component != null && teResourceGUID.Index(component.m_model) > 1 && teResourceGUID.Index(component.m_look) > 1)
                        {
                            entitiesWithModelCount++;
                            modelComponents[i] = component;
                        }
                    }

                    writer.Write((uint)(SingleModels.Header.PlaceableCount + Models.Header.PlaceableCount +
                                        entitiesWithModelCount)); // nr details
                    writer.Write(Lights.Header.PlaceableCount);   // nr Lights

                    foreach (IMapPlaceable mapPlaceable in ModelGroups.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableModelGroup modelGroup = (teMapPlaceableModelGroup)mapPlaceable;

                        FindLogic.Combo.Find(Info, modelGroup.Header.Model);
                        FindLogic.Combo.ModelInfoNew modelInfo = Info.Models[modelGroup.Header.Model];
                        string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        writer.Write(modelFn);
                        writer.Write(modelGroup.Header.GroupCount);
                        for (int j = 0; j < modelGroup.Header.GroupCount; ++j)
                        {
                            teMapPlaceableModelGroup.Group group = modelGroup.Groups[j];
                            FindLogic.Combo.Find(Info, group.ModelLook, null,
                                                 new FindLogic.Combo.ComboContext {
                                Model = modelGroup.Header.Model
                            });
                            FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[group.ModelLook];
                            string materialFn =
                                $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                            writer.Write(materialFn);
                            writer.Write(group.EntryCount);
                            for (int k = 0; k < group.EntryCount; ++k)
                            {
                                teMapPlaceableModelGroup.Entry record = modelGroup.Entries[j][k];

                                writer.Write(record.Translation);
                                writer.Write(record.Scale);
                                writer.Write(record.Rotation);
                            }
                        }
                    }

                    foreach (IMapPlaceable mapPlaceable in SingleModels.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableSingleModel singleModel = (teMapPlaceableSingleModel)mapPlaceable;

                        FindLogic.Combo.Find(Info, singleModel.Header.Model);
                        FindLogic.Combo.Find(Info, singleModel.Header.ModelLook, null,
                                             new FindLogic.Combo.ComboContext {
                            Model = singleModel.Header.Model
                        });

                        FindLogic.Combo.ModelInfoNew  modelInfo     = Info.Models[singleModel.Header.Model];
                        FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[singleModel.Header.ModelLook];
                        string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        string matFn   =
                            $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                        writer.Write(modelFn);
                        writer.Write(matFn);
                        writer.Write(singleModel.Header.Translation);
                        writer.Write(singleModel.Header.Scale);
                        writer.Write(singleModel.Header.Rotation);
                    }

                    foreach (IMapPlaceable mapPlaceable in Models.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        teMapPlaceableModel placeableModel = (teMapPlaceableModel)mapPlaceable;

                        FindLogic.Combo.Find(Info, placeableModel.Header.Model);
                        FindLogic.Combo.Find(Info, placeableModel.Header.ModelLook, null,
                                             new FindLogic.Combo.ComboContext {
                            Model = placeableModel.Header.Model
                        });

                        FindLogic.Combo.ModelInfoNew  modelInfo     = Info.Models[placeableModel.Header.Model];
                        FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[placeableModel.Header.ModelLook];
                        string modelFn =
                            $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        string matFn =
                            $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                        writer.Write(modelFn);
                        writer.Write(matFn);
                        writer.Write(placeableModel.Header.Translation);
                        writer.Write(placeableModel.Header.Scale);
                        writer.Write(placeableModel.Header.Rotation);
                    }

                    for (int i = 0; i < Entities.Placeables?.Length; i++)
                    {
                        var entity = (teMapPlaceableEntity)Entities.Placeables[i];

                        STUModelComponent modelComponent = modelComponents[i];
                        if (modelComponent == null)
                        {
                            continue;
                        }

                        ulong model     = modelComponent.m_model;
                        ulong modelLook = modelComponent.m_look;

                        foreach (STUComponentInstanceData instanceData in entity.InstanceData)
                        {
                            if (!(instanceData is STUModelComponentInstanceData modelComponentInstanceData))
                            {
                                continue;
                            }
                            if (modelComponentInstanceData.m_look != 0)
                            {
                                modelLook = modelComponentInstanceData.m_look;
                            }
                        }

                        FindLogic.Combo.Find(Info, model);
                        FindLogic.Combo.Find(Info, modelLook, null, new FindLogic.Combo.ComboContext {
                            Model = model
                        });

                        FindLogic.Combo.ModelInfoNew  modelInfo     = Info.Models[model];
                        FindLogic.Combo.ModelLookInfo modelLookInfo = Info.ModelLooks[modelLook];
                        string modelFn = $"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl";
                        string matFn   = $"Models\\{modelInfo.GetName()}\\ModelLooks\\{modelLookInfo.GetNameIndex()}.owmat";

                        writer.Write(modelFn);
                        writer.Write(matFn);
                        writer.Write(entity.Header.Translation);
                        writer.Write(entity.Header.Scale);
                        writer.Write(entity.Header.Rotation);
                    }

                    // Extension 1.1 - Lights
                    foreach (IMapPlaceable mapPlaceable in Lights.Placeables ?? Array.Empty <IMapPlaceable>())
                    {
                        var light = (teMapPlaceableLight)mapPlaceable;

                        writer.Write(light.Header.Translation);
                        writer.Write(light.Header.Rotation);

                        writer.Write((uint)light.Header.Type);
                        writer.Write(light.Header.LightFOV);
                        writer.Write(light.Header.Color);

                        writer.Write(light.Header.Unknown1A);
                        writer.Write(light.Header.Unknown1B);
                        writer.Write(light.Header.Unknown2A);
                        writer.Write(light.Header.Unknown2B);
                        writer.Write(light.Header.Unknown2C);
                        writer.Write(light.Header.Unknown2D);
                        writer.Write(light.Header.Unknown3A);
                        writer.Write(light.Header.Unknown3B);

                        writer.Write(light.Header.UnknownPos1);
                        writer.Write(light.Header.UnknownQuat1);
                        writer.Write(light.Header.UnknownPos2);
                        writer.Write(light.Header.UnknownQuat2);
                        writer.Write(light.Header.UnknownPos3);
                        writer.Write(light.Header.UnknownQuat3);

                        writer.Write(light.Header.Unknown4A);
                        writer.Write(light.Header.Unknown4B);
                        writer.Write(light.Header.Unknown5);
                        writer.Write(light.Header.Unknown6A);
                        writer.Write(light.Header.Unknown6B);
                        writer.Write(light.Header.Unknown7A);
                        writer.Write(light.Header.Unknown7B);
                    }
                }
            }