/// <summary> /// Rebuild pickupables database. /// </summary> public void Rebuild() { var pickupables = CollectAllPickupables(false); prefabs.Clear(); foreach (var pickupable in pickupables) { int prefabId = prefabs.Count; var metaDataComponent = pickupable.AddComponent <Components.PickupableMetaDataComponent>(); metaDataComponent.prefabId = prefabId; var prefab = Object.Instantiate(pickupable); prefab.SetActive(false); prefab.transform.SetParent(MPController.Instance.transform); Logger.Debug($"Registering {prefab.name} ({prefab.GetInstanceID()}) into pickupable database. (Prefab ID: {prefabId}, Source pickupable id: {pickupable.GetInstanceID()})"); PrefabDesc desc = new PrefabDesc(); desc.gameObject = prefab; desc.id = prefabId; SetupPrefabDescriptorType(desc); prefabs.Add(desc); } }
public static void assemblerAdd(Player player, int assemblerId) { var pf = player.factory; var fs = pf.factorySystem; var target = fs.assemblerPool[assemblerId]; var entity = pf.entityPool[target.entityId]; var entityitemId = pf.entityPool[target.entityId].protoId; var pcid = target.pcId; BugInfo += "\nkeyCount;" + keyCount; BugInfo += "\nentityitemId;" + entityitemId; BugInfo += "\n"; if (CheckCanUp(player, entityitemId)) { canUp = true; BugInfo += "\nspeed:" + fs.assemblerPool[assemblerId].speed; string speedText = (fs.assemblerPool[assemblerId].speed / 10000.0).ToString(); showInfo = $"\n\n< {ST.速度}" + speedText + " >"; checkKey(); if (key()) { UIRealtimeTip.Popup(ST.建造叠加 + "+", false); var item = LDB.items.Select(player.inhandItemId); BugInfo += "\n" + player.inhandItemId; PrefabDesc desc = item.prefabDesc; fs.assemblerPool[assemblerId].speed += desc.assemblerSpeed; pf.powerSystem.consumerPool[pcid].workEnergyPerTick += (long)(desc.workEnergyPerTick * powerUp); useItem(player, player.inhandItemId); } } }
//Post register fixups private static void onPostAdd() { foreach (var kv in models) { kv.Value.Preload(); PrefabDesc pdesc = kv.Value.prefabDesc; Material assMat = LDB.models.modelArray[65].prefabDesc.materials[0]; pdesc.lodMaterials[0][0] = assMat; VFPreload.SaveGameObjectResources(pdesc.prefab); VFPreload.SaveGameObjectResources(pdesc.colliderPrefab); VFPreload.SaveObject(pdesc.mesh); VFPreload.SaveMeshes(pdesc.meshes); VFPreload.SaveObject(pdesc.meshCollider); VFPreload.SaveMaterials(pdesc.materials); VFPreload.SaveMeshes(pdesc.lodMeshes); VFPreload.SaveMaterials(pdesc.lodMaterials); LDB.models.modelArray[kv.Value.ID] = kv.Value; } foreach (var kv in items) { kv.Value.Preload(kv.Value.index); } foreach (var kv in recipes) { kv.Value.Preload(kv.Value.index); } }
private static void UninstallMod(PlanetTransport instance, PrefabDesc prefabDesc, int warperId) { int warperSlotIndex = prefabDesc.stationMaxItemKinds; for (int j = 1; j < instance.stationCursor; j++) { if (instance.stationPool[j] != null && instance.stationPool[j].id == j) { StationComponent stationComponent = instance.stationPool[j]; if (stationComponent.isCollector == true || stationComponent.isStellar == false) { continue; } if (stationComponent.storage.Length > prefabDesc.stationMaxItemKinds && stationComponent.storage.Last().itemId == warperId) { instance.SetStationStorage( stationComponent.id, warperSlotIndex, 0, 0, ELogisticStorage.None, ELogisticStorage.None, GameMain.mainPlayer); List <StationStore> storeCopy = new List <StationStore>(stationComponent.storage); storeCopy.RemoveAt(warperSlotIndex); stationComponent.storage = storeCopy.ToArray(); } instance.RefreshTraffic(); instance.gameData.galacticTransport.RefreshTraffic(stationComponent.gid); stationComponent.UpdateNeeds(); } } }
/// <summary> /// Overridden save function /// </summary> /// <param name="filename"></param> /// <returns></returns> public override bool Save(string filename) { PrefabDesc prefab = new PrefabDesc(filename); ShapeCollection all = new ShapeCollection(); // the following shapes go into the prefab: lightgrid boxes, lights foreach (ShapeBase shape in this.FilteredSupplier) { all.Add(shape); } foreach (ShapeBase shape in this.FilteredLights) { if (!all.Contains(shape)) { all.Add(shape); } } if (!prefab.CreateFromInstances(all, Vector3F.Zero, false, false)) { return(false); } return(prefab.SaveToFile(null)); }
//Post register fixups private static void onPostAdd() { foreach (var kv in models) { kv.Value.Preload(); PrefabDesc pdesc = kv.Value.prefabDesc; Material[] mats = pdesc.materials; for (int i = 0; i < pdesc.lodMaterials[0].Length; i++) { pdesc.lodMaterials[0][i] = mats[i]; } LDB.models.modelArray[kv.Value.ID] = kv.Value; } foreach (var kv in items) { kv.Value.Preload(kv.Value.index); } foreach (var kv in recipes) { kv.Value.Preload(kv.Value.index); } onLoadingFinished?.Invoke(); LogSource.LogInfo("Post loading is complete!"); }
public override void ApplyProperties(PrefabDesc desc) { base.ApplyProperties(desc); desc.isTank = true; desc.fluidStorageCount = fluidCapacity; }
//[HarmonyPostfix] //[HarmonyPatch(typeof(PlayerAction_Build), "GameTick")] //public static void modifyModle(PlayerAction_Build __instance) //{ // if (__instance.previewGizmoDesc != null&&canUp) // { // __instance.previewGizmoDesc.condition = EBuildCondition.Ok; // } //} public static void PowerGenAdd(Player player, int genId) { var pf = player.factory; var fs = pf.powerSystem; var target = fs.genPool[genId]; var entity = pf.entityPool[target.entityId]; var entityitemId = pf.entityPool[target.entityId].protoId; if (CheckCanUp(player, entityitemId)) { canUp = true; BugInfo += "\ngenEnergyPerTick:" + fs.genPool[genId].genEnergyPerTick; checkKey(); if (key()) { UIRealtimeTip.Popup(ST.建造叠加 + "+", false); var item = LDB.items.Select(player.inhandItemId); BugInfo += "\n" + player.inhandItemId; PrefabDesc desc = item.prefabDesc; fs.genPool[genId].genEnergyPerTick += (long)(desc.genEnergyPerTick * 0.9); fs.genPool[genId].useFuelPerTick += desc.useFuelPerTick; useItem(player, player.inhandItemId); } } }
public override void ApplyProperties(PrefabDesc desc) { base.ApplyProperties(desc); desc.storageCol = columnCount; desc.storageRow = rowCount; desc.isStorage = desc.storageCol * desc.storageRow > 0; }
public override void OnPostPrefabCreation(ShapeCollection allRootShapes, PrefabDesc prefab) { base.OnPostPrefabCreation(allRootShapes, prefab); if (_uiProperties != null) { _uiProperties.OnPostPrefabCreation(allRootShapes, prefab); } }
public override void ApplyProperties(PrefabDesc desc) { base.ApplyProperties(desc); desc.assemblerSpeed = Mathf.RoundToInt(processingSpeed * 10000f); desc.assemblerRecipeType = ERecipeType.Chemical; desc.isAssembler = true; }
public override void ApplyProperties(PrefabDesc desc) { base.ApplyProperties(desc); desc.assemblerSpeed = Mathf.RoundToInt(smeltSpeed * 10000f); desc.assemblerRecipeType = ERecipeType.Smelt; desc.isAssembler = true; }
public static float getMinerRadius(PrefabDesc desc) { if (desc.HasProperty(CustomMinerDesc.MINER_RANGE_NAME)) { return(desc.GetProperty <float>(CustomMinerDesc.MINER_RANGE_NAME)); } return(MinerComponent.kFanRadius); }
private void treeView_Creators_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { PrefabDesc prefab = SelectedCreatorObject as PrefabDesc; if (prefab != null) { PrefabManager.EditPrefabDescriptor(prefab); } }
public static void PlanetTransport_Import_Postfix(BinaryReader r, PlanetTransport __instance) { if (Config.Utility.UninstallMod.Value == true) { int warperId = ItemProto.kWarperId; PrefabDesc prefabDesc = LDB.items.Select(_ilsId).prefabDesc; UninstallMod(__instance, prefabDesc, warperId); } }
public override void ApplyProperties(PrefabDesc desc) { base.ApplyProperties(desc); desc.SetProperty(MINER_RANGE_NAME, miningRange); float period = desc.minerPeriod / miningSpeed; desc.minerPeriod = Mathf.RoundToInt(period); }
public void CheckDismantle() { foreach (int objId in selectObjIds) { PrefabDesc desc = GetPrefabDesc(objId); if (!BuildTool_Dismantle.showDemolishContainerQuery) { continue; } if (objId <= 0) { continue; } EntityData data = factory.entityPool[objId]; if (desc.isStorage) { int storageId = data.storageId; if (!factory.factoryStorage.TryTakeBackItems_Storage(player.package, storageId)) { dismantleQueryBox = UIMessageBox.Show("拆除储物仓标题".Translate(), "拆除储物仓文字".Translate(), "否".Translate(), "是".Translate(), 0, DismantleQueryCancel, DismantleQueryConfirm); waitingForPlayerInput = true; return; } } if (desc.isTank) { int tankId = data.tankId; if (!factory.factoryStorage.TryTakeBackItems_Tank(player.package, tankId)) { dismantleQueryBox = UIMessageBox.Show("拆除储液罐标题".Translate(), "拆除储液罐文字".Translate(), "否".Translate(), "是".Translate(), 0, DismantleQueryCancel, DismantleQueryConfirm); waitingForPlayerInput = true; return; } } if (desc.isStation) { int stationId = data.stationId; if (factory.transport.stationPool[stationId] != null) { dismantleQueryBox = UIMessageBox.Show("拆除物流站标题".Translate(), "拆除物流站文字".Translate(), "否".Translate(), "是".Translate(), 0, DismantleQueryCancel, DismantleQueryConfirm); waitingForPlayerInput = true; return; } } } DismantleAction(); }
/// <summary> /// Rebuild pickupables database. /// </summary> public void CollectGameObject(GameObject gameObject) { if (!IsPickupable(gameObject)) { return; } int prefabId = prefabs.Count; var metaDataComponent = gameObject.AddComponent <Components.PickupableMetaDataComponent>(); metaDataComponent.prefabId = prefabId; PrefabDesc desc = new PrefabDesc(); desc.gameObject = gameObject; desc.id = prefabId; // Activate game object if it's not active to make sure we can access all play // maker fsm. bool wasActive = desc.gameObject.activeSelf; if (!wasActive) { desc.gameObject.SetActive(true); } // Add ObjectSyncComponent. if (desc.gameObject.GetComponent <Components.ObjectSyncComponent>() == null) { desc.gameObject.AddComponent <Components.ObjectSyncComponent>().Setup( ObjectSyncManager.ObjectTypes.Pickupable, -1); } else { GameObject.Destroy( desc.gameObject.GetComponent <Components.ObjectSyncComponent>()); desc.gameObject.AddComponent <Components.ObjectSyncComponent>().Setup( ObjectSyncManager.ObjectTypes.Pickupable, -1); } // Deactivate game object back if needed. if (!wasActive) { desc.gameObject.SetActive(false); } prefabs.Add(desc); Logger.Debug( $"Registered new prefab {gameObject.name} ({gameObject.GetInstanceID()}) into pickupable database. (Prefab ID: {prefabId})"); }
public static float getMinerRadius(PrefabDesc desc) { float radius = MinerComponent.kFanRadius; if (desc.beltSpeed == 1) { radius = configMinerMk2Range.Value; } return(radius); }
public static void AddDronesFromInventory(this StationComponent component, PrefabDesc prefabDesc) { var percentage = component.isStellar ? Config.ILS.DroneInsertPercentage.Value : Config.PLS.DroneInsertPercentage.Value; var maxToTake = Convert.ToInt32(Math.Floor(prefabDesc.stationMaxDroneCount * percentage)); var numAvailable = GameMain.mainPlayer.package.TakeItem(5001, maxToTake); component.idleDroneCount = numAvailable; }
public static void AddVesselsFromInventory(this StationComponent component, PrefabDesc prefabDesc) { if (!component.isStellar) { return; } var percentage = Config.ILS.VesselInsertPercentage.Value; var maxToTake = Convert.ToInt32(Math.Floor(prefabDesc.stationMaxShipCount * percentage)); var numAvailable = GameMain.mainPlayer.package.TakeItem(5002, maxToTake); component.idleShipCount = numAvailable; }
//Post register fixups private static void onPostAdd() { foreach (var kv in Registry.models) { PrefabDesc pdesc = kv.Value.prefabDesc; if (pdesc.minerType == EMinerType.Vein) { pdesc.beltSpeed = 1; } } }
/// <summary> /// Setup prefab type of the given prefab descriptor. /// </summary> /// <param name="desc">The descriptor to setup type for.</param> private void SetupPrefabDescriptorType(PrefabDesc desc) { PlayMakerFSM fsm = null; fsm = Utils.GetPlaymakerScriptByName(desc.gameObject, "Use"); if (fsm != null) { if (fsm.FsmVariables.FindFsmInt("DestroyedBottles") != null && fsm.Fsm.GetState("Remove bottle") != null) { // Found BeerCase desc.type = PrefabType.BeerCase; } } }
public GamePickupableDatabase() { instance = this; GameCallbacks.onPlayMakerObjectCreate += (GameObject instance, GameObject prefab) => { PrefabDesc descriptor = GetPrefabDesc(prefab); if (descriptor != null) { var metaDataComponent = instance.AddComponent <Components.PickupableMetaDataComponent>(); metaDataComponent.prefabId = descriptor.id; Logger.Log($"Pickupable has been spawned. ({instance.name})"); } }; }
public static void AddDronesFromInventory(this StationComponent component, PrefabDesc prefabDesc) { var percentage = component.isStellar ? AspConfig.ILS.DroneInsertPercentage.Value : AspConfig.PLS.DroneInsertPercentage.Value; var maxToTake = Convert.ToInt32(Math.Floor(prefabDesc.stationMaxDroneCount * percentage)); var numAvailable = GameMain.mainPlayer.package.TakeItem(ItemIds.Drone, maxToTake, out _); component.idleDroneCount = numAvailable; if (AspConfig.General.NotifyWhenDroneOrVesselMissing.Value && numAvailable < maxToTake) { UIRealtimeTip.PopupAhead("Not enough Logistics Drones in inventory!".Translate(), AspConfig.General.PlaySoundWhenDroneOrVesselMissing.Value); } }
/// <summary> /// Overridden save function /// </summary> /// <param name="filename"></param> /// <returns></returns> public override bool Save(string filename) { PrefabDesc prefab = new PrefabDesc(filename); ShapeCollection all = new ShapeCollection(); // the following shapes go into the prefab: lightgrid boxes, lights foreach (ShapeBase shape in this.FilteredSupplier) all.Add(shape); foreach (ShapeBase shape in this.FilteredLights) if (!all.Contains(shape)) all.Add(shape); if (!prefab.CreateFromInstances(all, Vector3F.Zero, false, false)) return false; return prefab.SaveToFile(null); }
//Post register fixups private static void onPostAdd() { foreach (var kv in models) { kv.Value.Preload(); PrefabDesc pdesc = kv.Value.prefabDesc; Material[] mats = pdesc.materials; for (int i = 0; i < pdesc.lodCount; i++) { for (int j = 0; j < pdesc.lodMaterials[i].Length; j++) { pdesc.lodMaterials[i][j] = mats[j]; } } LDB.models.modelArray[kv.Value.ID] = kv.Value; } foreach (var kv in items) { kv.Value.Preload(kv.Value.index); } foreach (var kv in recipes) { kv.Value.Preload(kv.Value.index); } foreach (var kv in techs) { kv.Value.Preload(); kv.Value.Preload2(); } foreach (var kv in techUpdateList) { TechProto OldTech = LDB.techs.Select(kv.Key); OldTech.postTechArray = OldTech.postTechArray.AddToArray(kv.Value); } onLoadingFinished?.Invoke(); LogSource.LogInfo("Post loading is complete!"); }
private void ExportModelLapJot() { LapJointAsset lapJointAsset = new LapJointAsset(); lapJointAsset.lapJoints = new List <LapJointNode>(); foreach (ItemProto itemProto in LDB.items.dataArray) { PrefabDesc prefabDesc = FactoryBP.GetPrefabDesc(itemProto); if (prefabDesc != null) { //Debug.LogFormat("{0},{1}", itemProto.ID, prefabDesc.lapJoint); LapJointNode node = new LapJointNode() { protoId = itemProto.ID, lapJoint = prefabDesc.lapJoint }; lapJointAsset.lapJoints.Add(node); } } //System.Text.StringBuilder sb = new System.Text.StringBuilder(); //sb.Append("{\n"); //sb.Append("\"lapJoints\":[\n"); //foreach (var node in lapJointAsset.lapJoints) //{ // sb.Append("{"); // sb.Append("\"protoId\":").Append(node.protoId).Append(",\n"); // sb.Append("\"lapJoint\":") // .Append("{"); // sb.Append("\"x\":").Append(node.lapJoint.x).Append(","); // sb.Append("\"y\":").Append(node.lapJoint.y).Append(","); // sb.Append("\"z\":").Append(node.lapJoint.z); // sb.Append("}").Append("\n"); // sb.Append("},\n"); //} //sb.Append("]\n"); //sb.Append("}"); //string jsonStr = sb.toString(); string jsonStr = JsonUtility.ToJson(lapJointAsset); string outFile = System.IO.Path.Combine(Environment.CurrentDirectory, "BepInEx/config", "latJoint.json"); System.IO.File.WriteAllText(outFile, jsonStr); }
//Post register fixups private static void onPostAdd() { foreach (var kv in models) { kv.Value.Preload(); PrefabDesc pdesc = kv.Value.prefabDesc; Material[] mats = pdesc.materials; for (int i = 0; i < pdesc.lodMaterials[0].Length; i++) { pdesc.lodMaterials[0][i] = mats[i]; } LDB.models.modelArray[kv.Value.ID] = kv.Value; } foreach (var kv in items) { kv.Value.Preload(kv.Value.index); } foreach (var kv in recipes) { kv.Value.Preload(kv.Value.index); } foreach (var kv in techs) { kv.Value.Preload(); kv.Value.Preload2(); } foreach (var kv in techUpdateList) { var OldTech = kv.Key; var NewTech = kv.Value; OldTech.postTechArray = OldTech.postTechArray.AddToArray(NewTech); } onLoadingFinished?.Invoke(); LogSource.LogInfo("Post loading is complete!"); }
public static void PasteBuilding(int index, BuildingCopy building, Vector2 targetSpr, float yaw) { Vector2 newRelative = building.cursorRelativePos.Rotate(yaw * Mathf.Deg2Rad, building.originalSegmentCount); Vector2 sprPos = newRelative + targetSpr; float rawLatitudeIndex = (sprPos.x - Mathf.PI / 2) / 6.2831855f * 200; int latitudeIndex = Mathf.FloorToInt(Mathf.Max(0f, Mathf.Abs(rawLatitudeIndex) - 0.1f)); int newSegmentCount = PlanetGrid.DetermineLongitudeSegmentCount(latitudeIndex, 200); float sizeDeviation = building.originalSegmentCount / (float)newSegmentCount; sprPos = new Vector2(newRelative.x, newRelative.y * sizeDeviation) + targetSpr; Vector3 absoluteBuildingPos = sprPos.SnapToGrid(); Quaternion absoluteBuildingRot = Maths.SphericalRotation(absoluteBuildingPos, yaw + building.cursorRelativeYaw); PrefabDesc desc = GetPrefabDesc(building); BuildPreview bp = BuildPreview.CreateSingle(building.itemProto, desc, true); bp.ResetInfos(); bp.desc = desc; bp.item = building.itemProto; bp.recipeId = building.recipeId; bp.lpos = absoluteBuildingPos; bp.lrot = absoluteBuildingRot; Pose pose = new Pose(absoluteBuildingPos, absoluteBuildingRot); int objId = InserterPoses.AddOverride(pose, building.itemProto); pastedEntities.Add(building.originalId, new PastedEntity() { type = EPastedType.BUILDING, index = index, sourceBuilding = building, pose = pose, objId = objId, buildPreview = bp }); ActivateColliders(absoluteBuildingPos); previews.Add(bp); }
public static void reData(PlanetFactory __instance, int entityId, PrefabDesc desc, short modelIndex) { MultipMachineSpeed.info = new StringBuilder(); var s = MultipMachineSpeed.info; if (isModAssembler) { desc.assemblerSpeed = speed1; desc.workEnergyPerTick = power1; isModAssembler = false; } if (isModSilo) { desc.siloChargeFrame = speed1; desc.siloColdFrame = speed2; desc.workEnergyPerTick = power1; isModSilo = false; } if (isModEjector) { desc.ejectorChargeFrame = speed1; desc.ejectorColdFrame = speed2; desc.workEnergyPerTick = power1; isModEjector = false; } if (isModPowerGen) { desc.genEnergyPerTick = speedl1; desc.useFuelPerTick = power1; isModPowerGen = false; } if (isModMiner) { desc.workEnergyPerTick = power1; isModMiner = false; } if (isModInserter) { desc.workEnergyPerTick = power1; isModInserter = false; } }
/// <summary> /// helper function to save layers as prefabs /// </summary> /// <param name="folderName">absolute path to the folder where the prefabs should be saved in. Set string to null if you want to use the default folder</param> private void ExportLayersAsPrefabs(string folderName) { if (EditorManager.Scene == null) return; int iCount = 0; bool bAsBinary = true; try { foreach (Layer layer in EditorManager.Scene.Layers) { string prefabName; if (folderName == null) //if no foldername is used { prefabName = Path.ChangeExtension(layer.AbsoluteLayerFilename, ".prefab"); } else { prefabName = Path.Combine(folderName, layer.LayerName + ".prefab"); } PrefabDesc prefab = new PrefabDesc(prefabName); prefab.AutoSaveBinary = true; //activate autosave per default [#2112] prefab.Description = layer.Description; prefab.CreateFromInstances(layer.Root.ChildCollection, Vector3F.Zero, true, true); if (prefab.SaveToFile(null)) iCount++; if (bAsBinary) { SceneExportInfo info = new SceneExportInfo(); info.ExportType = SceneExportInfo.ExportType_e.VPrefab; info.AbsoluteFilename = EditorManager.Project.MakeAbsolute(prefab.BinaryFilename); info.RelevantShapes = SceneExportInfo.GetRelevantExportShapes(layer.Root); ExportHelper.StartPrefabExport(info); layer.Root.OnExportRecursive(info); ExportHelper.EndPrefabExport(info); } } } catch (Exception ex) { EditorManager.DumpException(ex); EditorManager.ShowMessageBox(this, "Failed to export layers. Detailed message:\n\n" + ex.Message, "Export Layers as Prefabs", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (iCount == 0) EditorManager.ShowMessageBox(this, "No layer valid for export", "Export Layers as Prefabs", MessageBoxButtons.OK, MessageBoxIcon.Information); else EditorManager.ShowMessageBox(this, iCount.ToString() + " Layer(s) exported successfully", "Export Layers as Prefabs", MessageBoxButtons.OK, MessageBoxIcon.Information); }
public override void OnPostPrefabCreation(ShapeCollection allRootShapes, PrefabDesc prefab) { base.OnPostPrefabCreation(allRootShapes, prefab); if (_entityProperties != null) { if (!string.IsNullOrEmpty(_pendingEntityPropertyString)) _entityProperties.ParseParameterString(_pendingEntityPropertyString, ","); _entityProperties.OnPostPrefabCreation(allRootShapes, prefab); } _pendingEntityPropertyString = null; }
public bool LoadLayersFromXML(LayerCollection newLayers, ProgressStatus progress, FileInfo[] files) { bool bOK = true; float fPercentage = 0.0f; foreach (FileInfo fileInfo in files) { fPercentage += 100.0f / (float)files.Length; if (fileInfo == null || (fileInfo.Attributes & FileAttributes.Directory) != 0) // file info can be null continue; if (string.Compare(fileInfo.Extension, IScene.LayerFileExtensionXML, true) != 0) continue; try { string absfilename = fileInfo.FullName; string filename = fileInfo.Name; using (XmlTextReader xmlReader = new XmlTextReader(absfilename)) { XmlDocument doc = new XmlDocument(); doc.Load(xmlReader); if (doc.DocumentElement == null) throw new Exception("XML does not contain root node"); IEnumerator nodes = doc.DocumentElement.GetEnumerator(); while (nodes.MoveNext()) { XmlElement node = nodes.Current as XmlElement; if (node == null || node.Name != "layer") continue; string classname = node.GetAttribute("class"); string name = node.GetAttribute("name"); string uid = node.GetAttribute("uid"); if (string.IsNullOrEmpty(name)) name = Path.GetFileNameWithoutExtension(filename); Type t = EditorManager.ShapeFactory.GetTypeByName(classname, typeof(Layer), false); if (t == null) t = typeof(Layer); Layer layer = Activator.CreateInstance(t, new object[1] { name }) as Layer; if (layer == null) throw new Exception("Could not instantiate Layer"); layer.SetLayerFileNameInternal(filename); // same filename but will replace extension if (!string.IsNullOrEmpty(uid)) { layer.SetLayerIDInternal(Convert.ToUInt32(uid)); } newLayers.Add(layer); // apply property/value pairs to layer SerializationHelper.ApplyXMLProperties(node, layer, false); // parse for shapes IEnumerator propNodes = node.GetEnumerator(); while (propNodes.MoveNext()) { XmlElement propNode = propNodes.Current as XmlElement; if (propNode == null) continue; if (propNode.Name == "shapes") { // use prefab functionality to parse it PrefabDesc dummyPrefab = new PrefabDesc(null); ShapeCollection shapes = dummyPrefab.CreateInstances(propNode, true, true); if (shapes != null) { layer.Root.SetChildCollectionInternal(shapes); foreach (ShapeBase shape in shapes) { shape.SetParentInternal(layer.Root); shape.SetParentLayerInternal(layer); } } if (!string.IsNullOrEmpty(dummyPrefab.LastError)) { string msg = "An error occurred while parsing file: \n\n" + filename + "\n\nThe layer won't contain any shapes.\nDetailed message:\n" + dummyPrefab.LastError; EditorManager.ShowMessageBox(msg, "Error parsing layer file", MessageBoxButtons.OK, MessageBoxIcon.Error); } continue; } } } } } catch (Exception ex) { EditorManager.DumpException(ex, false); return false; } } return bOK; }
private void createPrefabToolStripMenuItem_Click(object sender, EventArgs e) { ShapeCollection shapes = shapeTreeView.SelectedShapes; PrefabDesc prefab = new PrefabDesc(null); // try to use/create the prefabs directory of the project string proj = EditorManager.Project.ProjectDir; string prefabDir = Path.Combine(proj, EditorManager.Settings.PrefabDirectory); if (!Directory.Exists(prefabDir)) { try { Directory.CreateDirectory(prefabDir); } catch (Exception ex) { EditorManager.DumpException(ex); prefabDir = proj; // OK, fallback to project directory } } // first select the prefab file to save CreateFileDlg fileDlg = new CreateFileDlg(); fileDlg.Caption = "Save a prefab"; fileDlg.Description = "Enter the name of the prefab file and select the directory to save it in. Then click OK to proceed."; fileDlg.InitialDirectory = prefabDir; fileDlg.Ext = ".prefab"; fileDlg.Filter = new string[] { ".prefab" }; fileDlg.AllowOverwrite = true; if (fileDlg.ShowDialog() != DialogResult.OK) return; prefab.Filename = fileDlg.FileName; // if the file exists, load it to get the properties if (File.Exists(prefab.Filename)) { prefab.Load(); } // set this before the dialog opens prefab.SourceShapesForExposedParameters = shapes; // edit the prefab properties using (PropertyGridDlg propDlg = new PropertyGridDlg("Edit prefab properties", "Edit additional prefab properties. Click OK to proceed with saving the prefab file.")) { propDlg.DataObjectNoClone = prefab; if (propDlg.ShowDialog() != DialogResult.OK) return; // fill with the shapes if (!prefab.CreateFromInstances(shapes, shapes.Center, true, true)) { EditorManager.ShowMessageBox("Failed to create prefab. Detailed message:\n\n" + prefab.LastError, "Creation Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!prefab.SaveToFile(fileDlg.FileName)) { EditorManager.ShowMessageBox("Failed to save prefab. Detailed message:\n\n" + prefab.LastError, "Saving Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } }