public static bool ConsumeTotal(Container pack, Type itemType, BeverageType content, int quantity) { Item[] items = pack.FindItemsByType(itemType); // First pass, compute total int total = 0; for (int i = 0; i < items.Length; ++i) { BaseBeverage bev = items[i] as BaseBeverage; if (bev != null && bev.Content == content && !bev.IsEmpty) { total += bev.Quantity; } } if (total >= quantity) { // We've enough, so consume it int need = quantity; for (int i = 0; i < items.Length; ++i) { BaseBeverage bev = items[i] as BaseBeverage; if (bev == null || bev.Content != content || bev.IsEmpty) { continue; } int theirQuantity = bev.Quantity; if (theirQuantity < need) { bev.Quantity = 0; need -= theirQuantity; } else { bev.Quantity -= need; return(true); } } } return(false); }
public void OnTarget(Mobile from, object obj) { // TODO: Need details on how oil cloths should get consumed here if (!IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it. } else if (obj is Item && ((Item)obj).RootParent != from) { from.SendLocalizedMessage(1005425); // You may only wipe down items you are holding or carrying. } else if (obj is BaseWeapon) { BaseWeapon weapon = (BaseWeapon)obj; if (weapon.Poison == null || weapon.PoisonCharges <= 0) { from.LocalOverheadMessage(Network.MessageType.Regular, 0x3B2, 1005422); // Hmmmm... this does not need to be cleaned. } else { if (weapon.PoisonCharges < 2) { weapon.PoisonCharges = 0; } else { weapon.PoisonCharges -= 2; } if (weapon.PoisonCharges > 0) { from.SendLocalizedMessage(1005423); // You have removed some of the caustic substance, but not all. } else { from.SendLocalizedMessage(1010497); // You have cleaned the item. } } } else if (obj == from && obj is PlayerMobile) { PlayerMobile pm = (PlayerMobile)obj; if (pm.BodyMod == 183 || pm.BodyMod == 184) { pm.SavagePaintExpiration = TimeSpan.Zero; pm.BodyMod = 0; pm.HueMod = -1; from.SendLocalizedMessage(1040006); // You wipe away all of your body paint. Consume(); } else { from.LocalOverheadMessage(Network.MessageType.Regular, 0x3B2, 1005422); // Hmmmm... this does not need to be cleaned. } } #region Firebomb else if (obj is BaseBeverage) { BaseBeverage beverage = (BaseBeverage)obj; if (beverage.Content == BeverageType.Liquor) { Firebomb bomb = new Firebomb(beverage.ItemID); bomb.Name = beverage.Name; beverage.ReplaceWith(bomb); from.SendLocalizedMessage(1060580); // You prepare a firebomb. Consume(); } } else if (obj is Firebomb) { from.SendLocalizedMessage(1060579); // That is already a firebomb! } #endregion else { from.SendLocalizedMessage(1005426); // The cloth will not work on that. } }
public override bool OnDragDrop(Mobile from, Item dropped) { if (!HasAccess(from)) { from.SendLocalizedMessage(1073821); // You do not have access to that item for use with the aquarium. return(false); } if (m_VacationLeft > 0) { from.SendLocalizedMessage(1074427); // The aquarium is in vacation mode. return(false); } bool takeItem = true; if (dropped is FishBowl) { FishBowl bowl = (FishBowl)dropped; if (bowl.Empty || !AddFish(from, bowl.Fish)) { return(false); } bowl.InvalidateProperties(); takeItem = false; } else if (dropped is BaseFish) { BaseFish fish = (BaseFish)dropped; if (!AddFish(from, fish)) { return(false); } } else if (dropped is VacationWafer) { m_VacationLeft = VacationWafer.VacationDays; dropped.Delete(); from.SendLocalizedMessage(1074428, m_VacationLeft.ToString()); // The aquarium will be in vacation mode for ~1_DAYS~ days } else if (dropped is AquariumFood) { m_Food.Added += 1; dropped.Delete(); from.SendLocalizedMessage(1074259, "1"); // ~1_NUM~ unit(s) of food have been added to the aquarium. } else if (dropped is BaseBeverage) { BaseBeverage beverage = (BaseBeverage)dropped; if (beverage.IsEmpty || !beverage.Pourable || beverage.Content != BeverageType.Water) { from.SendLocalizedMessage(500840); // Can't pour that in there. return(false); } m_Water.Added += 1; beverage.Quantity -= 1; from.PlaySound(0x4E); from.SendLocalizedMessage(1074260, "1"); // ~1_NUM~ unit(s) of water have been added to the aquarium. takeItem = false; } else if (!AddDecoration(from, dropped)) { takeItem = false; } from.CloseGump(typeof(AquariumGump)); InvalidateProperties(); if (takeItem) { from.PlaySound(0x42); } return(takeItem); }
public virtual void Fill_OnTarget(Mobile from, object targ) { if (!IsEmpty || !Fillable || !ValidateUse(from, false)) { return; } if (targ is BaseBeverage) { BaseBeverage bev = (BaseBeverage)targ; if (bev.IsEmpty || !bev.ValidateUse(from, true)) { return; } this.Content = bev.Content; this.Poison = bev.Poison; this.Poisoner = bev.Poisoner; if (bev.Quantity > this.MaxQuantity) { this.Quantity = this.MaxQuantity; bev.Quantity -= this.MaxQuantity; } else { this.Quantity += bev.Quantity; bev.Quantity = 0; } } else if (targ is BaseWaterContainer) { BaseWaterContainer bwc = targ as BaseWaterContainer; if (Quantity == 0 || (Content == BeverageType.Water && !IsFull)) { int iNeed = Math.Min((MaxQuantity - Quantity), bwc.Quantity); if (iNeed > 0 && !bwc.IsEmpty && !IsFull) { bwc.Quantity -= iNeed; Quantity += iNeed; Content = BeverageType.Water; from.PlaySound(0x4E); } } } else if (targ is Item) { Item item = (Item)targ; IWaterSource src; src = (item as IWaterSource); if (src == null && item is AddonComponent) { src = (((AddonComponent)item).Addon as IWaterSource); } if (src == null || src.Quantity <= 0) { return; } if (from.Map != item.Map || !from.InRange(item.GetWorldLocation(), 2) || !from.InLOS(item)) { from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. return; } this.Content = BeverageType.Water; this.Poison = null; this.Poisoner = null; if (src.Quantity > this.MaxQuantity) { this.Quantity = this.MaxQuantity; src.Quantity -= this.MaxQuantity; } else { this.Quantity += src.Quantity; src.Quantity = 0; } from.SendLocalizedMessage(1010089); // You fill the container with water. } else if (targ is Cow) { Cow cow = (Cow)targ; if (cow.TryMilk(from)) { Content = BeverageType.Milk; Quantity = MaxQuantity; from.SendLocalizedMessage(1080197); // You fill the container with milk. } } else if (targ is LandTarget) { int tileID = ((LandTarget)targ).TileID; PlayerMobile player = from as PlayerMobile; if (player != null) { QuestSystem qs = player.Quest; if (qs is WitchApprenticeQuest) { FindIngredientObjective obj = qs.FindObjective(typeof(FindIngredientObjective)) as FindIngredientObjective; if (obj != null && !obj.Completed && obj.Ingredient == Ingredient.SwampWater) { bool contains = false; for (int i = 0; !contains && i < m_SwampTiles.Length; i += 2) { contains = (tileID >= m_SwampTiles[i] && tileID <= m_SwampTiles[i + 1]); } if (contains) { Delete(); player.SendLocalizedMessage(1055035); // You dip the container into the disgusting swamp water, collecting enough for the Hag's vile stew. obj.Complete(); } } } } } }
public virtual void Pour_OnTarget(Mobile from, object targ) { if (IsEmpty || !Pourable || !ValidateUse(from, false)) { return; } if (targ is BaseBeverage) { BaseBeverage bev = (BaseBeverage)targ; if (!bev.ValidateUse(from, true)) { return; } if (bev.IsFull && bev.Content == this.Content) { from.SendLocalizedMessage(500848); // Couldn't pour it there. It was already full. } else if (!bev.IsEmpty) { from.SendLocalizedMessage(500846); // Can't pour it there. } else { bev.Content = this.Content; bev.Poison = this.Poison; bev.Poisoner = this.Poisoner; if (this.Quantity > bev.MaxQuantity) { bev.Quantity = bev.MaxQuantity; this.Quantity -= bev.MaxQuantity; } else { bev.Quantity += this.Quantity; this.Quantity = 0; } from.PlaySound(0x4E); } } else if (from == targ) { if (from.Thirst < 20) { from.Thirst += 1; } if (ContainsAlchohol) { int bac = 0; switch (this.Content) { case BeverageType.Ale: bac = 1; break; case BeverageType.Wine: bac = 2; break; case BeverageType.Cider: bac = 3; break; case BeverageType.Liquor: bac = 4; break; } from.BAC += bac; if (from.BAC > 60) { from.BAC = 60; } CheckHeaveTimer(from); } from.PlaySound(Utility.RandomList(0x30, 0x2D6)); if (m_Poison != null) { from.ApplyPoison(m_Poisoner, m_Poison); } --Quantity; } else if (targ is BaseWaterContainer) { BaseWaterContainer bwc = targ as BaseWaterContainer; if (Content != BeverageType.Water) { from.SendLocalizedMessage(500842); // Can't pour that in there. } else if (bwc.Items.Count != 0) { from.SendLocalizedMessage(500841); // That has something in it. } else { int itNeeds = Math.Min((bwc.MaxQuantity - bwc.Quantity), Quantity); if (itNeeds > 0) { bwc.Quantity += itNeeds; Quantity -= itNeeds; from.PlaySound(0x4E); } } } else if (targ is PlantItem) { ((PlantItem)targ).Pour(from, this); } else if (targ is AddonComponent && (((AddonComponent)targ).Addon is WaterVatEast || ((AddonComponent)targ).Addon is WaterVatSouth) && this.Content == BeverageType.Water) { PlayerMobile player = from as PlayerMobile; if (player != null) { SolenMatriarchQuest qs = player.Quest as SolenMatriarchQuest; if (qs != null) { QuestObjective obj = qs.FindObjective(typeof(GatherWaterObjective)); if (obj != null && !obj.Completed) { BaseAddon vat = ((AddonComponent)targ).Addon; if (vat.X > 5784 && vat.X < 5814 && vat.Y > 1903 && vat.Y < 1934 && ((qs.RedSolen && vat.Map == Map.Trammel) || (!qs.RedSolen && vat.Map == Map.Felucca))) { if (obj.CurProgress + Quantity > obj.MaxProgress) { int delta = obj.MaxProgress - obj.CurProgress; Quantity -= delta; obj.CurProgress = obj.MaxProgress; } else { obj.CurProgress += Quantity; Quantity = 0; } } } } } } else { from.SendLocalizedMessage(500846); // Can't pour it there. } }