using CodeWalker.GameFiles; using CodeWalker.World; using SharpDX; 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.Project.Panels { public partial class EditScenarioNodePanel : ProjectPanel { public ProjectForm ProjectForm; public ScenarioNode CurrentScenarioNode { get; set; } public YmtFile CurrentScenario { get; set; } public MCScenarioChainingEdge CurrentScenarioChainEdge { get; set; } private bool populatingui = false; public EditScenarioNodePanel(ProjectForm projectForm) { ProjectForm = projectForm; InitializeComponent(); } public void SetScenarioNode(ScenarioNode node) { CurrentScenarioNode = node; CurrentScenario = node?.Ymt; Tag = node; UpdateFormTitle(); UpdateScenarioNodeUI(); } private void UpdateFormTitle() { var sn = CurrentScenarioNode.ToString(); Text = sn; } public void UpdateScenarioNodeUI() { populatingui = true; LoadScenarioDropDowns(); LoadScenarioPointTabPage(); LoadScenarioEntityTabPage(); LoadScenarioEntityPointTabPage(); LoadScenarioChainTabPage(); LoadScenarioChainEdgeTabPage(); LoadScenarioChainNodeTabPage(); LoadScenarioClusterTabPage(); LoadScenarioClusterPointTabPage(); populatingui = false; UpdateTabVisibility(); if (CurrentScenarioNode != null) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SelectScenarioNode(CurrentScenarioNode); } } } private void UpdateTabVisibility() { //avoid resetting the tabs if no change is necessary. bool ok = true; bool pointTabVis = false; bool entTabVis = false; bool entPntTabVis = false; bool chainTabVis = false; bool chainNodeTabVis = false; bool clusterTabVis = false; bool clusterNodeTabVis = false; foreach (var tab in ScenarioTabControl.TabPages) { if (tab == ScenarioPointTabPage) pointTabVis = true; if (tab == ScenarioEntityTabPage) entTabVis = true; if (tab == ScenarioEntityPointTabPage) entPntTabVis = true; if (tab == ScenarioChainTabPage) chainTabVis = true; if (tab == ScenarioChainNodeTabPage) chainNodeTabVis = true; if (tab == ScenarioClusterTabPage) clusterTabVis = true; if (tab == ScenarioClusterPointTabPage) clusterNodeTabVis = true; } if ((CurrentScenarioNode?.MyPoint != null) != pointTabVis) ok = false; if ((CurrentScenarioNode?.Entity != null) != entTabVis) ok = false; if ((CurrentScenarioNode?.EntityPoint != null) != entPntTabVis) ok = false; if ((CurrentScenarioNode?.ChainingNode != null) != chainTabVis) ok = false; if ((CurrentScenarioNode?.ChainingNode != null) != chainNodeTabVis) ok = false; if ((CurrentScenarioNode?.Cluster != null) != clusterTabVis) ok = false; if ((CurrentScenarioNode?.ClusterMyPoint != null) != clusterNodeTabVis) ok = false; if (ok) return; var seltab = ScenarioTabControl.SelectedTab; ScenarioTabControl.TabPages.Clear(); if (CurrentScenarioNode?.MyPoint != null) ScenarioTabControl.TabPages.Add(ScenarioPointTabPage); if (CurrentScenarioNode?.Entity != null) ScenarioTabControl.TabPages.Add(ScenarioEntityTabPage); if (CurrentScenarioNode?.EntityPoint != null) ScenarioTabControl.TabPages.Add(ScenarioEntityPointTabPage); if (CurrentScenarioNode?.ChainingNode != null) ScenarioTabControl.TabPages.Add(ScenarioChainTabPage); if (CurrentScenarioNode?.ChainingNode != null) ScenarioTabControl.TabPages.Add(ScenarioChainNodeTabPage); if (CurrentScenarioNode?.Cluster != null) ScenarioTabControl.TabPages.Add(ScenarioClusterTabPage); if (CurrentScenarioNode?.ClusterMyPoint != null) ScenarioTabControl.TabPages.Add(ScenarioClusterPointTabPage); if (ScenarioTabControl.TabPages.Contains(seltab)) { ScenarioTabControl.SelectedTab = seltab; } } private void LoadScenarioDropDowns() { if (ScenarioPointTypeComboBox.Items.Count > 0) return; var types = Scenarios.ScenarioTypes; //these are loaded by Scenarios.Init if (types == null) { return; } var stypes = types.GetScenarioTypes(); if (stypes == null) return; var stgroups = types.GetScenarioTypeGroups(); if (stgroups == null) return; var pmsets = types.GetPedModelSets(); if (pmsets == null) return; var vmsets = types.GetVehicleModelSets(); if (vmsets == null) return; ScenarioPointTypeComboBox.Items.Clear(); ScenarioPointTypeComboBox.Items.Add(""); ScenarioClusterPointTypeComboBox.Items.Clear(); ScenarioClusterPointTypeComboBox.Items.Add(""); ScenarioChainNodeTypeComboBox.Items.Clear(); ScenarioChainNodeTypeComboBox.Items.Add(""); foreach (var stype in stypes) { ScenarioTypeRef? typeRef = new ScenarioTypeRef(stype); ScenarioPointTypeComboBox.Items.Add(typeRef); ScenarioClusterPointTypeComboBox.Items.Add(typeRef); ScenarioChainNodeTypeComboBox.Items.Add(typeRef); } foreach (var stgroup in stgroups) { ScenarioTypeRef? typeRef = new ScenarioTypeRef(stgroup); ScenarioPointTypeComboBox.Items.Add(typeRef); ScenarioClusterPointTypeComboBox.Items.Add(typeRef); ScenarioChainNodeTypeComboBox.Items.Add(typeRef); } ScenarioPointModelSetComboBox.Items.Clear(); ScenarioPointModelSetComboBox.Items.Add(""); ScenarioClusterPointModelSetComboBox.Items.Clear(); ScenarioClusterPointModelSetComboBox.Items.Add(""); foreach (var pmset in pmsets) { ScenarioPointModelSetComboBox.Items.Add(pmset); ScenarioClusterPointModelSetComboBox.Items.Add(pmset); } foreach (var vmset in vmsets) { ScenarioPointModelSetComboBox.Items.Add(vmset); ScenarioClusterPointModelSetComboBox.Items.Add(vmset); } ScenarioEntityPointAvailableInMpSpComboBox.Items.Clear(); ScenarioEntityPointAvailableInMpSpComboBox.Items.Add(Unk_3573596290.kBoth); ScenarioEntityPointAvailableInMpSpComboBox.Items.Add(Unk_3573596290.kOnlySp); ScenarioEntityPointAvailableInMpSpComboBox.Items.Add(Unk_3573596290.kOnlyMp); ScenarioChainEdgeActionComboBox.Items.Clear(); ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.Move); ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.Unk_7865678); ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.MoveFollowMaster); ScenarioChainEdgeNavModeComboBox.Items.Clear(); ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.Direct); ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.NavMesh); ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.Roads); ScenarioChainEdgeNavSpeedComboBox.Items.Clear(); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_00_3279574318); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_01_2212923970); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_02_4022799658); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_03_1425672334); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_04_957720931); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_05_3795195414); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_06_2834622009); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_07_1876554076); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_08_698543797); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_09_1544199634); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_10_2725613303); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_11_4033265820); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_12_3054809929); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_13_3911005380); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_14_3717649022); ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_15_3356026130); } private void LoadScenarioPointTabPage() { var p = CurrentScenarioNode?.MyPoint; if (p == null) { //ScenarioPointPanel.Enabled = false; //ScenarioPointCheckBox.Checked = false; ScenarioPointAddToProjectButton.Enabled = false; ScenarioPointDeleteButton.Enabled = false; ScenarioPointPositionTextBox.Text = ""; ScenarioPointDirectionTextBox.Text = ""; ScenarioPointTypeComboBox.SelectedItem = null; ScenarioPointModelSetComboBox.SelectedItem = null; ScenarioPointInteriorTextBox.Text = ""; ScenarioPointInteriorHashLabel.Text = "Hash: 0"; ScenarioPointGroupTextBox.Text = ""; ScenarioPointGroupHashLabel.Text = "Hash: 0"; ScenarioPointImapTextBox.Text = ""; ScenarioPointImapHashLabel.Text = "Hash: 0"; ScenarioPointTimeStartUpDown.Value = 0; ScenarioPointTimeEndUpDown.Value = 0; ScenarioPointProbabilityUpDown.Value = 0; ScenarioPointSpOnlyFlagUpDown.Value = 0; ScenarioPointRadiusUpDown.Value = 0; ScenarioPointWaitTimeUpDown.Value = 0; ScenarioPointFlagsValueUpDown.Value = 0; foreach (int i in ScenarioPointFlagsCheckedListBox.CheckedIndices) { ScenarioPointFlagsCheckedListBox.SetItemCheckState(i, CheckState.Unchecked); } } else { //ScenarioPointPanel.Enabled = true; //ScenarioPointCheckBox.Checked = true; ScenarioPointDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioPointAddToProjectButton.Enabled = !ScenarioPointDeleteButton.Enabled; ScenarioPointPositionTextBox.Text = FloatUtil.GetVector3String(p.Position); ScenarioPointDirectionTextBox.Text = FloatUtil.ToString(p.Direction); ScenarioPointTypeComboBox.SelectedItem = ((object)p.Type) ?? ""; ScenarioPointModelSetComboBox.SelectedItem = ((object)p.ModelSet) ?? ""; ScenarioPointInteriorTextBox.Text = p.InteriorName.ToString(); ScenarioPointInteriorHashLabel.Text = "Hash: " + p.InteriorName.Hash.ToString(); ScenarioPointGroupTextBox.Text = p.GroupName.ToString(); ScenarioPointGroupHashLabel.Text = "Hash: " + p.GroupName.Hash.ToString(); ScenarioPointImapTextBox.Text = p.IMapName.ToString(); ScenarioPointImapHashLabel.Text = "Hash: " + p.IMapName.Hash.ToString(); ScenarioPointTimeStartUpDown.Value = p.TimeStart; ScenarioPointTimeEndUpDown.Value = p.TimeEnd; ScenarioPointProbabilityUpDown.Value = p.Probability; ScenarioPointSpOnlyFlagUpDown.Value = p.AvailableMpSp; ScenarioPointRadiusUpDown.Value = p.Radius; ScenarioPointWaitTimeUpDown.Value = p.WaitTime; var iflags = (int)p.Flags; ScenarioPointFlagsValueUpDown.Value = iflags; for (int i = 0; i < ScenarioPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } } } private void LoadScenarioEntityTabPage() { var e = CurrentScenarioNode?.Entity; if (e == null) { //ScenarioEntityPanel.Enabled = false; //ScenarioEntityCheckBox.Checked = false; ScenarioEntityAddToProjectButton.Enabled = false; ScenarioEntityDeleteButton.Enabled = false; ScenarioEntityPositionTextBox.Text = ""; ScenarioEntityTypeTextBox.Text = ""; ScenarioEntityTypeHashLabel.Text = "Hash: 0"; ScenarioEntityUnk1UpDown.Value = 0; ScenarioEntityUnk2UpDown.Value = 0; ScenarioEntityInfoLabel.Text = "0 override points"; ScenarioEntityPointsListBox.Items.Clear(); ScenarioEntityAddPointButton.Enabled = false; } else { //ScenarioEntityPanel.Enabled = true; //ScenarioEntityCheckBox.Checked = true; ScenarioEntityDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioEntityAddToProjectButton.Enabled = !ScenarioEntityDeleteButton.Enabled; ScenarioEntityPositionTextBox.Text = FloatUtil.GetVector3String(e.Position); ScenarioEntityTypeTextBox.Text = e.TypeName.ToString(); ScenarioEntityTypeHashLabel.Text = "Hash: " + e.TypeName.Hash.ToString(); ScenarioEntityUnk1UpDown.Value = e.Unk1; ScenarioEntityUnk2UpDown.Value = e.Unk2; var pc = e.ScenarioPoints?.Length ?? 0; ScenarioEntityInfoLabel.Text = pc.ToString() + " override point" + ((pc != 1) ? "s" : ""); ScenarioEntityPointsListBox.Items.Clear(); ScenarioEntityAddPointButton.Enabled = true; if (e.ScenarioPoints != null) { foreach (var point in e.ScenarioPoints) { ScenarioEntityPointsListBox.Items.Add(point); } if (CurrentScenarioNode.EntityPoint != null) { ScenarioEntityPointsListBox.SelectedItem = CurrentScenarioNode.EntityPoint; } } } } private void LoadScenarioEntityPointTabPage() { var p = CurrentScenarioNode?.EntityPoint; if (p == null) { //ScenarioEntityPointPanel.Enabled = false; //ScenarioEntityPointCheckBox.Checked = false; ScenarioEntityPointAddToProjectButton.Enabled = false; ScenarioEntityPointDeleteButton.Enabled = false; ScenarioEntityPointNameTextBox.Text = ""; ScenarioEntityPointNameHashLabel.Text = "Hash: 0"; ScenarioEntityPointPositionTextBox.Text = ""; ScenarioEntityPointRotationTextBox.Text = ""; ScenarioEntityPointSpawnTypeTextBox.Text = ""; ScenarioEntityPointSpawnTypeHashLabel.Text = "Hash: 0"; ScenarioEntityPointPedTypeTextBox.Text = ""; ScenarioEntityPointPedTypeHashLabel.Text = "Hash: 0"; ScenarioEntityPointGroupTextBox.Text = ""; ScenarioEntityPointGroupHashLabel.Text = "Hash: 0"; ScenarioEntityPointInteriorTextBox.Text = ""; ScenarioEntityPointInteriorHashLabel.Text = "Hash: 0"; ScenarioEntityPointRequiredImapTextBox.Text = ""; ScenarioEntityPointRequiredImapHashLabel.Text = "Hash: 0"; ScenarioEntityPointAvailableInMpSpComboBox.SelectedItem = null; ScenarioEntityPointProbabilityTextBox.Text = ""; ScenarioEntityPointTimeTillPedLeavesTextBox.Text = ""; ScenarioEntityPointRadiusTextBox.Text = ""; ScenarioEntityPointStartUpDown.Value = 0; ScenarioEntityPointEndUpDown.Value = 0; ScenarioEntityPointExtendedRangeCheckBox.Checked = false; ScenarioEntityPointShortRangeCheckBox.Checked = false; ScenarioEntityPointHighPriCheckBox.Checked = false; ScenarioEntityPointFlagsUpDown.Value = 0; foreach (int i in ScenarioEntityPointFlagsCheckedListBox.CheckedIndices) { ScenarioEntityPointFlagsCheckedListBox.SetItemCheckState(i, CheckState.Unchecked); } } else { //ScenarioEntityPointPanel.Enabled = true; //ScenarioEntityPointCheckBox.Checked = true; ScenarioEntityPointDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioEntityPointAddToProjectButton.Enabled = !ScenarioEntityPointDeleteButton.Enabled; ScenarioEntityPointNameTextBox.Text = p.NameHash.ToString(); ScenarioEntityPointNameHashLabel.Text = "Hash: " + p.NameHash.Hash.ToString(); ScenarioEntityPointPositionTextBox.Text = FloatUtil.GetVector3String(p.OffsetPosition); ScenarioEntityPointRotationTextBox.Text = FloatUtil.GetVector4String(p.OffsetRotation); ScenarioEntityPointSpawnTypeTextBox.Text = p.SpawnType.ToString(); ScenarioEntityPointSpawnTypeHashLabel.Text = "Hash: " + p.SpawnType.Hash.ToString(); ScenarioEntityPointPedTypeTextBox.Text = p.PedType.ToString(); ScenarioEntityPointPedTypeHashLabel.Text = "Hash: " + p.PedType.Hash.ToString(); ScenarioEntityPointGroupTextBox.Text = p.Group.ToString(); ScenarioEntityPointGroupHashLabel.Text = "Hash: " + p.Group.Hash.ToString(); ScenarioEntityPointInteriorTextBox.Text = p.Interior.ToString(); ScenarioEntityPointInteriorHashLabel.Text = "Hash: " + p.Interior.Hash.ToString(); ScenarioEntityPointRequiredImapTextBox.Text = p.RequiredImap.ToString(); ScenarioEntityPointRequiredImapHashLabel.Text = "Hash: " + p.RequiredImap.Hash.ToString(); ScenarioEntityPointAvailableInMpSpComboBox.SelectedItem = p.AvailableInMpSp; ScenarioEntityPointProbabilityTextBox.Text = FloatUtil.ToString(p.Probability); ScenarioEntityPointTimeTillPedLeavesTextBox.Text = FloatUtil.ToString(p.TimeTillPedLeaves); ScenarioEntityPointRadiusTextBox.Text = FloatUtil.ToString(p.Radius); ScenarioEntityPointStartUpDown.Value = p.StartTime; ScenarioEntityPointEndUpDown.Value = p.EndTime; ScenarioEntityPointExtendedRangeCheckBox.Checked = p.ExtendedRange; ScenarioEntityPointShortRangeCheckBox.Checked = p.ShortRange; ScenarioEntityPointHighPriCheckBox.Checked = p.HighPri; var iflags = (int)p.Flags; ScenarioEntityPointFlagsUpDown.Value = 0; for (int i = 0; i < ScenarioEntityPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioEntityPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } } } private void LoadScenarioChainTabPage() { CurrentScenarioChainEdge = null; ProjectForm.SetScenarioChainEdge(CurrentScenarioChainEdge); var n = CurrentScenarioNode?.ChainingNode; if (n == null) { ScenarioChainAddToProjectButton.Enabled = false; ScenarioChainDeleteButton.Enabled = false; ScenarioChainEdgesListBox.Items.Clear(); ScenarioChainEdgeCountLabel.Text = "Edge Count: 0"; ScenarioChainUnk1UpDown.Value = 0; } else { ScenarioChainDeleteButton.Enabled = ScenarioChainNodeDeleteButton.Enabled;// ScenarioExistsInProject(CurrentScenario); ScenarioChainAddToProjectButton.Enabled = !ScenarioChainDeleteButton.Enabled; ScenarioChainEdgesListBox.Items.Clear(); ScenarioChainEdgeCountLabel.Text = "Edge Count: " + (n.Chain?.EdgeIds?.Length ?? 0).ToString(); ScenarioChainUnk1UpDown.Value = n.Chain?.Unk1 ?? 0; if ((n.Chain != null) && (n.Chain.Edges != null)) { foreach (var edge in n.Chain.Edges) { ScenarioChainEdgesListBox.Items.Add(edge); } } else { } } } private void LoadScenarioChainEdgeTabPage() { var e = CurrentScenarioChainEdge; if (e == null) { ScenarioChainEdgePanel.Enabled = false; ScenarioChainEdgeNodeIndexFromUpDown.Value = 0; ScenarioChainEdgeNodeIndexToUpDown.Value = 0; ScenarioChainEdgeActionComboBox.SelectedItem = null; ScenarioChainEdgeNavModeComboBox.SelectedItem = null; ScenarioChainEdgeNavSpeedComboBox.SelectedItem = null; ScenarioChainMoveEdgeDownButton.Enabled = false; ScenarioChainMoveEdgeUpButton.Enabled = false; } else { ScenarioChainEdgePanel.Enabled = true; ScenarioChainEdgeNodeIndexFromUpDown.Value = e.NodeIndexFrom; ScenarioChainEdgeNodeIndexToUpDown.Value = e.NodeIndexTo; ScenarioChainEdgeActionComboBox.SelectedItem = e.Action; ScenarioChainEdgeNavModeComboBox.SelectedItem = e.NavMode; ScenarioChainEdgeNavSpeedComboBox.SelectedItem = e.NavSpeed; ScenarioChainMoveEdgeDownButton.Enabled = true; ScenarioChainMoveEdgeUpButton.Enabled = true; if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SelectScenarioEdge(CurrentScenarioNode, e); } } } private void LoadScenarioChainNodeTabPage() { var n = CurrentScenarioNode?.ChainingNode; if (n == null) { //ScenarioChainNodePanel.Enabled = false; //ScenarioChainNodeCheckBox.Checked = false; ScenarioChainNodeAddToProjectButton.Enabled = false; ScenarioChainNodeDeleteButton.Enabled = false; ScenarioChainNodePositionTextBox.Text = ""; ScenarioChainNodeUnk1TextBox.Text = ""; ScenarioChainNodeUnk1HashLabel.Text = "Hash: 0"; ScenarioChainNodeTypeComboBox.SelectedItem = null; ScenarioChainNodeFirstCheckBox.Checked = false; ScenarioChainNodeLastCheckBox.Checked = false; ScenarioChainNodeIndexTextBox.Text = ""; } else { //ScenarioChainNodePanel.Enabled = true; //ScenarioChainNodeCheckBox.Checked = true; ScenarioChainNodeDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioChainNodeAddToProjectButton.Enabled = !ScenarioChainNodeDeleteButton.Enabled; ScenarioChainNodePositionTextBox.Text = FloatUtil.GetVector3String(n.Position); ScenarioChainNodeUnk1TextBox.Text = n.Unk1.ToString(); ScenarioChainNodeUnk1HashLabel.Text = "Hash: " + n.Unk1.Hash.ToString(); ScenarioChainNodeTypeComboBox.SelectedItem = ((object)n.Type) ?? ""; ScenarioChainNodeFirstCheckBox.Checked = !n.NotFirst; ScenarioChainNodeLastCheckBox.Checked = !n.NotLast; ScenarioChainNodeIndexTextBox.Text = n.NodeIndex.ToString(); } } private void LoadScenarioClusterTabPage() { var c = CurrentScenarioNode?.Cluster; if (c == null) { //ScenarioClusterPanel.Enabled = false; //ScenarioClusterCheckBox.Checked = false; ScenarioClusterAddToProjectButton.Enabled = false; ScenarioClusterDeleteButton.Enabled = false; ScenarioClusterCenterTextBox.Text = ""; ScenarioClusterRadiusTextBox.Text = ""; ScenarioClusterUnk1TextBox.Text = ""; ScenarioClusterUnk2CheckBox.Checked = false; ScenarioClusterPointsListBox.Items.Clear(); ScenarioClusterAddPointButton.Enabled = false; } else { //ScenarioClusterPanel.Enabled = true; //ScenarioClusterCheckBox.Checked = true; ScenarioClusterDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioClusterAddToProjectButton.Enabled = !ScenarioClusterDeleteButton.Enabled; ScenarioClusterCenterTextBox.Text = FloatUtil.GetVector3String(c.Position); ScenarioClusterRadiusTextBox.Text = FloatUtil.ToString(c.Radius); ScenarioClusterUnk1TextBox.Text = FloatUtil.ToString(c.Unk1); ScenarioClusterUnk2CheckBox.Checked = c.Unk2; ScenarioClusterPointsListBox.Items.Clear(); ScenarioClusterAddPointButton.Enabled = true; if (c.Points != null) { if (c.Points.MyPoints != null) { foreach (var point in c.Points.MyPoints) { ScenarioClusterPointsListBox.Items.Add(point); } if (CurrentScenarioNode.ClusterMyPoint != null) { ScenarioClusterPointsListBox.SelectedItem = CurrentScenarioNode.ClusterMyPoint; } } if (c.Points.LoadSavePoints != null) { foreach (var point in c.Points.LoadSavePoints) { ScenarioClusterPointsListBox.Items.Add(point); } if (CurrentScenarioNode.ClusterLoadSavePoint != null) { ScenarioClusterPointsListBox.SelectedItem = CurrentScenarioNode.ClusterLoadSavePoint; } } } } } private void LoadScenarioClusterPointTabPage() { var p = CurrentScenarioNode?.ClusterMyPoint; if (p == null) { //ScenarioClusterPointPanel.Enabled = false; //ScenarioClusterPointCheckBox.Checked = false; ScenarioClusterPointAddToProjectButton.Enabled = false; ScenarioClusterPointDeleteButton.Enabled = false; ScenarioClusterPointPositionTextBox.Text = ""; ScenarioClusterPointDirectionTextBox.Text = ""; ScenarioClusterPointTypeComboBox.SelectedItem = null; ScenarioClusterPointModelSetComboBox.SelectedItem = null; ScenarioClusterPointInteriorTextBox.Text = ""; ScenarioClusterPointInteriorHashLabel.Text = "Hash: 0"; ScenarioClusterPointGroupTextBox.Text = ""; ScenarioClusterPointGroupHashLabel.Text = "Hash: 0"; ScenarioClusterPointImapTextBox.Text = ""; ScenarioClusterPointImapHashLabel.Text = "Hash: 0"; ScenarioClusterPointTimeStartUpDown.Value = 0; ScenarioClusterPointTimeEndUpDown.Value = 0; ScenarioClusterPointProbabilityUpDown.Value = 0; ScenarioClusterPointSpOnlyFlagUpDown.Value = 0; ScenarioClusterPointRadiusUpDown.Value = 0; ScenarioClusterPointWaitTimeUpDown.Value = 0; ScenarioClusterPointFlagsUpDown.Value = 0; foreach (int i in ScenarioClusterPointFlagsCheckedListBox.CheckedIndices) { ScenarioClusterPointFlagsCheckedListBox.SetItemCheckState(i, CheckState.Unchecked); } } else { //ScenarioClusterPointPanel.Enabled = true; //ScenarioClusterPointCheckBox.Checked = true; ScenarioClusterPointDeleteButton.Enabled = ProjectForm.ScenarioExistsInProject(CurrentScenario); ScenarioClusterPointAddToProjectButton.Enabled = !ScenarioClusterPointDeleteButton.Enabled; ScenarioClusterPointPositionTextBox.Text = FloatUtil.GetVector3String(p.Position); ScenarioClusterPointDirectionTextBox.Text = FloatUtil.ToString(p.Direction); ScenarioClusterPointTypeComboBox.SelectedItem = ((object)p.Type) ?? ""; ScenarioClusterPointModelSetComboBox.SelectedItem = ((object)p.ModelSet) ?? ""; ScenarioClusterPointInteriorTextBox.Text = p.InteriorName.ToString(); ScenarioClusterPointInteriorHashLabel.Text = "Hash: " + p.InteriorName.Hash.ToString(); ScenarioClusterPointGroupTextBox.Text = p.GroupName.ToString(); ScenarioClusterPointGroupHashLabel.Text = "Hash: " + p.GroupName.Hash.ToString(); ScenarioClusterPointImapTextBox.Text = p.IMapName.ToString(); ScenarioClusterPointImapHashLabel.Text = "Hash: " + p.IMapName.Hash.ToString(); ScenarioClusterPointTimeStartUpDown.Value = p.TimeStart; ScenarioClusterPointTimeEndUpDown.Value = p.TimeEnd; ScenarioClusterPointProbabilityUpDown.Value = p.Probability; ScenarioClusterPointSpOnlyFlagUpDown.Value = p.AvailableMpSp; ScenarioClusterPointRadiusUpDown.Value = p.Radius; ScenarioClusterPointWaitTimeUpDown.Value = p.WaitTime; var iflags = (int)p.Flags; ScenarioClusterPointFlagsUpDown.Value = iflags; for (int i = 0; i < ScenarioClusterPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioClusterPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } } } private void AddScenarioChainEdge() { var chain = CurrentScenarioNode?.ChainingNode?.Chain; if (chain == null) return; var paths = CurrentScenario?.CScenarioPointRegion?.Paths; if (paths == null) return; MCScenarioChainingEdge edge = new MCScenarioChainingEdge(); if (CurrentScenarioChainEdge != null) { edge.Data = CurrentScenarioChainEdge.Data; } paths.AddEdge(edge); chain.AddEdge(edge); CurrentScenarioChainEdge = edge; ProjectForm.SetScenarioChainEdge(CurrentScenarioChainEdge); UpdateScenarioChainEdgeLinkage(); LoadScenarioChainTabPage(); ScenarioChainEdgesListBox.SelectedItem = edge; } private void RemoveScenarioChainEdge() { if (CurrentScenarioChainEdge == null) return; if (CurrentScenario == null) return; var chain = CurrentScenarioNode?.ChainingNode?.Chain; if (chain == null) return; var paths = CurrentScenario?.CScenarioPointRegion?.Paths; if (paths == null) return; if (MessageBox.Show("Are you sure you want to delete this scenario chain edge?\n" + CurrentScenarioChainEdge.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } chain.RemoveEdge(CurrentScenarioChainEdge); paths.RemoveEdge(CurrentScenarioChainEdge); LoadScenarioChainTabPage(); if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); ProjectForm.WorldForm.SelectScenarioEdge(CurrentScenarioNode, null); } } private void MoveScenarioChainEdge(bool moveDown) { var chain = CurrentScenarioNode?.ChainingNode?.Chain; if (chain == null) return; if (chain.Edges == null) return; if (chain.EdgeIds == null) return; if (CurrentScenarioChainEdge == null) return; var edges = CurrentScenario?.CScenarioPointRegion?.Paths?.Edges; if (edges == null) return; int lasti = (chain.Edges?.Length ?? 0) - 1; var edgeid = 0; for (int i = 0; i < chain.Edges.Length; i++) { if (chain.Edges[i] == CurrentScenarioChainEdge) { edgeid = i; break; } } if (!moveDown && (edgeid <= 0)) return; if (moveDown && (edgeid >= lasti)) return; var swapid = edgeid + (moveDown ? 1 : -1); var swaped = chain.Edges[swapid]; chain.Edges[swapid] = CurrentScenarioChainEdge; chain.EdgeIds[swapid] = (ushort)CurrentScenarioChainEdge.EdgeIndex; chain.Edges[edgeid] = swaped; chain.EdgeIds[edgeid] = (ushort)swapid; var ce = CurrentScenarioChainEdge; LoadScenarioChainTabPage(); CurrentScenarioChainEdge = ce; ProjectForm.SetScenarioChainEdge(CurrentScenarioChainEdge); ScenarioChainEdgesListBox.SelectedItem = ce; //LoadScenarioChainEdgeTabPage(); } private void UpdateScenarioChainEdgeLinkage() { if (CurrentScenarioChainEdge == null) return; if (CurrentScenario == null) return; var chains = CurrentScenario?.CScenarioPointRegion?.Paths; if (chains == null) return; var nodes = chains.Nodes; if (nodes == null) return; ushort nifrom = CurrentScenarioChainEdge.NodeIndexFrom; ushort nito = CurrentScenarioChainEdge.NodeIndexTo; if (nifrom < nodes.Length) CurrentScenarioChainEdge.NodeFrom = nodes[nifrom]; if (nito < nodes.Length) CurrentScenarioChainEdge.NodeTo = nodes[nito]; ////need to rebuild the link verts.. updating the graphics should do it... if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } private void ScenarioPointAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioPointDeleteButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentScenarioNode); ProjectForm.DeleteScenarioNode(); } private void ScenarioPointGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioPointPositionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioPointPositionTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioPointDirectionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; float dir = FloatUtil.Parse(ScenarioPointDirectionTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Direction != dir) { CurrentScenarioNode.MyPoint.Direction = dir; CurrentScenarioNode.Orientation = CurrentScenarioNode.MyPoint.Orientation; ProjectForm.SetScenarioHasChanged(true); if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetRotation(CurrentScenarioNode.Orientation); } } } } private void ScenarioPointTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; ScenarioTypeRef? stype = ScenarioPointTypeComboBox.SelectedItem as ScenarioTypeRef?; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Type != stype) { CurrentScenarioNode.MyPoint.Type = stype; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); if (CurrentScenarioNode.ChainingNode != null) { ScenarioChainNodeTypeComboBox.SelectedItem = stype; } } private void ScenarioPointModelSetComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; AmbientModelSet mset = ScenarioPointModelSetComboBox.SelectedItem as AmbientModelSet; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.ModelSet != mset) { CurrentScenarioNode.MyPoint.ModelSet = mset; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioPointInteriorTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; uint hash = 0; string name = ScenarioPointInteriorTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioPointInteriorHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.InteriorName != hash) { CurrentScenarioNode.MyPoint.InteriorName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointGroupTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; uint hash = 0; string name = ScenarioPointGroupTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioPointGroupHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.GroupName != hash) { CurrentScenarioNode.MyPoint.GroupName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointImapTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; uint hash = 0; string name = ScenarioPointImapTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioPointImapHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.IMapName != hash) { CurrentScenarioNode.MyPoint.IMapName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointTimeStartUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte t = (byte)ScenarioPointTimeStartUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.TimeStart != t) { CurrentScenarioNode.MyPoint.TimeStart = t; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioPointTimeEndUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte t = (byte)ScenarioPointTimeEndUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.TimeEnd != t) { CurrentScenarioNode.MyPoint.TimeEnd = t; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioPointProbabilityUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte v = (byte)ScenarioPointProbabilityUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Probability != v) { CurrentScenarioNode.MyPoint.Probability = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointSpOnlyFlagUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte v = (byte)ScenarioPointSpOnlyFlagUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.AvailableMpSp != v) { CurrentScenarioNode.MyPoint.AvailableMpSp = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointRadiusUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte v = (byte)ScenarioPointRadiusUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Radius != v) { CurrentScenarioNode.MyPoint.Radius = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointWaitTimeUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; byte v = (byte)ScenarioPointWaitTimeUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.WaitTime != v) { CurrentScenarioNode.MyPoint.WaitTime = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointFlagsValueUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; var iflags = (uint)ScenarioPointFlagsValueUpDown.Value; populatingui = true; for (int i = 0; i < ScenarioPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Flags != f) { CurrentScenarioNode.MyPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioPointFlagsCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.MyPoint == null) return; uint iflags = 0; for (int i = 0; i < ScenarioPointFlagsCheckedListBox.Items.Count; i++) { if (e.Index == i) { if (e.NewValue == CheckState.Checked) { iflags += (uint)(1 << i); } } else { if (ScenarioPointFlagsCheckedListBox.GetItemChecked(i)) { iflags += (uint)(1 << i); } } } populatingui = true; ScenarioPointFlagsValueUpDown.Value = iflags; populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.MyPoint.Flags != f) { CurrentScenarioNode.MyPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioEntityDeleteButton_Click(object sender, EventArgs e) { ProjectForm.DeleteScenarioEntity(); } private void ScenarioEntityGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioEntityPositionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Entity == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioEntityPositionTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioEntityTypeTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Entity == null) return; uint hash = 0; string name = ScenarioEntityTypeTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityTypeHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Entity.TypeName != hash) { CurrentScenarioNode.Entity.TypeName = hash; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioEntityUnk1UpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Entity == null) return; byte v = (byte)ScenarioEntityUnk1UpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Entity.Unk1 != v) { CurrentScenarioNode.Entity.Unk1 = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityUnk2UpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Entity == null) return; byte v = (byte)ScenarioEntityUnk2UpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Entity.Unk2 != v) { CurrentScenarioNode.Entity.Unk2 = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointsListBox_DoubleClick(object sender, EventArgs e) { var item = ScenarioEntityPointsListBox.SelectedItem as MCExtensionDefSpawnPoint; if (item == null) return; var nodes = CurrentScenario?.ScenarioRegion?.Nodes; if (nodes == null) return; ScenarioNode node = null; foreach (var snode in nodes) { if (snode.EntityPoint == item) { node = snode; break; } } if (node == null) return; ProjectForm.ProjectExplorer?.TrySelectScenarioNodeTreeNode(node); } private void ScenarioEntityAddPointButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioEntityPoint(); } private void ScenarioEntityPointAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioEntityPointDeleteButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentScenarioNode); ProjectForm.DeleteScenarioNode(); } private void ScenarioEntityPointGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioEntityPointPositionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioEntityPointPositionTextBox.Text); v += CurrentScenarioNode.EntityPoint.ParentPosition; bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioEntityPointRotationTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; Vector4 v = FloatUtil.ParseVector4String(ScenarioEntityPointRotationTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.OffsetRotation != v) { CurrentScenarioNode.EntityPoint.OffsetRotation = v; CurrentScenarioNode.Orientation = new Quaternion(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetRotation(CurrentScenarioNode.Orientation); } } } private void ScenarioEntityPointNameTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointNameTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointNameHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.NameHash != hash) { CurrentScenarioNode.EntityPoint.NameHash = hash; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioEntityPointSpawnTypeTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointSpawnTypeTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointSpawnTypeHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.SpawnType != hash) { CurrentScenarioNode.EntityPoint.SpawnType = hash; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioEntityPointPedTypeTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointPedTypeTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointPedTypeHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.PedType != hash) { CurrentScenarioNode.EntityPoint.PedType = hash; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioEntityPointGroupTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointGroupTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointGroupHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Group != hash) { CurrentScenarioNode.EntityPoint.Group = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointInteriorTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointInteriorTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointInteriorHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Interior != hash) { CurrentScenarioNode.EntityPoint.Interior = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointRequiredImapTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint hash = 0; string name = ScenarioEntityPointRequiredImapTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioEntityPointRequiredImapHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.RequiredImap != hash) { CurrentScenarioNode.EntityPoint.RequiredImap = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointAvailableInMpSpComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; Unk_3573596290 v = (Unk_3573596290)ScenarioEntityPointAvailableInMpSpComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.AvailableInMpSp != v) { CurrentScenarioNode.EntityPoint.AvailableInMpSp = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointProbabilityTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; float v = FloatUtil.Parse(ScenarioEntityPointProbabilityTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Probability != v) { CurrentScenarioNode.EntityPoint.Probability = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointTimeTillPedLeavesTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; float v = FloatUtil.Parse(ScenarioEntityPointTimeTillPedLeavesTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.TimeTillPedLeaves != v) { CurrentScenarioNode.EntityPoint.TimeTillPedLeaves = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointRadiusTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; float v = FloatUtil.Parse(ScenarioEntityPointRadiusTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Radius != v) { CurrentScenarioNode.EntityPoint.Radius = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointStartUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; byte v = (byte)ScenarioEntityPointStartUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.StartTime != v) { CurrentScenarioNode.EntityPoint.StartTime = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointEndUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; byte v = (byte)ScenarioEntityPointEndUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.EndTime != v) { CurrentScenarioNode.EntityPoint.EndTime = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointExtendedRangeCheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; bool v = ScenarioEntityPointExtendedRangeCheckBox.Checked; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.ExtendedRange != v) { CurrentScenarioNode.EntityPoint.ExtendedRange = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointShortRangeCheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; bool v = ScenarioEntityPointShortRangeCheckBox.Checked; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.ShortRange != v) { CurrentScenarioNode.EntityPoint.ShortRange = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointHighPriCheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; bool v = ScenarioEntityPointHighPriCheckBox.Checked; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.HighPri != v) { CurrentScenarioNode.EntityPoint.HighPri = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointFlagsUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; var iflags = (uint)ScenarioEntityPointFlagsUpDown.Value; populatingui = true; for (int i = 0; i < ScenarioEntityPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioEntityPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Flags != f) { CurrentScenarioNode.EntityPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioEntityPointFlagsCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; uint iflags = 0; for (int i = 0; i < ScenarioEntityPointFlagsCheckedListBox.Items.Count; i++) { if (e.Index == i) { if (e.NewValue == CheckState.Checked) { iflags += (uint)(1 << i); } } else { if (ScenarioEntityPointFlagsCheckedListBox.GetItemChecked(i)) { iflags += (uint)(1 << i); } } } populatingui = true; ScenarioEntityPointFlagsUpDown.Value = iflags; populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.Flags != f) { CurrentScenarioNode.EntityPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioChainNodeAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioChainNodeDeleteButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentScenarioNode); ProjectForm.DeleteScenarioNode(); } private void ScenarioChainNodeGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioChainNodePositionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioChainNodePositionTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioChainNodeUnk1TextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ChainingNode == null) return; uint hash = 0; string name = ScenarioChainNodeUnk1TextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioChainNodeUnk1HashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ChainingNode.Unk1 != hash) { CurrentScenarioNode.ChainingNode.Unk1 = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioChainNodeTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ChainingNode == null) return; ScenarioTypeRef? stype = ScenarioChainNodeTypeComboBox.SelectedItem as ScenarioTypeRef?; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ChainingNode.Type != stype) { CurrentScenarioNode.ChainingNode.Type = stype; CurrentScenarioNode.ChainingNode.TypeHash = stype?.NameHash ?? 0; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioChainNodeFirstCheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ChainingNode == null) return; bool v = !ScenarioChainNodeFirstCheckBox.Checked; bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ChainingNode.NotFirst != v) { CurrentScenarioNode.ChainingNode.NotFirst = v; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioChainNodeLastCheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ChainingNode == null) return; bool v = !ScenarioChainNodeLastCheckBox.Checked; bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ChainingNode.NotLast != v) { CurrentScenarioNode.ChainingNode.NotLast = v; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioChainAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioChainDeleteButton_Click(object sender, EventArgs e) { ProjectForm.DeleteScenarioChain(); } private void ScenarioChainEdgesListBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; CurrentScenarioChainEdge = ScenarioChainEdgesListBox.SelectedItem as MCScenarioChainingEdge; ProjectForm.SetScenarioChainEdge(CurrentScenarioChainEdge); populatingui = true; LoadScenarioChainEdgeTabPage(); populatingui = false; } private void ScenarioChainAddEdgeButton_Click(object sender, EventArgs e) { AddScenarioChainEdge(); } private void ScenarioChainRemoveEdgeButton_Click(object sender, EventArgs e) { RemoveScenarioChainEdge(); } private void ScenarioChainMoveEdgeUpButton_Click(object sender, EventArgs e) { MoveScenarioChainEdge(false); } private void ScenarioChainMoveEdgeDownButton_Click(object sender, EventArgs e) { MoveScenarioChainEdge(true); } private void ScenarioChainUnk1UpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ChainingNode == null) return; if (CurrentScenarioNode.ChainingNode.Chain == null) return; byte v = (byte)ScenarioChainUnk1UpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ChainingNode.Chain.Unk1 != v) { CurrentScenarioNode.ChainingNode.Chain.Unk1 = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioChainEdgeNodeIndexFromUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; ushort nodeid = (ushort)ScenarioChainEdgeNodeIndexFromUpDown.Value; bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NodeIndexFrom != nodeid) { CurrentScenarioChainEdge.NodeIndexFrom = nodeid; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { UpdateScenarioChainEdgeLinkage(); //refresh the selected item in the list box, to update the text, and the other controls. ScenarioChainEdgesListBox.Items[ScenarioChainEdgesListBox.SelectedIndex] = ScenarioChainEdgesListBox.SelectedItem; } } private void ScenarioChainEdgeNodeIndexToUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; ushort nodeid = (ushort)ScenarioChainEdgeNodeIndexToUpDown.Value; bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NodeIndexTo != nodeid) { CurrentScenarioChainEdge.NodeIndexTo = nodeid; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { UpdateScenarioChainEdgeLinkage(); //refresh the selected item in the list box, to update the text, and the other controls. ScenarioChainEdgesListBox.Items[ScenarioChainEdgesListBox.SelectedIndex] = ScenarioChainEdgesListBox.SelectedItem; } } private void ScenarioChainEdgeActionComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; CScenarioChainingEdge__eAction v = (CScenarioChainingEdge__eAction)ScenarioChainEdgeActionComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.Action != v) { CurrentScenarioChainEdge.Action = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioChainEdgeNavModeComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; CScenarioChainingEdge__eNavMode v = (CScenarioChainingEdge__eNavMode)ScenarioChainEdgeNavModeComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NavMode != v) { CurrentScenarioChainEdge.NavMode = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioChainEdgeNavSpeedComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; CScenarioChainingEdge__eNavSpeed v = (CScenarioChainingEdge__eNavSpeed)ScenarioChainEdgeNavSpeedComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NavSpeed != v) { CurrentScenarioChainEdge.NavSpeed = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioClusterDeleteButton_Click(object sender, EventArgs e) { ProjectForm.DeleteScenarioCluster(); } private void ScenarioClusterGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioClusterCenterTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioClusterCenterTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } if ((CurrentScenarioNode.Cluster != null) && (CurrentScenarioNode.Cluster.Position != v)) { CurrentScenarioNode.Cluster.Position = v; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioClusterRadiusTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; float r = FloatUtil.Parse(ScenarioClusterRadiusTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if ((CurrentScenarioNode.Cluster != null) && (CurrentScenarioNode.Cluster.Radius != r)) { CurrentScenarioNode.Cluster.Radius = r; ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioClusterUnk1TextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Cluster == null) return; float v = FloatUtil.Parse(ScenarioClusterUnk1TextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Cluster.Unk1 != v) { CurrentScenarioNode.Cluster.Unk1 = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterUnk2CheckBox_CheckedChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.Cluster == null) return; bool v = ScenarioClusterUnk2CheckBox.Checked; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Cluster.Unk2 != v) { CurrentScenarioNode.Cluster.Unk2 = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointsListBox_DoubleClick(object sender, EventArgs e) { var item = ScenarioClusterPointsListBox.SelectedItem as MCScenarioPoint; if (item == null) return; var nodes = CurrentScenario?.ScenarioRegion?.Nodes; if (nodes == null) return; ScenarioNode node = null; foreach (var snode in nodes) { if (snode.ClusterMyPoint == item) { node = snode; break; } } if (node == null) return; ProjectForm.ProjectExplorer?.TrySelectScenarioNodeTreeNode(node); } private void ScenarioClusterAddPointButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioClusterPoint(); } private void ScenarioClusterPointAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.AddScenarioToProject(CurrentScenario); } private void ScenarioClusterPointDeleteButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentScenarioNode); ProjectForm.DeleteScenarioNode(); } private void ScenarioClusterPointGoToButton_Click(object sender, EventArgs e) { if (CurrentScenarioNode == null) return; if (ProjectForm.WorldForm == null) return; ProjectForm.WorldForm.GoToPosition(CurrentScenarioNode.Position); } private void ScenarioClusterPointPositionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; Vector3 v = FloatUtil.ParseVector3String(ScenarioClusterPointPositionTextBox.Text); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.Position != v) { CurrentScenarioNode.SetPosition(v); ProjectForm.SetScenarioHasChanged(true); change = true; } } if (change) { if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetPosition(CurrentScenarioNode.Position); ProjectForm.WorldForm.UpdateScenarioGraphics(CurrentScenario, false); } } } private void ScenarioClusterPointDirectionTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; float dir = FloatUtil.Parse(ScenarioClusterPointDirectionTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Direction != dir) { CurrentScenarioNode.ClusterMyPoint.Direction = dir; CurrentScenarioNode.Orientation = CurrentScenarioNode.ClusterMyPoint.Orientation; ProjectForm.SetScenarioHasChanged(true); if (ProjectForm.WorldForm != null) { ProjectForm.WorldForm.SetWidgetRotation(CurrentScenarioNode.Orientation); } } } } private void ScenarioClusterPointTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; ScenarioTypeRef? stype = ScenarioClusterPointTypeComboBox.SelectedItem as ScenarioTypeRef?; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Type != stype) { CurrentScenarioNode.ClusterMyPoint.Type = stype; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); if (CurrentScenarioNode.ChainingNode != null) { ScenarioChainNodeTypeComboBox.SelectedItem = stype; } } private void ScenarioClusterPointModelSetComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; AmbientModelSet mset = ScenarioClusterPointModelSetComboBox.SelectedItem as AmbientModelSet; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.ModelSet != mset) { CurrentScenarioNode.ClusterMyPoint.ModelSet = mset; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioClusterPointInteriorTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; uint hash = 0; string name = ScenarioClusterPointInteriorTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioClusterPointInteriorHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.InteriorName != hash) { CurrentScenarioNode.ClusterMyPoint.InteriorName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointGroupTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; uint hash = 0; string name = ScenarioClusterPointGroupTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioClusterPointGroupHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.GroupName != hash) { CurrentScenarioNode.ClusterMyPoint.GroupName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointImapTextBox_TextChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; uint hash = 0; string name = ScenarioClusterPointImapTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes { hash = JenkHash.GenHash(name); JenkIndex.Ensure(name); } ScenarioClusterPointImapHashLabel.Text = "Hash: " + hash.ToString(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.IMapName != hash) { CurrentScenarioNode.ClusterMyPoint.IMapName = hash; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointTimeStartUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte t = (byte)ScenarioClusterPointTimeStartUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.TimeStart != t) { CurrentScenarioNode.ClusterMyPoint.TimeStart = t; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioClusterPointTimeEndUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte t = (byte)ScenarioClusterPointTimeEndUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.TimeEnd != t) { CurrentScenarioNode.ClusterMyPoint.TimeEnd = t; ProjectForm.SetScenarioHasChanged(true); } } ProjectForm.ProjectExplorer?.UpdateScenarioNodeTreeNode(CurrentScenarioNode); } private void ScenarioClusterPointProbabilityUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte v = (byte)ScenarioClusterPointProbabilityUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Probability != v) { CurrentScenarioNode.ClusterMyPoint.Probability = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointSpOnlyFlagUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte v = (byte)ScenarioClusterPointSpOnlyFlagUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.AvailableMpSp != v) { CurrentScenarioNode.ClusterMyPoint.AvailableMpSp = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointRadiusUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte v = (byte)ScenarioClusterPointRadiusUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Radius != v) { CurrentScenarioNode.ClusterMyPoint.Radius = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointWaitTimeUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; byte v = (byte)ScenarioClusterPointWaitTimeUpDown.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.WaitTime != v) { CurrentScenarioNode.ClusterMyPoint.WaitTime = v; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointFlagsUpDown_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; var iflags = (uint)ScenarioClusterPointFlagsUpDown.Value; populatingui = true; for (int i = 0; i < ScenarioClusterPointFlagsCheckedListBox.Items.Count; i++) { var c = ((iflags & (1 << i)) > 0); ScenarioClusterPointFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked); } populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Flags != f) { CurrentScenarioNode.ClusterMyPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } private void ScenarioClusterPointFlagsCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.ClusterMyPoint == null) return; uint iflags = 0; for (int i = 0; i < ScenarioClusterPointFlagsCheckedListBox.Items.Count; i++) { if (e.Index == i) { if (e.NewValue == CheckState.Checked) { iflags += (uint)(1 << i); } } else { if (ScenarioClusterPointFlagsCheckedListBox.GetItemChecked(i)) { iflags += (uint)(1 << i); } } } populatingui = true; ScenarioClusterPointFlagsUpDown.Value = iflags; populatingui = false; CScenarioPointFlags__Flags f = (CScenarioPointFlags__Flags)iflags; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.ClusterMyPoint.Flags != f) { CurrentScenarioNode.ClusterMyPoint.Flags = f; ProjectForm.SetScenarioHasChanged(true); } } } } }