diff --git a/CodeWalker.csproj b/CodeWalker.csproj
index 64f0108..2fa8392 100644
--- a/CodeWalker.csproj
+++ b/CodeWalker.csproj
@@ -383,6 +383,12 @@
SettingsForm.cs
+
+ Form
+
+
+ TextInputForm.cs
+
@@ -534,6 +540,9 @@
SettingsForm.cs
+
+ TextInputForm.cs
+
WorldForm.cs
diff --git a/GameFiles/FileTypes/YndFile.cs b/GameFiles/FileTypes/YndFile.cs
index 8015e06..b46cb74 100644
--- a/GameFiles/FileTypes/YndFile.cs
+++ b/GameFiles/FileTypes/YndFile.cs
@@ -632,7 +632,7 @@ namespace CodeWalker.GameFiles
public void BuildBVH()
{
- BVH = new PathBVH(Nodes, 10);
+ BVH = new PathBVH(Nodes, 10, 10);
}
@@ -1217,6 +1217,8 @@ namespace CodeWalker.GameFiles
public class PathBVHNode
{
+ public int Depth;
+ public int MaxDepth;
public int Threshold;
public List Nodes;
public BoundingBox Box;
@@ -1243,7 +1245,7 @@ namespace CodeWalker.GameFiles
public void Build()
{
- if ((Nodes == null) || (Nodes.Count <= Threshold)) return;
+ if ((Nodes == null) || (Nodes.Count <= Threshold) || (Depth >= MaxDepth)) return;
Vector3 avgsum = Vector3.Zero;
foreach (var node in Nodes)
@@ -1287,14 +1289,19 @@ namespace CodeWalker.GameFiles
else l2.Add(node);
}
+ var cdepth = Depth + 1;
Node1 = new PathBVHNode();
+ Node1.Depth = cdepth;
+ Node1.MaxDepth = MaxDepth;
Node1.Threshold = Threshold;
Node1.Nodes = new List(l1);
Node1.CalcBounds();
Node1.Build();
Node2 = new PathBVHNode();
+ Node2.Depth = cdepth;
+ Node2.MaxDepth = MaxDepth;
Node2.Threshold = Threshold;
Node2.Nodes = new List(l2);
Node2.CalcBounds();
@@ -1317,9 +1324,10 @@ namespace CodeWalker.GameFiles
public class PathBVH : PathBVHNode
{
- public PathBVH(IEnumerable nodes, int threshold)
+ public PathBVH(IEnumerable nodes, int threshold, int maxdepth)
{
Threshold = threshold;
+ MaxDepth = maxdepth;
Nodes = (nodes != null) ? new List(nodes) : new List();
CalcBounds();
Build();
diff --git a/GameFiles/MetaTypes/MetaNames.cs b/GameFiles/MetaTypes/MetaNames.cs
index c02bee1..7462760 100644
--- a/GameFiles/MetaTypes/MetaNames.cs
+++ b/GameFiles/MetaTypes/MetaNames.cs
@@ -3374,6 +3374,10 @@ namespace CodeWalker.GameFiles
vfxPedInfos = 1918175602,
+ CPedModelInfo__InitData = 3949383814,
+
+
+
diff --git a/GameFiles/MetaTypes/MetaXml.cs b/GameFiles/MetaTypes/MetaXml.cs
index c597c3f..03cc39e 100644
--- a/GameFiles/MetaTypes/MetaXml.cs
+++ b/GameFiles/MetaTypes/MetaXml.cs
@@ -511,17 +511,17 @@ namespace CodeWalker.GameFiles
WriteArrayNode(sb, cind, cont, blockId, offset, entry, structInfo, ename);
break;
- case PsoDataType.Boolean:
+ case PsoDataType.Bool:
var boolVal = BitConverter.ToBoolean(data, eoffset);
ValueTag(sb, cind, ename, boolVal?"true":"false");
break;
- case PsoDataType.Byte1: //was LONG_01h //signed byte?
+ case PsoDataType.SByte: //was LONG_01h //signed byte?
//var long1Val = MetaTypes.SwapBytes(BitConverter.ToUInt64(data, eoffset));
//ValueTag(sb, cind, ename, long1Val.ToString());
var byte1Val = (sbyte)data[eoffset];
ValueTag(sb, cind, ename, byte1Val.ToString());
break;
- case PsoDataType.Byte2:
+ case PsoDataType.UByte:
var byte2Val = data[eoffset];
ValueTag(sb, cind, ename, byte2Val.ToString());
break;
@@ -614,7 +614,7 @@ namespace CodeWalker.GameFiles
var v3a = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset));
SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3a.X) + "\" y=\"" + FloatUtil.ToString(v3a.Y) + "\" z=\"" + FloatUtil.ToString(v3a.Z) + "\"");
break;
- case PsoDataType.Float3b: //TODO: check this! //...why are there 3 different types of float3?
+ case PsoDataType.Float4a: //TODO: check this! //...why are there 3 different types of float3?
var v3b = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset));
SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3b.X) + "\" y=\"" + FloatUtil.ToString(v3b.Y) + "\" z=\"" + FloatUtil.ToString(v3b.Z) + "\"");
break;
@@ -622,11 +622,11 @@ namespace CodeWalker.GameFiles
var v4 = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset));
SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v4.X) + "\" y=\"" + FloatUtil.ToString(v4.Y) + "\" z=\"" + FloatUtil.ToString(v4.Z) + "\" w=\"" + FloatUtil.ToString(v4.W) + "\"");
break;
- case PsoDataType.INT_05h: //TODO: convert hashes?
+ case PsoDataType.SInt: //TODO: convert hashes?
var int5Val = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset));
ValueTag(sb, cind, ename, int5Val.ToString());
break;
- case PsoDataType.Integer:
+ case PsoDataType.UInt:
switch (entry.Unk_5h)
{
default:
@@ -642,7 +642,7 @@ namespace CodeWalker.GameFiles
break;
}
break;
- case PsoDataType.LONG_20h:
+ case PsoDataType.Long:
var long2Val = MetaTypes.SwapBytes(BitConverter.ToUInt64(data, eoffset));
ValueTag(sb, cind, ename, long2Val.ToString());
break;
@@ -651,15 +651,15 @@ namespace CodeWalker.GameFiles
WriteMapNode(sb, indent, cont, eoffset, entry, structInfo, ename);
break;
- case PsoDataType.SHORT_03h:
+ case PsoDataType.SShort:
var short3Val = (short)MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset));
ValueTag(sb, cind, ename, short3Val.ToString());
break;
- case PsoDataType.SHORT_04h:
+ case PsoDataType.UShort:
var short4Val = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset));
ValueTag(sb, cind, ename, short4Val.ToString());
break;
- case PsoDataType.SHORT_1Eh://half float?
+ case PsoDataType.HFloat://half float?
var short1EVal = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset));
ValueTag(sb, cind, ename, short1EVal.ToString());
break;
@@ -896,7 +896,7 @@ namespace CodeWalker.GameFiles
var v4Arr = MetaTypes.ConvertDataArray(data, eoffset, (int)aCount);
WriteRawArray(sb, v4Arr, indent, ename, "Vector3", FormatVector4SwapXYZOnly, 1);
break;
- case PsoDataType.Byte2:
+ case PsoDataType.UByte:
var barr = new byte[aCount];
if (aCount > 0)
{
@@ -906,7 +906,7 @@ namespace CodeWalker.GameFiles
}
WriteRawArray(sb, barr, indent, ename, "byte");
break;
- case PsoDataType.Boolean:
+ case PsoDataType.Bool:
var barr2 = new byte[aCount];
if (aCount > 0)
{
@@ -922,17 +922,17 @@ namespace CodeWalker.GameFiles
var floatArr = PsoTypes.GetFloatArray(cont.Pso, arrFloat);
WriteRawArray(sb, floatArr, indent, ename, "float");
break;
- case PsoDataType.SHORT_04h:
+ case PsoDataType.UShort:
var arrShort = MetaTypes.ConvertData(data, eoffset);
arrShort.SwapEnd();
var shortArr = PsoTypes.GetUShortArray(cont.Pso, arrShort);
WriteRawArray(sb, shortArr, indent, ename, "ushort");
break;
- case PsoDataType.Integer:
+ case PsoDataType.UInt:
var intArr = MetaTypes.ConvertDataArray(data, eoffset, (int)aCount);
WriteRawArray(sb, intArr, indent, ename, "int");
break;
- case PsoDataType.INT_05h:
+ case PsoDataType.SInt:
var arrUint2 = MetaTypes.ConvertData(data, eoffset);
arrUint2.SwapEnd();
var intArr2 = PsoTypes.GetUintArray(cont.Pso, arrUint2);
diff --git a/GameFiles/MetaTypes/Pso.cs b/GameFiles/MetaTypes/Pso.cs
index 9f3a98c..821b323 100644
--- a/GameFiles/MetaTypes/Pso.cs
+++ b/GameFiles/MetaTypes/Pso.cs
@@ -49,35 +49,13 @@ namespace CodeWalker.GameFiles
public enum PsoDataType : byte
{
- //BYTE_00h = 0x00,
- //LONG_01h = 0x01,
- //BYTE_02h = 0x02,
- //SHORT_03h = 0x03,
- //SHORT_04h = 0x04,
- //INT_05h = 0x05,
- //INT_06h = 0x06,
- //Float = 0x07,
- //LONG_08h = 0x08,
- //TYPE_09h = 0x09,
- //TYPE_0Ah = 0x0a,
- //INT_0Bh = 0x0b, //Hash? Name
- //Structure = 0x0c,
- //Array = 0x0d,
- //BYTE_ENUM_VALUE = 0x0e,
- //SHORT_0Fh = 0x0f, //short flags
- //TYPE_10h = 0x10,
- //TYPE_14h = 0x14,
- //Vector4 = 0x15,
- //SHORT_1Eh = 0x1e,
- //LONG_20h = 0x20
-
- Boolean = 0x00,
- Byte1 = 0x01, //signed byte..
- Byte2 = 0x02,
- SHORT_03h = 0x03, //signed short?
- SHORT_04h = 0x04,
- INT_05h = 0x05, //signed int?
- Integer = 0x06, //...unsigned?
+ Bool = 0x00,
+ SByte = 0x01,
+ UByte = 0x02,
+ SShort = 0x03,
+ UShort = 0x04,
+ SInt = 0x05,
+ UInt = 0x06,
Float = 0x07,
Float2 = 0x08,
Float3 = 0x09,
@@ -89,69 +67,39 @@ namespace CodeWalker.GameFiles
Flags = 0x0f,
Map = 0x10,
Float3a = 0x14,
- Float3b = 0x15,
- SHORT_1Eh = 0x1e,
- LONG_20h = 0x20
-
+ Float4a = 0x15,
+ HFloat = 0x1e,
+ Long = 0x20,
}
public static class PsoDataTypes
{
public static string GetCSharpTypeName(PsoDataType t)
{
- //MetaStructureEntryDataType mdt = (MetaStructureEntryDataType)t;
switch (t)
{
- case PsoDataType.Boolean: return "bool";
- case PsoDataType.Byte1: return "sbyte"; //was LONG_01h.. why?
- case PsoDataType.Byte2: return "byte";
- case PsoDataType.SHORT_03h: return "short";
- case PsoDataType.SHORT_04h: return "short";
- case PsoDataType.INT_05h: return "int";
- case PsoDataType.Integer: return "int";
+ case PsoDataType.Bool: return "bool";
+ case PsoDataType.SByte: return "sbyte";
+ case PsoDataType.UByte: return "byte";
+ case PsoDataType.SShort: return "short";
+ case PsoDataType.UShort: return "ushort";
+ case PsoDataType.SInt: return "int";
+ case PsoDataType.UInt: return "int";
case PsoDataType.Float: return "float";
case PsoDataType.Float2: return "long";
case PsoDataType.String: return "uint"; //hash? NEEDS WORK?
case PsoDataType.Enum: return "byte";
case PsoDataType.Flags: return "short";
- case PsoDataType.SHORT_1Eh: return "short";
- case PsoDataType.LONG_20h: return "long";
+ case PsoDataType.HFloat: return "short";
+ case PsoDataType.Long: return "long";
case PsoDataType.Float3:
case PsoDataType.Float4:
case PsoDataType.Map:
case PsoDataType.Float3a:
- case PsoDataType.Float3b:
+ case PsoDataType.Float4a:
case PsoDataType.Structure:
case PsoDataType.Array:
default:
return t.ToString();
-
- //case MetaStructureEntryDataType.Boolean: return "bool";
- //case MetaStructureEntryDataType.SignedByte: return "sbyte";
- //case MetaStructureEntryDataType.UnsignedByte: return "byte";
- //case MetaStructureEntryDataType.SignedShort: return "short";
- //case MetaStructureEntryDataType.UnsignedShort: return "ushort";
- //case MetaStructureEntryDataType.SignedInt: return "int";
- //case MetaStructureEntryDataType.UnsignedInt: return "uint";
- //case MetaStructureEntryDataType.Float: return "float";
- //case MetaStructureEntryDataType.Float_XYZ: return "Vector3";
- //case MetaStructureEntryDataType.Float_XYZW: return "Vector4";
-
- //case MetaStructureEntryDataType.Hash: return "uint"; //uint hashes...
- //case MetaStructureEntryDataType.ByteEnum: return "byte"; //convert to enum later..
- //case MetaStructureEntryDataType.IntEnum: return "int";
- //case MetaStructureEntryDataType.ShortFlags: return "short";
- //case MetaStructureEntryDataType.IntFlags1: return "int";
- //case MetaStructureEntryDataType.IntFlags2: return "int";
-
- //case MetaStructureEntryDataType.Array:
- //case MetaStructureEntryDataType.ArrayOfChars:
- //case MetaStructureEntryDataType.ArrayOfBytes:
- //case MetaStructureEntryDataType.DataBlockPointer:
- //case MetaStructureEntryDataType.CharPointer:
- //case MetaStructureEntryDataType.StructurePointer:
- //case MetaStructureEntryDataType.Structure:
- //default:
- // return t.ToString();
}
}
}
diff --git a/ProjectForm.Designer.cs b/ProjectForm.Designer.cs
index c69907b..c13bc0a 100644
--- a/ProjectForm.Designer.cs
+++ b/ProjectForm.Designer.cs
@@ -180,6 +180,8 @@
this.CarGoToButton = new System.Windows.Forms.Button();
this.CarPositionTextBox = new System.Windows.Forms.TextBox();
this.label31 = new System.Windows.Forms.Label();
+ this.YmapMloInstanceTabPage = new System.Windows.Forms.TabPage();
+ this.YmapTimecycleModifierTabPage = new System.Windows.Forms.TabPage();
this.YndTabPage = new System.Windows.Forms.TabPage();
this.YndTabControl = new System.Windows.Forms.TabControl();
this.YndYndTabPage = new System.Windows.Forms.TabPage();
@@ -670,8 +672,7 @@
this.OptionsHideGTAVMapMenu = new System.Windows.Forms.ToolStripMenuItem();
this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog();
this.OpenFileDialog = new System.Windows.Forms.OpenFileDialog();
- this.YmapMloInstanceTabPage = new System.Windows.Forms.TabPage();
- this.YmapTimecycleModifierTabPage = new System.Windows.Forms.TabPage();
+ this.ScenarioImportChainMenu = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
@@ -1029,6 +1030,7 @@
this.ProjectManifestTextBox.CommentPrefix = null;
this.ProjectManifestTextBox.Cursor = System.Windows.Forms.Cursors.IBeam;
this.ProjectManifestTextBox.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))));
+ this.ProjectManifestTextBox.Font = new System.Drawing.Font("Courier New", 9.75F);
this.ProjectManifestTextBox.IsReplaceMode = false;
this.ProjectManifestTextBox.Language = FastColoredTextBoxNS.Language.XML;
this.ProjectManifestTextBox.LeftBracket = '<';
@@ -2569,6 +2571,24 @@
this.label31.TabIndex = 52;
this.label31.Text = "Position:";
//
+ // YmapMloInstanceTabPage
+ //
+ this.YmapMloInstanceTabPage.Location = new System.Drawing.Point(4, 22);
+ this.YmapMloInstanceTabPage.Name = "YmapMloInstanceTabPage";
+ this.YmapMloInstanceTabPage.Size = new System.Drawing.Size(510, 443);
+ this.YmapMloInstanceTabPage.TabIndex = 3;
+ this.YmapMloInstanceTabPage.Text = "Mlo Instance";
+ this.YmapMloInstanceTabPage.UseVisualStyleBackColor = true;
+ //
+ // YmapTimecycleModifierTabPage
+ //
+ this.YmapTimecycleModifierTabPage.Location = new System.Drawing.Point(4, 22);
+ this.YmapTimecycleModifierTabPage.Name = "YmapTimecycleModifierTabPage";
+ this.YmapTimecycleModifierTabPage.Size = new System.Drawing.Size(510, 443);
+ this.YmapTimecycleModifierTabPage.TabIndex = 4;
+ this.YmapTimecycleModifierTabPage.Text = "Time Cycle Modifier";
+ this.YmapTimecycleModifierTabPage.UseVisualStyleBackColor = true;
+ //
// YndTabPage
//
this.YndTabPage.Controls.Add(this.YndTabControl);
@@ -7941,6 +7961,7 @@
this.ScenarioNewEntityOverrideMenu,
this.ScenarioNewChainMenu,
this.ScenarioNewClusterMenu,
+ this.ScenarioImportChainMenu,
this.toolStripSeparator12,
this.ScenarioAddToProjectMenu,
this.ScenarioRemoveFromProjectMenu});
@@ -8059,23 +8080,13 @@
//
this.OpenFileDialog.Filter = "CodeWalker Projects|*.cwproj";
//
- // YmapMloInstanceTabPage
+ // ScenarioImportChainMenu
//
- this.YmapMloInstanceTabPage.Location = new System.Drawing.Point(4, 22);
- this.YmapMloInstanceTabPage.Name = "YmapMloInstanceTabPage";
- this.YmapMloInstanceTabPage.Size = new System.Drawing.Size(510, 443);
- this.YmapMloInstanceTabPage.TabIndex = 3;
- this.YmapMloInstanceTabPage.Text = "Mlo Instance";
- this.YmapMloInstanceTabPage.UseVisualStyleBackColor = true;
- //
- // YmapTimecycleModifierTabPage
- //
- this.YmapTimecycleModifierTabPage.Location = new System.Drawing.Point(4, 22);
- this.YmapTimecycleModifierTabPage.Name = "YmapTimecycleModifierTabPage";
- this.YmapTimecycleModifierTabPage.Size = new System.Drawing.Size(510, 443);
- this.YmapTimecycleModifierTabPage.TabIndex = 4;
- this.YmapTimecycleModifierTabPage.Text = "Time Cycle Modifier";
- this.YmapTimecycleModifierTabPage.UseVisualStyleBackColor = true;
+ this.ScenarioImportChainMenu.Enabled = false;
+ this.ScenarioImportChainMenu.Name = "ScenarioImportChainMenu";
+ this.ScenarioImportChainMenu.Size = new System.Drawing.Size(228, 22);
+ this.ScenarioImportChainMenu.Text = "Import Chain...";
+ this.ScenarioImportChainMenu.Click += new System.EventHandler(this.ScenarioImportChainMenu_Click);
//
// ProjectForm
//
@@ -8927,5 +8938,6 @@
private System.Windows.Forms.ToolStripMenuItem ToolsImportMenyooXmlMenu;
private System.Windows.Forms.TabPage YmapMloInstanceTabPage;
private System.Windows.Forms.TabPage YmapTimecycleModifierTabPage;
+ private System.Windows.Forms.ToolStripMenuItem ScenarioImportChainMenu;
}
}
\ No newline at end of file
diff --git a/ProjectForm.cs b/ProjectForm.cs
index b40b76c..8ce9320 100644
--- a/ProjectForm.cs
+++ b/ProjectForm.cs
@@ -297,6 +297,7 @@ namespace CodeWalker
ScenarioNewEntityOverrideMenu.Enabled = enable && inproj;
ScenarioNewChainMenu.Enabled = enable && inproj;
ScenarioNewClusterMenu.Enabled = enable && inproj;
+ ScenarioImportChainMenu.Enabled = enable && inproj;
if (CurrentScenario != null)
{
@@ -5528,7 +5529,163 @@ namespace CodeWalker
+ private void ImportScenarioChain()
+ {
+ var paths = CurrentScenario?.CScenarioPointRegion?.Paths;
+ if (paths == null) return;
+ var rgn = CurrentScenario.ScenarioRegion;
+ if (rgn == null) return;
+ TextInputForm f = new TextInputForm();
+ f.TitleText = "Import scenario chain points";
+ f.PromptText = "Input chain points in CSV format. Direction is in radians. NavSpeed is from 0 to 15. NavMode can be either Direct, NavMesh, or Roads. ScenarioType is the name of the scenario type to use.";
+ f.MainText = "X, Y, Z, Direction, NavSpeed, NavMode, ScenarioType";
+ if (f.ShowDialog() == DialogResult.Cancel) return;
+
+ var stypes = Scenarios.ScenarioTypes; //these are loaded by Scenarios.Init
+ ScenarioType defaulttype = null;
+ if (stypes != null)
+ {
+ defaulttype = stypes.GetScenarioType(1194480618); //"drive";
+ }
+
+ ScenarioNode thisnode = null;
+ ScenarioNode lastnode = null;
+ MCScenarioChainingEdge lastedge = null;
+
+ var str = f.MainText;
+ var lines = str.Split('\n');
+
+
+ if (lines.Length < 2)
+ {
+ return;//need at least 2 lines (1 point) to work with...
+ }
+
+
+
+ MCScenarioChain chain = new MCScenarioChain();
+
+ paths.AddChain(chain);
+
+
+ for (int i = 0; i < lines.Length; i++)
+ {
+ var line = lines[i];
+ var vals = line.Split(',');
+ if (vals.Length < 3) continue;
+ if (vals[0].StartsWith("X")) continue;
+ Vector3 pos = Vector3.Zero;
+ float dir = 0;
+ var action = Unk_3609807418.Move;
+ var navMode = Unk_3971773454.Direct;
+ var navSpeed = Unk_941086046.Unk_00_3279574318;
+ var stype = defaulttype;
+ var ok = true;
+ ok = ok && FloatUtil.TryParse(vals[0].Trim(), out pos.X);
+ ok = ok && FloatUtil.TryParse(vals[1].Trim(), out pos.Y);
+ ok = ok && FloatUtil.TryParse(vals[2].Trim(), out pos.Z);
+ if (vals.Length > 3)
+ {
+ ok = ok && FloatUtil.TryParse(vals[3].Trim(), out dir);
+ }
+ if (vals.Length > 4)
+ {
+ byte nsb = 0;
+ byte.TryParse(vals[4].Trim(), out nsb);
+ if (nsb > 15) nsb = 15;
+ navSpeed = (Unk_941086046)nsb;
+ }
+ if (vals.Length > 5)
+ {
+ switch (vals[5].Trim())
+ {
+ case "Direct": navMode = Unk_3971773454.Direct; break;
+ case "NavMesh": navMode = Unk_3971773454.NavMesh; break;
+ case "Roads": navMode = Unk_3971773454.Roads; break;
+ }
+ }
+ if (vals.Length > 6)
+ {
+ var sthash = JenkHash.GenHash(vals[6].Trim().ToLowerInvariant());
+ stype = stypes?.GetScenarioType(sthash) ?? defaulttype;
+ }
+
+ if (!ok) continue;
+
+
+
+ thisnode = rgn.AddNode();
+
+ thisnode.MyPoint.Direction = dir;
+ thisnode.MyPoint.Type = stype;
+
+ thisnode.ChainingNode = new MCScenarioChainingNode();
+ thisnode.ChainingNode.Chain = chain;
+ thisnode.ChainingNode.Type = stype;
+ thisnode.ChainingNode.TypeHash = stype?.NameHash ?? 0;
+ thisnode.ChainingNode.NotLast = (i < (lines.Length - 1));
+ thisnode.ChainingNode.NotFirst = (lastnode != null);
+
+ thisnode.SetPosition(pos);
+
+ paths.AddNode(thisnode.ChainingNode);
+
+
+ if (lastnode != null)
+ {
+ var edge = new MCScenarioChainingEdge();
+
+ edge.NodeFrom = lastnode.ChainingNode;
+ edge.NodeTo = thisnode.ChainingNode;
+ edge.NodeIndexFrom = (ushort)lastnode.ChainingNode.NodeIndex;
+ edge.NodeIndexTo = (ushort)thisnode.ChainingNode.NodeIndex;
+
+ edge.Action = action;
+ edge.NavMode = navMode;
+ edge.NavSpeed = navSpeed;
+
+ paths.AddEdge(edge);
+ chain.AddEdge(edge);
+
+ lastedge = edge;
+ }
+
+
+ lastnode = thisnode;
+ }
+
+
+
+
+
+
+ LoadProjectTree();
+
+ if (lastnode != null)
+ {
+ TrySelectScenarioNodeTreeNode(lastnode);
+ CurrentScenarioNode = lastnode;
+ }
+
+ CurrentScenarioChainEdge = lastedge;
+ LoadScenarioChainTabPage();
+ //LoadScenarioTabPage();
+ //LoadScenarioNodeTabPages();
+
+
+ if (WorldForm != null)
+ {
+ WorldForm.UpdateScenarioGraphics(CurrentScenario, false);
+ }
+ else
+ {
+ CurrentScenario.ScenarioRegion.BuildBVH();
+ CurrentScenario.ScenarioRegion.BuildVertices(); //for the graphics...
+ }
+
+
+ }
@@ -6923,6 +7080,11 @@ namespace CodeWalker
AddScenarioCluster();
}
+ private void ScenarioImportChainMenu_Click(object sender, EventArgs e)
+ {
+ ImportScenarioChain();
+ }
+
private void ScenarioAddToProjectMenu_Click(object sender, EventArgs e)
{
AddScenarioToProject(CurrentScenario);
@@ -10251,6 +10413,11 @@ namespace CodeWalker
}
}
UpdateScenarioNodeTreeNode(CurrentScenarioNode);
+
+ if (CurrentScenarioNode.ChainingNode != null)
+ {
+ ScenarioChainNodeTypeComboBox.SelectedItem = stype;
+ }
}
private void ScenarioClusterPointModelSetComboBox_SelectedIndexChanged(object sender, EventArgs e)
diff --git a/TextInputForm.Designer.cs b/TextInputForm.Designer.cs
new file mode 100644
index 0000000..301ed2a
--- /dev/null
+++ b/TextInputForm.Designer.cs
@@ -0,0 +1,130 @@
+namespace CodeWalker
+{
+ partial class TextInputForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TextInputForm));
+ this.MainTextBox = new FastColoredTextBoxNS.FastColoredTextBox();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.CancelThisButton = new System.Windows.Forms.Button();
+ this.PromptLabel = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.MainTextBox)).BeginInit();
+ this.SuspendLayout();
+ //
+ // MainTextBox
+ //
+ this.MainTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.MainTextBox.AutoCompleteBracketsList = new char[] {
+ '(',
+ ')',
+ '{',
+ '}',
+ '[',
+ ']',
+ '\"',
+ '\"',
+ '\'',
+ '\''};
+ this.MainTextBox.AutoScrollMinSize = new System.Drawing.Size(27, 14);
+ this.MainTextBox.BackBrush = null;
+ this.MainTextBox.CharHeight = 14;
+ this.MainTextBox.CharWidth = 8;
+ this.MainTextBox.Cursor = System.Windows.Forms.Cursors.IBeam;
+ this.MainTextBox.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))));
+ this.MainTextBox.IsReplaceMode = false;
+ this.MainTextBox.Location = new System.Drawing.Point(1, 36);
+ this.MainTextBox.Name = "MainTextBox";
+ this.MainTextBox.Paddings = new System.Windows.Forms.Padding(0);
+ this.MainTextBox.SelectionColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));
+ this.MainTextBox.ServiceColors = ((FastColoredTextBoxNS.ServiceColors)(resources.GetObject("MainTextBox.ServiceColors")));
+ this.MainTextBox.Size = new System.Drawing.Size(658, 317);
+ this.MainTextBox.TabIndex = 0;
+ this.MainTextBox.Zoom = 100;
+ this.MainTextBox.TextChanged += new System.EventHandler(this.MainTextBox_TextChanged);
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(573, 362);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(75, 23);
+ this.OkButton.TabIndex = 1;
+ this.OkButton.Text = "Ok";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // CancelThisButton
+ //
+ this.CancelThisButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelThisButton.Location = new System.Drawing.Point(492, 362);
+ this.CancelThisButton.Name = "CancelThisButton";
+ this.CancelThisButton.Size = new System.Drawing.Size(75, 23);
+ this.CancelThisButton.TabIndex = 2;
+ this.CancelThisButton.Text = "Cancel";
+ this.CancelThisButton.UseVisualStyleBackColor = true;
+ this.CancelThisButton.Click += new System.EventHandler(this.CancelThisButton_Click);
+ //
+ // PromptLabel
+ //
+ this.PromptLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.PromptLabel.AutoEllipsis = true;
+ this.PromptLabel.Location = new System.Drawing.Point(12, 5);
+ this.PromptLabel.Name = "PromptLabel";
+ this.PromptLabel.Size = new System.Drawing.Size(636, 28);
+ this.PromptLabel.TabIndex = 3;
+ this.PromptLabel.Text = "Please input text:";
+ //
+ // TextInputForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(660, 397);
+ this.Controls.Add(this.PromptLabel);
+ this.Controls.Add(this.CancelThisButton);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.MainTextBox);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "TextInputForm";
+ this.Text = "Text Input - CodeWalker by dexyfex";
+ ((System.ComponentModel.ISupportInitialize)(this.MainTextBox)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private FastColoredTextBoxNS.FastColoredTextBox MainTextBox;
+ private System.Windows.Forms.Button OkButton;
+ private System.Windows.Forms.Button CancelThisButton;
+ private System.Windows.Forms.Label PromptLabel;
+ }
+}
\ No newline at end of file
diff --git a/TextInputForm.cs b/TextInputForm.cs
new file mode 100644
index 0000000..cff6f56
--- /dev/null
+++ b/TextInputForm.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace CodeWalker
+{
+ public partial class TextInputForm : Form
+ {
+ public TextInputForm()
+ {
+ InitializeComponent();
+ DialogResult = DialogResult.Cancel;
+ }
+
+
+ private string _MainText = string.Empty;
+ public string MainText
+ {
+ get
+ {
+ return _MainText;
+ }
+ set
+ {
+ _MainText = value;
+ MainTextBox.Text = _MainText;
+ }
+ }
+
+ public string PromptText
+ {
+ get
+ {
+ return PromptLabel.Text;
+ }
+ set
+ {
+ PromptLabel.Text = value;
+ }
+ }
+
+ private string _TitleText = string.Empty;
+ public string TitleText
+ {
+ get
+ {
+ return _TitleText;
+ }
+ set
+ {
+ _TitleText = value;
+ var str = "Text Input - CodeWalker by dexyfex";
+ if (!string.IsNullOrEmpty(_TitleText))
+ {
+ Text = _TitleText + " - " + str;
+ }
+ else
+ {
+ Text = str;
+ }
+ }
+ }
+
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ _MainText = MainTextBox.Text;
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void CancelThisButton_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ private void MainTextBox_TextChanged(object sender, FastColoredTextBoxNS.TextChangedEventArgs e)
+ {
+ _MainText = MainTextBox.Text;
+ }
+
+ }
+}
diff --git a/TextInputForm.resx b/TextInputForm.resx
new file mode 100644
index 0000000..9694944
--- /dev/null
+++ b/TextInputForm.resx
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdGYXN0Q29sb3JlZFRleHRCb3gsIFZlcnNpb249Mi4xNi4yMS4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWZiOGFhMTJiOTk0ZWY2MWIMAwAAAFFTeXN0
+ ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
+ PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACJGYXN0Q29sb3JlZFRleHRCb3hOUy5TZXJ2aWNlQ29sb3JzBgAA
+ ACg8Q29sbGFwc2VNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxDb2xsYXBzZU1hcmtlckJh
+ Y2tDb2xvcj5rX19CYWNraW5nRmllbGQqPENvbGxhcHNlTWFya2VyQm9yZGVyQ29sb3I+a19fQmFja2lu
+ Z0ZpZWxkJjxFeHBhbmRNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkJjxFeHBhbmRNYXJrZXJC
+ YWNrQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxFeHBhbmRNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5n
+ RmllbGQEBAQEBAQUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAA
+ ABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5E
+ cmF3aW5nLkNvbG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAACAAAABfz///8UU3lzdGVtLkRy
+ YXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAACgAAAAAA
+ AAAAlgABAAH7/////P///woAAAAAAAAAAKQAAQAB+v////z///8KAAAAAAAAAACWAAEAAfn////8////
+ CgAAAAAAAAAAjQABAAH4/////P///woAAAAAAAAAAKQAAQAB9/////z///8KAAAAAAAAAACWAAEACw==
+
+
+
+
+
+ AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA
+ 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
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+//r7//v8//7+/wAAAAAAAAAA
+ APb4/7/F84eP0e/0//7+/wAAAAAAAP7+//z9//v8//3+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz9//b5//X4//v8/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////w////4
+ P///+D////g8//D4MH/geCB/4Dggf+A4IH/wOCD/+DAB//hgAf//gAP//wAAB/AAAAPwAAAD8AAAA/AA
+ AAfjAAEHgYADAQPgBwEDEAEBAghgAQwIIEH8CCB//Bggf/wYMH/8ODD///h/////////////KAAAABAA
+ AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///+vv/fL1/v///wAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4+Vx7/F5v///wAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///4CHtrS62////////////////////wAAAAAAAAAAAP////H0/vf6/v//
+ /////////4yTwrrB4f///+zw+7rA6P39/////wAAAAAAAAAAAP///56l2BkcguXr/P///////42Uw8jO
+ 6P///ysvjWVqtP///////wAAAAAAAAAAAP////D0/0hPpsDG6////////6y02d7k8////3qAx+/z/f//
+ /wAAAAAAAAAAAAAAAAAAAP///////////////8zT8V5ns1Rcrdzh9f///////////wAAAAAAAAAAAAAA
+ AAAAAP////////7+/6ix3nmBxFthtmdwu09WqbC54/v9//r8//j6//39/wAAAAAAAAAAAOjt/H6I0FJc
+ skpSqHF+wRMahFZhs4iT1AsNc1pgrm52v2RsuO/z/gAAAP////////L2/cLJ7rrD64+V4DY+ozU+mYmU
+ 0X2Hy1hfss7V8urv/PP2/v///wAAAP///+Pp+d/k9////////+Pp/4uR3ysymW14xYOM0fD0/P///+Xq
+ +ri/6Pj6/wAAAOrv/j5DnbS75P////////////X4/+/0/ubr+/r7/////////9rh+hgZhKGo2QAAAPDz
+ /eLn+f////j6/2Nqttrg9////+Hn+P3+//3+/1hescLJ6/////L2/eru/AAAAAAAAAAAAP///8rR70tR
+ p/3+//v8/zY6jNPY7////09WqWpwu////wAAAAAAAAAAAAAAAAAAAAAAAPb4/vr7//////v8/5Wd1eHm
+ +P////v8//T3/wAAAAAAAAAAAAAAAP//AAD8PwAA/D8AAPwDAACAAwAAgAMAAIAHAADABwAAwAEAAMAB
+ AAAAAQAAAAEAAAABAAAAAQAAwAcAAOAPAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//f7//P3//P3//P3/
+ /f7//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//P3/
+ +fv/+fv/+Pr/+fv/+vv//P3//v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA/f7/+fr/8/b/7PL/5+3/6e/+9Pf/+vv//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA/P3/9/r/6O7/cXe1UVaet7z17fL/+Pr//f3/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/z/9Pj/4Oj/NzyCUlOd2dz/6O//9Pf//P3/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8vb/2+P9X2OmREGLnqPd
+ 4+v/8vb/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/
+ 1N35bXK1JSRtbHGz5O7/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA+vv/8PX/3Ob/U1eaDwtXjZLT4+z/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/2eP+MjR6AAA+c3i34Or/8fX/+/z/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8vb/1d/7MS91AAA1UFSS4On/8vb/+/z/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//P3/+vz/+fv/+Pr/+Pr/+vv//f3//v//AAAAAAAAAAAAAAAA
+ /v//+fv/9Pf/2+L/SVGtAABsLTaZytL58fX/9/n//f7/AAAAAAAAAAAAAAAA/v7/+/z/9/n/9fj/9vn/
+ 9fj/9vj/+vz//f7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//f7//f3//f3//f3//v7//v//AAAA
+ AAAAAAAAAAAAAAAAAAAA+/z/9vn/6e//mZ7gTVarr7bp6/H/9fj/+vv//v7/AAAAAAAAAAAAAAAAAAAA
+ /v7//f7/+/z/+/z/+/z//P3//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f3/+Pr/9fj/6e7/4+n/8fb/9Pf/+Pr//f3/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//P3/+fv/+fv/+vv/+Pr/+vv/
+ /P3//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//f7/
+ /f3//P3//f7//v7//v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+ ///////4D/////////AH////////8Af////////wB/////////AH////////8Af////////wB///////
+ //AH////////8Af////////wB/////////AH////////8AfwP//////wB8Af//+Af/AHgB///wA/8AcA
+ H///AB/wBgAf//8AD/AGAB///wAH8AYAH///AAPwBAAf//8AA/AEAD///wAD8AQAP///AAPwBAB///+A
+ A/AEAP///8AD4AAA////4AcAAAH////wDgAAAf/////8AAAH//////gAAAf/////4AAAAf/////gAAAA
+ /f//+AAAAAAAD//AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+A
+ AAAAAAAP/4AAAAAAAB//wAAAAABAf/4HwAAAAYAf8APAAAADgA/gA+AAAAMAA8AD8AAABwADgAP8AAAf
+ AAOAA/4AAB8AA4ADAAAAAQADgAIAcA4AgAOABgBwDgBAA4AMAGAMADADwDwAYAwAOAfg+ABgBAAeH//4
+ AEAEAB////gAwAYAH///+ADABgAf///4AcAGAB////gBwAcAH///+APAB4A////8B+AHwH//////4A//
+ ///////gD/////////Af//////////////8=
+
+
+
\ No newline at end of file
diff --git a/World/Scenarios.cs b/World/Scenarios.cs
index 4b8cfe2..9e7bf71 100644
--- a/World/Scenarios.cs
+++ b/World/Scenarios.cs
@@ -435,7 +435,7 @@ namespace CodeWalker.World
public void BuildBVH()
{
- BVH = new PathBVH(Nodes, 10);
+ BVH = new PathBVH(Nodes, 10, 10);
}
public void BuildVertices()
diff --git a/World/Trains.cs b/World/Trains.cs
index ec5fbec..87e7637 100644
--- a/World/Trains.cs
+++ b/World/Trains.cs
@@ -297,7 +297,7 @@ namespace CodeWalker.World
public void BuildBVH()
{
- BVH = new PathBVH(Nodes, 10);
+ BVH = new PathBVH(Nodes, 10, 10);
}
diff --git a/WorldForm.cs b/WorldForm.cs
index 056c2e5..3b82001 100644
--- a/WorldForm.cs
+++ b/WorldForm.cs
@@ -1130,7 +1130,7 @@ namespace CodeWalker
MetaHash ahash = arche.Hash;
MetaHash ahashuv1 = ahash + 1;
MetaHash ahashuv2 = ahash + 2;
- ClipMapEntry cme, cmeuv1, cmeuv2;
+ ClipMapEntry cme, cmeuv1, cmeuv2; //this goes to at least uv5! (from uv0) - see hw1_09.ycd
bool found = false;
if (ycd.ClipMap.TryGetValue(ahash, out cme))
{