//public static ToolBase.ToolErrors CreateNode(NetInfo info, NetTool.ControlPoint startPoint, NetTool.ControlPoint middlePoint, NetTool.ControlPoint endPoint, FastList<NetTool.NodePosition> nodeBuffer, // int maxSegments, bool test, bool visualize, bool autoFix, bool needMoney, bool invert, bool switchDir, ushort relocateBuildingID, // out ushort node, out ushort segment, out int cost, out int productionRate) public override void SimulationStep() { base.SimulationStep(); if (isHoveringSegment) { ushort node; ushort outSegment; int cost; int productionRate; // Initializes colliding arrays ToolErrors errors = NetTool.CreateNode(newPrefab != null ? newPrefab : segment.Info, startPoint, middlePoint, endPoint, NetTool.m_nodePositionsSimulation, 1000, true, false, true, false, false, false, (ushort)0, out node, out outSegment, out cost, out productionRate); } }
//public static ToolBase.ToolErrors CreateNode(NetInfo info, NetTool.ControlPoint startPoint, NetTool.ControlPoint middlePoint, NetTool.ControlPoint endPoint, FastList<NetTool.NodePosition> nodeBuffer, // int maxSegments, bool test, bool visualize, bool autoFix, bool needMoney, bool invert, bool switchDir, ushort relocateBuildingID, // out ushort node, out ushort segment, out int cost, out int productionRate) public override void SimulationStep() { ModDebug.LogClassAndMethodName(this.GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().Name); base.SimulationStep(); if (isHoveringSegment) { ushort node; ushort outSegment; int cost; int productionRate; // Initializes colliding arrays ToolErrors errors = NetTool.CreateNode(newPrefab != null ? newPrefab : segment.Info, startPoint, middlePoint, endPoint, NetTool.m_nodePositionsSimulation, 1000, true, false, true, false, false, false, (ushort)0, out node, out outSegment, out cost, out productionRate); } }
/// <summary> /// Called by the game every simulation step. /// Performs raycasting to select hovered instance. /// </summary> public override void SimulationStep() { // Get base mouse ray. Ray mouseRay = m_mouseRay; // Get raycast input. RaycastInput input = new RaycastInput(mouseRay, m_mouseRayLength) { m_rayRight = m_rayRight, m_netService = GetService(), m_buildingService = GetService(), m_propService = GetService(), m_treeService = GetService(), m_districtNameOnly = Singleton <InfoManager> .instance.CurrentMode != InfoManager.InfoMode.Districts, m_ignoreTerrain = GetTerrainIgnore(), m_ignoreNodeFlags = GetNodeIgnoreFlags(), m_ignoreSegmentFlags = GetSegmentIgnoreFlags(out input.m_segmentNameOnly), m_ignoreBuildingFlags = GetBuildingIgnoreFlags(), m_ignoreTreeFlags = GetTreeIgnoreFlags(), m_ignorePropFlags = GetPropIgnoreFlags(), m_ignoreVehicleFlags = GetVehicleIgnoreFlags(), m_ignoreParkedVehicleFlags = GetParkedVehicleIgnoreFlags(), m_ignoreCitizenFlags = GetCitizenIgnoreFlags(), m_ignoreTransportFlags = GetTransportIgnoreFlags(), m_ignoreDistrictFlags = GetDistrictIgnoreFlags(), m_ignoreParkFlags = GetParkIgnoreFlags(), m_ignoreDisasterFlags = GetDisasterIgnoreFlags(), m_transportTypes = GetTransportTypes() }; // Enable ferry line selection. input.m_netService.m_itemLayers |= ItemClass.Layer.FerryPaths; ToolErrors errors = ToolErrors.None; RaycastOutput output; // Cursor is dark by default. m_cursor = darkCursor; // Is the base mouse ray valid? if (m_mouseRayValid) { // Yes - raycast. if (RayCast(input, out output)) { // Set base tool accurate position. m_accuratePosition = output.m_hitPos; // Check for network hits. if (output.m_netSegment != 0) { // Networks. if (CheckSegment(output.m_netSegment, ref errors)) { // CheckSegment passed - record hit position and set cursor to light cursor. output.m_hitPos = Singleton <NetManager> .instance.m_segments.m_buffer[output.m_netSegment].GetClosestPosition(output.m_hitPos); m_cursor = lightCursor; } else { // CheckSegment failed - deselect segment. output.m_netSegment = 0; } } // Create new hover instance and set hovered type (if applicable). InstanceID hoverInstance = InstanceID.Empty; if (output.m_netSegment != 0) { hoverInstance.NetSegment = output.m_netSegment; } // Update tool hover instance. m_hoverInstance = hoverInstance; } else { // Raycast failed. errors = ToolErrors.RaycastFailed; } } else { // No valid mouse ray. output = default; errors = ToolErrors.RaycastFailed; } // Set mouse position and record errors. m_mousePosition = output.m_hitPos; m_selectErrors = errors; }
private int ConvertSegments(string convertTo, string convertFrom, bool test, out int totalCost, out ToolErrors errors) { int num = 0; totalCost = 0; int tempCost = 0; int issues = 0; errors = 0; StringWriter sw = new StringWriter(); //sw.WriteLine(String.Format("Entering ConvertObjects at {0}.", DateTime.Now.TimeOfDay)); NetInfo info = PrefabCollection<NetInfo>.FindLoaded(convertTo); if (info == null) { //sw.WriteLine("Could not find the object: " + convertTo + ", aborting."); return num; } NetSegment[] buffer = Singleton<NetManager>.instance.m_segments.m_buffer; //sw.WriteLine("Filling Singleton<NetManager>.instance.m_segments.m_buffer. Found: " + buffer.Length); for (int i = 0; i < buffer.Length - 1; i++) { NetSegment segment = buffer[i]; //Validate in selected area if (segment.Info == null) { //sw.WriteLine(String.Format("Segment {0} is Null.", segment.Info.name)); } else if (!segment.Info.name.Contains(convertFrom)) { //sw.WriteLine(String.Format("Segment {0} is not a converting item.", segment.Info.name)); } else if (ValidateSelectedArea(segment) == false) { //sw.WriteLine(String.Format("Segment {0} is not in the selected area.", segment.Info.name)); } else { bool skip = false; //Are we not equal bool Curved = AngleBetween(segment.m_startDirection, segment.m_endDirection, 1); string seg = segment.Info.name; NetTool.ControlPoint point; NetTool.ControlPoint point2; NetTool.ControlPoint point3; bool Bridge = seg.Contains("Bridge ") == true; bool Slope = seg.Contains("Slope ") == true; bool Tunnel = seg.Contains("Tunnel ") == true; bool Ground = types[(int)tp.Ground].isChecked; //sw.WriteLine(String.Format("Ground: {0}; Bridge: {1}; Slope: {2}; Tunnel: {3}; Curved: {4}", Ground, Bridge, Slope, Tunnel, Curved)); // we need to handle Ground, Bridge, Elevated, Slope, Tunnel, railroads, Pipe, Power Lines, if (Ground == false && (Bridge || Slope || Tunnel || Curved)) { skip = true; } else if (types[(int)tp.Tunnel].isChecked == false && seg.Contains("Tunnel")) { skip = true; } else if (types[(int)tp.Bridge].isChecked == false && seg.Contains("Elevated")) { skip = true; } else if (types[(int)tp.Slope].isChecked == false && seg.Contains("Slope")) { skip = true; } else if (types[(int)tp.Curve].isChecked == false && Curved) { skip = true; } //sw.WriteLine(segment.Info.name + " converting to " + convertTo + "."); //sw.WriteLine("About to call GetSegmentControlPoints.\n"); GetSegmentControlPoints(i, out point, out point2, out point3); bool visualize = false; bool autoFix = true; bool needMoney = true; bool invert = false; ushort num3 = 0; ushort num4 = 0; int num5 = 0; int num6 = 0; //test for bad index if ((point.m_position == new Vector3()) && (point2.m_position == new Vector3()) && (point3.m_position == new Vector3())) { } else if (skip == true) { } else { try { //sw.WriteLine("About to call NetTool.Create test mode.\n"); //Validate in area and other errors (no money!) errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsSimulation, 0x3e8, true, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6); //sw.WriteLine("Test Cost: " + num5); tempCost = num5; } catch (Exception ex) { ARUT.WriteError("Error testing convert of: " + segment.Info.name + " to " + convertTo + ".", ex); } if (errors == 0) { try { errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsMain, 0x3e8, false, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6); num++; totalCost += tempCost; } catch (Exception ex) { string lenght = "Left Segment Lenght: " + Math.Abs((float)(segment.m_startLeftSegment - segment.m_endLeftSegment)).ToString(); lenght += " Right Segment Lenght: " + Math.Abs((float)(segment.m_startRightSegment - segment.m_endRightSegment)).ToString(); string message = "Error converting: " + segment.Info.name + " to " + convertTo + "; errors: " + errors + "; " + lenght; //sw.WriteLine(lenght); ARUT.WriteError(message, ex); //sw.WriteLine(message); issues += 1; try { //lets retry this once errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsMain, 0x3e8, false, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6); num++; totalCost += tempCost; } catch { //do nothing } } } } else { //sw.WriteLine("Error test convert: " + segment.Info.name + " to " + convertTo + ". Message22: " + errors); issues += 1; } } } } lInformation.text = "Items converted: " + num + " Total Cost: " + totalCost + " Recorded issues: " + issues; //WriteLog("" + sw); return num; }
protected override bool CheckDisaster(ushort disaster, ref ToolErrors errors) => true;
protected override bool CheckCitizen(ushort citizenInstance, ref ToolErrors errors) => true;
protected override bool CheckParkedVehicle(ushort parkedVehicle, ref ToolErrors errors) => true;
protected override bool CheckVehicle(ushort vehicle, ref ToolErrors errors) => true;
protected override bool CheckTree(uint tree, ref ToolErrors errors) => true;
protected override bool CheckProp(ushort prop, ref ToolErrors errors) => true;
protected override bool CheckBuilding(ushort building, ref ToolErrors errors) => true;
protected override bool CheckSegment(ushort segment, ref ToolErrors errors) => true;
protected override bool CheckNode(ushort node, ref ToolErrors errors) => true;
/// <summary> /// Called by the game every simulation step. /// Performs raycasting to select hovered instance. /// </summary> public override void SimulationStep() { // Get base mouse ray. Ray mouseRay = m_mouseRay; // Get raycast input. RaycastInput input = new RaycastInput(mouseRay, m_mouseRayLength) { m_rayRight = m_rayRight, m_netService = GetService(), m_buildingService = GetService(), m_propService = GetService(), m_treeService = GetService(), m_districtNameOnly = Singleton <InfoManager> .instance.CurrentMode != InfoManager.InfoMode.Districts, m_ignoreTerrain = GetTerrainIgnore(), m_ignoreNodeFlags = GetNodeIgnoreFlags(), m_ignoreSegmentFlags = GetSegmentIgnoreFlags(out input.m_segmentNameOnly), m_ignoreBuildingFlags = GetBuildingIgnoreFlags(), m_ignoreTreeFlags = GetTreeIgnoreFlags(), m_ignorePropFlags = GetPropIgnoreFlags(), m_ignoreVehicleFlags = GetVehicleIgnoreFlags(), m_ignoreParkedVehicleFlags = GetParkedVehicleIgnoreFlags(), m_ignoreCitizenFlags = GetCitizenIgnoreFlags(), m_ignoreTransportFlags = GetTransportIgnoreFlags(), m_ignoreDistrictFlags = GetDistrictIgnoreFlags(), m_ignoreParkFlags = GetParkIgnoreFlags(), m_ignoreDisasterFlags = GetDisasterIgnoreFlags(), m_transportTypes = GetTransportTypes() }; // Enable ferry line selection. input.m_netService.m_itemLayers |= ItemClass.Layer.FerryPaths; ToolErrors errors = ToolErrors.None; RaycastOutput output; // Cursor is dark by default. m_cursor = darkCursor; // Is the base mouse ray valid? if (m_mouseRayValid) { // Yes - raycast. if (RayCast(input, out output)) { // Set base tool accurate position. m_accuratePosition = output.m_hitPos; // Select parent building of any 'untouchable' (sub-)building. if (output.m_building != 0 && (Singleton <BuildingManager> .instance.m_buildings.m_buffer[output.m_building].m_flags & Building.Flags.Untouchable) != 0) { output.m_building = Building.FindParentBuilding(output.m_building); } // Check for valid hits by type - network, building, prop, tree, in that order (so e.g. embedded networks can be selected). if (output.m_netSegment != 0) { // Networks. if (CheckSegment(output.m_netSegment, ref errors)) { // CheckSegment passed - record hit position and set cursor to light. output.m_hitPos = Singleton <NetManager> .instance.m_segments.m_buffer[output.m_netSegment].GetClosestPosition(output.m_hitPos); m_cursor = lightCursor; } else { // CheckSegment failed - deselect segment. output.m_netSegment = 0; } } else if (output.m_building != 0) { // Buildings. if (CheckBuilding(output.m_building, ref errors)) { // CheckSigment passed - record hit position and set cursor to light. output.m_hitPos = Singleton <BuildingManager> .instance.m_buildings.m_buffer[output.m_building].m_position; m_cursor = lightCursor; } else { // CheckSegment failed - deselect building. output.m_building = 0; } } else if (output.m_propInstance != 0) { // Map props. if (CheckProp(output.m_propInstance, ref errors)) { // CheckSigment passed - record hit position and set cursor to light. output.m_hitPos = Singleton <PropManager> .instance.m_props.m_buffer[output.m_propInstance].Position; m_cursor = lightCursor; } else { // CheckSegment failed - deselect prop. output.m_propInstance = 0; } } else if (output.m_treeInstance != 0) { // Map trees. if (CheckTree(output.m_treeInstance, ref errors)) { // CheckSigment passed - record hit position and set cursor to light. output.m_hitPos = Singleton <TreeManager> .instance.m_trees.m_buffer[output.m_treeInstance].Position; m_cursor = lightCursor; } else { // CheckSegment failed - deselect tree. output.m_treeInstance = 0u; } } // Create new hover instance and set hovered type (if applicable). InstanceID hoverInstance = InstanceID.Empty; if (output.m_netSegment != 0) { hoverInstance.NetSegment = output.m_netSegment; } else if (output.m_building != 0) { hoverInstance.Building = output.m_building; } else if (output.m_propInstance != 0) { hoverInstance.Prop = output.m_propInstance; } else if (output.m_treeInstance != 0) { hoverInstance.Tree = output.m_treeInstance; } // Has the hovered instance changed since last time? if (hoverInstance != m_hoverInstance) { // Hover instance has changed. // Unhide any previously-hidden props, trees or buildings. if (m_hoverInstance.Prop != 0) { // Unhide previously hovered prop. if (Singleton <PropManager> .instance.m_props.m_buffer[m_hoverInstance.Prop].Hidden) { Singleton <PropManager> .instance.m_props.m_buffer[m_hoverInstance.Prop].Hidden = false; } } else if (m_hoverInstance.Tree != 0) { // Unhide previously hovered tree. if (Singleton <TreeManager> .instance.m_trees.m_buffer[m_hoverInstance.Tree].Hidden) { Singleton <TreeManager> .instance.m_trees.m_buffer[m_hoverInstance.Tree].Hidden = false; Singleton <TreeManager> .instance.UpdateTreeRenderer(m_hoverInstance.Tree, updateGroup : true); } } else if (m_hoverInstance.Building != 0) { // Unhide previously hovered building. if ((Singleton <BuildingManager> .instance.m_buildings.m_buffer[m_hoverInstance.Building].m_flags & Building.Flags.Hidden) != 0) { Singleton <BuildingManager> .instance.m_buildings.m_buffer[m_hoverInstance.Building].m_flags &= ~Building.Flags.Hidden; Singleton <BuildingManager> .instance.UpdateBuildingRenderer(m_hoverInstance.Building, updateGroup : true); } } // Update tool hover instance. m_hoverInstance = hoverInstance; } } else { // Raycast failed. errors = ToolErrors.RaycastFailed; } } else { // No valid mouse ray. output = default; errors = ToolErrors.RaycastFailed; } // Set mouse position and record errors. m_mousePosition = output.m_hitPos; m_selectErrors = errors; }