Exemplo n.º 1
0
        public void AddEntitySet(MCMloEntitySet set)
        {
            var instset = new MloInstanceEntitySet(set, this);
            var esets   = EntitySets?.ToList() ?? new List <MloInstanceEntitySet>();

            esets.Add(instset);
            EntitySets = esets.ToArray();
        }
Exemplo n.º 2
0
        public void SetEntitySet(MCMloEntitySet entset)
        {
            CurrentEntitySet = entset;
            Tag = entset;
            UpdateFormTitle();
            MloInstanceData instance = ProjectForm.TryGetMloInstance(entset?.OwnerMlo);

            //ProjectForm.WorldForm?.SelectMloEntitySet(entset, instance);
            UpdateControls();
        }
Exemplo n.º 3
0
        public void LoadChildren(Meta meta)
        {
            var centities = MetaTypes.ConvertDataArray <CEntityDef>(meta, MetaName.CEntityDef, _MloArchetypeDefData.entities);

            if (centities != null)
            {
                entities = new MCEntityDef[centities.Length];
                for (int i = 0; i < centities.Length; i++)
                {
                    entities[i] = new MCEntityDef(meta, ref centities[i])
                    {
                        Archetype = this
                    };
                }
            }

            var crooms = MetaTypes.ConvertDataArray <CMloRoomDef>(meta, MetaName.CMloRoomDef, _MloArchetypeDefData.rooms);

            if (crooms != null)
            {
                rooms = new MCMloRoomDef[crooms.Length];
                for (int i = 0; i < crooms.Length; i++)
                {
                    rooms[i] = new MCMloRoomDef(meta, crooms[i])
                    {
                        Archetype = this, Index = i
                    };
                }
            }

            var cportals = MetaTypes.ConvertDataArray <CMloPortalDef>(meta, MetaName.CMloPortalDef, _MloArchetypeDefData.portals);

            if (cportals != null)
            {
                portals = new MCMloPortalDef[cportals.Length];
                for (int i = 0; i < cportals.Length; i++)
                {
                    portals[i] = new MCMloPortalDef(meta, cportals[i]);
                }
            }

            var centitySets = MetaTypes.ConvertDataArray <CMloEntitySet>(meta, MetaName.CMloEntitySet, _MloArchetypeDefData.entitySets);

            if (centitySets != null)
            {
                entitySets = new MCMloEntitySet[centitySets.Length];
                for (int i = 0; i < centitySets.Length; i++)
                {
                    entitySets[i] = new MCMloEntitySet(meta, centitySets[i]);
                }
            }


            timeCycleModifiers = MetaTypes.ConvertDataArray <CMloTimeCycleModifier>(meta, MetaName.CMloTimeCycleModifier, _MloArchetypeDefData.timeCycleModifiers);
        }
Exemplo n.º 4
0
        public bool DeleteEntitySet(MCMloEntitySet set)
        {
            if (EntitySets == null)
            {
                return(false);
            }
            var esets = EntitySets.ToList();
            var rem   = esets.RemoveAll(s => s.EntitySet == set);

            EntitySets = esets.ToArray();
            UpdateAllEntityIndexes();
            return(rem == 1);
        }
Exemplo n.º 5
0
        public void AddEntitySet(MCMloEntitySet set)
        {
            if (set == null)
            {
                return;
            }

            set.OwnerMlo = this;
            set.Index    = entitySets?.Length ?? 0;

            var newsets = entitySets?.ToList() ?? new List <MCMloEntitySet>();

            newsets.Add(set);
            entitySets = newsets.ToArray();
        }
Exemplo n.º 6
0
        public void RemoveEntitySet(MCMloEntitySet set)
        {
            if (set == null)
            {
                return;
            }

            var newsets = entitySets.ToList();

            newsets.Remove(set);
            entitySets = newsets.ToArray();

            for (int i = 0; i < entitySets.Length; i++)
            {
                entitySets[i].Index = i;
            }

            UpdateAllEntityIndexes();
        }
Exemplo n.º 7
0
 public MloInstanceEntitySet(MCMloEntitySet entSet, MloInstanceData instance)
 {
     EntitySet = entSet;
     Entities  = new List <YmapEntityDef>();
     Instance  = instance;
 }
