v0.0.1-Alpha (#42)

This commit is contained in:
Kamron Batman 2019-08-02 18:16:11 -07:00 committed by GitHub
parent d30f93c454
commit a36796c2c1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3552 changed files with 2476 additions and 15223 deletions

View file

@ -0,0 +1,278 @@
namespace Server.Items
{
[Flippable(0x1BD7, 0x1BDA)]
public class Board : Item, ICommodity
{
private CraftResource m_Resource;
[Constructible]
public Board(int amount = 1)
: this(CraftResource.RegularWood, amount)
{
}
public Board(Serial serial)
: base(serial)
{
}
[Constructible]
public Board(CraftResource resource, int amount = 1)
: base(0x1BD7)
{
Stackable = true;
Amount = amount;
m_Resource = resource;
Hue = CraftResources.GetHue(resource);
}
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
m_Resource = value;
InvalidateProperties();
}
}
int ICommodity.DescriptionNumber
{
get
{
if (m_Resource >= CraftResource.OakWood && m_Resource <= CraftResource.YewWood)
return 1075052 + ((int)m_Resource - (int)CraftResource.OakWood);
switch (m_Resource)
{
case CraftResource.Bloodwood: return 1075055;
case CraftResource.Frostwood: return 1075056;
case CraftResource.Heartwood: return 1075062; //WHY Osi. Why?
}
return LabelNumber;
}
}
bool ICommodity.IsDeedable => true;
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (!CraftResources.IsStandard(m_Resource))
{
int num = CraftResources.GetLocalizationNumber(m_Resource);
if (num > 0)
list.Add(num);
else
list.Add(CraftResources.GetName(m_Resource));
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(3);
writer.Write((int)m_Resource);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 3:
case 2:
{
m_Resource = (CraftResource)reader.ReadInt();
break;
}
}
if (version == 0 && Weight == 0.1 || version <= 2 && Weight == 2)
Weight = -1;
if (version <= 1)
m_Resource = CraftResource.RegularWood;
}
}
public class HeartwoodBoard : Board
{
[Constructible]
public HeartwoodBoard(int amount = 1)
: base(CraftResource.Heartwood, amount)
{
}
public HeartwoodBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BloodwoodBoard : Board
{
[Constructible]
public BloodwoodBoard(int amount = 1)
: base(CraftResource.Bloodwood, amount)
{
}
public BloodwoodBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class FrostwoodBoard : Board
{
[Constructible]
public FrostwoodBoard(int amount = 1)
: base(CraftResource.Frostwood, amount)
{
}
public FrostwoodBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class OakBoard : Board
{
[Constructible]
public OakBoard(int amount = 1)
: base(CraftResource.OakWood, amount)
{
}
public OakBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class AshBoard : Board
{
[Constructible]
public AshBoard(int amount = 1)
: base(CraftResource.AshWood, amount)
{
}
public AshBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class YewBoard : Board
{
[Constructible]
public YewBoard(int amount = 1)
: base(CraftResource.YewWood, amount)
{
}
public YewBoard(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,528 @@
using System;
using Server.Mobiles;
using Server.Multis;
using Server.Targeting;
namespace Server.Items
{
[Flippable(0x1EBA, 0x1EBB)]
public class TaxidermyKit : Item
{
private static TrophyInfo[] m_Table =
{
new TrophyInfo(typeof(BrownBear), 0x1E60, 1041093, 1041107),
new TrophyInfo(typeof(GreatHart), 0x1E61, 1041095, 1041109),
new TrophyInfo(typeof(BigFish), 0x1E62, 1041096, 1041110),
new TrophyInfo(typeof(Gorilla), 0x1E63, 1041091, 1041105),
new TrophyInfo(typeof(Orc), 0x1E64, 1041090, 1041104),
new TrophyInfo(typeof(PolarBear), 0x1E65, 1041094, 1041108),
new TrophyInfo(typeof(Troll), 0x1E66, 1041092, 1041106)
};
[Constructible]
public TaxidermyKit() : base(0x1EBA)
{
Weight = 1.0;
}
public TaxidermyKit(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1041279; // a taxidermy kit
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
public override void OnDoubleClick(Mobile from)
{
if (!IsChildOf(from.Backpack))
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
else if (from.Skills.Carpentry.Base < 90.0)
{
from.SendLocalizedMessage(1042594); // You do not understand how to use this.
}
else
{
from.SendLocalizedMessage(1042595); // Target the corpse to make a trophy out of.
from.Target = new CorpseTarget(this);
}
}
public class TrophyInfo
{
public TrophyInfo(Type type, int id, int deedNum, int addonNum)
{
CreatureType = type;
NorthID = id;
DeedNumber = deedNum;
AddonNumber = addonNum;
}
public Type CreatureType{ get; }
public int NorthID{ get; }
public int DeedNumber{ get; }
public int AddonNumber{ get; }
}
private class CorpseTarget : Target
{
private TaxidermyKit m_Kit;
public CorpseTarget(TaxidermyKit kit) : base(3, false, TargetFlags.None)
{
m_Kit = kit;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (m_Kit.Deleted)
return;
Corpse corpse = targeted as Corpse;
if (!(corpse != null || targeted is BigFish))
{
from.SendLocalizedMessage(1042600); // That is not a corpse!
}
else if (corpse?.VisitedByTaxidermist == true)
{
from.SendLocalizedMessage(1042596); // That corpse seems to have been visited by a taxidermist already.
}
else if (!m_Kit.IsChildOf(from.Backpack))
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
else if (from.Skills.Carpentry.Base < 90.0)
{
from.SendLocalizedMessage(1042603); // You would not understand how to use the kit.
}
else
{
object obj = corpse?.Owner ?? targeted;
foreach (TrophyInfo t in m_Table)
{
if (t.CreatureType != obj.GetType())
continue;
Container pack = from.Backpack;
if (pack?.ConsumeTotal(typeof(Board), 10) == true)
{
from.SendLocalizedMessage(
1042278); // You review the corpse and find it worthy of a trophy.
from.SendLocalizedMessage(1042602); // You use your kit up making the trophy.
Mobile hunter = null;
int weight = 0;
if (targeted is BigFish fish)
{
hunter = fish.Fisher;
weight = (int)fish.Weight;
fish.Consume();
}
from.AddToBackpack(new TrophyDeed(t, hunter, weight));
if (corpse != null)
corpse.VisitedByTaxidermist = true;
m_Kit.Delete();
return;
}
from.SendLocalizedMessage(1042598); // You do not have enough boards.
return;
}
from.SendLocalizedMessage(1042599); // That does not look like something you want hanging on a wall.
}
}
}
}
public class TrophyAddon : Item, IAddon
{
private int m_AddonNumber;
private int m_AnimalWeight;
private Mobile m_Hunter;
public TrophyAddon(Mobile from, int itemID, int westID, int northID, int deedNumber,
int addonNumber, Mobile hunter = null, int animalWeight = 0) : base(itemID)
{
WestID = westID;
NorthID = northID;
DeedNumber = deedNumber;
m_AddonNumber = addonNumber;
m_Hunter = hunter;
m_AnimalWeight = animalWeight;
Movable = false;
MoveToWorld(from.Location, from.Map);
}
public TrophyAddon(Serial serial) : base(serial)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
[CommandProperty(AccessLevel.GameMaster)]
public int WestID{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public int NorthID{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public int DeedNumber{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public int AddonNumber
{
get => m_AddonNumber;
set
{
m_AddonNumber = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Hunter
{
get => m_Hunter;
set
{
m_Hunter = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int AnimalWeight
{
get => m_AnimalWeight;
set
{
m_AnimalWeight = value;
InvalidateProperties();
}
}
public override int LabelNumber => m_AddonNumber;
public bool CouldFit(IPoint3D p, Map map)
{
if (!map.CanFit(p.X, p.Y, p.Z, ItemData.Height))
return false;
if (ItemID == NorthID)
return BaseAddon.IsWall(p.X, p.Y - 1, p.Z, map); // North wall
return BaseAddon.IsWall(p.X - 1, p.Y, p.Z, map); // West wall
}
public Item Deed => new TrophyDeed(WestID, NorthID, DeedNumber, m_AddonNumber, m_Hunter, m_AnimalWeight);
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (m_AnimalWeight >= 20)
{
if (m_Hunter != null)
list.Add(1070857, m_Hunter.Name); // Caught by ~1_fisherman~
list.Add(1070858, m_AnimalWeight.ToString()); // ~1_weight~ stones
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(m_Hunter);
writer.Write(m_AnimalWeight);
writer.Write(WestID);
writer.Write(NorthID);
writer.Write(DeedNumber);
writer.Write(m_AddonNumber);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
m_Hunter = reader.ReadMobile();
m_AnimalWeight = reader.ReadInt();
goto case 0;
}
case 0:
{
WestID = reader.ReadInt();
NorthID = reader.ReadInt();
DeedNumber = reader.ReadInt();
m_AddonNumber = reader.ReadInt();
break;
}
}
Timer.DelayCall(TimeSpan.Zero, FixMovingCrate);
}
private void FixMovingCrate()
{
if (Deleted)
return;
if (Movable || IsLockedDown)
{
Item deed = Deed;
if (Parent is Item item)
{
item.AddItem(deed);
deed.Location = Location;
}
else
{
deed.MoveToWorld(Location, Map);
}
Delete();
}
}
public override void OnDoubleClick(Mobile from)
{
BaseHouse house = BaseHouse.FindHouseAt(this);
if (house?.IsCoOwner(from) == true)
{
if (from.InRange(GetWorldLocation(), 1))
{
from.AddToBackpack(Deed);
Delete();
}
else
{
from.SendLocalizedMessage(500295); // You are too far away to do that.
}
}
}
}
[Flippable(0x14F0, 0x14EF)]
public class TrophyDeed : Item
{
private int m_AnimalWeight;
private int m_DeedNumber;
private Mobile m_Hunter;
public TrophyDeed(int westID, int northID, int deedNumber, int addonNumber,
Mobile hunter = null, int animalWeight = 0) : base(0x14F0)
{
WestID = westID;
NorthID = northID;
m_DeedNumber = deedNumber;
AddonNumber = addonNumber;
m_Hunter = hunter;
m_AnimalWeight = animalWeight;
}
public TrophyDeed(TaxidermyKit.TrophyInfo info, Mobile hunter, int animalWeight)
: this(info.NorthID + 7, info.NorthID, info.DeedNumber, info.AddonNumber, hunter, animalWeight)
{
}
public TrophyDeed(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public int WestID{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public int NorthID{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public int DeedNumber
{
get => m_DeedNumber;
set
{
m_DeedNumber = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int AddonNumber{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Hunter
{
get => m_Hunter;
set
{
m_Hunter = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int AnimalWeight
{
get => m_AnimalWeight;
set
{
m_AnimalWeight = value;
InvalidateProperties();
}
}
public override int LabelNumber => m_DeedNumber;
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (m_AnimalWeight >= 20)
{
if (m_Hunter != null)
list.Add(1070857, m_Hunter.Name); // Caught by ~1_fisherman~
list.Add(1070858, m_AnimalWeight.ToString()); // ~1_weight~ stones
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(m_Hunter);
writer.Write(m_AnimalWeight);
writer.Write(WestID);
writer.Write(NorthID);
writer.Write(m_DeedNumber);
writer.Write(AddonNumber);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
m_Hunter = reader.ReadMobile();
m_AnimalWeight = reader.ReadInt();
goto case 0;
}
case 0:
{
WestID = reader.ReadInt();
NorthID = reader.ReadInt();
m_DeedNumber = reader.ReadInt();
AddonNumber = reader.ReadInt();
break;
}
}
}
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{
BaseHouse house = BaseHouse.FindHouseAt(from);
if (house?.IsCoOwner(from) == true)
{
bool northWall = BaseAddon.IsWall(from.X, from.Y - 1, from.Z, from.Map);
bool westWall = BaseAddon.IsWall(from.X - 1, from.Y, from.Z, from.Map);
if (northWall && westWall)
switch (from.Direction & Direction.Mask)
{
case Direction.North:
case Direction.South:
westWall = false;
break;
case Direction.East:
case Direction.West:
northWall = false;
break;
default:
from.SendMessage("Turn to face the wall on which to hang this trophy.");
return;
}
int itemID = 0;
if (northWall)
itemID = NorthID;
else if (westWall)
itemID = WestID;
else
from.SendLocalizedMessage(1042626); // The trophy must be placed next to a wall.
if (itemID > 0)
{
house.Addons.Add(new TrophyAddon(from, itemID, WestID, NorthID, m_DeedNumber, AddonNumber, m_Hunter,
m_AnimalWeight));
Delete();
}
}
else
{
from.SendLocalizedMessage(502092); // You must be in your house to do this.
}
}
else
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
}
}
}