//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; } }