Exemplo n.º 8
0
        public void CreateYmapEntities(YmapEntityDef owner, MloArchetype mloa)
        {
            Owner = owner;
            if (owner == null)
            {
                return;
            }
            if (mloa.entities == null)
            {
                return;
            }
            var ec = mloa.entities.Length;

            var entlist = new List <YmapEntityDef>();

            for (int i = 0; i < ec; i++)
            {
                YmapEntityDef e = CreateYmapEntity(owner, mloa.entities[i], i);
                entlist.Add(e);
            }

            int lasti = ec;

            var entitySets = mloa.entitySets;

            if (entitySets != null)
            {
                for (int i = 0; i < entitySets.Length; i++)
                {
                    var entitySet = entitySets[i];
                    if (entitySet.Entities != null)
                    {
                        EntitySets[entitySet._Data.name] = new MloInstanceEntitySet(entitySet, this);
                        MloInstanceEntitySet instset = EntitySets[entitySet._Data.name];
                        for (int j = 0; j < entitySet.Entities.Length; j++)
                        {
                            YmapEntityDef e = CreateYmapEntity(owner, entitySet.Entities[j], lasti);
                            EntitySets[entitySet._Data.name].Entities.Add(e);
                            e.MloEntitySet = instset;
                            lasti++;
                        }
                    }
                }
            }

            if ((defaultEntitySets != null) && (entitySets != null))
            {
                for (var i = 0; i < defaultEntitySets.Length; i++)
                {
                    uint index = defaultEntitySets[i];
                    if (index >= entitySets.Length)
                    {
                        continue;
                    }
                    MCMloEntitySet       set     = entitySets[index];
                    MloInstanceEntitySet instset = EntitySets[set._Data.name];
                    instset.Visible = true;
                }
            }

            Entities = entlist.ToArray();
        }
