Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
416
Scripts/Services/Astronomy/Telescope.cs
Normal file
416
Scripts/Services/Astronomy/Telescope.cs
Normal file
@@ -0,0 +1,416 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Multis;
|
||||
using Server.Gumps;
|
||||
using Server.Engines.Astronomy;
|
||||
using Server.ContextMenus;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
[Flipable(0xA12C, 0xA12D)]
|
||||
public class PersonalTelescope : Item, ISecurable
|
||||
{
|
||||
private string _DisplayName;
|
||||
private double _DEC;
|
||||
|
||||
//[CommandProperty(AccessLevel.GameMaster)]
|
||||
//public static TimeCoordinate ForceTimeCoordinate { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public string DisplayName { get { return _DisplayName; } set { _DisplayName = value; InvalidateProperties(); } }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public SecureLevel Level { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int RA { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public double DEC
|
||||
{
|
||||
get { return _DEC; }
|
||||
set
|
||||
{
|
||||
_DEC = value;
|
||||
|
||||
_DEC = (double)decimal.Round((decimal)_DEC, 2);
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TimeCoordinate TimeCoordinate { get { return AstronomySystem.GetTimeCoordinate(this); } }
|
||||
|
||||
public DateTime LastUse { get; set; }
|
||||
|
||||
public override int LabelNumber { get { return 1125284; } }
|
||||
|
||||
[Constructable]
|
||||
public PersonalTelescope()
|
||||
: base(0xA12C)
|
||||
{
|
||||
Level = SecureLevel.Owner;
|
||||
|
||||
_DisplayName = _Names[Utility.Random(_Names.Length)];
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (!IsLockedDown)
|
||||
{
|
||||
m.SendLocalizedMessage(1114298); // This must be locked down in order to use it.
|
||||
return;
|
||||
}
|
||||
|
||||
if (m.InRange(Location, 2))
|
||||
{
|
||||
var house = BaseHouse.FindHouseAt(this);
|
||||
|
||||
if (house != null && house.HasSecureAccess(m, Level))
|
||||
{
|
||||
if (DateTime.UtcNow - LastUse > TimeSpan.FromMinutes(10))
|
||||
{
|
||||
m.SendLocalizedMessage(1158643); // The telescope is calibrating, try again in a moment.
|
||||
|
||||
LastUse = DateTime.UtcNow;
|
||||
}
|
||||
else
|
||||
{
|
||||
BaseGump.SendGump(new TelescopeGump((PlayerMobile)m, this));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m.LocalOverheadMessage(Server.Network.MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
|
||||
}
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
{
|
||||
base.GetProperties(list);
|
||||
|
||||
if (!String.IsNullOrEmpty(_DisplayName))
|
||||
{
|
||||
list.Add(1158477, _DisplayName); // <BASEFONT COLOR=#FFD24D>From the personal study of ~1_NAME~<BASEFONT COLOR=#FFFFFF>
|
||||
}
|
||||
}
|
||||
|
||||
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
|
||||
{
|
||||
base.GetContextMenuEntries(from, list);
|
||||
|
||||
SetSecureLevelEntry.AddTo(from, this, list);
|
||||
}
|
||||
|
||||
public PersonalTelescope(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(1);
|
||||
|
||||
writer.Write(_DisplayName);
|
||||
|
||||
writer.Write((int)Level);
|
||||
writer.Write(RA);
|
||||
writer.Write(DEC);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch (version)
|
||||
{
|
||||
case 1:
|
||||
_DisplayName = reader.ReadString();
|
||||
goto case 0;
|
||||
case 0:
|
||||
Level = (SecureLevel)reader.ReadInt();
|
||||
RA = reader.ReadInt();
|
||||
DEC = reader.ReadDouble();
|
||||
break;
|
||||
}
|
||||
|
||||
if (version == 0)
|
||||
{
|
||||
_DisplayName = _Names[Utility.Random(_Names.Length)];
|
||||
}
|
||||
}
|
||||
|
||||
private static string[] _Names =
|
||||
{
|
||||
"Adranath", "Aeluva the Arcanist", "Aesthyron", "Anon", "Balaki", "Clanin", "Dexter", "Doctor Spector", "Dryus Doost",
|
||||
"Gilform", "Grizelda the Hag", "Hawkwind", "Heigel of Moonglow", "Intanya", "Juo'Nar", "King Blackthorn", "Koole the Arcanist",
|
||||
"Kronos", "Kyrnia", "Lathiari", "Leoric Gathenwale", "Lysander Gathenwale", "Malabelle", "Mariah", "Melissa", "Minax",
|
||||
"Mondain", "Mordra", "Mythran", "Neira the Necromancer", "Nystul", "Queen Zhah", "Relvinian", "Selsius the Astronomer",
|
||||
"Sutek", "Uzeraan", "Wexton the Apprentice"
|
||||
};
|
||||
}
|
||||
|
||||
public class TelescopeGump : BaseGump
|
||||
{
|
||||
public Tuple<int, int> InterstellarObject { get; set; }
|
||||
public ConstellationInfo Constellation { get; set; }
|
||||
|
||||
public PersonalTelescope Tele { get; set; }
|
||||
public int ImageID { get; set; }
|
||||
|
||||
public TelescopeGump(PlayerMobile pm, PersonalTelescope tele)
|
||||
: base(pm, 200, 200)
|
||||
{
|
||||
Tele = tele;
|
||||
|
||||
pm.CloseGump(typeof(TelescopeGump));
|
||||
}
|
||||
|
||||
public override void AddGumpLayout()
|
||||
{
|
||||
AddPage(0);
|
||||
|
||||
if (ImageID == 0)
|
||||
{
|
||||
ImageID = AstronomySystem.RandomSkyImage(User);
|
||||
}
|
||||
|
||||
AddImage(0, 0, ImageID);
|
||||
|
||||
AddImage(222, 597, 0x694);
|
||||
AddImage(229, 600, GetGumpNumber(GetPlace(Tele.RA, 10)));
|
||||
|
||||
AddButton(222, 584, 0x697, 0x698, 60000, GumpButtonType.Reply, 0);
|
||||
AddButton(222, 631, 0x699, 0x69A, 60001, GumpButtonType.Reply, 0);
|
||||
|
||||
AddImage(256, 597, 0x694);
|
||||
AddImage(263, 600, GetGumpNumber(GetPlace(Tele.RA, 1)));
|
||||
|
||||
AddButton(256, 584, 0x697, 0x698, 60002, GumpButtonType.Reply, 0);
|
||||
AddButton(256, 631, 0x699, 0x69A, 60003, GumpButtonType.Reply, 0);
|
||||
|
||||
AddButton(291, 597, 0x69B, 0x69C, 70000, GumpButtonType.Reply, 0);
|
||||
AddTooltip(1158499); // View Coordinate
|
||||
|
||||
AddImage(332, 597, 0x694);
|
||||
AddImage(339, 600, GetGumpNumber(GetPlace((int)Math.Truncate(Tele.DEC), 10)));
|
||||
|
||||
AddButton(332, 584, 0x697, 0x698, 60004, GumpButtonType.Reply, 0);
|
||||
AddButton(332, 631, 0x699, 0x69A, 60005, GumpButtonType.Reply, 0);
|
||||
|
||||
AddImage(366, 597, 0x694);
|
||||
AddImage(373, 600, GetGumpNumber(GetPlace((int)Math.Truncate(Tele.DEC), 1)));
|
||||
|
||||
AddButton(366, 584, 0x697, 0x698, 60006, GumpButtonType.Reply, 0);
|
||||
AddButton(366, 631, 0x699, 0x69A, 60007, GumpButtonType.Reply, 0);
|
||||
|
||||
AddImage(400, 597, 0x694);
|
||||
AddImage(407, 600, GetGumpNumber(GetDecimalPlace(Tele.DEC)));
|
||||
|
||||
AddButton(400, 584, 0x697, 0x698, 60008, GumpButtonType.Reply, 0);
|
||||
AddButton(400, 631, 0x699, 0x69A, 60009, GumpButtonType.Reply, 0);
|
||||
|
||||
AddImage(397, 623, 0x696);
|
||||
|
||||
AddHtmlLocalized(251, 651, 100, 50, 1158489, 0x6B55, false, false); // RA
|
||||
AddTooltip(1158497); // Right Ascension
|
||||
|
||||
AddHtmlLocalized(371, 651, 100, 50, 1158490, 0x6B55, false, false); // DEC
|
||||
AddTooltip(1158498); // Declination
|
||||
|
||||
if (Constellation != null)
|
||||
{
|
||||
RenderConstellation();
|
||||
}
|
||||
else if (InterstellarObject != null)
|
||||
{
|
||||
RenderInterstellarObject();
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderInterstellarObject()
|
||||
{
|
||||
AddImage(180, 150, InterstellarObject.Item1);
|
||||
}
|
||||
|
||||
private void RenderConstellation()
|
||||
{
|
||||
foreach (var pos in Constellation.StarPositions)
|
||||
{
|
||||
AddImage(pos.X, pos.Y, pos.ImageID);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnResponse(RelayInfo info)
|
||||
{
|
||||
if (!User.InRange(Tele.Location, 2) || User.Map != Tele.Map)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Tele.LastUse = DateTime.UtcNow;
|
||||
|
||||
switch (info.ButtonID)
|
||||
{
|
||||
case 60000: // RA 10's Up
|
||||
if (Tele.RA >= 20)
|
||||
Tele.RA -= 20;
|
||||
else
|
||||
Tele.RA += 10;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60001: // RA 10's Down
|
||||
if (Tele.RA < 10)
|
||||
Tele.RA += 20;
|
||||
else
|
||||
Tele.RA -= 10;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60002: // RA 1's Up
|
||||
int raOnes = GetPlace(Tele.RA, 1);
|
||||
|
||||
if (raOnes >= 9)
|
||||
Tele.RA -= 9;
|
||||
else
|
||||
Tele.RA++;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60003: // RA 1's Down
|
||||
int raOnes1 = GetPlace(Tele.RA, 1);
|
||||
|
||||
if (raOnes1 == 0)
|
||||
Tele.RA += 9;
|
||||
else
|
||||
Tele.RA--;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60004: // DEC 10's Up
|
||||
if (Tele.DEC >= 90)
|
||||
Tele.DEC -= 90;
|
||||
else
|
||||
Tele.DEC += 10;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60005: // DEC 10's Down
|
||||
if (Tele.DEC < 10)
|
||||
Tele.DEC += 90;
|
||||
else
|
||||
Tele.DEC -= 10;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60006: // DEC 1's Up
|
||||
int decOnes = GetPlace((int)Math.Truncate(Tele.DEC), 1);
|
||||
|
||||
if (decOnes >= 9)
|
||||
Tele.DEC -= 9;
|
||||
else
|
||||
Tele.DEC++;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60007: // DEC 1's Down
|
||||
int decOnes1 = GetPlace((int)Math.Truncate(Tele.DEC), 1);
|
||||
|
||||
if (decOnes1 <= 0)
|
||||
Tele.DEC += 9;
|
||||
else
|
||||
Tele.DEC--;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60008: // DEC .2 Up
|
||||
int dec = GetDecimalPlace(Tele.DEC);
|
||||
|
||||
if (dec >= 8)
|
||||
Tele.DEC = Math.Truncate(Tele.DEC);
|
||||
else
|
||||
Tele.DEC += .2;
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 60009: // DEC .2 Down
|
||||
int dec1 = GetDecimalPlace(Tele.DEC);
|
||||
|
||||
if (dec1 < 2)
|
||||
Tele.DEC += 0.8;
|
||||
else if (dec1 == 2)
|
||||
Tele.DEC = Math.Truncate(Tele.DEC);
|
||||
else
|
||||
Tele.DEC -= 0.2;
|
||||
|
||||
User.SendSound(0x4A);
|
||||
break;
|
||||
case 70000: // View Coord
|
||||
if (Tele.RA > AstronomySystem.MaxRA || Tele.DEC > (double)AstronomySystem.MaxDEC)
|
||||
{
|
||||
User.SendLocalizedMessage(1158488); // You have entered invalid coordinates.
|
||||
User.SendSound(81);
|
||||
}
|
||||
else
|
||||
{
|
||||
InterstellarObject = null;
|
||||
Constellation = null;
|
||||
ImageID = AstronomySystem.RandomSkyImage(User);
|
||||
|
||||
var timeCoord = Tele.TimeCoordinate;
|
||||
|
||||
if (timeCoord == TimeCoordinate.Day)
|
||||
{
|
||||
User.SendLocalizedMessage(1158513); // You won't have much luck seeing the night sky during the day...
|
||||
}
|
||||
else
|
||||
{
|
||||
var constellation = AstronomySystem.GetConstellation(timeCoord, Tele.RA, Tele.DEC);
|
||||
|
||||
if (constellation != null)
|
||||
{
|
||||
Constellation = constellation;
|
||||
|
||||
User.SendLocalizedMessage(1158492, "", 0xBF); // You peer into the heavens and see...a constellation!
|
||||
User.SendSound(User.Female ? 0x32B : 0x43D);
|
||||
}
|
||||
else if (0.2 > Utility.RandomDouble())
|
||||
{
|
||||
InterstellarObject = AstronomySystem.GetRandomInterstellarObject();
|
||||
|
||||
User.SendLocalizedMessage(InterstellarObject.Item2, "", 0xBF); //
|
||||
User.SendSound(User.Female ? 0x32B : 0x43D);
|
||||
}
|
||||
else
|
||||
{
|
||||
User.SendLocalizedMessage(1158491, "", 0xBF); // You peer into the heavens and see...only empty space...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Refresh();
|
||||
return;
|
||||
}
|
||||
|
||||
if (info.ButtonID != 0)
|
||||
{
|
||||
Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
private int GetPlace(int value, int place)
|
||||
{
|
||||
return ((value % (place * 10)) - (value % place)) / place;
|
||||
}
|
||||
|
||||
private int GetDecimalPlace(double value)
|
||||
{
|
||||
decimal dec = decimal.Round((decimal)(value - Math.Truncate(value)), 2);
|
||||
|
||||
return (int)(dec * 10);
|
||||
}
|
||||
|
||||
private int GetGumpNumber(int v)
|
||||
{
|
||||
return 0x58F + v;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user