Files
abysmal-isle/Scripts/Items/Addons/DawnsMusicBox/DawnsMusicBox.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

336 lines
14 KiB
C#
Raw Blame History

using System;
using System.Collections.Generic;
using Server.ContextMenus;
using Server.Gumps;
using Server.Multis;
using Server.Network;
namespace Server.Items
{
public sealed class StopMusic : Packet
{
public static readonly Packet Instance = Packet.SetStatic(new StopMusic());
public StopMusic()
: base(0x6D, 3)
{
this.m_Stream.Write((short)0x1FFF);
}
}
[Flipable(0x2AF9, 0x2AFD)]
public class DawnsMusicBox : Item, ISecurable
{
public static MusicName[] m_CommonTracks = new MusicName[]
{
MusicName.Samlethe, MusicName.Sailing, MusicName.Britain2, MusicName.Britain1,
MusicName.Bucsden, MusicName.Forest_a, MusicName.Cove, MusicName.Death,
MusicName.Dungeon9, MusicName.Dungeon2, MusicName.Cave01, MusicName.Combat3,
MusicName.Combat1, MusicName.Combat2, MusicName.Jhelom, MusicName.Linelle,
MusicName.LBCastle, MusicName.Minoc, MusicName.Moonglow, MusicName.Magincia,
MusicName.Nujelm, MusicName.BTCastle, MusicName.Tavern04, MusicName.Skarabra,
MusicName.Stones2, MusicName.Serpents, MusicName.Taiko, MusicName.Tavern01,
MusicName.Tavern02, MusicName.Tavern03, MusicName.TokunoDungeon, MusicName.Trinsic,
MusicName.OldUlt01, MusicName.Ocllo, MusicName.Vesper, MusicName.Victory,
MusicName.Mountn_a, MusicName.Wind, MusicName.Yew, MusicName.Zento
};
public static MusicName[] m_UncommonTracks = new MusicName[]
{
MusicName.GwennoConversation, MusicName.DreadHornArea, MusicName.ElfCity,
MusicName.GoodEndGame, MusicName.GoodVsEvil, MusicName.GreatEarthSerpents,
MusicName.GrizzleDungeon, MusicName.Humanoids_U9, MusicName.MelisandesLair,
MusicName.MinocNegative, MusicName.ParoxysmusLair, MusicName.Paws
};
public static MusicName[] m_RareTracks = new MusicName[]
{
MusicName.SelimsBar, MusicName.SerpentIsleCombat_U7, MusicName.ValoriaShips
};
private static readonly Dictionary<MusicName, DawnsMusicInfo> m_Info = new Dictionary<MusicName, DawnsMusicInfo>();
private List<MusicName> m_Tracks;
private SecureLevel m_Level;
private Timer m_Timer;
private int m_ItemID = 0;
private int m_Count = 0;
[Constructable]
public DawnsMusicBox()
: base(0x2AF9)
{
this.Weight = 1.0;
this.m_Tracks = new List<MusicName>();
while (this.m_Tracks.Count < 4)
{
MusicName name = RandomTrack(DawnsMusicRarity.Common);
if (!this.m_Tracks.Contains(name))
this.m_Tracks.Add(name);
}
}
public DawnsMusicBox(Serial serial)
: base(serial)
{
}
public override int LabelNumber
{
get
{
return 1075198;
}
}// Dawn<77>s Music Box
public List<MusicName> Tracks
{
get
{
return this.m_Tracks;
}
}
[CommandProperty(AccessLevel.GameMaster)]
public SecureLevel Level
{
get
{
return this.m_Level;
}
set
{
this.m_Level = value;
}
}
public static void Initialize()
{
m_Info.Add(MusicName.Samlethe, new DawnsMusicInfo(1075152, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Sailing, new DawnsMusicInfo(1075163, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Britain2, new DawnsMusicInfo(1075145, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Britain1, new DawnsMusicInfo(1075144, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Bucsden, new DawnsMusicInfo(1075146, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Forest_a, new DawnsMusicInfo(1075161, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Cove, new DawnsMusicInfo(1075176, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Death, new DawnsMusicInfo(1075171, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Dungeon9, new DawnsMusicInfo(1075160, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Dungeon2, new DawnsMusicInfo(1075175, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Cave01, new DawnsMusicInfo(1075159, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Combat3, new DawnsMusicInfo(1075170, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Combat1, new DawnsMusicInfo(1075168, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Combat2, new DawnsMusicInfo(1075169, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Jhelom, new DawnsMusicInfo(1075147, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Linelle, new DawnsMusicInfo(1075185, DawnsMusicRarity.Common));
m_Info.Add(MusicName.LBCastle, new DawnsMusicInfo(1075148, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Minoc, new DawnsMusicInfo(1075150, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Moonglow, new DawnsMusicInfo(1075177, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Magincia, new DawnsMusicInfo(1075149, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Nujelm, new DawnsMusicInfo(1075174, DawnsMusicRarity.Common));
m_Info.Add(MusicName.BTCastle, new DawnsMusicInfo(1075173, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Tavern04, new DawnsMusicInfo(1075167, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Skarabra, new DawnsMusicInfo(1075154, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Stones2, new DawnsMusicInfo(1075143, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Serpents, new DawnsMusicInfo(1075153, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Taiko, new DawnsMusicInfo(1075180, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Tavern01, new DawnsMusicInfo(1075164, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Tavern02, new DawnsMusicInfo(1075165, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Tavern03, new DawnsMusicInfo(1075166, DawnsMusicRarity.Common));
m_Info.Add(MusicName.TokunoDungeon, new DawnsMusicInfo(1075179, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Trinsic, new DawnsMusicInfo(1075155, DawnsMusicRarity.Common));
m_Info.Add(MusicName.OldUlt01, new DawnsMusicInfo(1075142, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Ocllo, new DawnsMusicInfo(1075151, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Vesper, new DawnsMusicInfo(1075156, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Victory, new DawnsMusicInfo(1075172, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Mountn_a, new DawnsMusicInfo(1075162, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Wind, new DawnsMusicInfo(1075157, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Yew, new DawnsMusicInfo(1075158, DawnsMusicRarity.Common));
m_Info.Add(MusicName.Zento, new DawnsMusicInfo(1075178, DawnsMusicRarity.Common));
m_Info.Add(MusicName.GwennoConversation, new DawnsMusicInfo(1075131, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.DreadHornArea, new DawnsMusicInfo(1075181, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.ElfCity, new DawnsMusicInfo(1075182, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.GoodEndGame, new DawnsMusicInfo(1075132, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.GoodVsEvil, new DawnsMusicInfo(1075133, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.GreatEarthSerpents, new DawnsMusicInfo(1075134, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.GrizzleDungeon, new DawnsMusicInfo(1075186, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.Humanoids_U9, new DawnsMusicInfo(1075135, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.MelisandesLair, new DawnsMusicInfo(1075183, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.MinocNegative, new DawnsMusicInfo(1075136, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.ParoxysmusLair, new DawnsMusicInfo(1075184, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.Paws, new DawnsMusicInfo(1075137, DawnsMusicRarity.Uncommon));
m_Info.Add(MusicName.SelimsBar, new DawnsMusicInfo(1075138, DawnsMusicRarity.Rare));
m_Info.Add(MusicName.SerpentIsleCombat_U7, new DawnsMusicInfo(1075139, DawnsMusicRarity.Rare));
m_Info.Add(MusicName.ValoriaShips, new DawnsMusicInfo(1075140, DawnsMusicRarity.Rare));
}
public static DawnsMusicInfo GetInfo(MusicName name)
{
if (m_Info.ContainsKey(name))
return m_Info[name];
return null;
}
public static MusicName RandomTrack(DawnsMusicRarity rarity)
{
MusicName[] list = null;
switch ( rarity )
{
default:
case DawnsMusicRarity.Common:
list = m_CommonTracks;
break;
case DawnsMusicRarity.Uncommon:
list = m_UncommonTracks;
break;
case DawnsMusicRarity.Rare:
list = m_RareTracks;
break;
}
return list[Utility.Random(list.Length)];
}
public override void OnAfterDuped(Item newItem)
{
DawnsMusicBox box = newItem as DawnsMusicBox;
if (box == null)
return;
box.m_Tracks = new List<MusicName>();
box.m_Tracks.AddRange(this.m_Tracks);
base.OnAfterDuped(newItem);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
int commonSongs = 0;
int uncommonSongs = 0;
int rareSongs = 0;
for (int i = 0; i < this.m_Tracks.Count; i++)
{
DawnsMusicInfo info = GetInfo(this.m_Tracks[i]);
switch ( info.Rarity )
{
case DawnsMusicRarity.Common:
commonSongs++;
break;
case DawnsMusicRarity.Uncommon:
uncommonSongs++;
break;
case DawnsMusicRarity.Rare:
rareSongs++;
break;
}
}
if (commonSongs > 0)
list.Add(1075234, commonSongs.ToString()); // ~1_NUMBER~ Common Tracks
if (uncommonSongs > 0)
list.Add(1075235, uncommonSongs.ToString()); // ~1_NUMBER~ Uncommon Tracks
if (rareSongs > 0)
list.Add(1075236, rareSongs.ToString()); // ~1_NUMBER~ Rare Tracks
}
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
{
base.GetContextMenuEntries(from, list);
SetSecureLevelEntry.AddTo(from, this, list); // Set secure level
}
public override void OnDoubleClick(Mobile from)
{
if (!this.IsChildOf(from.Backpack) && !this.IsLockedDown)
from.SendLocalizedMessage(1061856); // You must have the item in your backpack or locked down in order to use it.
else if (this.IsLockedDown && !this.HasAccces(from))
from.SendLocalizedMessage(502436); // That is not accessible.
else
{
from.CloseGump(typeof(DawnsMusicBoxGump));
from.SendGump(new DawnsMusicBoxGump(this));
}
}
public bool HasAccces(Mobile m)
{
if (m.AccessLevel >= AccessLevel.GameMaster)
return true;
BaseHouse house = BaseHouse.FindHouseAt(this);
return (house != null && house.HasAccess(m));
}
public void PlayMusic(Mobile m, MusicName music)
{
if (this.m_Timer != null && this.m_Timer.Running)
this.EndMusic(m);
else
this.m_ItemID = this.ItemID;
m.Send(new PlayMusic(music));
this.m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(0.5), TimeSpan.FromSeconds(0.5), 4, new TimerCallback(Animate));
}
public void EndMusic(Mobile m)
{
if (this.m_Timer != null && this.m_Timer.Running)
this.m_Timer.Stop();
m.Send(StopMusic.Instance);
if (this.m_Count > 0)
this.ItemID = this.m_ItemID;
this.m_Count = 0;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
writer.Write((int)this.m_Tracks.Count);
for (int i = 0; i < this.m_Tracks.Count; i++)
writer.Write((int)this.m_Tracks[i]);
writer.Write((int)this.m_Level);
writer.Write((int)this.m_ItemID);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
int count = reader.ReadInt();
this.m_Tracks = new List<MusicName>();
for (int i = 0; i < count; i++)
this.m_Tracks.Add((MusicName)reader.ReadInt());
this.m_Level = (SecureLevel)reader.ReadInt();
this.m_ItemID = reader.ReadInt();
}
private void Animate()
{
this.m_Count++;
if (this.m_Count >= 4)
{
this.m_Count = 0;
this.ItemID = this.m_ItemID;
}
else
this.ItemID++;
}
}
}