mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-14 05:58:29 +08:00
Projects code to support audio placements editing
This commit is contained in:
@@ -173,6 +173,27 @@ namespace CodeWalker.Project.Panels
|
||||
scenariosnode.Expand();
|
||||
}
|
||||
|
||||
if (CurrentProjectFile.AudioRelFiles.Count > 0)
|
||||
{
|
||||
var audiorelsnode = projnode.Nodes.Add("Audio Rel Files");
|
||||
audiorelsnode.Name = "AudioRels";
|
||||
|
||||
foreach (var audiorelfile in CurrentProjectFile.AudioRelFiles)
|
||||
{
|
||||
var acstr = audiorelfile.HasChanged ? "*" : "";
|
||||
string name = audiorelfile.Name;
|
||||
if (audiorelfile.RpfFileEntry != null)
|
||||
{
|
||||
name = audiorelfile.RpfFileEntry.Name;
|
||||
}
|
||||
var audiorelnode = audiorelsnode.Nodes.Add(acstr + name);
|
||||
audiorelnode.Tag = audiorelfile;
|
||||
|
||||
LoadAudioRelTreeNodes(audiorelfile, audiorelnode);
|
||||
}
|
||||
audiorelsnode.Expand();
|
||||
}
|
||||
|
||||
projnode.Expand();
|
||||
|
||||
}
|
||||
@@ -377,6 +398,69 @@ namespace CodeWalker.Project.Panels
|
||||
//}
|
||||
|
||||
}
|
||||
private void LoadAudioRelTreeNodes(RelFile rel, TreeNode node)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Zones, Emitters
|
||||
|
||||
node.Nodes.Clear();
|
||||
|
||||
|
||||
TreeNode n;
|
||||
n = node.Nodes.Add("Edit Zone");
|
||||
n.Name = "EditZone";
|
||||
n.Tag = rel; //this tag should get updated with the selected zone!
|
||||
|
||||
n = node.Nodes.Add("Edit Emitter");
|
||||
n.Name = "EditEmitter";
|
||||
n.Tag = rel; //this tag should get updated with the selected emitter!
|
||||
|
||||
|
||||
|
||||
var zonelists = new List<Dat151AmbientZoneList>();
|
||||
var emitterlists = new List<Dat151AmbientEmitterList>();
|
||||
|
||||
foreach (var reldata in rel.RelDatas)
|
||||
{
|
||||
if (reldata is Dat151AmbientZoneList)
|
||||
{
|
||||
zonelists.Add(reldata as Dat151AmbientZoneList);
|
||||
}
|
||||
if (reldata is Dat151AmbientEmitterList)
|
||||
{
|
||||
emitterlists.Add(reldata as Dat151AmbientEmitterList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (zonelists.Count > 0)
|
||||
{
|
||||
var zonelistsnode = node.Nodes.Add("Zone Lists (" + zonelists.Count.ToString() + ")");
|
||||
zonelistsnode.Name = "ZoneLists";
|
||||
zonelistsnode.Tag = rel;
|
||||
for (int i = 0; i < zonelists.Count; i++)
|
||||
{
|
||||
var zonelist = zonelists[i];
|
||||
var tnode = zonelistsnode.Nodes.Add(zonelist.ToString());
|
||||
tnode.Tag = zonelist;
|
||||
}
|
||||
}
|
||||
|
||||
if (emitterlists.Count > 0)
|
||||
{
|
||||
var emitterlistsnode = node.Nodes.Add("Emitter Lists (" + emitterlists.Count.ToString() + ")");
|
||||
emitterlistsnode.Name = "EmitterLists";
|
||||
emitterlistsnode.Tag = rel;
|
||||
for (int i = 0; i < emitterlists.Count; i++)
|
||||
{
|
||||
var emitterlist = emitterlists[i];
|
||||
var tnode = emitterlistsnode.Nodes.Add(emitterlist.ToString());
|
||||
tnode.Tag = emitterlist;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -533,6 +617,30 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
}
|
||||
public void SetAudioRelHasChanged(RelFile rel, bool changed)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count > 0)
|
||||
{
|
||||
var pnode = ProjectTreeView.Nodes[0];
|
||||
var acnode = GetChildTreeNode(pnode, "AudioRels");
|
||||
if (acnode == null) return;
|
||||
string changestr = changed ? "*" : "";
|
||||
for (int i = 0; i < acnode.Nodes.Count; i++)
|
||||
{
|
||||
var anode = acnode.Nodes[i];
|
||||
if (anode.Tag == rel)
|
||||
{
|
||||
string name = rel.Name;
|
||||
if (rel.RpfFileEntry != null)
|
||||
{
|
||||
name = rel.RpfFileEntry.Name;
|
||||
}
|
||||
anode.Text = changestr + name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -726,6 +834,63 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindAudioRelTreeNode(RelFile rel)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count <= 0) return null;
|
||||
var projnode = ProjectTreeView.Nodes[0];
|
||||
var scenariosnode = GetChildTreeNode(projnode, "AudioRels");
|
||||
if (scenariosnode == null) return null;
|
||||
for (int i = 0; i < scenariosnode.Nodes.Count; i++)
|
||||
{
|
||||
var ymtnode = scenariosnode.Nodes[i];
|
||||
if (ymtnode.Tag == rel) return ymtnode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindAudioZoneTreeNode(AudioPlacement zone)
|
||||
{
|
||||
if (zone == null) return null;
|
||||
TreeNode relnode = FindAudioRelTreeNode(zone.RelFile);
|
||||
var zonenode = GetChildTreeNode(relnode, "EditZone");
|
||||
if (zonenode == null) return null;
|
||||
zonenode.Tag = zone;
|
||||
return zonenode;
|
||||
}
|
||||
public TreeNode FindAudioEmitterTreeNode(AudioPlacement emitter)
|
||||
{
|
||||
if (emitter == null) return null;
|
||||
TreeNode relnode = FindAudioRelTreeNode(emitter.RelFile);
|
||||
var zonenode = GetChildTreeNode(relnode, "EditEmitter");
|
||||
if (zonenode == null) return null;
|
||||
zonenode.Tag = emitter;
|
||||
return zonenode;
|
||||
}
|
||||
public TreeNode FindAudioZoneListTreeNode(Dat151AmbientZoneList list)
|
||||
{
|
||||
if (list == null) return null;
|
||||
TreeNode relnode = FindAudioRelTreeNode(list.Rel);
|
||||
var zonelistsnode = GetChildTreeNode(relnode, "ZoneLists");
|
||||
if (zonelistsnode == null) return null;
|
||||
for (int i = 0; i < zonelistsnode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode lnode = zonelistsnode.Nodes[i];
|
||||
if (lnode.Tag == list) return lnode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindAudioEmitterListTreeNode(Dat151AmbientEmitterList list)
|
||||
{
|
||||
if (list == null) return null;
|
||||
TreeNode relnode = FindAudioRelTreeNode(list.Rel);
|
||||
var emitterlistsnode = GetChildTreeNode(relnode, "EmitterLists");
|
||||
if (emitterlistsnode == null) return null;
|
||||
for (int i = 0; i < emitterlistsnode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode enode = emitterlistsnode.Nodes[i];
|
||||
if (enode.Tag == list) return enode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -894,6 +1059,97 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectAudioRelTreeNode(RelFile rel)
|
||||
{
|
||||
TreeNode tnode = FindAudioRelTreeNode(rel);
|
||||
if (tnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == tnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(rel);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = tnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectAudioZoneTreeNode(AudioPlacement zone)
|
||||
{
|
||||
TreeNode tnode = FindAudioZoneTreeNode(zone);
|
||||
if (tnode == null)
|
||||
{
|
||||
tnode = FindAudioRelTreeNode(zone?.RelFile);
|
||||
}
|
||||
if (tnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == tnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(zone);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = tnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectAudioEmitterTreeNode(AudioPlacement emitter)
|
||||
{
|
||||
TreeNode tnode = FindAudioEmitterTreeNode(emitter);
|
||||
if (tnode == null)
|
||||
{
|
||||
tnode = FindAudioRelTreeNode(emitter?.RelFile);
|
||||
}
|
||||
if (tnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == tnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(emitter);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = tnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectAudioZoneListTreeNode(Dat151AmbientZoneList list)
|
||||
{
|
||||
TreeNode tnode = FindAudioZoneListTreeNode(list);
|
||||
if (tnode == null)
|
||||
{
|
||||
tnode = FindAudioRelTreeNode(list?.Rel);
|
||||
}
|
||||
if (tnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == tnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(list);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = tnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectAudioEmitterListTreeNode(Dat151AmbientEmitterList list)
|
||||
{
|
||||
TreeNode tnode = FindAudioEmitterListTreeNode(list);
|
||||
if (tnode == null)
|
||||
{
|
||||
tnode = FindAudioRelTreeNode(list?.Rel);
|
||||
}
|
||||
if (tnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == tnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(list);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = tnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateCarGenTreeNode(YmapCarGen cargen)
|
||||
{
|
||||
@@ -916,7 +1172,6 @@ namespace CodeWalker.Project.Panels
|
||||
var tn = FindNavPolyTreeNode(poly);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = poly._RawData.ToString();
|
||||
}
|
||||
}
|
||||
public void UpdateTrainNodeTreeNode(TrainTrackNode node)
|
||||
@@ -935,6 +1190,37 @@ namespace CodeWalker.Project.Panels
|
||||
tn.Text = node.MedTypeName + ": " + node.StringText;
|
||||
}
|
||||
}
|
||||
public void UpdateAudioZoneTreeNode(AudioPlacement zone)
|
||||
{
|
||||
var tn = FindAudioZoneTreeNode(zone);
|
||||
if (tn != null)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void UpdateAudioEmitterTreeNode(AudioPlacement emitter)
|
||||
{
|
||||
var tn = FindAudioEmitterTreeNode(emitter);
|
||||
if (tn != null)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void UpdateAudioZoneListTreeNode(Dat151AmbientZoneList list)
|
||||
{
|
||||
var tn = FindAudioZoneListTreeNode(list);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = list.ToString();
|
||||
}
|
||||
}
|
||||
public void UpdateAudioEmitterListTreeNode(Dat151AmbientEmitterList list)
|
||||
{
|
||||
var tn = FindAudioEmitterListTreeNode(list);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = list.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void RemoveEntityTreeNode(YmapEntityDef ent)
|
||||
{
|
||||
@@ -981,6 +1267,42 @@ namespace CodeWalker.Project.Panels
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemoveAudioZoneListTreeNode(Dat151AmbientZoneList list)
|
||||
{
|
||||
var tn = FindAudioZoneListTreeNode(list);
|
||||
if ((tn != null) && (tn.Parent != null))
|
||||
{
|
||||
var zonelists = new List<Dat151AmbientZoneList>();
|
||||
foreach (var reldata in list.Rel.RelDatas)
|
||||
{
|
||||
if (reldata is Dat151AmbientZoneList)
|
||||
{
|
||||
zonelists.Add(reldata as Dat151AmbientZoneList);
|
||||
}
|
||||
}
|
||||
|
||||
tn.Parent.Text = "Zone Lists (" + zonelists.Count.ToString() + ")";
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemoveAudioEmitterListTreeNode(Dat151AmbientEmitterList list)
|
||||
{
|
||||
var tn = FindAudioEmitterListTreeNode(list);
|
||||
if ((tn != null) && (tn.Parent != null))
|
||||
{
|
||||
var emitterlists = new List<Dat151AmbientEmitterList>();
|
||||
foreach (var reldata in list.Rel.RelDatas)
|
||||
{
|
||||
if (reldata is Dat151AmbientEmitterList)
|
||||
{
|
||||
emitterlists.Add(reldata as Dat151AmbientEmitterList);
|
||||
}
|
||||
}
|
||||
|
||||
tn.Parent.Text = "Emitter Lists (" + emitterlists.Count.ToString() + ")";
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace CodeWalker.Project
|
||||
public List<string> YnvFilenames { get; set; } = new List<string>();
|
||||
public List<string> TrainsFilenames { get; set; } = new List<string>();
|
||||
public List<string> ScenarioFilenames { get; set; } = new List<string>();
|
||||
public List<string> AudioRelFilenames { get; set; } = new List<string>();
|
||||
|
||||
//fields not stored
|
||||
public string Filename { get; set; } //filename without path
|
||||
@@ -33,6 +34,7 @@ namespace CodeWalker.Project
|
||||
public List<YnvFile> YnvFiles { get; set; } = new List<YnvFile>();
|
||||
public List<TrainTrack> TrainsFiles { get; set; } = new List<TrainTrack>();
|
||||
public List<YmtFile> ScenarioFiles { get; set; } = new List<YmtFile>();
|
||||
public List<RelFile> AudioRelFiles { get; set; } = new List<RelFile>();
|
||||
|
||||
|
||||
|
||||
@@ -81,6 +83,12 @@ namespace CodeWalker.Project
|
||||
Xml.AddChildWithInnerText(doc, scenarioselem, "Item", scenariofilename);
|
||||
}
|
||||
|
||||
var audiorelselem = Xml.AddChild(doc, projelem, "AudioRelFilenames");
|
||||
foreach (string audiorelfilename in AudioRelFilenames)
|
||||
{
|
||||
Xml.AddChildWithInnerText(doc, audiorelselem, "Item", audiorelfilename);
|
||||
}
|
||||
|
||||
doc.Save(Filepath);
|
||||
}
|
||||
|
||||
@@ -196,6 +204,22 @@ namespace CodeWalker.Project
|
||||
}
|
||||
|
||||
|
||||
|
||||
AudioRelFilenames.Clear();
|
||||
AudioRelFiles.Clear();
|
||||
var audiorelselem = Xml.GetChild(projelem, "AudioRelFilenames");
|
||||
if (audiorelselem != null)
|
||||
{
|
||||
foreach (var node in audiorelselem.SelectNodes("Item"))
|
||||
{
|
||||
XmlElement audiorelel = node as XmlElement;
|
||||
if (audiorelel != null)
|
||||
{
|
||||
AddAudioRelFile(audiorelel.InnerText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -225,6 +249,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
ScenarioFilenames[i] = GetUpdatedFilePath(ScenarioFilenames[i], oldprojpath);
|
||||
}
|
||||
for (int i = 0; i < AudioRelFilenames.Count; i++)
|
||||
{
|
||||
AudioRelFilenames[i] = GetUpdatedFilePath(AudioRelFilenames[i], oldprojpath);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetUpdatedFilePath(string oldpath, string oldprojpath)
|
||||
@@ -697,5 +725,72 @@ namespace CodeWalker.Project
|
||||
}
|
||||
|
||||
|
||||
public RelFile AddAudioRelFile(string filename)
|
||||
{
|
||||
RelFile relfile = new RelFile();
|
||||
relfile.RpfFileEntry = new RpfResourceFileEntry();
|
||||
relfile.RpfFileEntry.Name = Path.GetFileName(filename);
|
||||
relfile.FilePath = GetFullFilePath(filename);
|
||||
relfile.Name = relfile.RpfFileEntry.Name;
|
||||
if (!AddAudioRelFile(relfile)) return null;
|
||||
return relfile;
|
||||
}
|
||||
public bool AddAudioRelFile(RelFile rel)
|
||||
{
|
||||
string relpath = GetRelativePath(rel.FilePath);
|
||||
if (string.IsNullOrEmpty(relpath)) relpath = rel.Name;
|
||||
if (AudioRelFilenames.Contains(relpath)) return false;
|
||||
AudioRelFilenames.Add(relpath);
|
||||
AudioRelFiles.Add(rel);
|
||||
return true;
|
||||
}
|
||||
public void RemoveAudioRelFile(RelFile rel)
|
||||
{
|
||||
if (rel == null) return;
|
||||
var relpath = GetRelativePath(rel.FilePath);
|
||||
if (string.IsNullOrEmpty(relpath)) relpath = rel.Name;
|
||||
AudioRelFiles.Remove(rel);
|
||||
AudioRelFilenames.Remove(relpath);
|
||||
HasChanged = true;
|
||||
}
|
||||
public bool ContainsAudioRel(string filename)
|
||||
{
|
||||
bool found = false;
|
||||
filename = filename.ToLowerInvariant();
|
||||
foreach (var audiorelfn in AudioRelFilenames)
|
||||
{
|
||||
if (audiorelfn == filename)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
public bool ContainsAudioRel(RelFile rel)
|
||||
{
|
||||
foreach (var f in AudioRelFiles)
|
||||
{
|
||||
if (f == rel) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool RenameAudioRel(string oldfilename, string newfilename)
|
||||
{
|
||||
oldfilename = oldfilename.ToLowerInvariant();
|
||||
newfilename = newfilename.ToLowerInvariant();
|
||||
for (int i = 0; i < AudioRelFilenames.Count; i++)
|
||||
{
|
||||
if (AudioRelFilenames[i] == oldfilename)
|
||||
{
|
||||
AudioRelFilenames[i] = newfilename;
|
||||
HasChanged = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+302
-16
@@ -60,6 +60,12 @@ namespace CodeWalker.Project
|
||||
private ScenarioNode CurrentScenarioNode;
|
||||
private MCScenarioChainingEdge CurrentScenarioChainEdge;
|
||||
|
||||
private RelFile CurrentAudioFile;
|
||||
private AudioPlacement CurrentAudioZone;
|
||||
private AudioPlacement CurrentAudioEmitter;
|
||||
private Dat151AmbientZoneList CurrentAudioZoneList;
|
||||
private Dat151AmbientEmitterList CurrentAudioEmitterList;
|
||||
|
||||
private bool renderitems = true;
|
||||
private bool hidegtavmap = false;
|
||||
|
||||
@@ -417,6 +423,21 @@ namespace CodeWalker.Project
|
||||
(panel) => { panel.SetScenarioNode(CurrentScenarioNode); }, //updateFunc
|
||||
(panel) => { return panel.CurrentScenarioNode == CurrentScenarioNode; }); //findFunc
|
||||
}
|
||||
private void ShowEditAudioFilePanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
private void ShowEditAudioZonePanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
private void ShowEditAudioEmitterPanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
private void ShowEditAudioZoneListPanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
private void ShowEditAudioEmitterListPanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
|
||||
private void ShowCurrentProjectItem(bool promote)
|
||||
{
|
||||
@@ -480,6 +501,27 @@ namespace CodeWalker.Project
|
||||
{
|
||||
ShowEditScenarioYmtPanel(promote);
|
||||
}
|
||||
if (CurrentAudioZone != null)
|
||||
{
|
||||
ShowEditAudioZonePanel(promote);
|
||||
}
|
||||
else if (CurrentAudioEmitter != null)
|
||||
{
|
||||
ShowEditAudioEmitterPanel(promote);
|
||||
}
|
||||
else if (CurrentAudioZoneList != null)
|
||||
{
|
||||
ShowEditAudioZoneListPanel(promote);
|
||||
}
|
||||
else if (CurrentAudioEmitterList != null)
|
||||
{
|
||||
ShowEditAudioEmitterListPanel(promote);
|
||||
}
|
||||
else if (CurrentAudioFile != null)
|
||||
{
|
||||
ShowEditAudioFilePanel(promote);
|
||||
}
|
||||
|
||||
}
|
||||
public void ShowProjectItem(object item, bool promote)
|
||||
{
|
||||
@@ -516,6 +558,11 @@ namespace CodeWalker.Project
|
||||
CurrentScenario = item as YmtFile;
|
||||
CurrentScenarioNode = item as ScenarioNode;
|
||||
CurrentScenarioChainEdge = item as MCScenarioChainingEdge;
|
||||
CurrentAudioFile = item as RelFile;
|
||||
CurrentAudioZone = item as AudioPlacement; if (CurrentAudioZone?.AudioZone == null) CurrentAudioZone = null;
|
||||
CurrentAudioEmitter = item as AudioPlacement; if (CurrentAudioEmitter?.AudioEmitter == null) CurrentAudioEmitter = null;
|
||||
CurrentAudioZoneList = item as Dat151AmbientZoneList;
|
||||
CurrentAudioEmitterList = item as Dat151AmbientEmitterList;
|
||||
|
||||
if (CurrentEntity != null)
|
||||
{
|
||||
@@ -561,6 +608,22 @@ namespace CodeWalker.Project
|
||||
{
|
||||
CurrentScenario = CurrentScenarioChainEdge.Region?.Ymt;
|
||||
}
|
||||
if (CurrentAudioZone != null)
|
||||
{
|
||||
CurrentAudioFile = CurrentAudioZone.RelFile;
|
||||
}
|
||||
if (CurrentAudioEmitter != null)
|
||||
{
|
||||
CurrentAudioFile = CurrentAudioEmitter.RelFile;
|
||||
}
|
||||
if (CurrentAudioZoneList != null)
|
||||
{
|
||||
CurrentAudioFile = CurrentAudioZoneList.Rel;
|
||||
}
|
||||
if (CurrentAudioEmitterList != null)
|
||||
{
|
||||
CurrentAudioFile = CurrentAudioEmitterList.Rel;
|
||||
}
|
||||
|
||||
RefreshUI();
|
||||
|
||||
@@ -1389,7 +1452,11 @@ namespace CodeWalker.Project
|
||||
ccg.flags = 3680;
|
||||
ccg.orientX = 5.0f;
|
||||
ccg.perpendicularLength = 2.6f;
|
||||
//TODO: set default values for cargen
|
||||
ccg.bodyColorRemap1 = -1;
|
||||
ccg.bodyColorRemap2 = -1;
|
||||
ccg.bodyColorRemap3 = -1;
|
||||
ccg.bodyColorRemap4 = -1;
|
||||
ccg.livery = -1;
|
||||
}
|
||||
|
||||
if (!copyPosition || (copy == null))
|
||||
@@ -3621,6 +3688,113 @@ namespace CodeWalker.Project
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void NewAudioFile() //TODO
|
||||
{
|
||||
}
|
||||
public void OpenAudioFile() //TODO
|
||||
{
|
||||
}
|
||||
public void SaveAudioFile(bool saveas = false) //TODO
|
||||
{
|
||||
}
|
||||
public void AddAudioFileToProject(RelFile rel)
|
||||
{
|
||||
if (rel == null) return;
|
||||
if (CurrentProjectFile == null)
|
||||
{
|
||||
NewProject();
|
||||
}
|
||||
if (AudioFileExistsInProject(rel)) return;
|
||||
if (CurrentProjectFile.AddAudioRelFile(rel))
|
||||
{
|
||||
rel.HasChanged = true;
|
||||
CurrentProjectFile.HasChanged = true;
|
||||
LoadProjectTree();
|
||||
}
|
||||
CurrentAudioFile = rel;
|
||||
RefreshUI();
|
||||
if (CurrentAudioZone != null)
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioZoneTreeNode(CurrentAudioZone);
|
||||
}
|
||||
else if (CurrentAudioEmitter != null)
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioEmitterTreeNode(CurrentAudioEmitter);
|
||||
}
|
||||
}
|
||||
public void RemoveAudioFileFromProject()
|
||||
{
|
||||
if (CurrentAudioFile == null) return;
|
||||
if (CurrentProjectFile == null) return;
|
||||
CurrentProjectFile.RemoveAudioRelFile(CurrentAudioFile);
|
||||
CurrentAudioFile = null;
|
||||
LoadProjectTree();
|
||||
RefreshUI();
|
||||
}
|
||||
public bool AudioFileExistsInProject(RelFile rel)
|
||||
{
|
||||
if (rel == null) return false;
|
||||
if (CurrentProjectFile == null) return false;
|
||||
return CurrentProjectFile.ContainsAudioRel(rel);
|
||||
}
|
||||
|
||||
public void NewAudioZone(AudioPlacement copy = null, bool copyPosition = false) //TODO
|
||||
{
|
||||
}
|
||||
public bool DeleteAudioZone() //TODO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public bool IsCurrentAudioZone(AudioPlacement zone)
|
||||
{
|
||||
return zone == CurrentAudioZone;
|
||||
}
|
||||
|
||||
public void NewAudioEmitter(AudioPlacement copy = null, bool copyPosition = false) //TODO
|
||||
{
|
||||
}
|
||||
public bool DeleteAudioEmitter() //TODO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public bool IsCurrentAudioEmitter(AudioPlacement emitter)
|
||||
{
|
||||
return emitter == CurrentAudioEmitter;
|
||||
}
|
||||
|
||||
public void NewAudioZoneList() //TODO
|
||||
{
|
||||
}
|
||||
public bool DeleteAudioZoneList() //TODO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public bool IsCurrentAudioZoneList(Dat151AmbientZoneList list)
|
||||
{
|
||||
return list == CurrentAudioZoneList;
|
||||
}
|
||||
|
||||
public void NewAudioEmitterList() //TODO
|
||||
{
|
||||
}
|
||||
public bool DeleteAudioEmitterList() //TODO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public bool IsCurrentAudioEmitterList(Dat151AmbientEmitterList list)
|
||||
{
|
||||
return list == CurrentAudioEmitterList;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void GetVisibleYmaps(Camera camera, Dictionary<MetaHash, YmapFile> ymaps)
|
||||
{
|
||||
if (hidegtavmap)
|
||||
@@ -3822,11 +3996,13 @@ namespace CodeWalker.Project
|
||||
var trainnode = sel.TrainTrackNode;
|
||||
var scenariond = sel.ScenarioNode;
|
||||
var scenarioedge = sel.ScenarioEdge;
|
||||
var audiopl = sel.Audio;
|
||||
YmapFile ymap = ent?.Ymap ?? cargen?.Ymap ?? grassbatch?.Ymap;
|
||||
YndFile ynd = pathnode?.Ynd;
|
||||
YnvFile ynv = navpoly?.Ynv ?? navpoint?.Ynv ?? navportal?.Ynv;
|
||||
TrainTrack traintrack = trainnode?.Track;
|
||||
YmtFile scenario = scenariond?.Ymt ?? scenarioedge?.Region?.Ymt;
|
||||
RelFile audiofile = audiopl?.RelFile;
|
||||
bool showcurrent = false;
|
||||
|
||||
if (YmapExistsInProject(ymap))
|
||||
@@ -3876,6 +4052,17 @@ namespace CodeWalker.Project
|
||||
ProjectExplorer?.TrySelectScenarioNodeTreeNode(scenariond);
|
||||
}
|
||||
}
|
||||
else if (AudioFileExistsInProject(audiofile))
|
||||
{
|
||||
if ((audiopl?.AudioZone != null) && (audiopl != CurrentAudioZone))
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioZoneTreeNode(audiopl);
|
||||
}
|
||||
if ((audiopl?.AudioEmitter != null) && (audiopl != CurrentAudioEmitter))
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioEmitterTreeNode(audiopl);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectExplorer?.DeselectNode();
|
||||
@@ -3900,6 +4087,11 @@ namespace CodeWalker.Project
|
||||
CurrentScenario = scenario;
|
||||
CurrentScenarioNode = scenariond;
|
||||
CurrentScenarioChainEdge = scenarioedge;
|
||||
CurrentAudioFile = audiofile;
|
||||
CurrentAudioZone = (audiopl?.AudioZone != null) ? audiopl : null;
|
||||
CurrentAudioEmitter = (audiopl?.AudioEmitter != null) ? audiopl : null;
|
||||
CurrentAudioZoneList = null;
|
||||
CurrentAudioEmitterList = null;
|
||||
RefreshUI();
|
||||
if (showcurrent)
|
||||
{
|
||||
@@ -3949,6 +4141,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
OnWorldScenarioNodeModified(sel.ScenarioNode);
|
||||
}
|
||||
else if (sel.Audio != null)
|
||||
{
|
||||
OnWorldAudioPlacementModified(sel.Audio);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnWorldEntityModified(YmapEntityDef ent)
|
||||
@@ -4321,26 +4517,76 @@ namespace CodeWalker.Project
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public Vector3 GetSpawnPos(float dist)
|
||||
private void OnWorldAudioPlacementModified(AudioPlacement audio)
|
||||
{
|
||||
Vector3 pos = Vector3.Zero;
|
||||
if (WorldForm != null)
|
||||
try
|
||||
{
|
||||
Vector3 campos = WorldForm.GetCameraPosition();
|
||||
Vector3 camdir = WorldForm.GetCameraViewDir();
|
||||
pos = campos + camdir * dist;
|
||||
if (InvokeRequired)
|
||||
{
|
||||
BeginInvoke(new Action(() => { OnWorldAudioPlacementModified(audio); }));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (audio?.RelFile == null) return;
|
||||
|
||||
if (CurrentProjectFile == null)
|
||||
{
|
||||
NewProject();
|
||||
}
|
||||
|
||||
if (!AudioFileExistsInProject(audio.RelFile))
|
||||
{
|
||||
audio.RelFile.HasChanged = true;
|
||||
AddAudioFileToProject(audio.RelFile);
|
||||
if (audio.AudioZone != null)
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioZoneTreeNode(audio);
|
||||
}
|
||||
if (audio.AudioEmitter != null)
|
||||
{
|
||||
ProjectExplorer?.TrySelectAudioEmitterTreeNode(audio);
|
||||
}
|
||||
}
|
||||
|
||||
if ((audio.AudioZone != null) && (audio != CurrentAudioZone))
|
||||
{
|
||||
CurrentAudioZone = audio;
|
||||
ProjectExplorer?.TrySelectAudioZoneTreeNode(audio);
|
||||
}
|
||||
if ((audio.AudioEmitter != null) && (audio != CurrentAudioEmitter))
|
||||
{
|
||||
CurrentAudioEmitter = audio;
|
||||
ProjectExplorer?.TrySelectAudioEmitterTreeNode(audio);
|
||||
}
|
||||
if (audio == CurrentAudioZone)
|
||||
{
|
||||
ShowEditAudioZonePanel(false);
|
||||
if (audio.RelFile != null)
|
||||
{
|
||||
SetAudioFileHasChanged(true);
|
||||
}
|
||||
}
|
||||
else if (audio == CurrentAudioEmitter)
|
||||
{
|
||||
ShowEditAudioEmitterPanel(false);
|
||||
if (audio.RelFile != null)
|
||||
{
|
||||
SetAudioFileHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
catch { }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void SetProjectHasChanged(bool changed)
|
||||
{
|
||||
if (CurrentProjectFile == null) return;
|
||||
@@ -4429,7 +4675,38 @@ namespace CodeWalker.Project
|
||||
|
||||
PromoteIfPreviewPanelActive();
|
||||
}
|
||||
public void SetAudioFileHasChanged(bool changed)
|
||||
{
|
||||
if (CurrentAudioFile == null) return;
|
||||
|
||||
bool changechange = changed != CurrentAudioFile.HasChanged;
|
||||
if (!changechange) return;
|
||||
|
||||
CurrentAudioFile.HasChanged = changed;
|
||||
|
||||
ProjectExplorer?.SetAudioRelHasChanged(CurrentAudioFile, changed);
|
||||
|
||||
PromoteIfPreviewPanelActive();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public Vector3 GetSpawnPos(float dist)
|
||||
{
|
||||
Vector3 pos = Vector3.Zero;
|
||||
if (WorldForm != null)
|
||||
{
|
||||
Vector3 campos = WorldForm.GetCameraPosition();
|
||||
Vector3 camdir = WorldForm.GetCameraViewDir();
|
||||
pos = campos + camdir * dist;
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
||||
public RpfFileEntry FindParentYmapEntry(uint hash)
|
||||
{
|
||||
@@ -4458,8 +4735,6 @@ namespace CodeWalker.Project
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//######## Private methods
|
||||
|
||||
private void LoadYmapFromFile(YmapFile ymap, string filename)
|
||||
@@ -4522,6 +4797,9 @@ namespace CodeWalker.Project
|
||||
|
||||
ymt.Load(data);
|
||||
}
|
||||
private void LoadAudioRelFromFile(RelFile rel, string filename) //TODO
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -4567,6 +4845,7 @@ namespace CodeWalker.Project
|
||||
RefreshYnvUI();
|
||||
RefreshTrainTrackUI();
|
||||
RefreshScenarioUI();
|
||||
RefreshAudioUI();
|
||||
SetCurrentSaveItem();
|
||||
//ShowEditYmapPanel(false);
|
||||
//ShowEditYmapEntityPanel(false);
|
||||
@@ -4762,6 +5041,9 @@ namespace CodeWalker.Project
|
||||
WorldForm.EnableScenarioUI(enable, CurrentScenario?.Name ?? "");
|
||||
}
|
||||
}
|
||||
private void RefreshAudioUI() //TODO
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
private void SetCurrentSaveItem()
|
||||
@@ -4791,6 +5073,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
filename = CurrentScenario.RpfFileEntry?.Name;
|
||||
}
|
||||
else if (CurrentAudioFile != null)
|
||||
{
|
||||
filename = CurrentAudioFile.RpfFileEntry?.Name;
|
||||
}
|
||||
|
||||
bool enable = !string.IsNullOrEmpty(filename);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user