#W# Removed bak file.

This commit is contained in:
WarrentyExpired 2026-08-23 14:09:46 -04:00
parent c43e016662
commit 66c963c885

View file

@ -1,352 +0,0 @@
using System;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Custom.InnRooms;
using Server.Multis;
using System.Collections.Generic;
using Server.ContextMenus;
namespace Server.Custom.InnRooms
{
public class InnDoor : Item
{
private Mobile m_Renter;
private InnRoomHouse m_House;
private DateTime m_RentExpires;
// Where is the void room located?
private Point3D m_RoomLocation;
private Map m_RoomMap;
[CommandProperty(AccessLevel.GameMaster)]
public bool ForceEviction
{ get { return false; } set { if (value == true) { EvictTenant(); } } }
// Configuration
private int m_RentCost = 5000; // 5,000 gold per week
private TimeSpan m_RentDuration = TimeSpan.FromDays(7); // 1 week
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Renter { get { return m_Renter; } set { m_Renter = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public Point3D RoomLocation { get { return m_RoomLocation; } set { m_RoomLocation = value; } }
[CommandProperty(AccessLevel.GameMaster)]
public Map RoomMap { get { return m_RoomMap; } set { m_RoomMap = value; } }
[Constructable]
public InnDoor() : this(0x6E5)
{
}
[Constructable]
public InnDoor(int itemID) : base(itemID) // Standard wooden door graphic
{
Movable = false;
Name = "A Vacant Inn Room";
}
public InnDoor(Serial serial) : base(serial)
{
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{
from.LocalOverheadMessage(Server.Network.MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
// SCENARIO A: The room is VACANT
if (m_Renter == null)
{
if (RoomLocation == Point3D.Zero || RoomMap == null)
{
from.SendMessage(33, "This door is out of order (No Room Linked).");
return;
}
if (from.Backpack != null && from.Backpack.ConsumeTotal(typeof(Gold), m_RentCost))
{
// Rent the room!
m_Renter = from;
m_RentExpires = DateTime.UtcNow + m_RentDuration;
Name = from.Name + "'s Inn Room";
// Spawn the invisible house controller in the void room
m_House = new InnRoomHouse(from);
//m_House.MoveToWorld(RoomLocation, RoomMap);
// BURY THE STAIRCASE! We spawn the house 20 Z-levels beneath the actual floor.
Point3D buriedLocation = new Point3D(RoomLocation.X, RoomLocation.Y, RoomLocation.Z - 20);
m_House.MoveToWorld(buriedLocation, RoomMap);
from.PlaySound(0x249);
from.SendMessage(68, $"You have rented this room for {m_RentDuration.Days} days.");
TeleportToRoom(from);
}
else
{
from.SendMessage(33, $"You need {m_RentCost} gold in your backpack to rent this room.");
}
}
// SCENARIO B: The room is RENTED
else
{
// Check if the rent has expired
if (DateTime.UtcNow > m_RentExpires)
{
EvictTenant();
from.SendMessage(33, "The rent expired and the room has been cleared. It is now vacant.");
return;
}
// Check Access using your BaseHouse logic!
if (m_House != null && (m_House.IsOwner(from) || m_House.IsFriend(from) || m_House.HasAccess(from)))
{
TeleportToRoom(from);
}
else
{
from.SendMessage(33, "The door is locked and you do not have permission to enter.");
}
}
}
private void TeleportToRoom(Mobile m)
{
m.PlaySound(0x1EA);
m.MoveToWorld(RoomLocation, RoomMap);
m.SendMessage(0x3B2, "You enter the inn room.");
}
public void EvictTenant()
{
if (m_Renter != null && m_House != null && !m_House.Deleted)
{
// 1. Locate the player's bank box
BankBox bank = m_Renter.BankBox;
if (bank != null)
{
// 2. Spawn our heavy-duty moving crate
InnEvictionCrate crate = new InnEvictionCrate();
// 3. Pack up all Secured Containers
// We must iterate backward (Count - 1 to 0) when removing things from lists!
for (int i = m_House.Secures.Count - 1; i >= 0; --i)
{
SecureInfo info = m_House.Secures[i] as SecureInfo;
if (info != null && info.Item != null)
{
Container secureContainer = info.Item;
secureContainer.IsSecure = false;
secureContainer.IsLockedDown = false;
secureContainer.Movable = true;
// Drop the entire secured bag/chest into the crate
crate.DropItem(secureContainer);
}
}
m_House.Secures.Clear();
// 4. Pack up all individual Locked Down Items
for (int i = m_House.LockDowns.Count - 1; i >= 0; --i)
{
Item item = m_House.LockDowns[i] as Item;
if (item != null)
{
item.IsLockedDown = false;
item.Movable = true;
// Drop the loose item into the crate
crate.DropItem(item);
}
}
m_House.LockDowns.Clear();
// 5. Deliver the crate to the bank!
if (crate.Items.Count > 0)
{
// Using DropItem forces it into the bank, bypassing standard bank limits
bank.DropItem(crate);
m_Renter.SendMessage(33, "Your inn room rent has expired. Your belongings have been packed into a crate and placed in your bank box.");
}
else
{
// If they didn't have any items in the room, just delete the empty crate
crate.Delete();
}
}
// 6. Demolish the invisible house controller
m_House.Delete();
}
// 7. Reset the door so a new player can rent it
m_Renter = null;
m_House = null;
Name = "A Vacant Inn Room";
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (m_Renter != null)
{
list.Add(1060658, "Rent Cost\tPaid"); // ~1_val~: ~2_val~
list.Add(1060659, "Expires\t{0}", m_RentExpires.ToString("g")); // ~1_val~: ~2_val~
}
else
{
list.Add(1060658, "Rent Cost\t{0} Gold", m_RentCost); // ~1_val~: ~2_val~
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(m_Renter);
writer.WriteItem(m_House);
writer.Write(m_RentExpires);
writer.Write(m_RoomLocation);
writer.Write(m_RoomMap);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_Renter = reader.ReadMobile();
m_House = reader.ReadItem() as InnRoomHouse;
m_RentExpires = reader.ReadDateTime();
m_RoomLocation = reader.ReadPoint3D();
m_RoomMap = reader.ReadMap();
}
// --- 1. THE CONTEXT MENU MENU OVERRIDE ---
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
{
base.GetContextMenuEntries(from, list);
// Only the active renter gets the option to renew
if (from.Alive && m_Renter == from)
{
// 1062400 is the UO Client Cliloc for "Renew Contract"
list.Add(new RenewRentEntry(from, this));
}
}
// --- 2. THE CONTEXT MENU ACTION LOGIC ---
private class RenewRentEntry : ContextMenuEntry
{
private Mobile m_From;
private InnDoor m_Door;
// The '2' is the interaction range
public RenewRentEntry(Mobile from, InnDoor door) : base(1034309, 2)
{
m_From = from;
m_Door = door;
}
public override void OnClick()
{
if (m_Door.Deleted || m_Door.Renter != m_From)
return;
// Check their backpack for the gold
if (m_From.Backpack != null && m_From.Backpack.ConsumeTotal(typeof(Gold), m_Door.m_RentCost))
{
// Add 7 days to their current expiration time
m_Door.m_RentExpires += m_Door.m_RentDuration;
m_From.PlaySound(0x249); // Coin jingle sound
m_From.SendMessage(68, $"You have paid {m_Door.m_RentCost} gold to extend your rent.");
m_From.SendMessage(68, $"Your room is now paid until: {m_Door.m_RentExpires.ToString("g")}");
m_Door.InvalidateProperties(); // Updates the door's mouse-over text
}
else
{
m_From.SendMessage(33, $"You need {m_Door.m_RentCost} gold in your backpack to renew this room.");
}
}
}
// --- 3. BONUS: DRAG AND DROP RENEWAL ---
public override bool OnDragDrop(Mobile from, Item dropped)
{
// If the renter drops gold directly onto the door...
if (from == m_Renter && dropped is Gold)
{
if (dropped.Amount == m_RentCost)
{
dropped.Delete(); // Consume the gold
m_RentExpires += m_RentDuration;
from.PlaySound(0x249);
from.SendMessage(68, $"You hand the gold to the landlord and extend your rent.");
from.SendMessage(68, $"Your room is now paid until: {m_RentExpires.ToString("g")}");
InvalidateProperties();
return true;
}
else
{
from.SendMessage(33, $"You must drop exactly {m_RentCost} gold on the door to renew it.");
return false; // Rejects the drop and bounces the gold back to their cursor
}
}
return base.OnDragDrop(from, dropped);
}
}
public class InnEvictionCrate : WoodenBox
{
public override int DefaultMaxItems { get { return 500; } }
public override int DefaultMaxWeight { get { return 5000; } }
[Constructable]
public InnEvictionCrate()
{
Name = "Evicted Inn Room Belongings";
Hue = 33; // Bright red
}
public InnEvictionCrate(Serial serial) : base(serial) { }
// 1. This prevents players from putting anything INTO the crate
public override bool CheckHold(Mobile m, Item item, bool message, bool checkItems, int plusItems, int plusWeight)
{
if (m.AccessLevel < AccessLevel.GameMaster)
{
if (message)
m.SendLocalizedMessage(1061145); // "You cannot place items into a house moving crate."
return false;
}
return base.CheckHold(m, item, message, checkItems, plusItems, plusWeight);
}
// 2. This makes the crate automatically vanish once the player empties it
public override void OnItemRemoved(Item item)
{
base.OnItemRemoved(item);
if (this.TotalItems == 0)
{
Delete();
}
}
public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int)0); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); }
}
}