Пример #1
0
        //Important: This function depends on the paste_seg array to fix up entity segment numbers
        public void PasteEntities(Level src, bool aligned)
        {
            Dictionary <Guid, Guid> guid_mapping = new Dictionary <Guid, Guid>();

            //First, make a mapping of old GUID to new GUID
            foreach (Entity entity in src.EnumerateAliveEntities())
            {
                guid_mapping.Add(entity.guid, Guid.NewGuid());
            }

            //Now copy objects to new level
            foreach (Entity src_entity in src.EnumerateAliveEntities())
            {
                Entity dest_entity = entity[next_entity];
                GetNextEntityIndex();

                //Copy the entity and give it its new guid
                dest_entity.Copy(src_entity, false, guid_mapping[src_entity.guid]);

                //Set the new segment number of the entity
                dest_entity.m_segnum = paste_seg[src_entity.m_segnum];

                //If entity is a door, find the side and point it to new entity
                if (dest_entity.Type == EntityType.DOOR)
                {
                    foreach (Side side in segment[dest_entity.m_segnum].side)
                    {
                        if (side.Door == src_entity.num)
                        {
                            side.Door = dest_entity.num;
                            break;
                        }
                    }
                }

                //Move & rotate entity if required
                if (aligned)
                {
                    dest_entity.SetPosition(editor.AlignPasteVert(dest_entity.position));
                    dest_entity.Rotate(editor.SourceSideRotation.Inverted());
                    dest_entity.Rotate(Matrix4.CreateRotationY(Utility.RAD_180));
                    dest_entity.Rotate(editor.DestSideRotation);
                }

                //If entity has links, fix them up
                FixEntityLinks(dest_entity, guid_mapping);
            }
        }
 //When entities are not getting pasted, go through pasted segments and remove door referneces
 //Important: This function depends on the paste_seg array to fix up entity segment numbers
 public void ClearDoorReferences(Level src)
 {
     foreach (Entity src_entity in src.EnumerateAliveEntities())
     {
         if (src_entity.Type == EntityType.DOOR)
         {
             foreach (Side side in segment[paste_seg[src_entity.m_segnum]].side)
             {
                 if (side.Door == src_entity.num)
                 {
                     side.Door = -1;
                     side.chunk_plane_order = -1;
                     break;
                 }
             }
         }
     }
 }
        public void UpdateSegmentNumbering()
        {
            gl_panel.RemoveAllTextItems();

            switch (m_show_3d_text_type)
            {
            default:
                break;

            case ShowTextType.MARK_SEGS:
            case ShowTextType.ALL_SEGS:
                foreach (Segment seg in m_level.EnumerateVisibleSegments())
                {
                    if ((m_show_3d_text_type == ShowTextType.MARK_SEGS) && !seg.marked && m_level.selected_segment != seg.num)
                    {
                        continue;
                    }
                    GLTextItem item = new GLTextItem(seg.FindCenter(), seg.num.ToString(), Color.Red, false);
                    item.Facing = true;
                    item.Scale  = new Vector3(0.06f, 0.06f, 0.06f);
                    gl_panel.AddTextItem(item);
                }
                break;

            case ShowTextType.POWERUPS:
            case ShowTextType.ROBOTS:
            case ShowTextType.MARK_ENTS:
                foreach (Entity ent in m_level.EnumerateAliveEntities())
                {
                    if (ent.m_segnum > -1 && m_level.segment[ent.m_segnum].m_hidden)
                    {
                        continue;
                    }
                    bool selected = (ent.num == m_level.selected_entity);
                    if (m_show_3d_text_type == ShowTextType.POWERUPS)
                    {
                        if (ent.Type == EntityType.ITEM)
                        {
                            GLTextItem item = new GLTextItem(ent.position - Vector3.UnitY, (GetItemString(ent)), (selected ? Color.HotPink : Color.Orange), false);
                            item.Facing = true;
                            item.Scale  = m_item_text_scale;
                            gl_panel.AddTextItem(item);
                        }
                    }
                    else if (m_show_3d_text_type == ShowTextType.ROBOTS)
                    {
                        if (ent.Type == EntityType.ENEMY)
                        {
                            GLTextItem item = new GLTextItem(ent.position - Vector3.UnitY, (GetRobotString(ent)), (selected ? Color.HotPink : Color.Red), false);
                            item.Facing = true;
                            item.Scale  = m_item_text_scale;
                            gl_panel.AddTextItem(item);
                        }
                    }
                    else
                    {
                        if (ent.marked || selected)
                        {
                            GLTextItem item;
                            if (ent.Type == EntityType.ITEM)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, (GetItemString(ent)), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else if (ent.Type == EntityType.ENEMY)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, (GetRobotString(ent)), (selected ? Color.HotPink : Color.Red), false);
                            }
                            else if (ent.Type == EntityType.PROP)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, GetPropString(ent), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else if (ent.Type == EntityType.SCRIPT)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, ((ScriptSubType)ent.SubType).ToString(), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else if (ent.Type == EntityType.TRIGGER)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, ((TriggerSubType)ent.SubType).ToString(), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else if (ent.Type == EntityType.SPECIAL)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, ((SpecialSubType)ent.SubType).ToString(), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else if (ent.Type == EntityType.DOOR)
                            {
                                item = new GLTextItem(ent.position - Vector3.UnitY, ((DoorSubType)ent.SubType).ToString(), (selected ? Color.HotPink : Color.Orange), false);
                            }
                            else
                            {
                                continue;
                            }
                            item.Facing = true;
                            item.Scale  = m_item_text_scale;
                            gl_panel.AddTextItem(item);
                        }
                    }
                }
                break;
            }
        }