mirror of
https://github.com/ServUO/ServUO
synced 2026-08-11 20:23:04 -04:00
- Fixed exploit with Mysterious Wisp outside dungeon Despise. It now works according to EA. - Added in Publish 109 store and 23rd Anniversary Items (Thanks @argalep) Co-authored-by: TrueUO <knight.daniel.r@gmail.com>
301 lines
9.3 KiB
C#
301 lines
9.3 KiB
C#
using System;
|
||
|
||
namespace Server.Items
|
||
{
|
||
public enum MiniHouseType
|
||
{
|
||
StoneAndPlaster,
|
||
FieldStone,
|
||
SmallBrick,
|
||
Wooden,
|
||
WoodAndPlaster,
|
||
ThatchedRoof,
|
||
Brick,
|
||
TwoStoryWoodAndPlaster,
|
||
TwoStoryStoneAndPlaster,
|
||
Tower,
|
||
SmallStoneKeep,
|
||
Castle,
|
||
LargeHouseWithPatio,
|
||
MarbleHouseWithPatio,
|
||
SmallStoneTower,
|
||
TwoStoryLogCabin,
|
||
TwoStoryVilla,
|
||
SandstoneHouseWithPatio,
|
||
SmallStoneWorkshop,
|
||
SmallMarbleWorkshop,
|
||
#region Veteran Rewards
|
||
MalasMountainPass,
|
||
ChurchAtNight,
|
||
#endregion
|
||
RobinsNest,
|
||
TheSpires
|
||
}
|
||
|
||
public class MiniHouseAddonComponent : AddonComponent
|
||
{
|
||
private MiniHouseType Type { get; set; }
|
||
|
||
public override int LabelNumber => ((MiniHouseAddon)Addon).LabelNumber;
|
||
|
||
public MiniHouseAddonComponent(int itemID)
|
||
: base(itemID)
|
||
{
|
||
}
|
||
|
||
public MiniHouseAddonComponent(Serial serial)
|
||
: base(serial)
|
||
{
|
||
}
|
||
|
||
public override void Serialize(GenericWriter writer)
|
||
{
|
||
base.Serialize(writer);
|
||
writer.Write(0); // version
|
||
|
||
writer.Write((int)Type);
|
||
}
|
||
|
||
public override void Deserialize(GenericReader reader)
|
||
{
|
||
base.Deserialize(reader);
|
||
reader.ReadInt();
|
||
|
||
Type = (MiniHouseType)reader.ReadInt();
|
||
}
|
||
}
|
||
|
||
public class MiniHouseAddon : BaseAddon
|
||
{
|
||
public override int LabelNumber => MiniHouseInfo.GetInfo(m_Type).LabelNumber;
|
||
|
||
private MiniHouseType m_Type;
|
||
|
||
[CommandProperty(AccessLevel.GameMaster)]
|
||
public MiniHouseType Type
|
||
{
|
||
get { return m_Type; }
|
||
set
|
||
{
|
||
m_Type = value;
|
||
Construct();
|
||
}
|
||
}
|
||
|
||
[Constructable]
|
||
public MiniHouseAddon()
|
||
: this(MiniHouseType.StoneAndPlaster)
|
||
{
|
||
}
|
||
|
||
[Constructable]
|
||
public MiniHouseAddon(MiniHouseType type)
|
||
{
|
||
m_Type = type;
|
||
Construct();
|
||
}
|
||
|
||
public MiniHouseAddon(Serial serial)
|
||
: base(serial)
|
||
{
|
||
}
|
||
|
||
public override BaseAddonDeed Deed => new MiniHouseDeed(m_Type);
|
||
|
||
public void Construct()
|
||
{
|
||
foreach (AddonComponent c in Components)
|
||
{
|
||
c.Addon = null;
|
||
c.Delete();
|
||
}
|
||
|
||
Components.Clear();
|
||
|
||
MiniHouseInfo info = MiniHouseInfo.GetInfo(m_Type);
|
||
|
||
int size = (int)Math.Sqrt(info.Graphics.Length);
|
||
int num = 0;
|
||
|
||
for (int y = 0; y < size; ++y)
|
||
for (int x = 0; x < size; ++x)
|
||
if (info.Graphics[num] != 0x1) // Veteran Rewards Mod
|
||
AddComponent(new MiniHouseAddonComponent(info.Graphics[num++]), size - x - 1, size - y - 1, 0);
|
||
}
|
||
|
||
public override void Serialize(GenericWriter writer)
|
||
{
|
||
base.Serialize(writer);
|
||
writer.Write(1); // version
|
||
|
||
writer.Write((int)m_Type);
|
||
}
|
||
|
||
public override void Deserialize(GenericReader reader)
|
||
{
|
||
base.Deserialize(reader);
|
||
int version = reader.ReadInt();
|
||
|
||
switch (version)
|
||
{
|
||
case 1:
|
||
case 0:
|
||
{
|
||
m_Type = (MiniHouseType)reader.ReadInt();
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (version == 0)
|
||
Timer.DelayCall(TimeSpan.FromSeconds(30.0), Construct);
|
||
}
|
||
}
|
||
|
||
public class MiniHouseDeed : BaseAddonDeed
|
||
{
|
||
public override int LabelNumber
|
||
{
|
||
get
|
||
{
|
||
switch (m_Type)
|
||
{
|
||
case MiniHouseType.MalasMountainPass:
|
||
return 1062692; // Mini House: Contest Winning House Design
|
||
case MiniHouseType.ChurchAtNight:
|
||
return 1072216; // Mini House: Contest 2004 Winning House Design
|
||
case MiniHouseType.RobinsNest:
|
||
return 1159527; // Mini Keep - Robin's Nest
|
||
case MiniHouseType.TheSpires:
|
||
return 1159526; // Mini Castle - The Spires
|
||
default:
|
||
return 1062096; // a mini house deed
|
||
}
|
||
}
|
||
}
|
||
|
||
private MiniHouseType m_Type;
|
||
|
||
[CommandProperty(AccessLevel.GameMaster)]
|
||
public MiniHouseType Type
|
||
{
|
||
get { return m_Type; }
|
||
set
|
||
{
|
||
m_Type = value;
|
||
InvalidateProperties();
|
||
}
|
||
}
|
||
|
||
public override BaseAddon Addon => new MiniHouseAddon(m_Type);
|
||
|
||
[Constructable]
|
||
public MiniHouseDeed()
|
||
: this(MiniHouseType.StoneAndPlaster)
|
||
{
|
||
}
|
||
|
||
[Constructable]
|
||
public MiniHouseDeed(MiniHouseType type)
|
||
{
|
||
m_Type = type;
|
||
Weight = 1.0;
|
||
LootType = LootType.Blessed;
|
||
}
|
||
|
||
public MiniHouseDeed(Serial serial)
|
||
: base(serial)
|
||
{
|
||
}
|
||
|
||
public override void GetProperties(ObjectPropertyList list)
|
||
{
|
||
base.GetProperties(list);
|
||
|
||
list.Add(MiniHouseInfo.GetInfo(m_Type).LabelNumber);
|
||
}
|
||
|
||
public override void Serialize(GenericWriter writer)
|
||
{
|
||
base.Serialize(writer);
|
||
writer.Write(0); // version
|
||
|
||
writer.Write((int)m_Type);
|
||
}
|
||
|
||
public override void Deserialize(GenericReader reader)
|
||
{
|
||
base.Deserialize(reader);
|
||
int version = reader.ReadInt();
|
||
|
||
switch (version)
|
||
{
|
||
case 0:
|
||
{
|
||
m_Type = (MiniHouseType)reader.ReadInt();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public class MiniHouseInfo
|
||
{
|
||
public static MiniHouseInfo[] Info { get; } = new MiniHouseInfo[]
|
||
{
|
||
/* Stone and plaster house */ new MiniHouseInfo(0x22C4, 1, 1011303),
|
||
/* Field stone house */ new MiniHouseInfo(0x22DE, 1, 1011304),
|
||
/* Small brick house */ new MiniHouseInfo(0x22DF, 1, 1011305),
|
||
/* Wooden house */ new MiniHouseInfo(0x22C9, 1, 1011306),
|
||
/* Wood and plaster house */ new MiniHouseInfo(0x22E0, 1, 1011307),
|
||
/* Thatched-roof cottage */ new MiniHouseInfo(0x22E1, 1, 1011308),
|
||
/* Brick house */ new MiniHouseInfo(1011309, 0x22CD, 0x22CB, 0x22CC, 0x22CA),
|
||
/* Two-story wood and plaster house */ new MiniHouseInfo(1011310, 0x2301, 0x2302, 0x2304, 0x2303),
|
||
/* Two-story stone and plaster house */ new MiniHouseInfo(1011311, 0x22FC, 0x22FD, 0x22FF, 0x22FE),
|
||
/* Tower */ new MiniHouseInfo(1011312, 0x22F7, 0x22F8, 0x22FA, 0x22F9),
|
||
/* Small stone keep */ new MiniHouseInfo(0x22E6, 9, 1011313),
|
||
/* Castle */ new MiniHouseInfo(1011314, 0x22CE, 0x22D0, 0x22D2, 0x22D7, 0x22CF, 0x22D1, 0x22D4, 0x22D9, 0x22D3, 0x22D5, 0x22D6, 0x22DB, 0x22D8, 0x22DA, 0x22DC, 0x22DD),
|
||
/* Large house with patio */ new MiniHouseInfo(0x22E2, 4, 1011315),
|
||
/* Marble house with patio */ new MiniHouseInfo(0x22EF, 4, 1011316),
|
||
/* Small stone tower */ new MiniHouseInfo(0x22F5, 1, 1011317),
|
||
/* Two-story log cabin */ new MiniHouseInfo(0x22FB, 1, 1011318),
|
||
/* Two-story villa */ new MiniHouseInfo(0x2300, 1, 1011319),
|
||
/* Sandstone house with patio */ new MiniHouseInfo(0x22F3, 1, 1011320),
|
||
/* Small stone workshop */ new MiniHouseInfo(0x22F6, 1, 1011321),
|
||
/* Small marble workshop */ new MiniHouseInfo(0x22F4, 1, 1011322),
|
||
/* Malas Mountain Pass */ new MiniHouseInfo(1062692, 0x2316, 0x2315, 0x2314, 0x2313),
|
||
/* Church At Night */ new MiniHouseInfo(1072215, 0x2318, 0x2317, 0x2319, 0x1),
|
||
/* Robin’s Nest */ new MiniHouseInfo(1126529, 0xA609, 0xA60A, 0xA60C, 0xA60B, 0xA60D, 0xA60F, 0xA60E, 0xA610, 0xA611),
|
||
/* The Spires */ new MiniHouseInfo(1126538, 0xA612, 0xA613, 0xA615, 0xA614, 0xA616, 0xA618, 0xA617, 0xA619, 0xA61A)
|
||
};
|
||
|
||
public MiniHouseInfo(int start, int count, int labelNumber)
|
||
{
|
||
Graphics = new int[count];
|
||
|
||
for (int i = 0; i < count; ++i)
|
||
Graphics[i] = start + i;
|
||
|
||
LabelNumber = labelNumber;
|
||
}
|
||
|
||
public MiniHouseInfo(int labelNumber, params int[] graphics)
|
||
{
|
||
LabelNumber = labelNumber;
|
||
Graphics = graphics;
|
||
}
|
||
|
||
public int[] Graphics { get; }
|
||
|
||
public int LabelNumber { get; }
|
||
|
||
public static MiniHouseInfo GetInfo(MiniHouseType type)
|
||
{
|
||
int v = (int)type;
|
||
|
||
if (v < 0 || v >= Info.Length)
|
||
v = 0;
|
||
|
||
return Info[v];
|
||
}
|
||
}
|
||
}
|