Exemplo n.º 9
0
        static void HandleInjectEntitiesOptions(string[] args)
        {
            CommandLine.Parse <InjectEntitiesOptions>(args, (opts, gOpts) =>
            {
                if (opts.Ymap == null)
                {
                    Console.WriteLine("Please provide source ymap file with --ymap");
                    return;
                }

                if (opts.Ytyp == null)
                {
                    Console.WriteLine("Please provide source ytyp file with --ytyp");
                    return;
                }

                if (opts.Position == null || opts.Position.Count() != 3)
                {
                    Console.WriteLine("Please provide a correct position ex: --position 120.5,1370.312,769.2");
                    return;
                }

                if (opts.Rotation == null || opts.Rotation.Count() != 4)
                {
                    Console.WriteLine("Plase provide a correct rotation ex: --rotation 0,0,0,1");
                    return;
                }

                if (opts.Name == null)
                {
                    Console.WriteLine("Plase provide new generated ytyp name with --name");
                    return;
                }

                Init(args);

                var ymapInfos = Utils.Expand(opts.Ymap);
                var ymapNames = ymapInfos.Select(e => Path.GetFileNameWithoutExtension(e.Name)).ToArray();

                var position = new Vector3(opts.Position.ElementAt(0), opts.Position.ElementAt(1), opts.Position.ElementAt(2));
                var rotation = new Quaternion(opts.Rotation.ElementAt(0), opts.Rotation.ElementAt(1), opts.Rotation.ElementAt(2), opts.Rotation.ElementAt(3));

                var ytyp = new YtypFile();

                ytyp.Load(opts.Ytyp);

                MCMloArchetypeDef mlo = null;

                for (int i = 0; i < ytyp.CMapTypes.MloArchetypes.Count; i++)
                {
                    if (opts.MloName == null)
                    {
                        mlo = ytyp.CMapTypes.MloArchetypes[i];
                        break;
                    }
                    else
                    {
                        uint mloNameHash = Jenkins.Hash(opts.MloName.ToLowerInvariant());

                        if (mloNameHash == ytyp.CMapTypes.MloArchetypes[i].Name)
                        {
                            Console.Error.WriteLine("Found MLO => " + opts.MloName);
                            mlo = ytyp.CMapTypes.MloArchetypes[i];
                            break;
                        }
                    }
                }

                if (mlo == null)
                {
                    Console.WriteLine("MLO archetype not found");
                    return;
                }

                var ymaps = new List <YmapFile>();

                for (int i = 0; i < ymapInfos.Length; i++)
                {
                    var ymap = new YmapFile();

                    ymap.Load(ymapInfos[i].FullName);

                    ymaps.Add(ymap);
                }

                var missingYmap  = new YmapFile();
                int missingCount = 0;

                Console.WriteLine("Calculating rooms extents");

                var roomExtents = new Vector3[mlo.Rooms.Count][];

                for (int i = 0; i < mlo.Rooms.Count; i++)
                {
                    var room     = mlo.Rooms[i];
                    var entities = new List <MCEntityDef>();

                    for (int j = 0; j < room.AttachedObjects.Count; j++)
                    {
                        int idx = (int)room.AttachedObjects[j];

                        if (idx >= mlo.Entities.Count)
                        {
                            continue;
                        }

                        entities.Add(mlo.Entities[idx]);
                    }

                    var extents = Utils.CalcExtents(entities);

                    roomExtents[i] = extents[0];
                }

                for (int i = 0; i < ymaps.Count; i++)
                {
                    var ymap = ymaps[i];
                    var name = ymapNames[i];

                    if (name.StartsWith("portal_") || name.StartsWith("entityset_"))
                    {
                        continue;
                    }

                    var roomIdx           = mlo.Rooms.FindIndex(e => e.Name == name);
                    MCMloRoomDef currRoom = null;

                    if (roomIdx != -1)
                    {
                        currRoom = mlo.Rooms[roomIdx];
                    }

                    for (int j = 0; j < ymap.CMapData.Entities.Count; j++)
                    {
                        var entity           = ymap.CMapData.Entities[j];
                        var idx              = mlo.Entities.FindIndex(e => e.Guid == entity.Guid);
                        var room             = currRoom;
                        var originalPosition = entity.Position;
                        var originalRotation = entity.Rotation;

                        Console.WriteLine(name + " => " + j + " (" + idx + "|" + mlo.Entities.Count + ") => " + Utils.HashString((MetaName)entity.ArchetypeName));

                        Utils.World2Mlo(entity, mlo, position, rotation);

                        if (opts.Static && idx == -1)
                        {
                            if ((entity.Flags & 32) == 0)
                            {
                                Console.WriteLine("  Setting static flag (32)");
                                entity.Flags = entity.Flags | 32;
                            }
                        }

                        entity.LodLevel = Unk_1264241711.LODTYPES_DEPTH_ORPHANHD;

                        if (entity.Guid == 0)
                        {
                            var random = new Random();

                            do
                            {
                                entity.Guid = (uint)random.Next(1000000, Int32.MaxValue);
                            }while (mlo.Entities.Count(e => e.Guid == entity.Guid) > 0);

                            Console.WriteLine("  Setting random GUID => " + entity.Guid);
                        }

                        if (idx == -1)
                        {
                            idx = mlo.AddEntity(entity);
                        }
                        else
                        {
                            Console.WriteLine("  Found matching GUID => Overriding " + idx);
                            mlo.Entities[idx] = entity;
                        }


                        Console.WriteLine(j + " " + Utils.HashString((MetaName)entity.ArchetypeName));

                        if (room == null)
                        {
                            room = GetRoomForEntity(mlo, roomExtents, entity);
                        }

                        if (room == null)
                        {
                            entity.Position = originalPosition;
                            entity.Rotation = originalRotation;
                            entity.LodLevel = Unk_1264241711.LODTYPES_DEPTH_HD;

                            missingYmap.CMapData.Entities.Add(entity);

                            missingCount++;

                            continue;
                        }

                        uint id = (uint)idx;

                        if (room.AttachedObjects.IndexOf(id) == -1)
                        {
                            room.AttachedObjects.Add(id);
                        }

                        Console.WriteLine("  Room => " + room.Name);
                    }
                }

                if (opts.DeleteMissing)
                {
                    for (int i = mlo.Entities.Count - 1; i >= 0; i--)
                    {
                        bool found = false;

                        for (int j = 0; j < ymaps.Count; j++)
                        {
                            var ymap = ymaps[j];

                            if (ymap.CMapData.Entities.FindIndex(e => e.Guid == mlo.Entities[i].Guid) != -1)
                            {
                                found = true;
                                break;
                            }
                        }

                        if (!found)
                        {
                            Console.WriteLine("DELETE " + i);

                            for (int j = 0; j < mlo.Rooms.Count; j++)
                            {
                                for (int k = mlo.Rooms[j].AttachedObjects.Count - 1; k >= 0; k--)
                                {
                                    if (mlo.Rooms[j].AttachedObjects[k] == (uint)i)
                                    {
                                        mlo.Rooms[j].AttachedObjects.RemoveAt(k);
                                    }
                                }
                            }
                        }
                    }
                }

                var foundEntities = new Dictionary <uint, List <MCEntityDef> >();

                for (int i = 0; i < ymaps.Count; i++)
                {
                    var ymap = ymaps[i];
                    var name = ymapNames[i];

                    if (!name.StartsWith("entityset_"))
                    {
                        continue;
                    }

                    string[] split  = name.Split('_');
                    uint nameHash   = uint.Parse(split[1]);
                    string roomName = split[2];

                    if (!foundEntities.TryGetValue(nameHash, out List <MCEntityDef> fEntities))
                    {
                        fEntities = new List <MCEntityDef>();
                    }

                    int entitySetIdx = mlo.EntitySets.FindIndex(e => e.Name == nameHash);
                    int roomIdx      = mlo.Rooms.FindIndex(e => e.Name == roomName);

                    MCMloEntitySet currEntitySet = null;

                    if (entitySetIdx != -1)
                    {
                        currEntitySet = mlo.EntitySets[entitySetIdx];
                    }

                    for (int j = 0; j < ymap.CMapData.Entities.Count; j++)
                    {
                        var entity           = ymap.CMapData.Entities[j];
                        var idx              = currEntitySet.Entities.FindIndex(e => e.Guid == entity.Guid);
                        var entitySet        = currEntitySet;
                        var originalPosition = entity.Position;
                        var originalRotation = entity.Rotation;

                        Console.WriteLine(name + " => " + j + " (" + idx + "|" + currEntitySet.Entities.Count + ") => " + Utils.HashString((MetaName)entity.ArchetypeName));

                        Utils.World2Mlo(entity, mlo, position, rotation);

                        if (opts.Static && idx == -1)
                        {
                            if ((entity.Flags & 32) == 0)
                            {
                                Console.WriteLine("  Setting static flag (32)");
                                entity.Flags = entity.Flags | 32;
                            }
                        }

                        entity.LodLevel = Unk_1264241711.LODTYPES_DEPTH_ORPHANHD;

                        if (entity.Guid == 0)
                        {
                            var random = new Random();

                            do
                            {
                                entity.Guid = (uint)random.Next(1000000, Int32.MaxValue);
                            }while (currEntitySet.Entities.Count(e => e.Guid == entity.Guid) > 0);

                            Console.WriteLine("  Setting random GUID => " + entity.Guid);
                        }

                        if (idx == -1)
                        {
                            idx = currEntitySet.AddEntity(entity, roomIdx);
                        }
                        else
                        {
                            Console.WriteLine("  Found matching GUID => Overriding " + idx);
                            currEntitySet.Entities[idx] = entity;
                        }


                        Console.WriteLine(j + " " + Utils.HashString((MetaName)entity.ArchetypeName));

                        fEntities.Add(entity);
                    }

                    foundEntities[nameHash] = fEntities;
                }

                if (opts.DeleteMissing)
                {
                    foreach (var entry in foundEntities)
                    {
                        var entitySet = mlo.EntitySets.Find(e => e.Name == entry.Key);

                        for (int i = entitySet.Entities.Count - 1; i >= 0; i--)
                        {
                            bool found = false;

                            if (entry.Value.FindIndex(e => e.Guid == entitySet.Entities[i].Guid) != -1)
                            {
                                found = true;
                            }

                            if (!found)
                            {
                                Console.WriteLine("DELETE " + i);
                                entitySet.RemoveEntity(entitySet.Entities[i]);
                            }
                        }
                    }
                }

                ytyp.Save(opts.Name + ".ytyp");

                if (missingCount > 0)
                {
                    var extents = Utils.CalcExtents(missingYmap.CMapData.Entities);

                    missingYmap.CMapData.EntitiesExtentsMin  = extents[0][0];
                    missingYmap.CMapData.EntitiesExtentsMax  = extents[0][1];
                    missingYmap.CMapData.StreamingExtentsMin = extents[1][0];
                    missingYmap.CMapData.StreamingExtentsMax = extents[1][1];

                    missingYmap.Save(opts.Name + "_exterior.ymap");
                }
            });
        }