423 lines
8.8 KiB
C#
423 lines
8.8 KiB
C#
#region References
|
|
using System;
|
|
using System.Linq;
|
|
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Multis;
|
|
#endregion
|
|
|
|
namespace Knives.TownHouses
|
|
{
|
|
public class RentalContract : TownHouseSign
|
|
{
|
|
private Mobile c_RentalMaster;
|
|
private Mobile c_RentalClient;
|
|
private BaseHouse c_ParentHouse;
|
|
|
|
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; set; }
|
|
public bool EntireHouse { get; set; }
|
|
|
|
public RentalContract()
|
|
{
|
|
ItemID = 0x14F0;
|
|
Movable = true;
|
|
RentByTime = TimeSpan.FromDays(1);
|
|
RecurRent = true;
|
|
MaxZ = MinZ;
|
|
}
|
|
|
|
public bool HasContractedArea(Rectangle2D rect, int z)
|
|
{
|
|
foreach (Item item in AllSigns)
|
|
{
|
|
if (item is RentalContract && item != this && item.Map == Map && c_ParentHouse == ((RentalContract)item).ParentHouse)
|
|
{
|
|
foreach (Rectangle2D rect2 in ((RentalContract)item).Blocks)
|
|
{
|
|
for (var x = rect.Start.X; x < rect.End.X; ++x)
|
|
{
|
|
for (var 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 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 (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.UtcNow).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.UtcNow).TotalHours, 2));
|
|
}
|
|
|
|
public void FixLocSec()
|
|
{
|
|
var 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 c_ParentHouse.Doors.OfType<BaseDoor>().ToArray())
|
|
{
|
|
if (door.Map == House.Map && House.Region.Contains(door.Location))
|
|
{
|
|
ConvertDoor(door);
|
|
}
|
|
}
|
|
|
|
foreach (SecureInfo info in c_ParentHouse.Secures.ToArray())
|
|
{
|
|
if (info.Item.Map == House.Map && House.Region.Contains(info.Item.Location))
|
|
{
|
|
c_ParentHouse.Release(c_RentalMaster, info.Item);
|
|
}
|
|
}
|
|
|
|
foreach (Item item in c_ParentHouse.LockDowns.Keys.ToArray())
|
|
{
|
|
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 House.Doors.OfType<BaseDoor>().ToArray())
|
|
{
|
|
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;
|
|
}
|
|
|
|
var 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 && !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 && !Completed && General.EntireHouseContracted(c_ParentHouse))
|
|
{
|
|
m.SendMessage("This entire house already has a rental contract.");
|
|
return;
|
|
}
|
|
|
|
if (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 (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);
|
|
|
|
PackUpHouse();
|
|
}
|
|
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(1); // version
|
|
|
|
// Version 1
|
|
|
|
writer.Write(EntireHouse);
|
|
|
|
writer.Write(c_RentalMaster);
|
|
writer.Write(c_RentalClient);
|
|
writer.Write(c_ParentHouse);
|
|
writer.Write(Completed);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
|
|
var version = reader.ReadInt();
|
|
|
|
if (version >= 1)
|
|
{
|
|
EntireHouse = reader.ReadBool();
|
|
}
|
|
|
|
c_RentalMaster = reader.ReadMobile();
|
|
c_RentalClient = reader.ReadMobile();
|
|
c_ParentHouse = reader.ReadItem() as BaseHouse;
|
|
Completed = reader.ReadBool();
|
|
}
|
|
}
|
|
}
|