Files
abysmal-isle/Scripts/Scripts-master/Items/Sprinklers/WaterSprinkler.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

347 lines
11 KiB
C#

// RunUO 2.0 SVN Version
using Server;
using System;
using Server.Mobiles;
using System.Collections.Generic;
using Server.Multis;
using Server.Engines.Plants;
using Server.Targeting;
using Server.ContextMenus;
using Server.Gumps;
namespace Server.Items
{
public class WaterSprinkler : Item, ISecurable
{
private int m_UsesRemaining;
private int m_StorageLimit;
private SecureLevel m_Level;
[CommandProperty(AccessLevel.GameMaster)]
public int StorageLimit { get { return m_StorageLimit; } set { m_StorageLimit = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public SecureLevel Level
{
get { return m_Level; }
set { m_Level = value; }
}
[CommandProperty(AccessLevel.GameMaster)]
public int UsesRemaining
{
get
{
return this.m_UsesRemaining;
}
set
{
this.m_UsesRemaining = value;
this.InvalidateProperties();
}
}
public bool ShowUsesRemaining
{
get
{
return true;
}
set
{
}
}
[Constructable]
public WaterSprinkler() : base( 0xE7A )
{
Movable = true;
Weight = 1.0;
Name = "a water sprinkler";
Hue = 291;
StorageLimit = 1000;
}
[Constructable]
public WaterSprinkler(int uses, int storageLimit)
: base(0xE7A)
{
Weight = 1.0;
Name = "a watering sprinkler";
Hue = 291;
m_UsesRemaining = uses;
StorageLimit = storageLimit;
}
public override void AddNameProperty(ObjectPropertyList list)
{
base.AddNameProperty(list);
list.Add("Water Remaining: {0}", this.m_UsesRemaining.ToString()); // potions remaining: ~1_val~
}
public WaterSprinkler(Serial serial)
: base(serial)
{
}
public bool CanBeWatered(PlantItem plant)
{
return plant.PlantStatus < PlantStatus.DecorativePlant && plant.PlantSystem.Water <= 1;
}
public override void OnDoubleClick(Mobile from)
{
BaseHouse house = BaseHouse.FindHouseAt(from);
if (house == null)
from.SendLocalizedMessage(1005525);//That is not in your house
else if (this.Movable)
from.SendMessage("This must be locked down to use!");
else
{
if (this.IsAccessibleTo(from))
{
if (m_UsesRemaining < 1)
from.SendMessage("You must fill this before you can use it!");
else
{
Point3D p = new Point3D(this.Location);
Map map = this.Map;
IPooledEnumerable eable = map.GetItemsInRange(p, 18);
bool found = false;
foreach (Item item in eable)
{
if (house.IsInside(item) && item is PlantItem && item.IsLockedDown)
{
PlantItem plant = (PlantItem)item;
if (CanBeWatered(plant))
{
if (plant.PlantSystem.Water == 1 && m_UsesRemaining > 0)
{
plant.PlantSystem.Water = 2;
found = true;
m_UsesRemaining--;
InvalidateProperties();
}
if (plant.PlantSystem.Water == 0 && m_UsesRemaining > 1)
{
plant.PlantSystem.Water = 2;
found = true;
m_UsesRemaining-=2;
InvalidateProperties();
}
}
}
}
if (found)
{
from.SendMessage("Your dry plants have been watered.");
from.PlaySound(0x12);
}
else
from.SendMessage("You have no plants that need watering!");
}
}
else
from.SendMessage("You may not access this!");
}
}
public override bool OnDragDrop(Mobile from, Item item)
{
if (m_UsesRemaining == m_StorageLimit)
{
from.SendMessage("That sprinkler is full."); // You place the empty bottle in your backpack.
return false;
}
if ( item is SprinklerContainer )
{
int freespace = m_StorageLimit - m_UsesRemaining;
SprinklerContainer keg = (SprinklerContainer)item;
if ( keg.Quantity <= freespace )
{
m_UsesRemaining += keg.Quantity;
InvalidateProperties();
keg.Quantity = 0;
keg.InvalidateProperties();
from.PlaySound(0x240);
from.SendMessage("You place the empty water tub in your backpack."); // You place the empty bottle in your backpack.
Container pack = from.Backpack;
pack.DropItem(keg);
return true;
}
if (keg.Quantity >= freespace)
{
int kegamountleft = keg.Quantity - freespace;
keg.Quantity = kegamountleft;
keg.InvalidateProperties();
m_UsesRemaining = m_StorageLimit;
InvalidateProperties();
from.PlaySound(0x240);
from.SendMessage("You place the water tub back in your backpack."); // You place the empty bottle in your backpack.
Container pack = from.Backpack;
pack.DropItem(keg);
return true;
}
from.SendMessage("This is not from the water tub!"); // You don't have room for the empty bottle in your backpack.
return false;
}
from.SendMessage("You can't put that in the sprinkler!"); // You don't have room for the empty bottle in your backpack.
return false;
}
public void Pour(Mobile from, Item item)
{
if (item is BaseBeverage)
{
BaseBeverage beverage = (BaseBeverage)item;
if (beverage.IsEmpty || !beverage.Pourable || beverage.Content != BeverageType.Water)
{
from.SendMessage("You can only put water in here!");
return;
}
if (m_UsesRemaining < m_StorageLimit)
{
m_UsesRemaining++;
beverage.Quantity--;
from.PlaySound(0x4E);
if (m_UsesRemaining == m_StorageLimit)
from.SendMessage("You completely fill the sprinkler.");
else
from.SendMessage("You dump some water into the sprinkler");
}
else
from.SendMessage("It's already full.");
}
}
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
{
base.GetContextMenuEntries(from, list);
SetSecureLevelEntry.AddTo(from, this, list);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write((int)m_Level);
writer.Write((int)this.m_UsesRemaining);
writer.Write((int)this.m_StorageLimit);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_Level = (SecureLevel)reader.ReadInt();
this.m_UsesRemaining = reader.ReadInt();
this.m_StorageLimit = reader.ReadInt();
}
}
public class SprinklerContainer : BaseBeverage
{
public override int MaxQuantity { get { return 100; } }
public override int ComputeItemID() { return 0x0E7B; }
[Constructable]
public SprinklerContainer()
{
Weight = 5.0;
Name = "a water tub";
}
[Constructable]
public SprinklerContainer(BeverageType type)
: base(type)
{
Weight = 5.0;
}
public SprinklerContainer(Serial serial)
: base(serial)
{
}
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 (Quantity > 0)
{
from.SendMessage("Select the sprinkler you wish to fill");
from.Target = new SprinklerTarget(this);
}
else
{
from.BeginTarget(-1, true, TargetFlags.None, new TargetCallback(Fill_OnTarget));
SendLocalizedMessageTo(from, 500837); // Fill from what?
}
}
private class SprinklerTarget : Target
{
private SprinklerContainer m_cont;
public SprinklerTarget(SprinklerContainer cont)
: base(1, false, TargetFlags.None)
{
m_cont = cont;
}
protected override void OnTarget(Mobile from, object target)
{
if (target is WaterSprinkler)
{
WaterSprinkler sprink = (WaterSprinkler)target;
sprink.Pour(from, m_cont);
}
else
from.SendMessage("This can only be used on sprinklers!");
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)1); // version
writer.Write((int)Quantity);
writer.Write((int)Content);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
Quantity = reader.ReadInt();
Content = (BeverageType)reader.ReadInt();
}
}
}