using System; using FMOD.Studio; using FMODUnity; using Gamecraft.Wires; using RobocraftX.Common; using RobocraftX.Blocks; using Svelto.ECS; using Unity.Mathematics; using TechbloxModdingAPI; using TechbloxModdingAPI.Tests; using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.Blocks { public class MusicBlock : SignalingBlock { public MusicBlock(EGID id) : base(id) { } public MusicBlock(uint id) : base(new EGID(id, CommonExclusiveGroups.MUSIC_BLOCK_GROUP)) { } public byte TrackIndex { get { return BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).trackIndx; } set { BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).trackIndx = value; } } public Guid Track { get { var msdes = BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this); return msdes.fmod2DEventPaths.Get<Guid>(msdes.trackIndx); } set { ref var msdes = ref BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this); for (byte i = 0; i < msdes.fmod2DEventPaths.Count<Guid>(); i++) { Guid track = msdes.fmod2DEventPaths.Get<Guid>(i); if (track == value) { msdes.trackIndx = i; break; } } } } public Guid[] Tracks { get { var msdes = BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this); Guid[] tracks = new Guid[msdes.fmod2DEventPaths.Count<Guid>()]; for (byte i = 0; i < tracks.Length; i++) { tracks[i] = msdes.fmod2DEventPaths.Get<Guid>(i); } return tracks; } } public float Volume { get { return BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).tweakableVolume; } set { BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).tweakableVolume = value; } } public ChannelType ChannelType { get { //Assert.Log("Block exists: " + Exists); return (ChannelType) BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).channelType; } set { BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).channelType = (byte) value; } } public bool IsPlaying { get { return BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this).isPlaying; } set { ref var msdes = ref BlockEngine.GetBlockInfo<MusicBlockDataEntityStruct>(this); if (msdes.isPlaying == value) return; if (value) { // start playing EventInstance inst = RuntimeManager.CreateInstance(msdes.fmod2DEventPaths.Get<Guid>(msdes.trackIndx)); inst.setVolume(msdes.tweakableVolume / 100f); inst.start(); msdes.eventHandle = inst.handle; } else { // stop playing EventInstance inst = default(EventInstance); inst.handle = msdes.eventHandle; inst.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT); inst.release(); } msdes.isPlaying = value; } } } }