#W# Added Knives TownHouses. Also wrote my own static house system that is configured with a cfg file.
This commit is contained in:
parent
3132211847
commit
dc5e0577fd
31 changed files with 7009 additions and 11 deletions
3
Data/Config/statichouses.cfg
Normal file
3
Data/Config/statichouses.cfg
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Map SignX SignY SignZ StartX StartY Width Height MinZ MaxZ Price Locks Secures SignID <0xC0C/0xC0B>
|
||||
Vaelen 863 595 5 861 583 11 13 0 55 5000 500 500 0xC0C
|
||||
Vaelen 779 675 0 769 672 11 10 0 55 5000 500 500 0xC0B
|
||||
104
Scripts/Items/Houses/GenStaticHouses.cs
Normal file
104
Scripts/Items/Houses/GenStaticHouses.cs
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Multis;
|
||||
using Server.Commands;
|
||||
|
||||
namespace Server.Custom.StaticHousing
|
||||
{
|
||||
public class GenStaticHouses
|
||||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
CommandSystem.Register("GenStaticHouses", AccessLevel.Administrator, new CommandEventHandler(GenStaticHouses_OnCommand));
|
||||
}
|
||||
|
||||
[Usage("GenStaticHouses")]
|
||||
[Description("Generates Static House signs from a configuration file.")]
|
||||
public static void GenStaticHouses_OnCommand(CommandEventArgs e)
|
||||
{
|
||||
string filePath = Path.Combine(Core.BaseDirectory, "Data", "Config", "statichouses.cfg");
|
||||
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
e.Mobile.SendMessage(33, "Error: Data/Config/statichouses.cfg not found!");
|
||||
return;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
|
||||
using (StreamReader ip = new StreamReader(filePath))
|
||||
{
|
||||
string line;
|
||||
while ((line = ip.ReadLine()) != null)
|
||||
{
|
||||
line = line.Trim();
|
||||
if (line.Length == 0 || line.StartsWith("#")) continue;
|
||||
|
||||
string[] split = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (split.Length >= 13)
|
||||
{
|
||||
try
|
||||
{
|
||||
Map map = Map.Parse(split[0]);
|
||||
Point3D signLoc = new Point3D(int.Parse(split[1]), int.Parse(split[2]), int.Parse(split[3]));
|
||||
|
||||
Point2D start = new Point2D(int.Parse(split[4]), int.Parse(split[5]));
|
||||
Point2D end = new Point2D(start.X + int.Parse(split[6]), start.Y + int.Parse(split[7]));
|
||||
Rectangle2D area = new Rectangle2D(start, end);
|
||||
|
||||
int minZ = int.Parse(split[8]);
|
||||
int maxZ = int.Parse(split[9]);
|
||||
int price = int.Parse(split[10]);
|
||||
int locks = int.Parse(split[11]);
|
||||
int secures = int.Parse(split[12]);
|
||||
|
||||
// --- NEW ITEM ID PARSING ---
|
||||
int itemID = 0xC0B; // Defaults to the East-facing sign
|
||||
if (split.Length >= 14)
|
||||
{
|
||||
if (split[13].StartsWith("0x", StringComparison.OrdinalIgnoreCase))
|
||||
itemID = Convert.ToInt32(split[13], 16);
|
||||
else
|
||||
itemID = int.Parse(split[13]);
|
||||
}
|
||||
|
||||
if (map != null && !CheckForExistingHouse(map, signLoc))
|
||||
{
|
||||
// Pass the parsed itemID into the new sign!
|
||||
StaticHouseSign sign = new StaticHouseSign(itemID, area, minZ, maxZ, price, locks, secures);
|
||||
sign.MoveToWorld(signLoc, map);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error parsing statichouses.cfg line: {line}\n{ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
e.Mobile.SendMessage(68, $"Generation complete. {count} new Static House signs were spawned.");
|
||||
}
|
||||
|
||||
private static bool CheckForExistingHouse(Map map, Point3D loc)
|
||||
{
|
||||
bool exists = false;
|
||||
IPooledEnumerable eable = map.GetItemsInRange(loc, 0);
|
||||
|
||||
foreach (Item item in eable)
|
||||
{
|
||||
if (item is StaticHouseSign || item is HouseSign)
|
||||
{
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
return exists;
|
||||
}
|
||||
}
|
||||
}
|
||||
1098
Scripts/Items/Houses/Monopoly/Decorate.cs.bak
Normal file
1098
Scripts/Items/Houses/Monopoly/Decorate.cs.bak
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,69 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Network;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class Errors
|
||||
{
|
||||
private static ArrayList s_ErrorLog = new ArrayList();
|
||||
private static ArrayList s_Checked = new ArrayList();
|
||||
|
||||
public static ArrayList ErrorLog{ get{ return s_ErrorLog; } }
|
||||
public static ArrayList Checked{ get{ return s_Checked; } }
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
RUOVersion.AddCommand("TownHouseErrors", AccessLevel.Counselor, new TownHouseCommandHandler(OnErrors));
|
||||
RUOVersion.AddCommand("the", AccessLevel.Counselor, new TownHouseCommandHandler(OnErrors));
|
||||
|
||||
EventSink.Login += new LoginEventHandler( OnLogin );
|
||||
}
|
||||
|
||||
private static void OnErrors( CommandInfo e )
|
||||
{
|
||||
if ( e.ArgString == null || e.ArgString == "" )
|
||||
new ErrorsGump( e.Mobile );
|
||||
else
|
||||
Report( e.ArgString + " - " + e.Mobile.Name );
|
||||
}
|
||||
|
||||
private static void OnLogin( LoginEventArgs e )
|
||||
{
|
||||
if ( e.Mobile.AccessLevel != AccessLevel.Player
|
||||
&& s_ErrorLog.Count != 0
|
||||
&& !s_Checked.Contains( e.Mobile ) )
|
||||
new ErrorsNotifyGump( e.Mobile );
|
||||
}
|
||||
|
||||
public static void Report( string error )
|
||||
{
|
||||
s_ErrorLog.Add( String.Format( "<B>{0}</B><BR>{1}<BR>", DateTime.Now, error ) );
|
||||
|
||||
s_Checked.Clear();
|
||||
|
||||
Notify();
|
||||
}
|
||||
|
||||
private static void Notify()
|
||||
{
|
||||
foreach( NetState state in NetState.Instances )
|
||||
{
|
||||
if ( state.Mobile == null )
|
||||
continue;
|
||||
|
||||
if ( state.Mobile.AccessLevel != AccessLevel.Player )
|
||||
Notify( state.Mobile );
|
||||
}
|
||||
}
|
||||
|
||||
public static void Notify( Mobile m )
|
||||
{
|
||||
if ( m.HasGump( typeof( ErrorsGump ) ) )
|
||||
new ErrorsGump( m );
|
||||
else
|
||||
new ErrorsNotifyGump( m );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class ErrorsGump : GumpPlusLight
|
||||
{
|
||||
public ErrorsGump( Mobile m ) : base( m, 100, 100 )
|
||||
{
|
||||
Errors.Checked.Add(m);
|
||||
|
||||
m.CloseGump( typeof( ErrorsGump ) );
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
int width = 400;
|
||||
int y = 10;
|
||||
|
||||
AddHtml(0, y, width, "<CENTER>TownHouse Errors");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddButton(width - 20, y, 0x5689, 0x5689, "Help", new GumpCallback(Help));
|
||||
|
||||
string str = HTML.Black;
|
||||
foreach( string text in Errors.ErrorLog )
|
||||
str += text;
|
||||
|
||||
AddHtml( 20, y+=25, width-40, 200, str, true, true );
|
||||
|
||||
y += 200;
|
||||
|
||||
if ( Owner.AccessLevel >= AccessLevel.Administrator )
|
||||
{
|
||||
AddButton( width/2-30, y+=10, 0x98B, 0x98B, "Clear", new GumpCallback( ClearLog ) );
|
||||
AddHtml( width/2-23, y+3, 51, "<CENTER>Clear");
|
||||
}
|
||||
|
||||
AddBackgroundZero(0, 0, width, y + 40, 0x1400);
|
||||
}
|
||||
|
||||
private void Help()
|
||||
{
|
||||
NewGump();
|
||||
new InfoGump( Owner, 300, 300, HTML.White + " Errors reported by either the TownHouse system or other staff members! Administrators have the power to clear this list. All staff members can report an error using the [TownHouseErrors command.", true );
|
||||
}
|
||||
|
||||
private void ClearLog()
|
||||
{
|
||||
Errors.ErrorLog.Clear();
|
||||
NewGump();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class ErrorsNotifyGump : GumpPlusLight
|
||||
{
|
||||
public ErrorsNotifyGump( Mobile m ) : base( m, 250, 100 )
|
||||
{
|
||||
m.CloseGump( typeof( ErrorsNotifyGump ) );
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
AddButton( 0, 0, 0x1590, 0x1590, "Errors", new GumpCallback( Errors ) );
|
||||
AddItem(20, 20, 0x22C4);
|
||||
}
|
||||
|
||||
private void Errors()
|
||||
{
|
||||
new ErrorsGump( Owner );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class BackgroundPlus : GumpBackground
|
||||
{
|
||||
private bool c_Override;
|
||||
|
||||
public bool Override{ get{ return c_Override; } set{ c_Override = value; } }
|
||||
|
||||
public BackgroundPlus( int x, int y, int width, int height, int back ) : base( x, y, width, height, back )
|
||||
{
|
||||
c_Override = true;
|
||||
}
|
||||
|
||||
public BackgroundPlus( int x, int y, int width, int height, int back, bool over ) : base( x, y, width, height, back )
|
||||
{
|
||||
c_Override = over;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class ButtonPlus : GumpButton
|
||||
{
|
||||
private string c_Name;
|
||||
private object c_Callback;
|
||||
private object c_Param;
|
||||
|
||||
public string Name{ get{ return c_Name; } }
|
||||
|
||||
public ButtonPlus( int x, int y, int normalID, int pressedID, int buttonID, string name, GumpCallback back ) : base( x, y, normalID, pressedID, buttonID, GumpButtonType.Reply, 0 )
|
||||
{
|
||||
c_Name = name;
|
||||
c_Callback = back;
|
||||
c_Param = "";
|
||||
}
|
||||
|
||||
public ButtonPlus( int x, int y, int normalID, int pressedID, int buttonID, string name, GumpStateCallback back, object param ) : base( x, y, normalID, pressedID, buttonID, GumpButtonType.Reply, 0 )
|
||||
{
|
||||
c_Name = name;
|
||||
c_Callback = back;
|
||||
c_Param = param;
|
||||
}
|
||||
|
||||
public void Invoke()
|
||||
{
|
||||
if ( c_Callback is GumpCallback )
|
||||
((GumpCallback)c_Callback)();
|
||||
else if ( c_Callback is GumpStateCallback )
|
||||
((GumpStateCallback)c_Callback)( c_Param );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,261 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public delegate void GumpStateCallback(object obj);
|
||||
public delegate void GumpCallback();
|
||||
|
||||
public abstract class GumpPlusLight : Gump
|
||||
{
|
||||
public static void RefreshGump(Mobile m, Type type)
|
||||
{
|
||||
if (m.NetState == null)
|
||||
return;
|
||||
|
||||
foreach (Gump g in m.NetState.Gumps)
|
||||
if (g is GumpPlusLight && g.GetType() == type)
|
||||
{
|
||||
m.CloseGump(type);
|
||||
((GumpPlusLight)g).NewGump();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private Mobile c_Owner;
|
||||
private Hashtable c_Buttons, c_Fields;
|
||||
|
||||
public Mobile Owner{ get{ return c_Owner; } }
|
||||
|
||||
public GumpPlusLight( Mobile m, int x, int y ) : base( x, y )
|
||||
{
|
||||
c_Owner = m;
|
||||
|
||||
c_Buttons = new Hashtable();
|
||||
c_Fields = new Hashtable();
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(0), new TimerCallback(NewGump));
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
Entries.Clear();
|
||||
c_Buttons.Clear();
|
||||
c_Fields.Clear();
|
||||
}
|
||||
|
||||
public virtual void NewGump()
|
||||
{
|
||||
NewGump( true );
|
||||
}
|
||||
|
||||
public void NewGump( bool clear )
|
||||
{
|
||||
if ( clear )
|
||||
Clear();
|
||||
|
||||
BuildGump();
|
||||
|
||||
c_Owner.SendGump( this );
|
||||
}
|
||||
|
||||
public void SameGump()
|
||||
{
|
||||
c_Owner.SendGump( this );
|
||||
}
|
||||
|
||||
protected abstract void BuildGump();
|
||||
|
||||
private int UniqueButton()
|
||||
{
|
||||
int random = 0;
|
||||
|
||||
do
|
||||
{
|
||||
random = Utility.Random( 20000 );
|
||||
|
||||
}while( c_Buttons[random] != null );
|
||||
|
||||
return random;
|
||||
}
|
||||
|
||||
private int UniqueTextId()
|
||||
{
|
||||
int random = 0;
|
||||
|
||||
do
|
||||
{
|
||||
random = Utility.Random(20000);
|
||||
|
||||
} while (c_Buttons[random] != null);
|
||||
|
||||
return random;
|
||||
}
|
||||
|
||||
public void AddBackgroundZero(int x, int y, int width, int height, int back)
|
||||
{
|
||||
AddBackgroundZero(x, y, width, height, back, true);
|
||||
}
|
||||
|
||||
public void AddBackgroundZero(int x, int y, int width, int height, int back, bool over)
|
||||
{
|
||||
BackgroundPlus plus = new BackgroundPlus(x, y, width, height, back, over);
|
||||
|
||||
Entries.Insert(0, plus);
|
||||
}
|
||||
|
||||
public new void AddBackground(int x, int y, int width, int height, int back)
|
||||
{
|
||||
AddBackground(x, y, width, height, back, true);
|
||||
}
|
||||
|
||||
public void AddBackground(int x, int y, int width, int height, int back, bool over)
|
||||
{
|
||||
BackgroundPlus plus = new BackgroundPlus(x, y, width, height, back, over);
|
||||
|
||||
Add(plus);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int id, GumpCallback callback)
|
||||
{
|
||||
AddButton(x, y, id, id, "None", callback);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int id, GumpStateCallback callback, object arg)
|
||||
{
|
||||
AddButton(x, y, id, id, "None", callback, arg);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int id, string name, GumpCallback callback)
|
||||
{
|
||||
AddButton(x, y, id, id, name, callback);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int id, string name, GumpStateCallback callback, object arg)
|
||||
{
|
||||
AddButton(x, y, id, id, name, callback, arg);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int up, int down, GumpCallback callback)
|
||||
{
|
||||
AddButton(x, y, up, down, "None", callback);
|
||||
}
|
||||
|
||||
public void AddButton(int x, int y, int up, int down, string name, GumpCallback callback)
|
||||
{
|
||||
int id = UniqueButton();
|
||||
|
||||
ButtonPlus button = new ButtonPlus( x, y, up, down, id, name, callback );
|
||||
|
||||
Add( button );
|
||||
|
||||
c_Buttons[id] = button;
|
||||
}
|
||||
|
||||
public void AddButton( int x, int y, int up, int down, GumpStateCallback callback, object arg )
|
||||
{
|
||||
AddButton( x, y, up, down, "None", callback, arg );
|
||||
}
|
||||
|
||||
public void AddButton( int x, int y, int up, int down, string name, GumpStateCallback callback, object arg )
|
||||
{
|
||||
int id = UniqueButton();
|
||||
|
||||
ButtonPlus button = new ButtonPlus( x, y, up, down, id, name, callback, arg );
|
||||
|
||||
Add( button );
|
||||
|
||||
c_Buttons[id] = button;
|
||||
}
|
||||
|
||||
public void AddHtml(int x, int y, int width, string text)
|
||||
{
|
||||
AddHtml(x, y, width, 21, HTML.White + text, false, false, true, false);
|
||||
}
|
||||
|
||||
public void AddHtml(int x, int y, int width, string text, bool over)
|
||||
{
|
||||
AddHtml(x, y, width, 21, HTML.White + text, false, false, over, false);
|
||||
}
|
||||
|
||||
public void AddHtml(int x, int y, int width, int height, string text, bool back, bool scroll)
|
||||
{
|
||||
AddHtml(x, y, width, height, HTML.White + text, back, scroll, false);
|
||||
}
|
||||
|
||||
public void AddHtml(int x, int y, int width, int height, string text, bool back, bool scroll, bool over, bool useBlackTextOutline = false)
|
||||
{
|
||||
HtmlPlus html = new HtmlPlus(x, y, width, height, HTML.White + text, back, scroll, over);
|
||||
|
||||
Add(html);
|
||||
}
|
||||
|
||||
public void AddTextField(int x, int y, int width, int height, int color, int back, string name, string text)
|
||||
{
|
||||
int id = UniqueTextId();
|
||||
|
||||
AddImageTiled(x, y, width, height, back);
|
||||
base.AddTextEntry(x, y, width, height, color, id, text);
|
||||
|
||||
c_Fields[id] = name;
|
||||
c_Fields[name] = text;
|
||||
}
|
||||
|
||||
public string GetTextField( string name )
|
||||
{
|
||||
if ( c_Fields[name] == null )
|
||||
return "";
|
||||
|
||||
return c_Fields[name].ToString();
|
||||
}
|
||||
|
||||
public int GetTextFieldInt(string name)
|
||||
{
|
||||
return Utility.ToInt32(GetTextField(name));
|
||||
}
|
||||
|
||||
protected virtual void OnClose()
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnResponse( NetState state, RelayInfo info )
|
||||
{
|
||||
string name = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (info.ButtonID == -5)
|
||||
{
|
||||
NewGump();
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (TextRelay t in info.TextEntries)
|
||||
c_Fields[c_Fields[t.EntryID].ToString()] = t.Text;
|
||||
|
||||
if (info.ButtonID == 0)
|
||||
OnClose();
|
||||
|
||||
if (c_Buttons[info.ButtonID] == null || !(c_Buttons[info.ButtonID] is ButtonPlus))
|
||||
return;
|
||||
|
||||
name = ((ButtonPlus)c_Buttons[info.ButtonID]).Name;
|
||||
|
||||
((ButtonPlus)c_Buttons[info.ButtonID]).Invoke();
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Errors.Report("An error occured during a gump response. More information can be found on the console.");
|
||||
if (name != "")
|
||||
Console.WriteLine("{0} gump name triggered an error.", name);
|
||||
Console.WriteLine(e.Message);
|
||||
Console.WriteLine(e.Source);
|
||||
Console.WriteLine(e.StackTrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Scripts/Items/Houses/Monopoly/Gumps/Gumps Plus Light/HTML.cs
Normal file
20
Scripts/Items/Houses/Monopoly/Gumps/Gumps Plus Light/HTML.cs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class HTML
|
||||
{
|
||||
public static string White{ get { return "<BASEFONT Color=#FBFBFB>"; } }
|
||||
public static string Red{ get { return "<BASEFONT COLOR=#FF0000>"; } }
|
||||
public static string AshRed{ get { return "<BASEFONT COLOR=#FF9999>"; } }
|
||||
public static string Green{ get { return "<BASEFONT COLOR=#00FF00>"; } }
|
||||
public static string Blue{ get { return "<BASEFONT COLOR=#0000FF>"; } }
|
||||
public static string Gray{ get { return "<BASEFONT COLOR=#999999>"; } }
|
||||
public static string DarkGray{ get { return "<BASEFONT COLOR=#222222>"; } }
|
||||
public static string Black{ get { return "<BASEFONT COLOR=#111111>"; } }
|
||||
public static string Yellow{ get { return "<BASEFONT COLOR=#FFFF00>"; } }
|
||||
public static string Purple{ get { return "<BASEFONT COLOR=#990099>"; } }
|
||||
public static string LightPurple{ get { return "<BASEFONT COLOR=#CC00FF>"; } }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class HtmlPlus : GumpHtml
|
||||
{
|
||||
private bool c_Override;
|
||||
|
||||
public bool Override{ get{ return c_Override; } set{ c_Override = value; } }
|
||||
|
||||
public HtmlPlus( int x, int y, int width, int height, string text, bool back, bool scroll ) : base( x, y, width, height, text, back, scroll )
|
||||
{
|
||||
c_Override = true;
|
||||
}
|
||||
|
||||
public HtmlPlus( int x, int y, int width, int height, string text, bool back, bool scroll, bool over ) : base( x, y, width, height, text, back, scroll )
|
||||
{
|
||||
c_Override = over;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class InfoGump : GumpPlusLight
|
||||
{
|
||||
private int c_Width, c_Height;
|
||||
private string c_Text;
|
||||
private bool c_Scroll;
|
||||
|
||||
public InfoGump( Mobile m, int width, int height, string text, bool scroll ) : base( m, 100, 100 )
|
||||
{
|
||||
c_Width = width;
|
||||
c_Height = height;
|
||||
c_Text= text;
|
||||
c_Scroll = scroll;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
AddBackground( 0, 0, c_Width, c_Height, 3600 );
|
||||
|
||||
AddHtml( 20, 20, c_Width-40, c_Height-40, HTML.White + c_Text, false, c_Scroll );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class ContractConfirmGump : GumpPlusLight
|
||||
{
|
||||
private RentalContract c_Contract;
|
||||
|
||||
public ContractConfirmGump( Mobile m, RentalContract rc ) : base( m, 100, 100 )
|
||||
{
|
||||
m.CloseGump( typeof( ContractConfirmGump ) );
|
||||
|
||||
c_Contract = rc;
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
int width = 300;
|
||||
int y = 0;
|
||||
|
||||
if ( c_Contract.RentalClient == null )
|
||||
AddHtml( 0, y+5, width, HTML.Black + "<CENTER>Rent this House?");
|
||||
else
|
||||
AddHtml( 0, y+5, width, HTML.Black + "<CENTER>Rental Agreement");
|
||||
|
||||
string text = String.Format( " I, {0}, agree to rent this property from {1} for the sum of {2} every {3}. " +
|
||||
"The funds for this payment will be taken directly from my bank. In the case where " +
|
||||
"I cannot pay this fee, the property will return to {1}. I may cancel this agreement at any time by " +
|
||||
"demolishing the property. {1} may also cancel this agreement at any time by either demolishing their " +
|
||||
"property or canceling the contract, in which case your security deposit will be returned.",
|
||||
c_Contract.RentalClient == null ? "_____" : c_Contract.RentalClient.Name,
|
||||
c_Contract.RentalMaster.Name,
|
||||
c_Contract.Free ? 0 : c_Contract.Price,
|
||||
c_Contract.PriceTypeShort.ToLower() );
|
||||
|
||||
text += "<BR> Here is some more info reguarding this property:<BR>";
|
||||
|
||||
text += String.Format( "<CENTER>Lockdowns: {0}<BR>", c_Contract.Locks );
|
||||
text += String.Format( "Secures: {0}<BR>", c_Contract.Secures );
|
||||
text += String.Format( "Floors: {0}<BR>", (c_Contract.MaxZ-c_Contract.MinZ < 200) ? (c_Contract.MaxZ-c_Contract.MinZ)/20+1 : 1 );
|
||||
text += String.Format( "Space: {0} cubic units", c_Contract.CalcVolume() );
|
||||
|
||||
AddHtml( 40, y+=30, width-60, 200, HTML.Black + text, false, true );
|
||||
|
||||
y += 200;
|
||||
|
||||
if ( c_Contract.RentalClient == null )
|
||||
{
|
||||
AddHtml( 60, y+=20, 60, HTML.Black + "Preview");
|
||||
AddButton( 40, y+3, 0x837, 0x838, "Preview", new GumpCallback( Preview ) );
|
||||
|
||||
bool locsec = c_Contract.ValidateLocSec();
|
||||
|
||||
if ( Owner != c_Contract.RentalMaster && locsec )
|
||||
{
|
||||
AddHtml( width-100, y, 60, HTML.Black + "Accept");
|
||||
AddButton( width-60, y+3, 0x232C, 0x232D, "Accept", new GumpCallback( Accept ) );
|
||||
}
|
||||
else
|
||||
AddImage( width-60, y-10, 0x232C );
|
||||
|
||||
if ( !locsec )
|
||||
Owner.SendMessage( (Owner == c_Contract.RentalMaster ? "You don't have the lockdowns or secures available for this contract." : "The owner of this contract cannot rent this property at this time.") );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( Owner == c_Contract.RentalMaster )
|
||||
{
|
||||
AddHtml( 60, y+=20, 100, HTML.Black + "Cancel Contract");
|
||||
AddButton( 40, y+3, 0x837, 0x838, "Cancel Contract", new GumpCallback( CancelContract ) );
|
||||
}
|
||||
else
|
||||
AddImage( width-60, y+=20, 0x232C );
|
||||
}
|
||||
|
||||
AddBackgroundZero( 0, 0, width, y+23, 0x24A4 );
|
||||
}
|
||||
|
||||
protected override void OnClose()
|
||||
{
|
||||
c_Contract.ClearPreview();
|
||||
}
|
||||
|
||||
private void Preview()
|
||||
{
|
||||
c_Contract.ShowAreaPreview(Owner);
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void CancelContract()
|
||||
{
|
||||
if ( Owner == c_Contract.RentalClient )
|
||||
c_Contract.House.Delete();
|
||||
else
|
||||
c_Contract.Delete();
|
||||
}
|
||||
|
||||
private void Accept()
|
||||
{
|
||||
if ( !c_Contract.ValidateLocSec() )
|
||||
{
|
||||
Owner.SendMessage( "The owner of this contract cannot rent this property at this time." );
|
||||
return;
|
||||
}
|
||||
|
||||
c_Contract.Purchase( Owner );
|
||||
|
||||
if ( !c_Contract.Owned )
|
||||
return;
|
||||
|
||||
c_Contract.Visible = true;
|
||||
c_Contract.RentalClient = Owner;
|
||||
c_Contract.RentalClient.AddToBackpack( new RentalContractCopy( c_Contract ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,560 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class ContractSetupGump : GumpPlusLight
|
||||
{
|
||||
public enum Page { Blocks, Floors, Sign, LocSec, Length, Price }
|
||||
public enum TargetType { SignLoc, MinZ, MaxZ, BlockOne, BlockTwo }
|
||||
|
||||
private RentalContract c_Contract;
|
||||
private Page c_Page;
|
||||
|
||||
public ContractSetupGump( Mobile m, RentalContract contract ) : base( m, 50, 50 )
|
||||
{
|
||||
m.CloseGump( typeof( ContractSetupGump ) );
|
||||
|
||||
c_Contract = contract;
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
int width = 300;
|
||||
int y = 0;
|
||||
|
||||
switch( c_Page )
|
||||
{
|
||||
case Page.Blocks: BlocksPage(width, ref y); break;
|
||||
case Page.Floors: FloorsPage(width, ref y); break;
|
||||
case Page.Sign: SignPage(width, ref y); break;
|
||||
case Page.LocSec: LocSecPage(width, ref y); break;
|
||||
case Page.Length: LengthPage(width, ref y); break;
|
||||
case Page.Price: PricePage(width, ref y); break;
|
||||
}
|
||||
|
||||
AddBackgroundZero(0, 0, width, y+40, 3600);
|
||||
}
|
||||
|
||||
private void BlocksPage(int width, ref int y)
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.ShowAreaPreview( Owner );
|
||||
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Create the Area");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
y+=25;
|
||||
|
||||
if ( !General.HasOtherContract( c_Contract.ParentHouse, c_Contract ) )
|
||||
{
|
||||
AddHtml( 60, y, 90, "Entire House");
|
||||
AddButton( 30, y, c_Contract.EntireHouse ? 0xD3 : 0xD2, "Entire House", new GumpCallback(EntireHouse ));
|
||||
}
|
||||
|
||||
if ( !c_Contract.EntireHouse )
|
||||
{
|
||||
AddHtml( 170, y, 70, "Add Area");
|
||||
AddButton( 240, y, 0x15E1, 0x15E5, "Add Area", new GumpCallback( AddBlock ) );
|
||||
|
||||
AddHtml( 170, y+=20, 70, "Clear All");
|
||||
AddButton( 240, y, 0x15E1, 0x15E5, "Clear All", new GumpCallback( ClearBlocks ) );
|
||||
}
|
||||
|
||||
string helptext = String.Format( " Welcome to the rental contract setup menu! To begin, you must " +
|
||||
"first create the area which you wish to sell. As seen above, there are two ways to do this: " +
|
||||
"rent the entire house, or parts of it. As you create the area, a simple preview will show you exactly " +
|
||||
"what area you've selected so far. You can make all sorts of odd shapes by using multiple areas!" );
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 170, helptext, false, false );
|
||||
|
||||
y += 170;
|
||||
|
||||
if ( c_Contract.EntireHouse || c_Contract.Blocks.Count != 0 )
|
||||
{
|
||||
AddHtml( width-60, y+=20, 60, "Next");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Next", new GumpStateCallback( ChangePage ), (int)c_Page + ( c_Contract.EntireHouse ? 4 : 1 ) );
|
||||
}
|
||||
}
|
||||
|
||||
private void FloorsPage(int width, ref int y)
|
||||
{
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Floors");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddHtml( 40, y+=25, 80, "Base Floor");
|
||||
AddButton( 110, y, 0x15E1, 0x15E5, "Base Floor", new GumpCallback( MinZSelect ) );
|
||||
|
||||
AddHtml( 160, y, 80, "Top Floor");
|
||||
AddButton( 230, y, 0x15E1, 0x15E5, "Top Floor", new GumpCallback( MaxZSelect ) );
|
||||
|
||||
AddHtml( 100, y+=25, 100, String.Format( "{0} total floor{1}", c_Contract.Floors > 10 ? "1" : "" + c_Contract.Floors, c_Contract.Floors == 1 || c_Contract.Floors > 10 ? "" : "s" ));
|
||||
|
||||
string helptext = String.Format( " Now you will need to target the floors you wish to rent out. " +
|
||||
"If you only want one floor, you can skip targeting the top floor. Everything within the base " +
|
||||
"and highest floor will come with the rental, and the more floors, the higher the cost later on." );
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 120, helptext, false, false );
|
||||
|
||||
y += 120;
|
||||
|
||||
AddHtml( 30, y+=20, 80, "Previous");
|
||||
AddButton( 10, y, 0x15E3, 0x15E7, "Previous", new GumpStateCallback( ChangePage ), (int)c_Page-1 );
|
||||
|
||||
if ( c_Contract.MinZ != short.MinValue )
|
||||
{
|
||||
AddHtml( width-60, y, 60, "Next");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Next", new GumpStateCallback( ChangePage ), (int)c_Page+1 );
|
||||
}
|
||||
}
|
||||
|
||||
private void SignPage(int width, ref int y)
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.ShowSignPreview();
|
||||
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Their Sign Location");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddHtml( 100, y+=25, 80, "Set Location");
|
||||
AddButton( 180, y, 0x15E1, 0x15E5, "Sign Loc", new GumpCallback( SignLocSelect ) );
|
||||
|
||||
string helptext = String.Format( " With this sign, the rentee will have all the powers an owner has " +
|
||||
"over their area. If they use this power to demolish their rental unit, they have broken their " +
|
||||
"contract and will not receive their security deposit. They can also ban you from their rental home!" );
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 110, helptext, false, false );
|
||||
|
||||
y += 110;
|
||||
|
||||
AddHtml( 30, y+=20, 80, "Previous");
|
||||
AddButton( 10, y, 0x15E3, 0x15E7, "Previous", new GumpStateCallback( ChangePage ), (int)c_Page-1 );
|
||||
|
||||
if ( c_Contract.SignLoc != Point3D.Zero )
|
||||
{
|
||||
AddHtml( width-60, y, 60, "Next");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Next", new GumpStateCallback( ChangePage ), (int)c_Page+1 );
|
||||
}
|
||||
}
|
||||
|
||||
private void LocSecPage(int width, ref int y)
|
||||
{
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Lockdowns and Secures");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddHtml(0, y += 25, width, "<CENTER>Suggest Secures");
|
||||
AddButton(width / 2 - 70, y + 3, 0x2716, "Suggest LocSec", new GumpCallback(SuggestLocSec));
|
||||
AddButton(width / 2 + 60, y + 3, 0x2716, "Suggest LocSec", new GumpCallback(SuggestLocSec));
|
||||
|
||||
AddHtml(30, y += 25, width / 2 - 20, "<DIV ALIGN=RIGHT>Secures (Max: " + (General.RemainingSecures(c_Contract.ParentHouse) + c_Contract.Secures) + ")");
|
||||
AddTextField( width/2+50, y, 50, 20, 0x480, 0xBBC, "Secures", c_Contract.Secures.ToString() );
|
||||
AddButton(width / 2 + 25, y + 3, 0x2716, "Secures", new GumpCallback(Secures));
|
||||
|
||||
AddHtml(30, y += 20, width / 2 - 20, "<DIV ALIGN=RIGHT>Lockdowns (Max: " + (General.RemainingLocks(c_Contract.ParentHouse) + c_Contract.Locks) + ")");
|
||||
AddTextField( width/2+50, y, 50, 20, 0x480, 0xBBC, "Lockdowns", c_Contract.Locks.ToString() );
|
||||
AddButton(width / 2 + 25, y + 3, 0x2716, "Lockdowns", new GumpCallback(Lockdowns));
|
||||
|
||||
string helptext = String.Format( " Without giving storage, this wouldn't be much of a home! Here you give them lockdowns " +
|
||||
"and secures from your own home. Use the suggest button for an idea of how much you should give. Be very careful when " +
|
||||
"renting your property: if you use too much storage you begin to use storage you reserved for your clients. " +
|
||||
"You will receive a 48 hour warning when this happens, but after that the contract disappears!" );
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 180, helptext, false, false );
|
||||
|
||||
y += 180;
|
||||
|
||||
AddHtml( 30, y+=20, 80, "Previous");
|
||||
AddButton( 10, y, 0x15E3, 0x15E7, "Previous", new GumpStateCallback( ChangePage ), (int)c_Page-1 );
|
||||
|
||||
if ( c_Contract.Locks != 0 && c_Contract.Secures != 0 )
|
||||
{
|
||||
AddHtml( width-60, y, 60, "Next");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Next", new GumpStateCallback( ChangePage ), (int)c_Page+1 );
|
||||
}
|
||||
}
|
||||
|
||||
private void LengthPage(int width, ref int y)
|
||||
{
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Time Period");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddHtml( 120, y+=25, 50, c_Contract.PriceType);
|
||||
AddButton( 170, y+8, 0x985, "LengthUp", new GumpCallback( LengthUp ) );
|
||||
AddButton( 170, y-2, 0x983, "LengthDown", new GumpCallback( LengthDown ) );
|
||||
|
||||
string helptext = String.Format( " Every {0} the bank will automatically transfer the rental cost from them to you. " +
|
||||
"By using the arrows, you can cycle through other time periods to something better fitting your needs.", c_Contract.PriceTypeShort.ToLower() );
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 100, helptext, false, false );
|
||||
|
||||
y += 100;
|
||||
|
||||
AddHtml( 30, y+=20, 80, "Previous");
|
||||
AddButton( 10, y, 0x15E3, 0x15E7, "Previous", new GumpStateCallback( ChangePage ), (int)c_Page - ( c_Contract.EntireHouse ? 4 : 1 ) );
|
||||
|
||||
AddHtml( width-60, y, 60, "Next");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Next", new GumpStateCallback( ChangePage ), (int)c_Page+1 );
|
||||
}
|
||||
|
||||
private void PricePage(int width, ref int y)
|
||||
{
|
||||
AddHtml( 0, y+=10, width, "<CENTER>Charge Per Period");
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
AddHtml(0, y += 25, width, "<CENTER>Free");
|
||||
AddButton(width / 2 - 80, y, c_Contract.Free ? 0xD3 : 0xD2, "Free", new GumpCallback(Free));
|
||||
AddButton(width / 2 + 60, y, c_Contract.Free ? 0xD3 : 0xD2, "Free", new GumpCallback(Free));
|
||||
|
||||
if ( !c_Contract.Free )
|
||||
{
|
||||
AddHtml( 0, y+=25, width/2-20, "<DIV ALIGN=RIGHT>Per " + c_Contract.PriceTypeShort);
|
||||
AddTextField( width/2+20, y, 70, 20, 0x480, 0xBBC, "Price", c_Contract.Price.ToString() );
|
||||
AddButton(width / 2 - 5, y + 3, 0x2716, "Price", new GumpCallback(Price));
|
||||
|
||||
AddHtml( 0, y+=20, width, "<CENTER>Suggest");
|
||||
AddButton(width / 2 - 70, y + 3, 0x2716, "Suggest", new GumpCallback(SuggestPrice));
|
||||
AddButton(width / 2 + 60, y + 3, 0x2716, "Suggest", new GumpCallback(SuggestPrice));
|
||||
}
|
||||
|
||||
string helptext = String.Format( " Now you can finalize the contract by including your price per {0}. " +
|
||||
"Once you finalize, the only way you can modify it is to dump it and start a new contract! By " +
|
||||
"using the suggest button, a price will automatically be figured based on the following:<BR>", c_Contract.PriceTypeShort );
|
||||
|
||||
helptext += String.Format( "<CENTER>Volume: {0}<BR>", c_Contract.CalcVolume() );
|
||||
helptext += String.Format( "Cost per unit: {0} gold</CENTER>", General.SuggestionFactor );
|
||||
helptext += "<br> You may also give this space away for free using the option above.";
|
||||
|
||||
AddHtml( 10, y+=35, width-20, 150, helptext, false, true );
|
||||
|
||||
y += 150;
|
||||
|
||||
AddHtml( 30, y+=20, 80, "Previous");
|
||||
AddButton( 10, y, 0x15E3, 0x15E7, "Previous", new GumpStateCallback( ChangePage ), (int)c_Page-1 );
|
||||
|
||||
if ( c_Contract.Price != 0 )
|
||||
{
|
||||
AddHtml( width-70, y, 60, "Finalize");
|
||||
AddButton( width-30, y, 0x15E1, 0x15E5, "Finalize", new GumpCallback( FinalizeSetup ) );
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnClose()
|
||||
{
|
||||
c_Contract.ClearPreview();
|
||||
}
|
||||
|
||||
private void SuggestPrice()
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.Price = c_Contract.CalcVolume()*General.SuggestionFactor;
|
||||
|
||||
if ( c_Contract.RentByTime == TimeSpan.FromDays( 1 ) )
|
||||
c_Contract.Price /= 60;
|
||||
if ( c_Contract.RentByTime == TimeSpan.FromDays( 7 ) )
|
||||
c_Contract.Price = (int)((double)c_Contract.Price/8.57);
|
||||
if ( c_Contract.RentByTime == TimeSpan.FromDays( 30 ) )
|
||||
c_Contract.Price /= 2;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void SuggestLocSec()
|
||||
{
|
||||
int price = c_Contract.CalcVolume()*General.SuggestionFactor;
|
||||
c_Contract.Secures = price/75;
|
||||
c_Contract.Locks = c_Contract.Secures/2;
|
||||
|
||||
c_Contract.FixLocSec();
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Price()
|
||||
{
|
||||
c_Contract.Price = GetTextFieldInt("Price");
|
||||
Owner.SendMessage("Price set!");
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Secures()
|
||||
{
|
||||
c_Contract.Secures = GetTextFieldInt("Secures");
|
||||
Owner.SendMessage("Secures set!");
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Lockdowns()
|
||||
{
|
||||
c_Contract.Locks = GetTextFieldInt("Lockdowns");
|
||||
Owner.SendMessage("Lockdowns set!");
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void ChangePage(object obj)
|
||||
{
|
||||
if ( c_Contract == null || !(obj is int) )
|
||||
return;
|
||||
|
||||
c_Contract.ClearPreview();
|
||||
|
||||
c_Page = (Page)(int)obj;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void EntireHouse()
|
||||
{
|
||||
if ( c_Contract == null || c_Contract.ParentHouse == null )
|
||||
return;
|
||||
|
||||
c_Contract.EntireHouse = !c_Contract.EntireHouse;
|
||||
|
||||
c_Contract.ClearPreview();
|
||||
|
||||
if ( c_Contract.EntireHouse )
|
||||
{
|
||||
ArrayList list = new ArrayList();
|
||||
|
||||
bool once = false;
|
||||
foreach (Rectangle3D rect in RUOVersion.RegionArea(c_Contract.ParentHouse.Region))
|
||||
{
|
||||
list.Add(new Rectangle2D(new Point2D(rect.Start.X, rect.Start.Y), new Point2D(rect.End.X, rect.End.Y)));
|
||||
|
||||
if (once)
|
||||
continue;
|
||||
|
||||
if (rect.Start.Z >= rect.End.Z)
|
||||
{
|
||||
c_Contract.MinZ = rect.End.Z;
|
||||
c_Contract.MaxZ = rect.Start.Z;
|
||||
}
|
||||
else
|
||||
{
|
||||
c_Contract.MinZ = rect.Start.Z;
|
||||
c_Contract.MaxZ = rect.End.Z;
|
||||
}
|
||||
|
||||
once = true;
|
||||
}
|
||||
|
||||
c_Contract.Blocks = list;
|
||||
}
|
||||
else
|
||||
{
|
||||
c_Contract.Blocks.Clear();
|
||||
c_Contract.MinZ = short.MinValue;
|
||||
c_Contract.MaxZ = short.MinValue;
|
||||
}
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void SignLocSelect()
|
||||
{
|
||||
Owner.Target = new InternalTarget( this, c_Contract, TargetType.SignLoc );
|
||||
}
|
||||
|
||||
private void MinZSelect()
|
||||
{
|
||||
Owner.SendMessage( "Target the base floor for your rental area." );
|
||||
Owner.Target = new InternalTarget( this, c_Contract, TargetType.MinZ );
|
||||
}
|
||||
|
||||
private void MaxZSelect()
|
||||
{
|
||||
Owner.SendMessage( "Target the highest floor for your rental area." );
|
||||
Owner.Target = new InternalTarget( this, c_Contract, TargetType.MaxZ );
|
||||
}
|
||||
|
||||
private void LengthUp()
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.NextPriceType();
|
||||
|
||||
if ( c_Contract.RentByTime == TimeSpan.FromDays( 0 ) )
|
||||
c_Contract.RentByTime = TimeSpan.FromDays( 1 );
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void LengthDown()
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.PrevPriceType();
|
||||
|
||||
if ( c_Contract.RentByTime == TimeSpan.FromDays( 0 ) )
|
||||
c_Contract.RentByTime = TimeSpan.FromDays( 30 );
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Free()
|
||||
{
|
||||
c_Contract.Free = !c_Contract.Free;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void AddBlock()
|
||||
{
|
||||
Owner.SendMessage( "Target the north western corner." );
|
||||
Owner.Target = new InternalTarget( this, c_Contract, TargetType.BlockOne );
|
||||
}
|
||||
|
||||
private void ClearBlocks()
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
c_Contract.Blocks.Clear();
|
||||
|
||||
c_Contract.ClearPreview();
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void FinalizeSetup()
|
||||
{
|
||||
if ( c_Contract == null )
|
||||
return;
|
||||
|
||||
if ( c_Contract.Price == 0 )
|
||||
{
|
||||
Owner.SendMessage( "You can't rent the area for 0 gold!" );
|
||||
NewGump();
|
||||
return;
|
||||
}
|
||||
|
||||
c_Contract.Completed = true;
|
||||
c_Contract.BanLoc = c_Contract.ParentHouse.Region.GoLocation;
|
||||
|
||||
if ( c_Contract.EntireHouse )
|
||||
{
|
||||
Point3D point = c_Contract.ParentHouse.Sign.Location;
|
||||
c_Contract.SignLoc = new Point3D( point.X, point.Y, point.Z-5 );
|
||||
c_Contract.Secures = Core.AOS ? c_Contract.ParentHouse.GetAosMaxSecures() : c_Contract.ParentHouse.MaxSecures;
|
||||
c_Contract.Locks = Core.AOS ? c_Contract.ParentHouse.GetAosMaxLockdowns() : c_Contract.ParentHouse.MaxLockDowns;
|
||||
}
|
||||
|
||||
Owner.SendMessage( "You have finalized this rental contract. Now find someone to sign it!" );
|
||||
}
|
||||
|
||||
private class InternalTarget : Target
|
||||
{
|
||||
private ContractSetupGump c_Gump;
|
||||
private RentalContract c_Contract;
|
||||
private TargetType c_Type;
|
||||
private Point3D c_BoundOne;
|
||||
|
||||
public InternalTarget( ContractSetupGump gump, RentalContract contract, TargetType type ) : this( gump, contract, type, Point3D.Zero ){}
|
||||
|
||||
public InternalTarget( ContractSetupGump gump, RentalContract contract, TargetType type, Point3D point ) : base( 20, true, TargetFlags.None )
|
||||
{
|
||||
c_Gump = gump;
|
||||
c_Contract = contract;
|
||||
c_Type = type;
|
||||
c_BoundOne = point;
|
||||
}
|
||||
|
||||
protected override void OnTarget( Mobile m, object o )
|
||||
{
|
||||
IPoint3D point = (IPoint3D)o;
|
||||
|
||||
if ( c_Contract == null || c_Contract.ParentHouse == null )
|
||||
return;
|
||||
|
||||
if ( !c_Contract.ParentHouse.Region.Contains( new Point3D( point.X, point.Y, point.Z ) ) )
|
||||
{
|
||||
m.SendMessage( "You must target within the home." );
|
||||
m.Target = new InternalTarget( c_Gump, c_Contract, c_Type, c_BoundOne );
|
||||
return;
|
||||
}
|
||||
|
||||
switch( c_Type )
|
||||
{
|
||||
case TargetType.SignLoc:
|
||||
c_Contract.SignLoc = new Point3D( point.X, point.Y, point.Z );
|
||||
c_Contract.ShowSignPreview();
|
||||
c_Gump.NewGump();
|
||||
break;
|
||||
|
||||
case TargetType.MinZ:
|
||||
if (!c_Contract.ParentHouse.Region.Contains(new Point3D(point.X, point.Y, point.Z)))
|
||||
m.SendMessage( "That isn't within your house." );
|
||||
else if ( c_Contract.HasContractedArea( point.Z ) )
|
||||
m.SendMessage( "That area is already taken by another rental contract." );
|
||||
else
|
||||
{
|
||||
c_Contract.MinZ = point.Z;
|
||||
|
||||
if ( c_Contract.MaxZ < c_Contract.MinZ+19 )
|
||||
c_Contract.MaxZ = point.Z+19;
|
||||
}
|
||||
|
||||
c_Contract.ShowFloorsPreview(m);
|
||||
c_Gump.NewGump();
|
||||
break;
|
||||
|
||||
case TargetType.MaxZ:
|
||||
if ( !c_Contract.ParentHouse.Region.Contains(new Point3D(point.X, point.Y, point.Z)) )
|
||||
m.SendMessage( "That isn't within your house." );
|
||||
else if ( c_Contract.HasContractedArea( point.Z ) )
|
||||
m.SendMessage( "That area is already taken by another rental contract." );
|
||||
else
|
||||
{
|
||||
c_Contract.MaxZ = point.Z+19;
|
||||
|
||||
if ( c_Contract.MinZ > c_Contract.MaxZ )
|
||||
c_Contract.MinZ = point.Z;
|
||||
}
|
||||
|
||||
c_Contract.ShowFloorsPreview(m);
|
||||
c_Gump.NewGump();
|
||||
break;
|
||||
|
||||
case TargetType.BlockOne:
|
||||
m.SendMessage( "Now target the south eastern corner." );
|
||||
m.Target = new InternalTarget( c_Gump, c_Contract, TargetType.BlockTwo, new Point3D( point.X, point.Y, point.Z ) );
|
||||
break;
|
||||
|
||||
case TargetType.BlockTwo:
|
||||
Rectangle2D rect = TownHouseSetupGump.FixRect( new Rectangle2D( c_BoundOne, new Point3D( point.X+1, point.Y+1, point.Z ) ) );
|
||||
|
||||
if ( c_Contract.HasContractedArea( rect, point.Z ) )
|
||||
m.SendMessage( "That area is already taken by another rental contract." );
|
||||
else
|
||||
{
|
||||
c_Contract.Blocks.Add( rect );
|
||||
c_Contract.ShowAreaPreview( m );
|
||||
}
|
||||
|
||||
c_Gump.NewGump();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnTargetCancel( Mobile m, TargetCancelType cancelType )
|
||||
{
|
||||
c_Gump.NewGump();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class TownHouseConfirmGump : GumpPlusLight
|
||||
{
|
||||
private TownHouseSign c_Sign;
|
||||
private bool c_Items;
|
||||
|
||||
public TownHouseConfirmGump( Mobile m, TownHouseSign sign ) : base( m, 100, 100 )
|
||||
{
|
||||
c_Sign = sign;
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
int width = 200;
|
||||
int y = 0;
|
||||
|
||||
AddHtml( 0, y+=10, width, String.Format( "<CENTER>{0} this House?", c_Sign.RentByTime == TimeSpan.Zero ? "Purchase" : "Rent" ));
|
||||
AddImage(width / 2 - 100, y + 2, 0x39);
|
||||
AddImage(width / 2 + 70, y + 2, 0x3B);
|
||||
|
||||
if ( c_Sign.RentByTime == TimeSpan.Zero )
|
||||
AddHtml( 0, y+=25, width, String.Format( "<CENTER>{0}: {1}", "Price", c_Sign.Free ? "Free" : "" + c_Sign.Price ));
|
||||
else if ( c_Sign.RecurRent )
|
||||
AddHtml( 0, y+=25, width, String.Format( "<CENTER>{0}: {1}", "Recurring " + c_Sign.PriceType, c_Sign.Price ));
|
||||
else
|
||||
AddHtml( 0, y+=25, width, String.Format( "<CENTER>{0}: {1}", "One " + c_Sign.PriceTypeShort, c_Sign.Price ));
|
||||
|
||||
if ( c_Sign.KeepItems )
|
||||
{
|
||||
AddHtml( 0, y+=20, width, "<CENTER>Cost of Items: " + c_Sign.ItemsPrice);
|
||||
AddButton( 20, y, c_Items ? 0xD3 : 0xD2, "Items", new GumpCallback( Items ) );
|
||||
}
|
||||
|
||||
AddHtml(0, y += 20, width, "<CENTER>Lockdowns: " + c_Sign.Locks);
|
||||
AddHtml( 0, y+=20, width, "<CENTER>Secures: " + c_Sign.Secures);
|
||||
|
||||
AddButton( 10, y+=25, 0xFB1, 0xFB3, "Cancel", new GumpCallback( Cancel ) );
|
||||
AddButton( width-40, y, 0xFB7, 0xFB9, "Confirm", new GumpCallback( Confirm ) );
|
||||
|
||||
AddBackgroundZero(0, 0, width, y+40, 3600);
|
||||
}
|
||||
|
||||
private void Items()
|
||||
{
|
||||
c_Items = !c_Items;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Cancel()
|
||||
{
|
||||
}
|
||||
|
||||
private void Confirm()
|
||||
{
|
||||
c_Sign.Purchase( Owner, c_Items );
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,202 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Multis;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class TownHousesGump : GumpPlusLight
|
||||
{
|
||||
public enum ListPage { Town, House }
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
RUOVersion.AddCommand("TownHouses", AccessLevel.Counselor, new TownHouseCommandHandler(OnHouses));
|
||||
}
|
||||
|
||||
private static void OnHouses(CommandInfo info)
|
||||
{
|
||||
new TownHousesGump(info.Mobile);
|
||||
}
|
||||
|
||||
private ListPage c_ListPage;
|
||||
private int c_Page;
|
||||
|
||||
public TownHousesGump(Mobile m)
|
||||
: base(m, 100, 100)
|
||||
{
|
||||
m.CloseGump(typeof(TownHousesGump));
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
int width = 400;
|
||||
int y = 0;
|
||||
|
||||
AddHtml(0, y += 10, width, "<CENTER>TownHouses Main Menu");
|
||||
AddImage(width / 2 - 120, y + 2, 0x39);
|
||||
AddImage(width / 2 + 90, y + 2, 0x3B);
|
||||
|
||||
int pp = 10;
|
||||
|
||||
if (c_Page != 0)
|
||||
AddButton(width / 2 - 10, y += 25, 0x25E4, 0x25E5, "Page Down", new GumpCallback(PageDown));
|
||||
|
||||
ArrayList list = new ArrayList();
|
||||
if(c_ListPage == ListPage.Town)
|
||||
list = new ArrayList(TownHouseSign.AllSigns);
|
||||
else
|
||||
foreach(Item item in World.Items.Values)
|
||||
if(item is BaseHouse)
|
||||
list.Add(item);
|
||||
|
||||
list.Sort(new InternalSort());
|
||||
|
||||
AddHtml(0, y += 20, width, "<CENTER>" + (c_ListPage == ListPage.Town ? "TownHouses" : "Houses") + " Count: " + list.Count);
|
||||
AddHtml(0, y += 25, width, "<CENTER>TownHouses / Houses");
|
||||
AddButton(width / 2 - 100, y + 3, c_ListPage == ListPage.Town ? 0x939 : 0x2716, "Page", new GumpStateCallback(Page), ListPage.Town);
|
||||
AddButton(width / 2 + 90, y + 3, c_ListPage == ListPage.House ? 0x939 : 0x2716, "Page", new GumpStateCallback(Page), ListPage.House);
|
||||
|
||||
TownHouseSign sign = null;
|
||||
BaseHouse house = null;
|
||||
|
||||
y += 5;
|
||||
|
||||
for (int i = c_Page * pp; i < (c_Page + 1) * pp && i < list.Count; ++i)
|
||||
{
|
||||
if (c_ListPage == ListPage.Town)
|
||||
{
|
||||
sign = (TownHouseSign)list[i];
|
||||
|
||||
AddHtml(30, y += 20, width / 2 - 20, "<DIV ALIGN=LEFT>" + sign.Name);
|
||||
AddButton(15, y + 3, 0x2716, "TownHouse Menu", new GumpStateCallback(TownHouseMenu), sign);
|
||||
|
||||
if (sign.House != null && sign.House.Owner != null)
|
||||
{
|
||||
AddHtml(width / 2, y, width / 2 - 40, "<DIV ALIGN=RIGHT>" + sign.House.Owner.RawName);
|
||||
AddButton(width - 30, y + 3, 0x2716, "House Menu", new GumpStateCallback(HouseMenu), sign.House);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
house = (BaseHouse)list[i];
|
||||
|
||||
AddHtml(30, y += 20, width / 2 - 20, "<DIV ALIGN=LEFT>" + house.Name);
|
||||
AddButton(15, y + 3, 0x2716, "Goto", new GumpStateCallback(Goto), house);
|
||||
|
||||
if (house.Owner != null)
|
||||
{
|
||||
AddHtml(width / 2, y, width / 2 - 40, "<DIV ALIGN=RIGHT>" + house.Owner.RawName);
|
||||
AddButton(width - 30, y + 3, 0x2716, "House Menu", new GumpStateCallback(HouseMenu), house);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pp * (c_Page + 1) < list.Count)
|
||||
AddButton(width / 2 - 10, y += 25, 0x25E8, 0x25E9, "Page Up", new GumpCallback(PageUp));
|
||||
|
||||
if (c_ListPage == ListPage.Town)
|
||||
{
|
||||
AddHtml(0, y += 35, width, "<CENTER>Add New TownHouse");
|
||||
AddButton(width / 2 - 80, y + 3, 0x2716, "New", new GumpCallback(New));
|
||||
AddButton(width / 2 + 70, y + 3, 0x2716, "New", new GumpCallback(New));
|
||||
}
|
||||
|
||||
AddBackgroundZero(0, 0, width, y + 40, 3600);
|
||||
}
|
||||
|
||||
private void TownHouseMenu(object obj)
|
||||
{
|
||||
if (!(obj is TownHouseSign))
|
||||
return;
|
||||
|
||||
NewGump();
|
||||
|
||||
new TownHouseSetupGump(Owner, (TownHouseSign)obj);
|
||||
}
|
||||
|
||||
private void Page(object obj)
|
||||
{
|
||||
c_ListPage = (ListPage)obj;
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void Goto(object obj)
|
||||
{
|
||||
if (!(obj is BaseHouse))
|
||||
return;
|
||||
|
||||
Owner.Location = ((BaseHouse)obj).BanLocation;
|
||||
Owner.Map = ((BaseHouse)obj).Map;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void HouseMenu(object obj)
|
||||
{
|
||||
if (!(obj is BaseHouse))
|
||||
return;
|
||||
|
||||
NewGump();
|
||||
|
||||
Owner.SendGump(new HouseGumpAOS((HouseGumpPageAOS)0, Owner, (BaseHouse)obj));
|
||||
}
|
||||
|
||||
private void New()
|
||||
{
|
||||
TownHouseSign sign = new TownHouseSign();
|
||||
Owner.AddToBackpack(sign);
|
||||
Owner.SendMessage("A new sign is now in your backpack. It will move on it's own during setup, but if you don't complete setup you may want to delete it.");
|
||||
|
||||
NewGump();
|
||||
|
||||
new TownHouseSetupGump(Owner, sign);
|
||||
}
|
||||
|
||||
private void PageUp()
|
||||
{
|
||||
c_Page++;
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private void PageDown()
|
||||
{
|
||||
c_Page--;
|
||||
NewGump();
|
||||
}
|
||||
|
||||
private class InternalSort : IComparer
|
||||
{
|
||||
public InternalSort()
|
||||
{
|
||||
}
|
||||
|
||||
public int Compare(object x, object y)
|
||||
{
|
||||
if (x == null && y == null)
|
||||
return 0;
|
||||
|
||||
if (x is TownHouseSign)
|
||||
{
|
||||
TownHouseSign a = (TownHouseSign)x;
|
||||
TownHouseSign b = (TownHouseSign)y;
|
||||
|
||||
return Insensitive.Compare(a.Name, b.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
BaseHouse a = (BaseHouse)x;
|
||||
BaseHouse b = (BaseHouse)y;
|
||||
|
||||
if (a.Owner == null && b.Owner != null)
|
||||
return -1;
|
||||
if (a.Owner != null && b.Owner == null)
|
||||
return 1;
|
||||
|
||||
return Insensitive.Compare(a.Owner.RawName, b.Owner.RawName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
318
Scripts/Items/Houses/Monopoly/Items/RentalContract.cs
Normal file
318
Scripts/Items/Houses/Monopoly/Items/RentalContract.cs
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Multis;
|
||||
using Server.Items;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class RentalContract : TownHouseSign
|
||||
{
|
||||
private Mobile c_RentalMaster;
|
||||
private Mobile c_RentalClient;
|
||||
private BaseHouse c_ParentHouse;
|
||||
private bool c_Completed, c_EntireHouse;
|
||||
|
||||
public BaseHouse ParentHouse{ get{ return c_ParentHouse; } }
|
||||
public Mobile RentalClient{ get{ return c_RentalClient; } set{ c_RentalClient = value; InvalidateProperties(); } }
|
||||
public Mobile RentalMaster{ get{ return c_RentalMaster; } }
|
||||
public bool Completed{ get{ return c_Completed; } set{ c_Completed = value; } }
|
||||
public bool EntireHouse{ get{ return c_EntireHouse; } set{ c_EntireHouse = value; } }
|
||||
|
||||
public RentalContract() : base()
|
||||
{
|
||||
ItemID = 0x14F0;
|
||||
Movable = true;
|
||||
RentByTime = TimeSpan.FromDays( 1 );
|
||||
RecurRent = true;
|
||||
MaxZ = MinZ;
|
||||
}
|
||||
|
||||
public bool HasContractedArea( Rectangle2D rect, int z )
|
||||
{
|
||||
foreach( Item item in TownHouseSign.AllSigns )
|
||||
if ( item is RentalContract && item != this && item.Map == Map && c_ParentHouse == ((RentalContract)item).ParentHouse )
|
||||
foreach( Rectangle2D rect2 in ((RentalContract)item).Blocks )
|
||||
for( int x = rect.Start.X; x < rect.End.X; ++x )
|
||||
for( int y = rect.Start.Y; y < rect.End.Y; ++y )
|
||||
if ( rect2.Contains( new Point2D( x, y ) ) )
|
||||
if ( ((RentalContract)item).MinZ <= z && ((RentalContract)item).MaxZ >= z )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool HasContractedArea( int z )
|
||||
{
|
||||
foreach( Item item in TownHouseSign.AllSigns )
|
||||
if ( item is RentalContract && item != this && item.Map == Map && c_ParentHouse == ((RentalContract)item).ParentHouse )
|
||||
if ( ((RentalContract)item).MinZ <= z && ((RentalContract)item).MaxZ >= z )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void DepositTo( Mobile m )
|
||||
{
|
||||
if ( m == null )
|
||||
return;
|
||||
|
||||
if ( Free )
|
||||
{
|
||||
m.SendMessage( "Since this home is free, you do not receive the deposit." );
|
||||
return;
|
||||
}
|
||||
|
||||
m.BankBox.DropItem( new Gold( Price ) );
|
||||
m.SendMessage( "You have received a {0} gold deposit from your town house.", Price );
|
||||
}
|
||||
|
||||
public override void ValidateOwnership()
|
||||
{
|
||||
if ( c_Completed && c_RentalMaster == null )
|
||||
{
|
||||
Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( c_RentalClient != null && ( c_ParentHouse == null || c_ParentHouse.Deleted ) )
|
||||
{
|
||||
Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( c_RentalClient != null && !Owned )
|
||||
{
|
||||
Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ParentHouse == null )
|
||||
return;
|
||||
|
||||
if ( !ValidateLocSec() )
|
||||
{
|
||||
if ( DemolishTimer == null )
|
||||
BeginDemolishTimer( TimeSpan.FromHours( 48 ) );
|
||||
}
|
||||
else
|
||||
ClearDemolishTimer();
|
||||
}
|
||||
|
||||
protected override void DemolishAlert()
|
||||
{
|
||||
if ( ParentHouse == null || c_RentalMaster == null || c_RentalClient == null )
|
||||
return;
|
||||
|
||||
c_RentalMaster.SendMessage( "You have begun to use lockdowns reserved for {0}, and their rental unit will collapse in {1}.", c_RentalClient.Name, Math.Round( (DemolishTime-DateTime.Now).TotalHours, 2 ) );
|
||||
c_RentalClient.SendMessage( "Alert your land lord, {0}, they are using storage reserved for you. They have violated the rental agreement, which will end in {1} if nothing is done.", c_RentalMaster.Name, Math.Round( (DemolishTime-DateTime.Now).TotalHours, 2 ) );
|
||||
}
|
||||
|
||||
public void FixLocSec()
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
if ( (count = General.RemainingSecures( c_ParentHouse )+Secures) < Secures )
|
||||
Secures = count;
|
||||
|
||||
if ( (count = General.RemainingLocks( c_ParentHouse )+Locks) < Locks )
|
||||
Locks = count;
|
||||
}
|
||||
|
||||
public bool ValidateLocSec()
|
||||
{
|
||||
if ( General.RemainingSecures( c_ParentHouse )+Secures < Secures )
|
||||
return false;
|
||||
|
||||
if ( General.RemainingLocks( c_ParentHouse )+Locks < Locks )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void ConvertItems( bool keep )
|
||||
{
|
||||
if ( House == null || c_ParentHouse == null || c_RentalMaster == null )
|
||||
return;
|
||||
|
||||
foreach( BaseDoor door in new ArrayList( c_ParentHouse.Doors ) )
|
||||
if ( door.Map == House.Map && House.Region.Contains( door.Location ) )
|
||||
ConvertDoor( door );
|
||||
|
||||
foreach( SecureInfo info in new ArrayList( c_ParentHouse.Secures ) )
|
||||
if ( info.Item.Map == House.Map && House.Region.Contains( info.Item.Location ) )
|
||||
c_ParentHouse.Release( c_RentalMaster, info.Item );
|
||||
|
||||
foreach( Item item in new ArrayList( c_ParentHouse.LockDowns ) )
|
||||
if ( item.Map == House.Map && House.Region.Contains( item.Location ) )
|
||||
c_ParentHouse.Release( c_RentalMaster, item );
|
||||
}
|
||||
|
||||
public override void UnconvertDoors( )
|
||||
{
|
||||
if ( House == null || c_ParentHouse == null )
|
||||
return;
|
||||
|
||||
foreach( BaseDoor door in new ArrayList( House.Doors ) )
|
||||
House.Doors.Remove( door );
|
||||
}
|
||||
|
||||
protected override void OnRentPaid()
|
||||
{
|
||||
if ( c_RentalMaster == null || c_RentalClient == null )
|
||||
return;
|
||||
|
||||
if ( Free )
|
||||
return;
|
||||
|
||||
c_RentalMaster.BankBox.DropItem( new Gold( Price ) );
|
||||
c_RentalMaster.SendMessage( "The bank has transfered your rent from {0}.", c_RentalClient.Name );
|
||||
}
|
||||
|
||||
public override void ClearHouse()
|
||||
{
|
||||
if ( !Deleted )
|
||||
Delete();
|
||||
|
||||
base.ClearHouse();
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile m )
|
||||
{
|
||||
ValidateOwnership();
|
||||
|
||||
if ( Deleted )
|
||||
return;
|
||||
|
||||
if ( c_RentalMaster == null )
|
||||
c_RentalMaster = m;
|
||||
|
||||
BaseHouse house = BaseHouse.FindHouseAt( m );
|
||||
|
||||
if ( c_ParentHouse == null )
|
||||
c_ParentHouse = house;
|
||||
|
||||
if ( house == null || ( house != c_ParentHouse && house != House ) )
|
||||
{
|
||||
m.SendMessage( "You must be in the home to view this contract." );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( m == c_RentalMaster
|
||||
&& !c_Completed
|
||||
&& house is TownHouse
|
||||
&& ((TownHouse)house).ForSaleSign.PriceType != "Sale" )
|
||||
{
|
||||
c_ParentHouse = null;
|
||||
m.SendMessage( "You can only rent property you own." );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( m == c_RentalMaster && !c_Completed && General.EntireHouseContracted( c_ParentHouse ) )
|
||||
{
|
||||
m.SendMessage( "This entire house already has a rental contract." );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( c_Completed )
|
||||
new ContractConfirmGump( m, this );
|
||||
else if ( m == c_RentalMaster )
|
||||
new ContractSetupGump( m, this );
|
||||
else
|
||||
m.SendMessage( "This rental contract has not yet been completed." );
|
||||
}
|
||||
|
||||
public override void GetProperties( ObjectPropertyList list )
|
||||
{
|
||||
if ( c_RentalClient != null )
|
||||
list.Add( "a house rental contract with " + c_RentalClient.Name );
|
||||
else if ( c_Completed )
|
||||
list.Add( "a completed house rental contract" );
|
||||
else
|
||||
list.Add( "an uncompleted house rental contract" );
|
||||
}
|
||||
|
||||
public override void Delete()
|
||||
{
|
||||
if ( c_ParentHouse == null )
|
||||
{
|
||||
base.Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !Owned && !c_ParentHouse.IsFriend( c_RentalClient ) )
|
||||
{
|
||||
if ( c_RentalClient != null && c_RentalMaster != null )
|
||||
{
|
||||
c_RentalMaster.SendMessage( "{0} has ended your rental agreement. Because you revoked their access, their last payment will be refunded.", c_RentalMaster.Name );
|
||||
c_RentalClient.SendMessage( "You have ended your rental agreement with {0}. Because your access was revoked, your last payment is refunded.", c_RentalClient.Name );
|
||||
}
|
||||
|
||||
DepositTo( c_RentalClient );
|
||||
}
|
||||
else if ( Owned )
|
||||
{
|
||||
if ( c_RentalClient != null && c_RentalMaster != null )
|
||||
{
|
||||
c_RentalClient.SendMessage( "{0} has ended your rental agreement. Since they broke the contract, your are refunded the last payment.", c_RentalMaster.Name );
|
||||
c_RentalMaster.SendMessage( "You have ended your rental agreement with {0}. They will be refunded their last payment.", c_RentalClient.Name );
|
||||
}
|
||||
|
||||
DepositTo( c_RentalClient );
|
||||
|
||||
/* Fixed for Rental Loop bug */
|
||||
//PackUpHouse();
|
||||
DeleteTest();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( c_RentalClient != null && c_RentalMaster != null )
|
||||
{
|
||||
c_RentalMaster.SendMessage( "{0} has ended your rental agreement.", c_RentalClient.Name );
|
||||
c_RentalClient.SendMessage( "You have ended your rental agreement with {0}.", c_RentalMaster.Name );
|
||||
}
|
||||
|
||||
DepositTo( c_RentalMaster );
|
||||
}
|
||||
|
||||
ClearRentTimer();
|
||||
base.Delete();
|
||||
}
|
||||
|
||||
public RentalContract( Serial serial ) : base( serial )
|
||||
{
|
||||
RecurRent = true;
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 1 ); // version
|
||||
|
||||
// Version 1
|
||||
|
||||
writer.Write( c_EntireHouse );
|
||||
|
||||
writer.Write( c_RentalMaster );
|
||||
writer.Write( c_RentalClient );
|
||||
writer.Write( c_ParentHouse );
|
||||
writer.Write( c_Completed );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if ( version >= 1 )
|
||||
c_EntireHouse = reader.ReadBool();
|
||||
|
||||
c_RentalMaster = reader.ReadMobile();
|
||||
c_RentalClient = reader.ReadMobile();
|
||||
c_ParentHouse = reader.ReadItem() as BaseHouse;
|
||||
c_Completed = reader.ReadBool();
|
||||
}
|
||||
}
|
||||
}
|
||||
47
Scripts/Items/Houses/Monopoly/Items/RentalContractCopy.cs
Normal file
47
Scripts/Items/Houses/Monopoly/Items/RentalContractCopy.cs
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class RentalContractCopy : Item
|
||||
{
|
||||
private RentalContract c_Contract;
|
||||
|
||||
public RentalContractCopy( RentalContract contract )
|
||||
{
|
||||
Name = "rental contract copy";
|
||||
ItemID = 0x14F0;
|
||||
c_Contract = contract;
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile m )
|
||||
{
|
||||
if ( c_Contract == null || c_Contract.Deleted )
|
||||
{
|
||||
Delete();
|
||||
return;
|
||||
}
|
||||
|
||||
c_Contract.OnDoubleClick( m );
|
||||
}
|
||||
|
||||
public RentalContractCopy( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 1 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
53
Scripts/Items/Houses/Monopoly/Items/RentalLicense.cs
Normal file
53
Scripts/Items/Houses/Monopoly/Items/RentalLicense.cs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class RentalLicense : Item
|
||||
{
|
||||
private Mobile c_Owner;
|
||||
|
||||
public Mobile Owner{ get{ return c_Owner; } set{ c_Owner = value; InvalidateProperties(); } }
|
||||
|
||||
public RentalLicense() : base( 0x14F0 )
|
||||
{
|
||||
}
|
||||
|
||||
public override void GetProperties( ObjectPropertyList list )
|
||||
{
|
||||
if ( c_Owner != null )
|
||||
list.Add( "a renter's license belonging to " + c_Owner.Name );
|
||||
else
|
||||
list.Add( "a renter's license" );
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile m )
|
||||
{
|
||||
if ( c_Owner == null )
|
||||
c_Owner = m;
|
||||
}
|
||||
|
||||
public RentalLicense( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
|
||||
writer.Write( c_Owner );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
c_Owner = reader.ReadMobile();
|
||||
}
|
||||
}
|
||||
}
|
||||
299
Scripts/Items/Houses/Monopoly/Items/SignHammer.cs
Normal file
299
Scripts/Items/Houses/Monopoly/Items/SignHammer.cs
Normal file
|
|
@ -0,0 +1,299 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Multis;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public enum HammerJob{ Flip, Swap }
|
||||
|
||||
public class SignHammer : Item
|
||||
{
|
||||
private static Hashtable s_Table = new Hashtable();
|
||||
private static ArrayList s_List = new ArrayList();
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
// Signs
|
||||
s_Table[0xB95] = 0xB96;
|
||||
s_Table[0xB96] = 0xB95;
|
||||
s_Table[0xBA3] = 0xBA4;
|
||||
s_Table[0xBA4] = 0xBA3;
|
||||
s_Table[0xBA5] = 0xBA6;
|
||||
s_Table[0xBA6] = 0xBA5;
|
||||
s_Table[0xBA7] = 0xBA8;
|
||||
s_Table[0xBA8] = 0xBA7;
|
||||
s_Table[0xBA9] = 0xBAA;
|
||||
s_Table[0xBAA] = 0xBA9;
|
||||
s_Table[0xBAB] = 0xBAC;
|
||||
s_Table[0xBAC] = 0xBAB;
|
||||
s_Table[0xBAD] = 0xBAE;
|
||||
s_Table[0xBAE] = 0xBAD;
|
||||
s_Table[0xBAF] = 0xBB0;
|
||||
s_Table[0xBB0] = 0xBAF;
|
||||
s_Table[0xBB1] = 0xBB2;
|
||||
s_Table[0xBB2] = 0xBB1;
|
||||
s_Table[0xBB3] = 0xBB4;
|
||||
s_Table[0xBB4] = 0xBB3;
|
||||
s_Table[0xBB5] = 0xBB6;
|
||||
s_Table[0xBB6] = 0xBB5;
|
||||
s_Table[0xBB7] = 0xBB8;
|
||||
s_Table[0xBB8] = 0xBB7;
|
||||
s_Table[0xBB9] = 0xBBA;
|
||||
s_Table[0xBBA] = 0xBB9;
|
||||
s_Table[0xBBB] = 0xBBC;
|
||||
s_Table[0xBBC] = 0xBBB;
|
||||
s_Table[0xBBD] = 0xBBE;
|
||||
s_Table[0xBBE] = 0xBBD;
|
||||
s_Table[0xBBF] = 0xBC0;
|
||||
s_Table[0xBC0] = 0xBBF;
|
||||
s_Table[0xBC1] = 0xBC2;
|
||||
s_Table[0xBC2] = 0xBC1;
|
||||
s_Table[0xBC3] = 0xBC4;
|
||||
s_Table[0xBC4] = 0xBC3;
|
||||
s_Table[0xBC5] = 0xBC6;
|
||||
s_Table[0xBC6] = 0xBC5;
|
||||
s_Table[0xBC7] = 0xBC8;
|
||||
s_Table[0xBC8] = 0xBC7;
|
||||
s_Table[0xBC9] = 0xBCA;
|
||||
s_Table[0xBCA] = 0xBC9;
|
||||
s_Table[0xBCB] = 0xBCC;
|
||||
s_Table[0xBCC] = 0xBCB;
|
||||
s_Table[0xBCD] = 0xBCE;
|
||||
s_Table[0xBCE] = 0xBCD;
|
||||
s_Table[0xBCF] = 0xBD0;
|
||||
s_Table[0xBD0] = 0xBCF;
|
||||
s_Table[0xBD1] = 0xBD2;
|
||||
s_Table[0xBD2] = 0xBD1;
|
||||
s_Table[0xBD3] = 0xBD4;
|
||||
s_Table[0xBD4] = 0xBD3;
|
||||
s_Table[0xBD5] = 0xBD6;
|
||||
s_Table[0xBD6] = 0xBD5;
|
||||
s_Table[0xBD7] = 0xBD8;
|
||||
s_Table[0xBD8] = 0xBD7;
|
||||
s_Table[0xBD9] = 0xBDA;
|
||||
s_Table[0xBDA] = 0xBD9;
|
||||
s_Table[0xBDB] = 0xBDC;
|
||||
s_Table[0xBDC] = 0xBDB;
|
||||
s_Table[0xBDD] = 0xBDE;
|
||||
s_Table[0xBDE] = 0xBDD;
|
||||
s_Table[0xBDF] = 0xBE0;
|
||||
s_Table[0xBE0] = 0xBDF;
|
||||
s_Table[0xBE1] = 0xBE2;
|
||||
s_Table[0xBE2] = 0xBE1;
|
||||
s_Table[0xBE3] = 0xBE4;
|
||||
s_Table[0xBE4] = 0xBE3;
|
||||
s_Table[0xBE5] = 0xBE6;
|
||||
s_Table[0xBE6] = 0xBE5;
|
||||
s_Table[0xBE7] = 0xBE8;
|
||||
s_Table[0xBE8] = 0xBE7;
|
||||
s_Table[0xBE9] = 0xBEA;
|
||||
s_Table[0xBEA] = 0xBE9;
|
||||
s_Table[0xBEB] = 0xBEC;
|
||||
s_Table[0xBEC] = 0xBEB;
|
||||
s_Table[0xBED] = 0xBEE;
|
||||
s_Table[0xBEE] = 0xBED;
|
||||
s_Table[0xBEF] = 0xBF0;
|
||||
s_Table[0xBF0] = 0xBEF;
|
||||
s_Table[0xBF1] = 0xBF2;
|
||||
s_Table[0xBF2] = 0xBF1;
|
||||
s_Table[0xBF3] = 0xBF4;
|
||||
s_Table[0xBF4] = 0xBF3;
|
||||
s_Table[0xBF5] = 0xBF6;
|
||||
s_Table[0xBF6] = 0xBF5;
|
||||
s_Table[0xBF7] = 0xBF8;
|
||||
s_Table[0xBF8] = 0xBF7;
|
||||
s_Table[0xBF9] = 0xBFA;
|
||||
s_Table[0xBFA] = 0xBF9;
|
||||
s_Table[0xBFB] = 0xBFC;
|
||||
s_Table[0xBFC] = 0xBFB;
|
||||
s_Table[0xBFD] = 0xBFE;
|
||||
s_Table[0xBFE] = 0xBFD;
|
||||
s_Table[0xBFF] = 0xC00;
|
||||
s_Table[0xC00] = 0xBFF;
|
||||
s_Table[0xC01] = 0xC02;
|
||||
s_Table[0xC02] = 0xC01;
|
||||
s_Table[0xC03] = 0xC04;
|
||||
s_Table[0xC04] = 0xC03;
|
||||
s_Table[0xC05] = 0xC06;
|
||||
s_Table[0xC06] = 0xC05;
|
||||
s_Table[0xC07] = 0xC08;
|
||||
s_Table[0xC08] = 0xC07;
|
||||
s_Table[0xC09] = 0xC0A;
|
||||
s_Table[0xC0A] = 0xC09;
|
||||
s_Table[0xC0B] = 0xC0C;
|
||||
s_Table[0xC0C] = 0xC0B;
|
||||
s_Table[0xC0D] = 0xC0E;
|
||||
s_Table[0xC0E] = 0xC0D;
|
||||
|
||||
// Hangers
|
||||
s_Table[0xB97] = 0xB98;
|
||||
s_Table[0xB98] = 0xB97;
|
||||
s_Table[0xB99] = 0xB9A;
|
||||
s_Table[0xB9A] = 0xB99;
|
||||
s_Table[0xB9B] = 0xB9C;
|
||||
s_Table[0xB9C] = 0xB9B;
|
||||
s_Table[0xB9D] = 0xB9E;
|
||||
s_Table[0xB9E] = 0xB9D;
|
||||
s_Table[0xB9F] = 0xBA0;
|
||||
s_Table[0xBA0] = 0xB9F;
|
||||
s_Table[0xBA1] = 0xBA2;
|
||||
s_Table[0xBA2] = 0xBA1;
|
||||
|
||||
// Hangers for swapping
|
||||
s_List.Add(0xB97);
|
||||
s_List.Add(0xB98);
|
||||
s_List.Add(0xB99);
|
||||
s_List.Add(0xB9A);
|
||||
s_List.Add(0xB9B);
|
||||
s_List.Add(0xB9C);
|
||||
s_List.Add(0xB9D);
|
||||
s_List.Add(0xB9E);
|
||||
s_List.Add(0xB9F);
|
||||
s_List.Add(0xBA0);
|
||||
s_List.Add(0xBA1);
|
||||
s_List.Add(0xBA2);
|
||||
}
|
||||
|
||||
private HammerJob c_Job;
|
||||
|
||||
public HammerJob Job { get { return c_Job; } set { c_Job = value; } }
|
||||
|
||||
[Constructable]
|
||||
public SignHammer()
|
||||
: base(0x13E3)
|
||||
{
|
||||
Name = "Sign Hammer";
|
||||
}
|
||||
|
||||
public int GetFlipFor(int id)
|
||||
{
|
||||
return (s_Table[id] == null ? id : (int)s_Table[id]);
|
||||
}
|
||||
|
||||
public int GetNextSign(int id)
|
||||
{
|
||||
if (!s_List.Contains(id))
|
||||
return id;
|
||||
|
||||
int idx = s_List.IndexOf(id);
|
||||
|
||||
if (idx + 2 < s_List.Count)
|
||||
return (int)s_List[idx + 2];
|
||||
|
||||
if (idx % 2 == 0)
|
||||
return (int)s_List[0];
|
||||
|
||||
return (int)s_List[1];
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (RootParent != m)
|
||||
{
|
||||
m.SendMessage("That item must be in your backpack to use.");
|
||||
return;
|
||||
}
|
||||
|
||||
BaseHouse house = BaseHouse.FindHouseAt(m);
|
||||
|
||||
if (m.AccessLevel == AccessLevel.Player && (house == null || house.Owner != m))
|
||||
{
|
||||
m.SendMessage("You have to be inside your house to use this.");
|
||||
return;
|
||||
}
|
||||
|
||||
m.BeginTarget(3, false, TargetFlags.None, new TargetCallback(OnTarget));
|
||||
}
|
||||
|
||||
protected void OnTarget(Mobile m, object obj)
|
||||
{
|
||||
Item item = obj as Item;
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
m.SendMessage("You cannot change that with this.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (item == this)
|
||||
{
|
||||
new SignHammerGump(m, this);
|
||||
return;
|
||||
}
|
||||
|
||||
if (c_Job == HammerJob.Flip)
|
||||
{
|
||||
int id = GetFlipFor(item.ItemID);
|
||||
|
||||
if (id == item.ItemID)
|
||||
m.SendMessage("You cannot change that with this.");
|
||||
else
|
||||
item.ItemID = id;
|
||||
}
|
||||
else
|
||||
{
|
||||
int id = GetNextSign(item.ItemID);
|
||||
|
||||
if (id == item.ItemID)
|
||||
m.SendMessage("You cannot change that with this.");
|
||||
else
|
||||
item.ItemID = id;
|
||||
}
|
||||
}
|
||||
|
||||
public SignHammer(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
|
||||
public class SignHammerGump : GumpPlusLight
|
||||
{
|
||||
private SignHammer c_Hammer;
|
||||
|
||||
public SignHammerGump( Mobile m, SignHammer hammer ) : base( m, 100, 100 )
|
||||
{
|
||||
c_Hammer = hammer;
|
||||
|
||||
NewGump();
|
||||
}
|
||||
|
||||
protected override void BuildGump()
|
||||
{
|
||||
AddBackground(0, 0, 200, 200, 2600);
|
||||
|
||||
AddButton(50, 45, 2152, 2154, "Swap", new GumpCallback(Swap));
|
||||
AddHtml( 90, 50, 70, "Swap Hanger");
|
||||
|
||||
AddButton( 50, 95, 2152, 2154, "Flip", new GumpCallback( Flip ) );
|
||||
AddHtml( 90, 100, 70, "Flip Sign or Hanger");
|
||||
}
|
||||
|
||||
private void Swap()
|
||||
{
|
||||
c_Hammer.Job = HammerJob.Swap;
|
||||
}
|
||||
|
||||
private void Flip()
|
||||
{
|
||||
c_Hammer.Job = HammerJob.Flip;
|
||||
}
|
||||
}
|
||||
}
|
||||
259
Scripts/Items/Houses/Monopoly/Items/TownHouse.cs
Normal file
259
Scripts/Items/Houses/Monopoly/Items/TownHouse.cs
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Multis;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class TownHouse : VersionHouse
|
||||
{
|
||||
private static ArrayList s_TownHouses = new ArrayList();
|
||||
public static ArrayList AllTownHouses{ get{ return s_TownHouses; } }
|
||||
|
||||
private TownHouseSign c_Sign;
|
||||
private Item c_Hanger;
|
||||
private ArrayList c_Sectors = new ArrayList();
|
||||
|
||||
public TownHouseSign ForSaleSign { get { return c_Sign; } }
|
||||
|
||||
public Item Hanger
|
||||
{
|
||||
get
|
||||
{
|
||||
if ( c_Hanger == null )
|
||||
{
|
||||
c_Hanger = new Item( 0xB98 );
|
||||
c_Hanger.Movable = false;
|
||||
c_Hanger.Location = Sign.Location;
|
||||
c_Hanger.Map = Sign.Map;
|
||||
}
|
||||
|
||||
return c_Hanger;
|
||||
}
|
||||
set{ c_Hanger = value; }
|
||||
}
|
||||
|
||||
public TownHouse( Mobile m, TownHouseSign sign, int locks, int secures ) : base( 0x1DD6 | 0x4000, m, locks, secures )
|
||||
{
|
||||
c_Sign = sign;
|
||||
|
||||
SetSign( 0, 0, 0 );
|
||||
|
||||
s_TownHouses.Add( this );
|
||||
}
|
||||
|
||||
public void InitSectorDefinition()
|
||||
{
|
||||
if (c_Sign == null || c_Sign.Blocks.Count == 0)
|
||||
return;
|
||||
|
||||
int minX = ((Rectangle2D)c_Sign.Blocks[0]).Start.X;
|
||||
int minY = ((Rectangle2D)c_Sign.Blocks[0]).Start.Y;
|
||||
int maxX = ((Rectangle2D)c_Sign.Blocks[0]).End.X;
|
||||
int maxY = ((Rectangle2D)c_Sign.Blocks[0]).End.Y;
|
||||
|
||||
foreach( Rectangle2D rect in c_Sign.Blocks )
|
||||
{
|
||||
if ( rect.Start.X < minX )
|
||||
minX = rect.Start.X;
|
||||
if ( rect.Start.Y < minY )
|
||||
minY = rect.Start.Y;
|
||||
if ( rect.End.X > maxX )
|
||||
maxX = rect.End.X;
|
||||
if ( rect.End.Y > maxY )
|
||||
maxY = rect.End.Y;
|
||||
}
|
||||
|
||||
foreach (Sector sector in c_Sectors)
|
||||
sector.OnMultiLeave(this);
|
||||
|
||||
c_Sectors.Clear();
|
||||
for (int x = minX; x < maxX; ++x)
|
||||
for (int y = minY; y < maxY; ++y)
|
||||
if(!c_Sectors.Contains(Map.GetSector(new Point2D(x, y))))
|
||||
c_Sectors.Add(Map.GetSector(new Point2D(x, y)));
|
||||
|
||||
foreach (Sector sector in c_Sectors)
|
||||
sector.OnMultiEnter(this);
|
||||
|
||||
Components.Resize(maxX - minX, maxY - minY);
|
||||
Components.Add(0x520, Components.Width - 1, Components.Height - 1, -5);
|
||||
}
|
||||
|
||||
public override Rectangle2D[] Area
|
||||
{
|
||||
get
|
||||
{
|
||||
if (c_Sign == null)
|
||||
return new Rectangle2D[100];
|
||||
|
||||
Rectangle2D[] rects = new Rectangle2D[c_Sign.Blocks.Count];
|
||||
|
||||
for (int i = 0; i < c_Sign.Blocks.Count && i < rects.Length; ++i)
|
||||
rects[i] = (Rectangle2D)c_Sign.Blocks[i];
|
||||
|
||||
return rects;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool IsInside( Point3D p, int height )
|
||||
{
|
||||
if (c_Sign == null)
|
||||
return false;
|
||||
|
||||
if ( Map == null || Region == null )
|
||||
{
|
||||
Delete();
|
||||
return false;
|
||||
}
|
||||
|
||||
Sector sector = null;
|
||||
|
||||
try
|
||||
{
|
||||
if (c_Sign is RentalContract && Region.Contains(p))
|
||||
return true;
|
||||
|
||||
sector = Map.GetSector(p);
|
||||
|
||||
foreach (BaseMulti m in sector.Multis)
|
||||
{
|
||||
if (m != this
|
||||
&& m is TownHouse
|
||||
&& ((TownHouse)m).ForSaleSign is RentalContract
|
||||
&& ((TownHouse)m).IsInside(p, height))
|
||||
return false;
|
||||
}
|
||||
|
||||
return Region.Contains(p);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Errors.Report("Error occured in IsInside(). More information on the console.");
|
||||
Console.WriteLine("Info:{0}, {1}, {2}", Map, sector, Region, sector != null ? "" + sector.Multis : "**");
|
||||
Console.WriteLine(e.Source);
|
||||
Console.WriteLine(e.Message);
|
||||
Console.WriteLine(e.StackTrace);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override int GetNewVendorSystemMaxVendors()
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
|
||||
public override int GetAosMaxSecures()
|
||||
{
|
||||
return MaxSecures;
|
||||
}
|
||||
|
||||
public override int GetAosMaxLockdowns()
|
||||
{
|
||||
return MaxLockDowns;
|
||||
}
|
||||
|
||||
public override void OnMapChange()
|
||||
{
|
||||
base.OnMapChange();
|
||||
|
||||
if ( c_Hanger != null )
|
||||
c_Hanger.Map = Map;
|
||||
}
|
||||
|
||||
public override void OnLocationChange( Point3D oldLocation )
|
||||
{
|
||||
base.OnLocationChange( oldLocation );
|
||||
|
||||
if ( c_Hanger != null )
|
||||
c_Hanger.Location = Sign.Location;
|
||||
}
|
||||
|
||||
public override void OnSpeech( SpeechEventArgs e )
|
||||
{
|
||||
if ( e.Mobile != Owner || !IsInside( e.Mobile ) )
|
||||
return;
|
||||
|
||||
if (e.Speech.ToLower() == "check house rent")
|
||||
c_Sign.CheckRentTimer();
|
||||
|
||||
Timer.DelayCall(TimeSpan.Zero, new TimerStateCallback(AfterSpeech), e.Mobile);
|
||||
}
|
||||
|
||||
private void AfterSpeech(object o)
|
||||
{
|
||||
if (!(o is Mobile))
|
||||
return;
|
||||
|
||||
if (((Mobile)o).Target is HouseBanTarget && ForSaleSign != null && ForSaleSign.NoBanning)
|
||||
{
|
||||
((Mobile)o).Target.Cancel((Mobile)o, TargetCancelType.Canceled);
|
||||
((Mobile)o).SendMessage(0x161, "You cannot ban people from this house.");
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDelete()
|
||||
{
|
||||
if (c_Hanger != null)
|
||||
c_Hanger.Delete();
|
||||
|
||||
foreach (Item item in Sign.GetItemsInRange(0))
|
||||
if (item != Sign)
|
||||
item.Visible = true;
|
||||
|
||||
c_Sign.ClearHouse();
|
||||
Doors.Clear();
|
||||
|
||||
s_TownHouses.Remove(this);
|
||||
|
||||
base.OnDelete();
|
||||
}
|
||||
|
||||
public TownHouse(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
s_TownHouses.Add(this);
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( 3 );
|
||||
|
||||
// Version 2
|
||||
|
||||
writer.Write( c_Hanger );
|
||||
|
||||
// Version 1
|
||||
|
||||
writer.Write( c_Sign );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if ( version >= 2 )
|
||||
c_Hanger = reader.ReadItem();
|
||||
|
||||
c_Sign = (TownHouseSign)reader.ReadItem();
|
||||
|
||||
if (version <= 2)
|
||||
{
|
||||
int count = reader.ReadInt();
|
||||
for (int i = 0; i < count; ++i)
|
||||
reader.ReadRect2D();
|
||||
}
|
||||
|
||||
if( Price == 0 )
|
||||
Price = 1;
|
||||
|
||||
ItemID = 0x1DD6 | 0x4000;
|
||||
}
|
||||
}
|
||||
}
|
||||
1334
Scripts/Items/Houses/Monopoly/Items/TownHouseSign.cs
Normal file
1334
Scripts/Items/Houses/Monopoly/Items/TownHouseSign.cs
Normal file
File diff suppressed because it is too large
Load diff
36
Scripts/Items/Houses/Monopoly/Misc/CommandInfo.cs
Normal file
36
Scripts/Items/Houses/Monopoly/Misc/CommandInfo.cs
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public delegate void TownHouseCommandHandler(CommandInfo info);
|
||||
|
||||
public class CommandInfo
|
||||
{
|
||||
private Mobile c_Mobile;
|
||||
private string c_Command;
|
||||
private string c_ArgString;
|
||||
private string[] c_Arguments;
|
||||
|
||||
public Mobile Mobile { get { return c_Mobile; } }
|
||||
public string Command { get { return c_Command; } }
|
||||
public string ArgString { get { return c_ArgString; } }
|
||||
public string[] Arguments { get { return c_Arguments; } }
|
||||
|
||||
public CommandInfo(Mobile m, string com, string args, string[] arglist)
|
||||
{
|
||||
c_Mobile = m;
|
||||
c_Command = com;
|
||||
c_ArgString = args;
|
||||
c_Arguments = arglist;
|
||||
}
|
||||
|
||||
public string GetString(int num)
|
||||
{
|
||||
if (c_Arguments.Length > num)
|
||||
return c_Arguments[num];
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
64
Scripts/Items/Houses/Monopoly/Misc/DecoreItemInfo.cs
Normal file
64
Scripts/Items/Houses/Monopoly/Misc/DecoreItemInfo.cs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class DecoreItemInfo
|
||||
{
|
||||
private string c_TypeString;
|
||||
private string c_Name;
|
||||
private int c_ItemID;
|
||||
private int c_Hue;
|
||||
private Point3D c_Location;
|
||||
private Map c_Map;
|
||||
|
||||
public string TypeString{ get{ return c_TypeString; } }
|
||||
public string Name{ get{ return c_Name; } }
|
||||
public int ItemID{ get{ return c_ItemID; } }
|
||||
public int Hue{ get{ return c_Hue; } }
|
||||
public Point3D Location{ get{ return c_Location; } }
|
||||
public Map Map{ get{ return c_Map; } }
|
||||
|
||||
public DecoreItemInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public DecoreItemInfo( string typestring, string name, int itemid, int hue, Point3D loc, Map map )
|
||||
{
|
||||
c_TypeString = typestring;
|
||||
c_ItemID = itemid;
|
||||
c_Location = loc;
|
||||
c_Map = map;
|
||||
}
|
||||
|
||||
public void Save( GenericWriter writer )
|
||||
{
|
||||
writer.Write( (int)1 ); // Version
|
||||
|
||||
// Version 1
|
||||
writer.Write( c_Hue );
|
||||
writer.Write( c_Name );
|
||||
|
||||
writer.Write( c_TypeString );
|
||||
writer.Write( c_ItemID );
|
||||
writer.Write( c_Location );
|
||||
writer.Write( c_Map );
|
||||
}
|
||||
|
||||
public void Load( GenericReader reader )
|
||||
{
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if ( version >= 1 )
|
||||
{
|
||||
c_Hue = reader.ReadInt();
|
||||
c_Name = reader.ReadString();
|
||||
}
|
||||
|
||||
c_TypeString = reader.ReadString();
|
||||
c_ItemID = reader.ReadInt();
|
||||
c_Location = reader.ReadPoint3D();
|
||||
c_Map = reader.ReadMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
217
Scripts/Items/Houses/Monopoly/Misc/General.cs
Normal file
217
Scripts/Items/Houses/Monopoly/Misc/General.cs
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
// Check PackUpHouse() for that crash on item delete. It causes a crash in RemoveMulti (Core)
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Multis;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class General
|
||||
{
|
||||
public static string Version{ get { return "2.01"; } }
|
||||
|
||||
// This setting determines the suggested gold value for a single square of a home
|
||||
// which then derives price, lockdowns and secures.
|
||||
public static int SuggestionFactor { get{ return 600; } }
|
||||
|
||||
// This setting determines if players need License in order to rent out their property
|
||||
public static bool RequireRenterLicense{ get{ return false; } }
|
||||
|
||||
public static void Configure()
|
||||
{
|
||||
EventSink.WorldSave += new WorldSaveEventHandler( OnSave );
|
||||
}
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
EventSink.Login += new LoginEventHandler( OnLogin );
|
||||
EventSink.Speech += new SpeechEventHandler( HandleSpeech );
|
||||
EventSink.ServerStarted += new ServerStartedEventHandler( OnStarted );
|
||||
}
|
||||
|
||||
private static void OnStarted()
|
||||
{
|
||||
foreach (TownHouse house in TownHouse.AllTownHouses)
|
||||
{
|
||||
house.InitSectorDefinition();
|
||||
RUOVersion.UpdateRegion(house.ForSaleSign);
|
||||
}
|
||||
}
|
||||
|
||||
public static void OnSave( WorldSaveEventArgs e )
|
||||
{
|
||||
foreach( TownHouseSign sign in new ArrayList( TownHouseSign.AllSigns ) )
|
||||
sign.ValidateOwnership();
|
||||
|
||||
foreach( TownHouse house in new ArrayList( TownHouse.AllTownHouses ) )
|
||||
if ( house.Deleted )
|
||||
{
|
||||
TownHouse.AllTownHouses.Remove( house );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnLogin( LoginEventArgs e )
|
||||
{
|
||||
foreach( BaseHouse house in BaseHouse.GetHouses( e.Mobile ) )
|
||||
if ( house is TownHouse )
|
||||
((TownHouse)house).ForSaleSign.CheckDemolishTimer();
|
||||
}
|
||||
|
||||
private static void HandleSpeech( SpeechEventArgs e )
|
||||
{
|
||||
ArrayList houses = new ArrayList(BaseHouse.GetHouses( e.Mobile ));
|
||||
|
||||
if ( houses == null )
|
||||
return;
|
||||
|
||||
foreach( BaseHouse house in houses )
|
||||
{
|
||||
if (!RUOVersion.RegionContains(house.Region, e.Mobile))
|
||||
continue;
|
||||
|
||||
if ( house is TownHouse )
|
||||
house.OnSpeech( e );
|
||||
|
||||
if ( house.Owner == e.Mobile
|
||||
&& e.Speech.ToLower() == "create rental contract"
|
||||
&& CanRent( e.Mobile, house, true ) )
|
||||
{
|
||||
e.Mobile.AddToBackpack( new RentalContract() );
|
||||
e.Mobile.SendMessage( "A rental contract has been placed in your bag." );
|
||||
}
|
||||
|
||||
if ( house.Owner == e.Mobile
|
||||
&& e.Speech.ToLower() == "check storage" )
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
e.Mobile.SendMessage( "You have {0} lockdowns and {1} secures available.", RemainingSecures( house ), RemainingLocks( house ) );
|
||||
|
||||
if ( (count = AllRentalLocks( house )) != 0 )
|
||||
e.Mobile.SendMessage( "Current rentals are using {0} of your lockdowns.", count );
|
||||
if ( (count = AllRentalSecures( house )) != 0 )
|
||||
e.Mobile.SendMessage( "Current rentals are using {0} of your secures.", count );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool CanRent( Mobile m, BaseHouse house, bool say )
|
||||
{
|
||||
if ( house is TownHouse && ((TownHouse)house).ForSaleSign.PriceType != "Sale" )
|
||||
{
|
||||
if ( say )
|
||||
m.SendMessage( "You must own your property to rent it." );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( RequireRenterLicense )
|
||||
{
|
||||
RentalLicense lic = m.Backpack.FindItemByType( typeof( RentalLicense ) ) as RentalLicense;
|
||||
|
||||
if ( lic != null && lic.Owner == null )
|
||||
lic.Owner = m;
|
||||
|
||||
if ( lic == null || lic.Owner != m )
|
||||
{
|
||||
if ( say )
|
||||
m.SendMessage( "You must have a renter's license to rent your property." );
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( EntireHouseContracted( house ) )
|
||||
{
|
||||
if ( say )
|
||||
m.SendMessage( "This entire house already has a rental contract." );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( RemainingSecures( house ) < 0 || RemainingLocks( house ) < 0 )
|
||||
{
|
||||
if ( say )
|
||||
m.SendMessage( "You don't have the storage available to rent property." );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#region Rental Info
|
||||
|
||||
public static bool EntireHouseContracted( BaseHouse house )
|
||||
{
|
||||
foreach( Item item in TownHouseSign.AllSigns )
|
||||
if ( item is RentalContract && house == ((RentalContract)item).ParentHouse )
|
||||
if ( ((RentalContract)item).EntireHouse )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool HasContract( BaseHouse house )
|
||||
{
|
||||
foreach( Item item in TownHouseSign.AllSigns )
|
||||
if ( item is RentalContract && house == ((RentalContract)item).ParentHouse )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool HasOtherContract( BaseHouse house, RentalContract contract )
|
||||
{
|
||||
foreach( Item item in TownHouseSign.AllSigns )
|
||||
if ( item is RentalContract && item != contract && house == ((RentalContract)item).ParentHouse )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int RemainingSecures( BaseHouse house )
|
||||
{
|
||||
if ( house == null )
|
||||
return 0;
|
||||
|
||||
int a, b, c, d;
|
||||
|
||||
return (Core.AOS ? house.GetAosMaxSecures() - house.GetAosCurSecures( out a, out b, out c, out d ) : house.MaxSecures - house.SecureCount) - AllRentalSecures( house );
|
||||
}
|
||||
|
||||
public static int RemainingLocks( BaseHouse house )
|
||||
{
|
||||
if ( house == null )
|
||||
return 0;
|
||||
|
||||
return (Core.AOS ? house.GetAosMaxLockdowns() - house.GetAosCurLockdowns() : house.MaxLockDowns - house.LockDownCount) - AllRentalLocks( house );
|
||||
}
|
||||
|
||||
public static int AllRentalSecures( BaseHouse house )
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
foreach( TownHouseSign sign in TownHouseSign.AllSigns )
|
||||
if ( sign is RentalContract && ((RentalContract)sign).ParentHouse == house )
|
||||
count+=sign.Secures;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public static int AllRentalLocks( BaseHouse house )
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
foreach( TownHouseSign sign in TownHouseSign.AllSigns )
|
||||
if ( sign is RentalContract && ((RentalContract)sign).ParentHouse == house )
|
||||
count+=sign.Locks;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
167
Scripts/Items/Houses/Monopoly/Misc/GumpResponse.cs
Normal file
167
Scripts/Items/Houses/Monopoly/Misc/GumpResponse.cs
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Network;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class GumpResponse
|
||||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
Timer.DelayCall(TimeSpan.Zero, new TimerCallback(AfterInit));
|
||||
}
|
||||
|
||||
private static void AfterInit()
|
||||
{
|
||||
PacketHandlers.Register(0xB1, 0, true, new OnPacketReceive(DisplayGumpResponse));
|
||||
}
|
||||
|
||||
public static void DisplayGumpResponse(NetState state, PacketReader pvSrc)
|
||||
{
|
||||
int serial = pvSrc.ReadInt32();
|
||||
int typeID = pvSrc.ReadInt32();
|
||||
int buttonID = pvSrc.ReadInt32();
|
||||
|
||||
/* Fixed for SVN */
|
||||
//List<Gump> gumps = state.Gumps;
|
||||
List<Gump> gumps = ((List<Gump>)state.Gumps);
|
||||
|
||||
for (int i = 0; i < gumps.Count; ++i)
|
||||
{
|
||||
Gump gump = gumps[i];
|
||||
|
||||
if (gump.Serial == serial && gump.TypeID == typeID)
|
||||
{
|
||||
int switchCount = pvSrc.ReadInt32();
|
||||
|
||||
if (switchCount < 0)
|
||||
{
|
||||
Console.WriteLine("Client: {0}: Invalid gump response, disconnecting...", state);
|
||||
state.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
int[] switches = new int[switchCount];
|
||||
|
||||
for (int j = 0; j < switches.Length; ++j)
|
||||
switches[j] = pvSrc.ReadInt32();
|
||||
|
||||
int textCount = pvSrc.ReadInt32();
|
||||
|
||||
if (textCount < 0)
|
||||
{
|
||||
Console.WriteLine("Client: {0}: Invalid gump response, disconnecting...", state);
|
||||
state.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
TextRelay[] textEntries = new TextRelay[textCount];
|
||||
|
||||
for (int j = 0; j < textEntries.Length; ++j)
|
||||
{
|
||||
int entryID = pvSrc.ReadUInt16();
|
||||
int textLength = pvSrc.ReadUInt16();
|
||||
|
||||
if (textLength > 239)
|
||||
return;
|
||||
|
||||
string text = pvSrc.ReadUnicodeStringSafe(textLength);
|
||||
textEntries[j] = new TextRelay(entryID, text);
|
||||
}
|
||||
|
||||
state.RemoveGump(i);
|
||||
|
||||
if (!CheckResponse(gump, state.Mobile, buttonID))
|
||||
return;
|
||||
|
||||
gump.OnResponse(state, new RelayInfo(buttonID, switches, textEntries));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool CheckResponse(Gump gump, Mobile m, int id)
|
||||
{
|
||||
if (m == null || !m.Player)
|
||||
return true;
|
||||
|
||||
TownHouse th = null;
|
||||
|
||||
ArrayList list = new ArrayList();
|
||||
foreach (Item item in m.GetItemsInRange(20))
|
||||
if (item is TownHouse)
|
||||
list.Add(item);
|
||||
|
||||
foreach (TownHouse t in list)
|
||||
if (t.Owner == m)
|
||||
{
|
||||
th = t;
|
||||
break;
|
||||
}
|
||||
|
||||
if (th == null || th.ForSaleSign == null)
|
||||
return true;
|
||||
|
||||
if (gump is HouseGumpAOS)
|
||||
{
|
||||
int val = id - 1;
|
||||
|
||||
if (val < 0)
|
||||
return true;
|
||||
|
||||
int type = val % 15;
|
||||
int index = val / 15;
|
||||
|
||||
if (th.ForSaleSign.ForcePublic && type == 3 && index == 12 && th.Public)
|
||||
{
|
||||
m.SendMessage("This house cannot be private.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (th.ForSaleSign.ForcePrivate && type == 3 && index == 13 && !th.Public)
|
||||
{
|
||||
m.SendMessage("This house cannot be public.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (th.ForSaleSign.NoTrade && type == 6 && index == 1)
|
||||
{
|
||||
m.SendMessage("This house cannot be traded.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (gump is HouseGump)
|
||||
{
|
||||
if (th.ForSaleSign.ForcePublic && id == 17 && th.Public)
|
||||
{
|
||||
m.SendMessage("This house cannot be private.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (th.ForSaleSign.ForcePrivate && id == 17 && !th.Public)
|
||||
{
|
||||
m.SendMessage("This house cannot be public.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (th.ForSaleSign.NoTrade && id == 14)
|
||||
{
|
||||
m.SendMessage("This house cannot be traded.");
|
||||
m.SendGump(gump);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
137
Scripts/Items/Houses/Monopoly/RUOVersion.cs
Normal file
137
Scripts/Items/Houses/Monopoly/RUOVersion.cs
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
* The two lines following this entry specify what RunUO version you are running.
|
||||
* In order to switch to RunUO 1.0 Final, remove the '//' in front of that setting
|
||||
* and add '//' in front of '#define RunUO_2_RC1'. Warning: If you comment both
|
||||
* out, many commands in this system will not work. Enjoy!
|
||||
*/
|
||||
|
||||
#define RunUO_2_RC1
|
||||
//#define RunUO_1_Final
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Multis;
|
||||
using Server.Network;
|
||||
|
||||
#if (RunUO_2_RC1)
|
||||
using Server.Commands;
|
||||
#endif
|
||||
|
||||
namespace Knives.TownHouses
|
||||
{
|
||||
public class RUOVersion
|
||||
{
|
||||
private static Hashtable s_Commands = new Hashtable();
|
||||
|
||||
public static void AddCommand(string com, AccessLevel acc, TownHouseCommandHandler cch)
|
||||
{
|
||||
s_Commands[com.ToLower()] = cch;
|
||||
|
||||
#if(RunUO_1_Final)
|
||||
Server.Commands.Register(com, acc, new CommandEventHandler(OnCommand));
|
||||
#elif(RunUO_2_RC1)
|
||||
Server.Commands.CommandSystem.Register(com, acc, new CommandEventHandler(OnCommand));
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void OnCommand(CommandEventArgs e)
|
||||
{
|
||||
if (s_Commands[e.Command.ToLower()] == null)
|
||||
return;
|
||||
|
||||
((TownHouseCommandHandler)s_Commands[e.Command.ToLower()])(new CommandInfo(e.Mobile, e.Command, e.ArgString, e.Arguments));
|
||||
}
|
||||
|
||||
public static void UpdateRegion(TownHouseSign sign)
|
||||
{
|
||||
if (sign.House == null)
|
||||
return;
|
||||
|
||||
#if(RunUO_1_Final)
|
||||
sign.House.Region.Coords = new ArrayList(sign.Blocks);
|
||||
sign.House.Region.MinZ = sign.MinZ;
|
||||
sign.House.Region.MaxZ = sign.MaxZ;
|
||||
sign.House.Region.Unregister();
|
||||
sign.House.Region.Register();
|
||||
sign.House.Region.GoLocation = sign.BanLoc;
|
||||
#elif(RunUO_2_RC1)
|
||||
sign.House.UpdateRegion();
|
||||
|
||||
Rectangle3D rect = new Rectangle3D(Point3D.Zero, Point3D.Zero);
|
||||
|
||||
for (int i = 0; i < sign.House.Region.Area.Length; ++i)
|
||||
{
|
||||
rect = sign.House.Region.Area[i];
|
||||
rect = new Rectangle3D(new Point3D(rect.Start.X - sign.House.X, rect.Start.Y - sign.House.Y, sign.MinZ), new Point3D(rect.End.X - sign.House.X, rect.End.Y - sign.House.Y, sign.MaxZ));
|
||||
sign.House.Region.Area[i] = rect;
|
||||
}
|
||||
|
||||
sign.House.Region.Unregister();
|
||||
sign.House.Region.Register();
|
||||
sign.House.Region.GoLocation = sign.BanLoc;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
public static bool RegionContains(Region region, Mobile m)
|
||||
{
|
||||
#if(RunUO_1_Final)
|
||||
return region.Mobiles.Contains(m);
|
||||
#elif(RunUO_2_RC1)
|
||||
return region.GetMobiles().Contains(m);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static Rectangle3D[] RegionArea(Region region)
|
||||
{
|
||||
#if(RunUO_1_Final)
|
||||
|
||||
Rectangle3D[] rects = new Rectangle3D[region.Coords.Count];
|
||||
Rectangle2D rect = new Rectangle2D(Point2D.Zero, Point2D.Zero);
|
||||
|
||||
for (int i = 0; i < rects.Length && i < region.Coords.Count; ++i)
|
||||
{
|
||||
rect = (Rectangle2D)region.Coords[i];
|
||||
rects[i] = new Rectangle3D(new Point3D(rect.Start.X, rect.Start.Y, region.MinZ), new Point3D(rect.End.X, rect.End.Y, region.MaxZ));
|
||||
}
|
||||
|
||||
return rects;
|
||||
|
||||
#elif(RunUO_2_RC1)
|
||||
return region.Area;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public class VersionHouse : BaseHouse
|
||||
{
|
||||
public VersionHouse(int id, Mobile m, int locks, int secures)
|
||||
: base(id, m, locks, secures)
|
||||
{
|
||||
}
|
||||
|
||||
public override Rectangle2D[] Area { get { return new Rectangle2D[5]; } }
|
||||
|
||||
#if(RunUO_2_RC1)
|
||||
|
||||
public override Point3D BaseBanLocation { get { return Point3D.Zero; } }
|
||||
|
||||
#endif
|
||||
|
||||
public VersionHouse(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
106
Scripts/Items/Houses/StaticHouse.cs
Normal file
106
Scripts/Items/Houses/StaticHouse.cs
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Multis;
|
||||
|
||||
namespace Server.Custom.StaticHousing
|
||||
{
|
||||
public class StaticHouse : BaseHouse
|
||||
{
|
||||
private Rectangle2D m_CustomArea;
|
||||
private int m_MinZ;
|
||||
private int m_MaxZ;
|
||||
private int m_CustomLockdowns;
|
||||
private int m_CustomSecures;
|
||||
|
||||
public override Rectangle2D[] Area
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Rectangle2D[] { new Rectangle2D(0, 0, m_CustomArea.Width, m_CustomArea.Height) };
|
||||
}
|
||||
}
|
||||
|
||||
public override Point3D BaseBanLocation
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Sign != null)
|
||||
return new Point3D(Sign.X, Sign.Y + 1, Sign.Z);
|
||||
|
||||
return Point3D.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
public override double BonusStorageScalar { get { return 1.0; } }
|
||||
|
||||
public StaticHouse(Mobile owner, Rectangle2D area, int minZ, int maxZ, int locks, int secures, int price)
|
||||
: base(0xA28, owner, locks, secures)
|
||||
{
|
||||
RestrictDecay = true;
|
||||
|
||||
m_CustomArea = area;
|
||||
m_MinZ = minZ;
|
||||
m_MaxZ = maxZ;
|
||||
|
||||
m_CustomLockdowns = locks;
|
||||
m_CustomSecures = secures;
|
||||
|
||||
MaxLockDowns = locks;
|
||||
MaxSecures = secures;
|
||||
|
||||
Price = price;
|
||||
|
||||
Components.Resize(area.Width, area.Height);
|
||||
Components.Add(0x520, area.Width - 1, area.Height - 1, -5);
|
||||
|
||||
SetSign(0, 0, 0);
|
||||
}
|
||||
|
||||
public StaticHouse(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override int GetAosMaxLockdowns() { return m_CustomLockdowns; }
|
||||
public override int GetAosMaxSecures() { return m_CustomSecures; }
|
||||
|
||||
public override bool IsInside(Point3D p, int height)
|
||||
{
|
||||
if (Deleted) return false;
|
||||
|
||||
if (!m_CustomArea.Contains(new Point2D(p.X, p.Y)))
|
||||
return false;
|
||||
|
||||
if (p.Z >= m_MinZ && (p.Z + height) <= m_MaxZ)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write((int)0);
|
||||
|
||||
writer.Write(m_CustomArea);
|
||||
writer.Write(m_MinZ);
|
||||
writer.Write(m_MaxZ);
|
||||
writer.Write(m_CustomLockdowns);
|
||||
writer.Write(m_CustomSecures);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
m_CustomArea = reader.ReadRect2D();
|
||||
m_MinZ = reader.ReadInt();
|
||||
m_MaxZ = reader.ReadInt();
|
||||
m_CustomLockdowns = reader.ReadInt();
|
||||
m_CustomSecures = reader.ReadInt();
|
||||
|
||||
Components.Resize(m_CustomArea.Width, m_CustomArea.Height);
|
||||
Components.Add(0x520, m_CustomArea.Width - 1, m_CustomArea.Height - 1, -5);
|
||||
}
|
||||
}
|
||||
}
|
||||
147
Scripts/Items/Houses/StaticHouseSign.cs
Normal file
147
Scripts/Items/Houses/StaticHouseSign.cs
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Custom.StaticHousing
|
||||
{
|
||||
public class StaticHouseSign : Item
|
||||
{
|
||||
private Rectangle2D m_HouseArea;
|
||||
private int m_MinZ;
|
||||
private int m_MaxZ;
|
||||
private int m_Price;
|
||||
private int m_CustomLockdowns;
|
||||
private int m_CustomSecures;
|
||||
|
||||
public Rectangle2D HouseArea { get { return m_HouseArea; } }
|
||||
public int MinZ { get { return m_MinZ; } }
|
||||
public int MaxZ { get { return m_MaxZ; } }
|
||||
public int Price { get { return m_Price; } }
|
||||
public int CustomLockdowns { get { return m_CustomLockdowns; } }
|
||||
public int CustomSecures { get { return m_CustomSecures; } }
|
||||
|
||||
[Constructable]
|
||||
public StaticHouseSign(int itemID, Rectangle2D area, int minZ, int maxZ, int price, int locks, int secures) : base(itemID)
|
||||
{
|
||||
Name = "A Vacant House For Sale";
|
||||
Movable = false;
|
||||
|
||||
m_HouseArea = area;
|
||||
m_MinZ = minZ;
|
||||
m_MaxZ = maxZ;
|
||||
m_Price = price;
|
||||
m_CustomLockdowns = locks;
|
||||
m_CustomSecures = secures;
|
||||
}
|
||||
|
||||
public StaticHouseSign(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
{
|
||||
base.GetProperties(list);
|
||||
list.Add(1060658, "Price\t{0} Gold", m_Price);
|
||||
list.Add(1060659, "Lockdowns\t{0}", m_CustomLockdowns);
|
||||
list.Add(1060660, "Secures\t{0}", m_CustomSecures);
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
if (!from.InRange(GetWorldLocation(), 3))
|
||||
{
|
||||
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
|
||||
return;
|
||||
}
|
||||
|
||||
if (from is PlayerMobile)
|
||||
{
|
||||
from.SendGump(new StaticPurchaseGump((PlayerMobile)from, this));
|
||||
}
|
||||
}
|
||||
|
||||
public void Purchase(PlayerMobile pm)
|
||||
{
|
||||
if (Deleted) return;
|
||||
|
||||
if (Banker.Withdraw(pm, m_Price))
|
||||
{
|
||||
StaticHouse newHouse = new StaticHouse(pm, m_HouseArea, m_MinZ, m_MaxZ, m_CustomLockdowns, m_CustomSecures, m_Price);
|
||||
|
||||
Point3D houseLoc = new Point3D(m_HouseArea.Start.X, m_HouseArea.Start.Y, m_MinZ);
|
||||
newHouse.MoveToWorld(houseLoc, this.Map);
|
||||
|
||||
if (newHouse.Sign != null)
|
||||
newHouse.Sign.Location = this.Location;
|
||||
|
||||
newHouse.BanLocation = new Point3D(this.X, this.Y + 1, this.Z);
|
||||
|
||||
pm.PlaySound(0x249);
|
||||
pm.SendMessage(68, $"You have purchased this home for {m_Price} gold.");
|
||||
|
||||
this.Delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
pm.SendMessage(33, $"You need {m_Price} gold in your bank to purchase this home.");
|
||||
}
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write((int)0);
|
||||
writer.Write(m_HouseArea);
|
||||
writer.Write(m_MinZ);
|
||||
writer.Write(m_MaxZ);
|
||||
writer.Write(m_Price);
|
||||
writer.Write(m_CustomLockdowns);
|
||||
writer.Write(m_CustomSecures);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
m_HouseArea = reader.ReadRect2D();
|
||||
m_MinZ = reader.ReadInt();
|
||||
m_MaxZ = reader.ReadInt();
|
||||
m_Price = reader.ReadInt();
|
||||
m_CustomLockdowns = reader.ReadInt();
|
||||
m_CustomSecures = reader.ReadInt();
|
||||
}
|
||||
|
||||
private class StaticPurchaseGump : Gump
|
||||
{
|
||||
private PlayerMobile m_Player;
|
||||
private StaticHouseSign m_Sign;
|
||||
|
||||
public StaticPurchaseGump(PlayerMobile pm, StaticHouseSign sign) : base(200, 200)
|
||||
{
|
||||
m_Player = pm;
|
||||
m_Sign = sign;
|
||||
|
||||
AddPage(0);
|
||||
AddBackground(0, 0, 300, 150, 9270);
|
||||
AddHtml(0, 15, 300, 20, "<CENTER><BASEFONT COLOR=#FFFFFF>Purchase Property?</BASEFONT></CENTER>", false, false);
|
||||
AddHtml(20, 50, 260, 40, $"<BASEFONT COLOR=#FFFFFF>This will deduct {sign.Price} gold from your bank box.</BASEFONT>", false, false);
|
||||
|
||||
AddButton(40, 100, 4005, 4007, 1, GumpButtonType.Reply, 0);
|
||||
AddHtml(75, 100, 100, 20, "<BASEFONT COLOR=#FFFFFF>Confirm</BASEFONT>", false, false);
|
||||
|
||||
AddButton(160, 100, 4005, 4007, 0, GumpButtonType.Reply, 0);
|
||||
AddHtml(195, 100, 100, 20, "<BASEFONT COLOR=#FFFFFF>Cancel</BASEFONT>", false, false);
|
||||
}
|
||||
|
||||
public override void OnResponse(NetState sender, RelayInfo info)
|
||||
{
|
||||
if (info.ButtonID == 1 && m_Sign != null && !m_Sign.Deleted)
|
||||
{
|
||||
m_Sign.Purchase(m_Player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Custom.StaticHousing;
|
||||
|
||||
namespace Server.Scripts.Custom
|
||||
{
|
||||
|
|
@ -9,9 +11,6 @@ namespace Server.Scripts.Custom
|
|||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
// Timer.DelayCall parameters: (Initial Delay, Interval between runs, Method to call)
|
||||
// We give the server 1 minute to finish booting up before running the first sweep,
|
||||
// then it runs exactly every 1 hour after that.
|
||||
Timer.DelayCall(TimeSpan.FromMinutes(1), TimeSpan.FromHours(1), new TimerCallback(ExecuteTasks));
|
||||
|
||||
Console.WriteLine("TasksManager: Hourly automated tasks initialized.");
|
||||
|
|
@ -25,20 +24,98 @@ namespace Server.Scripts.Custom
|
|||
{
|
||||
ClearSpawnedTraps();
|
||||
}
|
||||
CheckStaticHouses();
|
||||
}
|
||||
|
||||
// FUTURE TASKS:
|
||||
// Just add new methods here as your server grows!
|
||||
// Example: ClearAbandonedTents();
|
||||
// Example: AnnounceHourlyLottery();
|
||||
private static void CheckStaticHouses()
|
||||
{
|
||||
string filePath = Path.Combine(Core.BaseDirectory, "Data", "Config", "statichouses.cfg");
|
||||
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
Console.WriteLine("TasksManager: Error - Data/Config/statichouses.cfg not found!");
|
||||
return;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
|
||||
using (StreamReader ip = new StreamReader(filePath))
|
||||
{
|
||||
string line;
|
||||
while ((line = ip.ReadLine()) != null)
|
||||
{
|
||||
line = line.Trim();
|
||||
if (line.Length == 0 || line.StartsWith("#")) continue;
|
||||
|
||||
string[] split = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (split.Length >= 13)
|
||||
{
|
||||
try
|
||||
{
|
||||
Map map = Map.Parse(split[0]);
|
||||
Point3D signLoc = new Point3D(int.Parse(split[1]), int.Parse(split[2]), int.Parse(split[3]));
|
||||
|
||||
Point2D start = new Point2D(int.Parse(split[4]), int.Parse(split[5]));
|
||||
Point2D end = new Point2D(start.X + int.Parse(split[6]), start.Y + int.Parse(split[7]));
|
||||
Rectangle2D area = new Rectangle2D(start, end);
|
||||
|
||||
int minZ = int.Parse(split[8]);
|
||||
int maxZ = int.Parse(split[9]);
|
||||
int price = int.Parse(split[10]);
|
||||
int locks = int.Parse(split[11]);
|
||||
int secures = int.Parse(split[12]);
|
||||
|
||||
int itemID = 0xC0B;
|
||||
if (split.Length >= 14)
|
||||
{
|
||||
if (split[13].StartsWith("0x", StringComparison.OrdinalIgnoreCase))
|
||||
itemID = Convert.ToInt32(split[13], 16);
|
||||
else
|
||||
itemID = int.Parse(split[13]);
|
||||
}
|
||||
|
||||
if (map != null && !CheckForExistingHouse(map, signLoc))
|
||||
{
|
||||
StaticHouseSign sign = new StaticHouseSign(itemID, area, minZ, maxZ, price, locks, secures);
|
||||
sign.MoveToWorld(signLoc, map);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error parsing statichouses.cfg line: {line}\n{ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
Console.WriteLine($"TasksManager: Respawned {count} missing Static House signs.");
|
||||
}
|
||||
|
||||
private static bool CheckForExistingHouse(Map map, Point3D loc)
|
||||
{
|
||||
bool exists = false;
|
||||
IPooledEnumerable eable = map.GetItemsInRange(loc, 0);
|
||||
|
||||
foreach (Item item in eable)
|
||||
{
|
||||
if (item is StaticHouseSign || item is Server.Multis.HouseSign)
|
||||
{
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
return exists;
|
||||
}
|
||||
|
||||
private static void ClearSpawnedTraps()
|
||||
{
|
||||
// We must put them in a list first. If we delete them while actively
|
||||
// searching the World.Items dictionary, it will cause a crash.
|
||||
List<Item> trapsToDelete = new List<Item>();
|
||||
|
||||
// Scan the entire world for any item that acts as a floor trap
|
||||
foreach (Item item in World.Items.Values)
|
||||
{
|
||||
if (item is BaseTrap)
|
||||
|
|
@ -47,7 +124,6 @@ namespace Server.Scripts.Custom
|
|||
}
|
||||
}
|
||||
|
||||
// Loop through our safe list and delete them all
|
||||
foreach (Item trap in trapsToDelete)
|
||||
{
|
||||
trap.Delete();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue