232 lines
5.6 KiB
C#
232 lines
5.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Server;
|
|
using Server.Targeting;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public class ArcaneGem : Item
|
|
{
|
|
public override string DefaultName
|
|
{
|
|
get { return "arcane gem"; }
|
|
}
|
|
|
|
[Constructible]
|
|
public ArcaneGem() : base( 0x1EA7 )
|
|
{
|
|
Stackable = Core.ML;
|
|
Weight = 1.0;
|
|
}
|
|
|
|
public ArcaneGem( 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
|
|
{
|
|
from.BeginTarget( 2, false, TargetFlags.None, new TargetCallback( OnTarget ) );
|
|
from.SendMessage( "What do you wish to use the gem on?" );
|
|
}
|
|
}
|
|
|
|
public int GetChargesFor( Mobile m )
|
|
{
|
|
int v = (int)(m.Skills[SkillName.Tailoring].Value / 5);
|
|
|
|
if ( v < 16 )
|
|
return 16;
|
|
else if ( v > 24 )
|
|
return 24;
|
|
|
|
return v;
|
|
}
|
|
|
|
public const int DefaultArcaneHue = 2117;
|
|
|
|
public void OnTarget( Mobile from, object obj )
|
|
{
|
|
if ( !IsChildOf( from.Backpack ) )
|
|
{
|
|
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
|
return;
|
|
}
|
|
|
|
if ( obj is IArcaneEquip eq && eq is Item item )
|
|
{
|
|
CraftResource resource = CraftResource.None;
|
|
|
|
switch (item)
|
|
{
|
|
case BaseClothing clothing:
|
|
resource = clothing.Resource;
|
|
break;
|
|
case BaseArmor armor:
|
|
resource = armor.Resource;
|
|
break;
|
|
// Sanity, weapons cannot receive gems...
|
|
case BaseWeapon weapon:
|
|
resource = weapon.Resource;
|
|
break;
|
|
}
|
|
|
|
if ( !item.IsChildOf( from.Backpack ) )
|
|
{
|
|
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
|
return;
|
|
}
|
|
if ( item.LootType == LootType.Blessed )
|
|
{
|
|
from.SendMessage( "You can only use this on exceptionally crafted robes, thigh boots, cloaks, or leather gloves." );
|
|
return;
|
|
}
|
|
if ( resource != CraftResource.None && resource != CraftResource.RegularLeather )
|
|
{
|
|
from.SendLocalizedMessage( 1049690 ); // Arcane gems can not be used on that type of leather.
|
|
return;
|
|
}
|
|
|
|
int charges = GetChargesFor( from );
|
|
|
|
if ( eq.IsArcane )
|
|
{
|
|
if ( eq.CurArcaneCharges >= eq.MaxArcaneCharges )
|
|
{
|
|
from.SendMessage( "That item is already fully charged." );
|
|
}
|
|
else
|
|
{
|
|
if ( eq.CurArcaneCharges <= 0 )
|
|
item.Hue = DefaultArcaneHue;
|
|
|
|
if ( (eq.CurArcaneCharges + charges) > eq.MaxArcaneCharges )
|
|
eq.CurArcaneCharges = eq.MaxArcaneCharges;
|
|
else
|
|
eq.CurArcaneCharges += charges;
|
|
|
|
from.SendMessage( "You recharge the item." );
|
|
if ( Amount <= 1 )
|
|
Delete();
|
|
else Amount--;
|
|
}
|
|
}
|
|
else if ( from.Skills[SkillName.Tailoring].Value >= 80.0 )
|
|
{
|
|
bool isExceptional = false;
|
|
|
|
switch (item)
|
|
{
|
|
case BaseClothing clothing:
|
|
isExceptional = clothing.Quality == ClothingQuality.Exceptional;
|
|
break;
|
|
case BaseArmor armor:
|
|
isExceptional = armor.Quality == ArmorQuality.Exceptional;
|
|
break;
|
|
case BaseWeapon weapon:
|
|
isExceptional = weapon.Quality == WeaponQuality.Exceptional;
|
|
break;
|
|
}
|
|
|
|
if ( isExceptional )
|
|
{
|
|
switch (item)
|
|
{
|
|
case BaseClothing clothing:
|
|
clothing.Quality = ClothingQuality.Regular;
|
|
clothing.Crafter = @from;
|
|
break;
|
|
case BaseArmor armor:
|
|
armor.Quality = ArmorQuality.Regular;
|
|
armor.Crafter = @from;
|
|
armor.PhysicalBonus = armor.FireBonus = armor.ColdBonus = armor.PoisonBonus = armor.EnergyBonus = 0; // Is there a method to remove bonuses?
|
|
break;
|
|
// Sanity, weapons cannot receive gems...
|
|
case BaseWeapon weapon:
|
|
weapon.Quality = WeaponQuality.Regular;
|
|
weapon.Crafter = @from;
|
|
break;
|
|
}
|
|
|
|
eq.CurArcaneCharges = eq.MaxArcaneCharges = charges;
|
|
|
|
item.Hue = DefaultArcaneHue;
|
|
|
|
from.SendMessage( "You enhance the item with your gem." );
|
|
if ( Amount <= 1 )
|
|
Delete();
|
|
else Amount--;
|
|
}
|
|
else
|
|
{
|
|
from.SendMessage( "Only exceptional items can be enhanced with the gem." );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendMessage( "You do not have enough skill in tailoring to enhance the item." );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendMessage( "You can only use this on exceptionally crafted robes, thigh boots, cloaks, or leather gloves." );
|
|
}
|
|
}
|
|
|
|
public static bool ConsumeCharges( Mobile from, int amount )
|
|
{
|
|
List<Item> items = from.Items;
|
|
int avail = 0;
|
|
|
|
for ( int i = 0; i < items.Count; ++i )
|
|
{
|
|
Item obj = items[i];
|
|
|
|
if ( obj is IArcaneEquip eq && eq.IsArcane )
|
|
avail += eq.CurArcaneCharges;
|
|
}
|
|
|
|
if ( avail < amount )
|
|
return false;
|
|
|
|
for ( int i = 0; i < items.Count; ++i )
|
|
{
|
|
Item obj = items[i];
|
|
|
|
if ( obj is IArcaneEquip eq && eq.IsArcane )
|
|
{
|
|
if ( eq.CurArcaneCharges > amount )
|
|
{
|
|
eq.CurArcaneCharges -= amount;
|
|
break;
|
|
}
|
|
|
|
amount -= eq.CurArcaneCharges;
|
|
eq.CurArcaneCharges = 0;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|