Exemplo n.º 1
0
        public void InsertRequiredActors()
        {
            MyMwcLog.WriteLine("InsertRequiredActors - START");

            foreach (MyActorEnum actor in RequiredActors)
            {
                switch (actor)
                {
                    //Insert Madelyn
                    case MyActorEnum.MADELYN:
                        {
                            if (!MyEntities.EntityExists("Madelyn"))
                            {
                                MyMwcLog.WriteLine("Insert Madelyne - START");

                                // Holds ids for remap
                                IMyEntityIdRemapContext remapContext = new MyEntityIdRemapContext();

                                //MyMwcObjectBuilder_SectorObjectGroups groups = MySectorGenerator.LoadSectorGroups(MyTemplateGroups.GetGroupSector(MyTemplateGroupEnum.Madelyn));
                                MyMwcObjectBuilder_SectorObjectGroups groups = MySession.Static.LoadSectorGroups(MyTemplateGroups.GetGroupSector(MyTemplateGroupEnum.Madelyn));
                                System.Diagnostics.Debug.Assert(groups.Groups.Count > 0);

                                MyMwcObjectBuilder_ObjectGroup madelynGroup = groups.Groups[0];
                                groups.RemapEntityIds(remapContext);
                                IEnumerable<MyMwcObjectBuilder_Base> rootObjects = madelynGroup.GetRootBuilders(groups.Entities);

                                List<MyMwcObjectBuilder_Base> clonedList = new List<MyMwcObjectBuilder_Base>();
                                foreach (MyMwcObjectBuilder_Base o in rootObjects)
                                {
                                    // Clone
                                    var clone = o.Clone() as MyMwcObjectBuilder_Base;
                                    // we want Madelyn's prefab container as first builder
                                    if (clone is MyMwcObjectBuilder_PrefabContainer)
                                    {
                                        clonedList.Insert(0, clone);
                                    }
                                    else
                                    {
                                        clonedList.Add(clone);
                                    }
                                }

                                System.Diagnostics.Debug.Assert(clonedList.Count > 0 && clonedList[0] is MyMwcObjectBuilder_PrefabContainer);

                                // create Madelyn's prefab container
                                MyEntity madelynMothership = MyEntities.CreateFromObjectBuilder(MyTextsWrapper.Get(MyTextsWrapperEnum.Actor_Madelyn).ToString(), clonedList[0], ((MyMwcObjectBuilder_Object3dBase)clonedList[0]).PositionAndOrientation.GetMatrix());
                                madelynMothership.FindChild(MyMissionLocation.MADELYN_HANGAR).DisplayName = MyTextsWrapper.Get(MyTextsWrapperEnum.Sapho).ToString();
                                madelynMothership.SetName(MyActorConstants.GetActorName(MyActorEnum.MADELYN));
                                Matrix madelynMothershipWorldInv = Matrix.Invert(madelynMothership.WorldMatrix);

                                List<MinerWars.AppCode.Game.Entities.WayPoints.MyWayPoint> waypoints = new List<Entities.WayPoints.MyWayPoint>();

                                // create other entities as children of Madelyn's prefab container
                                for (int i = 1; i < clonedList.Count; i++)
                                {
                                    System.Diagnostics.Debug.Assert(clonedList[i] is MyMwcObjectBuilder_Object3dBase);
                                    MyEntity childEntity = MyEntities.CreateFromObjectBuilder(null, clonedList[i], ((MyMwcObjectBuilder_Object3dBase)clonedList[i]).PositionAndOrientation.GetMatrix());
                                    childEntity.SetLocalMatrix(childEntity.WorldMatrix * madelynMothershipWorldInv);
                                    madelynMothership.Children.Add(childEntity);
                                    if (childEntity is MinerWars.AppCode.Game.Entities.WayPoints.MyWayPoint)
                                    {
                                        waypoints.Add(childEntity as MinerWars.AppCode.Game.Entities.WayPoints.MyWayPoint);
                                    }
                                }

                                // connect waypoints of Madelyn's prefab container
                                foreach (var waypoint in waypoints)
                                {
                                    waypoint.ResolveLinks();
                                }

                                // set correct Madelyn's position and add to scene
                                madelynMothership.SetWorldMatrix(MyPlayer.FindMothershipPosition());
                                madelynMothership.Link();
                                MyEntities.Add(madelynMothership);

                                MyMwcLog.WriteLine("Insert Madelyne - END");
                            }
                            else
                            {
                                MyMwcLog.WriteLine("Insert Madelyne - Madelyne already loaded");
                            }

                            MyWayPointGraph.RecreateWaypointsAroundMadelyn();
                        }
                        break;

                    //Insert Marcus
                    case MyActorEnum.MARCUS:
                        InsertFriend(MyActorEnum.MARCUS);
                        break;

                    //Insert RavenGirl
                    case MyActorEnum.TARJA:
                        InsertFriend(MyActorEnum.TARJA);
                        break;

                    //Insert RavenGuy
                    case MyActorEnum.VALENTIN:
                        InsertFriend(MyActorEnum.VALENTIN, MyMwcObjectBuilder_SmallShip_TypesEnum.HAMMER);
                        break;

                    default:
                        System.Diagnostics.Debug.Assert(false, "Uknown actor to insert!");
                        break;
                }
            }

            MyMwcLog.WriteLine("InsertRequiredActors - END");
        }
        void OnAddSelected(MyGuiControlButton sender)
        {
            CloseScreen();

            // Holds ids for remap
            IMyEntityIdRemapContext remapContext = new MyEntityIdRemapContext();

            var newEntities = new List<MyEntity>();

            foreach (var item in m_objectList.GetSelectedItems())
            {
                var builder = m_sectorBuilder.SectorObjects[item.Key];
                builder.RemapEntityIds(remapContext);

                //builder.EntityId = null;                                        // reset entityId because it's new object
                //builder.Name = null;
                
                //var container = builder as MyMwcObjectBuilder_PrefabContainer;  // reset entityIds also on prefabs in container
                //if (container != null)
                //{
                //    foreach (var prefabBuilder in container.Prefabs)
                //    {
                //        prefabBuilder.EntityId = null;
                //        prefabBuilder.Name = null;
                //    }
                //}

                var entity = CreateFromObjectBuilder(builder);
                if (entity != null)
                {
                    newEntities.Add(entity);
                }
            }

            foreach (var e in newEntities)
            {
                e.Link();
            }

            // recreate snap point links
            var snapPointLinks = m_sectorBuilder.SnapPointLinks;
            foreach (var item in snapPointLinks)
            {
                List<MySnapPointLink> group = new List<MySnapPointLink>();

                foreach (var link in item.Links)
                {
                    MyEntity entity;
                    if (!MyEntities.TryGetEntityById(new MyEntityIdentifier(remapContext.RemapEntityId(link.EntityId).Value), out entity))
                        continue;
                    var prefab = entity as MyPrefabBase;
                    if (prefab == null)
                        continue;

                    if (string.IsNullOrEmpty(link.SnapPointName))
                    {
                        if (prefab != null && link.Index < prefab.SnapPoints.Count)
                            group.Add(new MySnapPointLink(prefab.SnapPoints[link.Index]));
                    }
                    else
                    {
                        foreach (var snapPoint in prefab.SnapPoints)
                            if (snapPoint.Name == link.SnapPointName)
                                group.Add(new MySnapPointLink(snapPoint));
                    }
                }

                if (group.Count >= 2)
                    MyEditor.Static.AddLinkedSnapPoints(group);
            }

            MyWayPointGraph.DeleteNullVerticesFromPaths();
        }