Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
#region References
|
||||
using Server.Items;
|
||||
using Server.Misc;
|
||||
using Server.Targeting;
|
||||
using System;
|
||||
#endregion
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an inhuman corpse")]
|
||||
public class CultistAmbusher : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CultistAmbusher()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Cultist Ambusher";
|
||||
Body = 0x190;
|
||||
Hue = 2500;
|
||||
BaseSoundID = 0x45A;
|
||||
|
||||
SetStr(150, 200);
|
||||
SetDex(150);
|
||||
SetInt(25, 44);
|
||||
|
||||
SetHits(500, 1000);
|
||||
|
||||
SetDamage(8, 18);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 10, 20);
|
||||
SetResistance(ResistanceType.Fire, 10, 20);
|
||||
SetResistance(ResistanceType.Cold, 10, 20);
|
||||
SetResistance(ResistanceType.Poison, 10, 20);
|
||||
SetResistance(ResistanceType.Energy, 10, 20);
|
||||
|
||||
SetSkill(SkillName.Fencing, 100.0, 120.0);
|
||||
SetSkill(SkillName.Macing, 100.0, 120.0);
|
||||
SetSkill(SkillName.MagicResist, 100.0, 120.0);
|
||||
SetSkill(SkillName.Swords, 100.0, 120.0);
|
||||
SetSkill(SkillName.Tactics, 100.0, 120.0);
|
||||
SetSkill(SkillName.Archery, 100.0, 120.0);
|
||||
SetSkill(SkillName.Parry, 100.0, 120.0);
|
||||
SetSkill(SkillName.Tactics, 100.0, 120.0);
|
||||
|
||||
Fame = 8000;
|
||||
Karma = -8000;
|
||||
|
||||
switch (Utility.Random(3))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
SetWearable(new RingmailChest(), 1510);
|
||||
SetWearable(new ChainLegs(), 1345);
|
||||
SetWearable(new Sandals(), 1345);
|
||||
SetWearable(new LeatherNinjaHood(), 1345);
|
||||
SetWearable(new LeatherGloves(), 1345);
|
||||
SetWearable(new LeatherArms(), 1345);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
SetWearable(new Robe(2306));
|
||||
SetWearable(new BearMask(2683));
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
SetWearable(new Shirt(676));
|
||||
SetWearable(new RingmailLegs());
|
||||
SetWearable(new StuddedArms());
|
||||
SetWearable(new StuddedGloves());
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
SetWearable(new SkullCap(2406));
|
||||
SetWearable(new JinBaori(1001));
|
||||
SetWearable(new Shirt());
|
||||
SetWearable(new ShortPants(902));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Utility.Random(2))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
SetWearable(Loot.Construct(new Type[] { typeof(Kryss), typeof(Spear), typeof(ShortSpear), typeof(Lance), typeof(Pike), typeof(WarMace), typeof(Mace), typeof(WarHammer), typeof(WarAxe) }));
|
||||
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
SetWearable(Loot.Construct(new Type[] { typeof(Yumi), typeof(Crossbow), typeof(RepeatingCrossbow), typeof(HeavyCrossbow) }));
|
||||
|
||||
RangeFight = 7;
|
||||
AI = AIType.AI_Archer;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
if (Map != null && AI == AIType.AI_Archer && 0.4 >= Utility.RandomDouble())
|
||||
{
|
||||
Point3D p = FindLocation(Map, Location, 10);
|
||||
Effects.SendLocationParticles(EffectItem.Create(Location, Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 2023);
|
||||
Location = p;
|
||||
Effects.SendLocationParticles(EffectItem.Create(p, Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 5023);
|
||||
|
||||
PlaySound(0x1FE);
|
||||
}
|
||||
}
|
||||
|
||||
private Point3D FindLocation(Map map, Point3D center, int range)
|
||||
{
|
||||
int cx = center.X;
|
||||
int cy = center.Y;
|
||||
|
||||
for (int i = 0; i < 20; ++i)
|
||||
{
|
||||
int x = cx + Utility.Random(range * 2) - range;
|
||||
int y = cy + Utility.Random(range * 2) - range;
|
||||
|
||||
if ((cx - x) * (cx - x) + (cy - y) * (cy - y) > range * range)
|
||||
continue;
|
||||
|
||||
int z = map.GetAverageZ(x, y);
|
||||
|
||||
if (!map.CanFit(x, y, z, 6, false, false))
|
||||
continue;
|
||||
|
||||
int topZ = z;
|
||||
|
||||
foreach (Item item in map.GetItemsInRange(new Point3D(x, y, z), 0))
|
||||
{
|
||||
topZ = Math.Max(topZ, item.Z + item.ItemData.CalcHeight);
|
||||
}
|
||||
|
||||
return new Point3D(x, y, topZ);
|
||||
}
|
||||
|
||||
return center;
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
|
||||
public CultistAmbusher(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Rich);
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
BaseWeapon wep = Weapon as BaseWeapon;
|
||||
|
||||
if (wep != null && !(wep is Fists))
|
||||
{
|
||||
if (Utility.RandomDouble() > 0.5)
|
||||
return wep.PrimaryAbility;
|
||||
|
||||
return wep.SecondaryAbility;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(0);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Server.Commands;
|
||||
using Server.Engines.CannedEvil;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a Khal Ankur corpse")]
|
||||
public class KhalAnkur : BaseChampion
|
||||
{
|
||||
public ChampionSpawn Spawn { get; set; }
|
||||
private DateTime m_NextSpawn;
|
||||
private DateTime m_NextSay;
|
||||
private DateTime m_NextAbilityTime;
|
||||
|
||||
[Constructable]
|
||||
public KhalAnkur()
|
||||
: base(AIType.AI_Necro)
|
||||
{
|
||||
Name = "Khal Ankur";
|
||||
Body = 0x5C7;
|
||||
BaseSoundID = 0x301;
|
||||
|
||||
SetStr(700, 800);
|
||||
SetDex(500, 600);
|
||||
SetInt(800, 900);
|
||||
|
||||
SetHits(30000);
|
||||
|
||||
SetDamage(28, 35);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Cold, 25);
|
||||
SetDamageType(ResistanceType.Poison, 25);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 90);
|
||||
SetResistance(ResistanceType.Fire, 70, 80);
|
||||
SetResistance(ResistanceType.Cold, 70, 80);
|
||||
SetResistance(ResistanceType.Poison, 80, 90);
|
||||
SetResistance(ResistanceType.Energy, 80, 90);
|
||||
|
||||
SetSkill(SkillName.Wrestling, 120.0);
|
||||
SetSkill(SkillName.Tactics, 80.0, 100.0);
|
||||
SetSkill(SkillName.MagicResist, 150.0);
|
||||
SetSkill(SkillName.DetectHidden, 100.0);
|
||||
SetSkill(SkillName.Parry, 80.0, 100.0);
|
||||
SetSkill(SkillName.Necromancy, 120.0);
|
||||
SetSkill(SkillName.SpiritSpeak, 120.0);
|
||||
|
||||
Fame = 28000;
|
||||
Karma = -28000;
|
||||
|
||||
VirtualArmor = 80;
|
||||
|
||||
SetMagicalAbility(MagicalAbility.WrestlingMastery);
|
||||
}
|
||||
|
||||
public KhalAnkur(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool Unprovokable { get { return true; } }
|
||||
public override bool BleedImmune { get { return true; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
public override bool ClickTitle { get { return false; } }
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override bool AutoDispel { get { return true; } }
|
||||
public override double AutoDispelChance { get { return 1.0; } }
|
||||
|
||||
public override ChampionSkullType SkullType { get { return ChampionSkullType.None; } }
|
||||
|
||||
public override Type[] UniqueList
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Type[] { };
|
||||
}
|
||||
}
|
||||
public override Type[] SharedList
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Type[] { };
|
||||
}
|
||||
}
|
||||
public override Type[] DecorativeList
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Type[] { };
|
||||
}
|
||||
}
|
||||
public override MonsterStatuetteType[] StatueTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
return new MonsterStatuetteType[] { };
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack(Mobile defender)
|
||||
{
|
||||
base.OnGaveMeleeAttack(defender);
|
||||
|
||||
if (Hue == 0 && Hits < HitsMax * 0.60 && DateTime.UtcNow > m_NextAbilityTime && 0.2 > Utility.RandomDouble())
|
||||
{
|
||||
Hue = 2745;
|
||||
new InternalTimer(this);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
if (Blessed)
|
||||
{
|
||||
from.SendLocalizedMessage(1071372); // It's covered with treasure guardian's magical power. To touch it, you need to beat them!
|
||||
}
|
||||
|
||||
base.OnDoubleClick(from);
|
||||
}
|
||||
|
||||
public override void OnChampPopped(ChampionSpawn spawn)
|
||||
{
|
||||
Blessed = true;
|
||||
Spawn = spawn;
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
if (Spawn == null || Map == null)
|
||||
return;
|
||||
|
||||
if (!Utility.InRange(Location, Home, 150))
|
||||
{
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(5), () => { Location = Home; });
|
||||
}
|
||||
|
||||
if (Blessed)
|
||||
{
|
||||
if (m_NextSay < DateTime.UtcNow)
|
||||
{
|
||||
Say(1158752 + Utility.Random(5), 0x25);
|
||||
|
||||
m_NextSay = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(20, 40));
|
||||
}
|
||||
|
||||
if (m_NextSpawn < DateTime.UtcNow)
|
||||
{
|
||||
BaseCreature bc = new KhalAnkurWarriors(KhalAnkurWarriors.WarriorType.General);
|
||||
|
||||
int x, y, z = 0;
|
||||
|
||||
Point3D p = Location;
|
||||
|
||||
for (int i = 0; i < 25; i++)
|
||||
{
|
||||
x = Utility.RandomMinMax(p.X - 4, p.X + 4);
|
||||
y = Utility.RandomMinMax(p.Y - 4, p.Y + 4);
|
||||
z = Map.GetAverageZ(x, y);
|
||||
|
||||
if (Map.CanSpawnMobile(x, y, z))
|
||||
{
|
||||
p = new Point3D(x, y, z);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bc.MoveToWorld(p, Map);
|
||||
bc.FixedParticles(0x3709, 1, 30, 9963, 13, 3, EffectLayer.Head);
|
||||
bc.Home = p;
|
||||
bc.IsChampionSpawn = true;
|
||||
Spawn.Creatures.Add(bc);
|
||||
|
||||
m_NextSpawn = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(120, 180));
|
||||
}
|
||||
else if (Spawn.Creatures.OfType<KhalAnkurWarriors>().Where(x => x._Type == KhalAnkurWarriors.WarriorType.General && !x.Deleted).Count() <= 0)
|
||||
{
|
||||
Blessed = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class InternalTimer : Timer
|
||||
{
|
||||
private KhalAnkur m_Mobile;
|
||||
private int m_Tick;
|
||||
|
||||
public InternalTimer(KhalAnkur mob)
|
||||
: base(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(2))
|
||||
{
|
||||
m_Tick = 1;
|
||||
m_Mobile = mob;
|
||||
Start();
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if (!m_Mobile.Alive || m_Mobile.Deleted || m_Mobile.Map == null)
|
||||
{
|
||||
Stop();
|
||||
}
|
||||
else if (m_Tick < 15)
|
||||
{
|
||||
Point3D p = FindLocation(m_Mobile.Map, m_Mobile.Location, 7);
|
||||
Effects.SendLocationEffect(p, m_Mobile.Map, 0x3789, 30, 1, 2062, 0x4);
|
||||
|
||||
m_Tick++;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Mobile.ClearAround();
|
||||
Stop();
|
||||
}
|
||||
}
|
||||
|
||||
private Point3D FindLocation(Map map, Point3D center, int range)
|
||||
{
|
||||
int cx = center.X;
|
||||
int cy = center.Y;
|
||||
|
||||
for (int i = 0; i < 20; ++i)
|
||||
{
|
||||
int x = cx + Utility.Random(range * 2) - range;
|
||||
int y = cy + Utility.Random(range * 2) - range;
|
||||
|
||||
if ((cx - x) * (cx - x) + (cy - y) * (cy - y) > range * range)
|
||||
continue;
|
||||
|
||||
int z = map.GetAverageZ(x, y);
|
||||
|
||||
if (!map.CanFit(x, y, z, 6, false, false))
|
||||
continue;
|
||||
|
||||
int topZ = z;
|
||||
|
||||
foreach (Item item in map.GetItemsInRange(new Point3D(x, y, z), 0))
|
||||
{
|
||||
topZ = Math.Max(topZ, item.Z + item.ItemData.CalcHeight);
|
||||
}
|
||||
|
||||
return new Point3D(x, y, topZ);
|
||||
}
|
||||
|
||||
return center;
|
||||
}
|
||||
}
|
||||
|
||||
private void ClearAround()
|
||||
{
|
||||
Point3D loc = Location;
|
||||
Map pmmap = Map;
|
||||
|
||||
List<Point3D> points = new List<Point3D>();
|
||||
|
||||
Server.Misc.Geometry.Circle2D(loc, pmmap, 7, (pnt, map) =>
|
||||
{
|
||||
if (map.CanFit(pnt, 0) && InLOS(pnt))
|
||||
points.Add(pnt);
|
||||
});
|
||||
|
||||
if (pmmap != Map.Internal && pmmap != null)
|
||||
{
|
||||
Server.Misc.Geometry.Circle2D(loc, pmmap, 6, (pnt, map) =>
|
||||
{
|
||||
if (map.CanFit(pnt, 0) && InLOS(pnt) && Utility.RandomBool())
|
||||
{
|
||||
Effects.SendPacket(pnt, map, new ParticleEffect(EffectType.FixedXYZ, Serial, Serial.Zero, 0x3789, pnt, pnt, 1, 30, false, false, 0, 3, 0, 9502, 1, Serial, 153, 0));
|
||||
Effects.SendPacket(pnt, map, new ParticleEffect(EffectType.FixedXYZ, Serial, Serial.Zero, 0x9DAC, pnt, pnt, 1, 30, false, false, 0, 0, 0, 9502, 1, Serial, 153, 0));
|
||||
}
|
||||
});
|
||||
|
||||
Server.Misc.Geometry.Circle2D(loc, pmmap, 7, (pnt, map) =>
|
||||
{
|
||||
if (map.CanFit(pnt, 0) && InLOS(pnt) && Utility.RandomBool())
|
||||
{
|
||||
Effects.SendPacket(pnt, map, new ParticleEffect(EffectType.FixedXYZ, Serial, Serial.Zero, 0x3789, pnt, pnt, 1, 30, false, false, 0, 3, 0, 9502, 1, Serial, 153, 0));
|
||||
Effects.SendPacket(pnt, map, new ParticleEffect(EffectType.FixedXYZ, Serial, Serial.Zero, 0x9DAC, pnt, pnt, 1, 30, false, false, 0, 0, 0, 9502, 1, Serial, 153, 0));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromMilliseconds(500), () =>
|
||||
{
|
||||
IPooledEnumerable eable = GetMobilesInRange(6);
|
||||
|
||||
foreach (Mobile from in eable)
|
||||
{
|
||||
if (!from.Alive || from == this || from.AccessLevel > AccessLevel.Player)
|
||||
continue;
|
||||
|
||||
if (from is PlayerMobile || (from is BaseCreature && (((BaseCreature)from).Controlled) || ((BaseCreature)from).Summoned))
|
||||
{
|
||||
Point3D point = points[Utility.Random(points.Count)];
|
||||
from.MoveToWorld(point, pmmap);
|
||||
from.Frozen = true;
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(3), () =>
|
||||
{
|
||||
from.Frozen = false;
|
||||
from.SendLocalizedMessage(1005603); // You can move again!
|
||||
});
|
||||
|
||||
if (CanBeHarmful(from))
|
||||
{
|
||||
double damage = from.Hits * 0.6;
|
||||
|
||||
if (damage < 10.0)
|
||||
damage = 10.0;
|
||||
else if (damage > 75.0)
|
||||
damage = 75.0;
|
||||
|
||||
DoHarmful(from);
|
||||
|
||||
AOS.Damage(from, this, (int)damage, 100, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
});
|
||||
|
||||
Hue = 0;
|
||||
|
||||
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(200, 300));
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.UltraRich, 3);
|
||||
AddLoot(LootPack.Meager);
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.WriteItem<ChampionSpawn>(Spawn);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
Spawn = reader.ReadItem<ChampionSpawn>();
|
||||
|
||||
Hue = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
using System.Linq;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a human corpse")]
|
||||
public class KhalAnkurWarriors : BaseCreature
|
||||
{
|
||||
public static readonly WarriorType[] Types =
|
||||
Enum.GetValues(typeof(WarriorType))
|
||||
.Cast<WarriorType>()
|
||||
.ToArray();
|
||||
|
||||
public static WarriorType RandomType { get { return Types[Utility.Random(Types.Length)]; } }
|
||||
|
||||
public enum WarriorType
|
||||
{
|
||||
Scout,
|
||||
Corporal,
|
||||
Lieutenant,
|
||||
Captain,
|
||||
General
|
||||
}
|
||||
|
||||
public WarriorType _Type { get; set; }
|
||||
|
||||
[Constructable]
|
||||
public KhalAnkurWarriors()
|
||||
: this(RandomType)
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public KhalAnkurWarriors(WarriorType type)
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
_Type = type;
|
||||
|
||||
if (Female = Utility.RandomBool())
|
||||
{
|
||||
Body = 0x191;
|
||||
Name = NameList.RandomName("female");
|
||||
}
|
||||
else
|
||||
{
|
||||
Body = 0x190;
|
||||
Name = NameList.RandomName("male");
|
||||
}
|
||||
|
||||
BaseSoundID = 0x45A;
|
||||
|
||||
SetStr(150, 250);
|
||||
SetDex(150);
|
||||
SetInt(100, 150);
|
||||
|
||||
SetDamage(20, 30);
|
||||
|
||||
SetHits(600, 800);
|
||||
|
||||
string _title = null;
|
||||
|
||||
switch (_Type)
|
||||
{
|
||||
case WarriorType.Scout: _title = "the Scout"; break;
|
||||
case WarriorType.Corporal: _title = "the Corporal"; break;
|
||||
case WarriorType.Lieutenant: _title = "the Lieutenant"; break;
|
||||
case WarriorType.Captain: _title = "the Captain"; SetHits(1000, 1500); break;
|
||||
case WarriorType.General: _title = "the General"; SetHits(1000, 1500); break;
|
||||
}
|
||||
|
||||
Title = _title;
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 20, 30);
|
||||
SetResistance(ResistanceType.Cold, 20, 30);
|
||||
SetResistance(ResistanceType.Poison, 20, 30);
|
||||
SetResistance(ResistanceType.Energy, 20, 30);
|
||||
|
||||
SetSkill(SkillName.Fencing, 105.0, 130.0);
|
||||
SetSkill(SkillName.Macing, 1105.0, 130.0);
|
||||
SetSkill(SkillName.MagicResist, 105.0, 130.0);
|
||||
SetSkill(SkillName.Swords, 105.0, 130.0);
|
||||
SetSkill(SkillName.Tactics, 105.0, 130.0);
|
||||
SetSkill(SkillName.Archery, 105.0, 130.0);
|
||||
SetSkill(SkillName.Magery, 105.0, 130.0);
|
||||
SetSkill(SkillName.Meditation, 105.0, 130.0);
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
switch (Utility.Random(4))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
Hue = 2697;
|
||||
SetWearable(new ChainChest(), Hue);
|
||||
SetWearable(new ChainCoif(), Hue);
|
||||
SetWearable(new Cloak(), Hue);
|
||||
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
Hue = 2697;
|
||||
SetWearable(new PlateChest(), Hue);
|
||||
SetWearable(new PlateLegs(), Hue);
|
||||
SetWearable(new Cloak(), Hue);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
Hue = 2684;
|
||||
SetWearable(new PlateChest(), Hue);
|
||||
SetWearable(new PlateLegs(), Hue);
|
||||
SetWearable(new PlateArms(), Hue);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
Hue = 2697;
|
||||
SetWearable(new ChainChest(), Hue);
|
||||
SetWearable(new ChainLegs(), Hue);
|
||||
SetWearable(new Boots(Hue));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Utility.Random(2))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
SetWearable(Loot.Construct(new Type[] { typeof(Spear), typeof(QuarterStaff), typeof(BlackStaff), typeof(Tessen), typeof(Cleaver), typeof(Lajatang) }));
|
||||
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
SetWearable(Loot.Construct(new Type[] { typeof(Yumi), typeof(Crossbow), typeof(RepeatingCrossbow), typeof(HeavyCrossbow) }));
|
||||
|
||||
RangeFight = 7;
|
||||
AI = AIType.AI_Archer;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int hairHue = Utility.RandomNondyedHue();
|
||||
|
||||
Utility.AssignRandomHair(this, hairHue);
|
||||
|
||||
if (Utility.Random(7) != 0)
|
||||
Utility.AssignRandomFacialHair(this, hairHue);
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
|
||||
public KhalAnkurWarriors(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Rich);
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
BaseWeapon wep = Weapon as BaseWeapon;
|
||||
|
||||
if (wep != null && !(wep is Fists))
|
||||
{
|
||||
if (Utility.RandomDouble() > 0.5)
|
||||
return wep.PrimaryAbility;
|
||||
|
||||
return wep.SecondaryAbility;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(0);
|
||||
|
||||
writer.Write((int)_Type);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
_Type = (WarriorType)reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
using Server.Items;
|
||||
using System;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a Bloody corpse")]
|
||||
public class KhaldunBlood : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public KhaldunBlood()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Blood";
|
||||
Body = 0x33;
|
||||
BaseSoundID = 456;
|
||||
|
||||
Hue = Utility.RandomList(33, 1157);
|
||||
|
||||
SetStr(220, 286);
|
||||
SetDex(125, 130);
|
||||
SetInt(100, 101);
|
||||
|
||||
SetHits(130);
|
||||
|
||||
SetDamage(8, 18);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 30, 50);
|
||||
SetResistance(ResistanceType.Fire, 20, 30);
|
||||
SetResistance(ResistanceType.Cold, 50, 60);
|
||||
SetResistance(ResistanceType.Poison, 20, 30);
|
||||
SetResistance(ResistanceType.Energy, 30, 40);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 60.0, 80.0);
|
||||
SetSkill(SkillName.Tactics, 85.0, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 85.0, 100.0);
|
||||
SetSkill(SkillName.DetectHidden, 40.0);
|
||||
|
||||
Fame = 300;
|
||||
Karma = -300;
|
||||
|
||||
VirtualArmor = 8;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.BleedAttack);
|
||||
}
|
||||
|
||||
public KhaldunBlood(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune { get { return Poison.Lesser; } }
|
||||
public override Poison HitPoison { get { return Poison.Lesser; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Poor);
|
||||
AddLoot(LootPack.Gems);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an incorporeal corpse")]
|
||||
public class ShadowFiend : BaseCreature
|
||||
{
|
||||
private UnhideTimer m_Timer;
|
||||
|
||||
[Constructable]
|
||||
public ShadowFiend()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "a shadow fiend";
|
||||
Body = 0x10;
|
||||
Hue = 2051;
|
||||
|
||||
// this to allow shadow fiend to loot from corpses
|
||||
Backpack backpack = new Backpack();
|
||||
backpack.Movable = false;
|
||||
AddItem(backpack);
|
||||
|
||||
SetStr(300, 400);
|
||||
SetDex(200, 250);
|
||||
SetInt(45, 55);
|
||||
|
||||
SetHits(300, 500);
|
||||
|
||||
SetDamage(10, 22);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 20);
|
||||
SetDamageType(ResistanceType.Cold, 80);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 30, 40);
|
||||
SetResistance(ResistanceType.Fire, 20, 30);
|
||||
SetResistance(ResistanceType.Cold, 50, 70);
|
||||
SetResistance(ResistanceType.Poison, 60, 70);
|
||||
SetResistance(ResistanceType.Energy, 5, 10);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 120.0);
|
||||
SetSkill(SkillName.Tactics, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 100.0);
|
||||
SetSkill(SkillName.DetectHidden, 250.0);
|
||||
SetSkill(SkillName.Hiding, 100.0);
|
||||
SetSkill(SkillName.Meditation, 100.0);
|
||||
SetSkill(SkillName.Focus, 0.0, 20.0);
|
||||
|
||||
Fame = 1000;
|
||||
Karma = -1000;
|
||||
|
||||
m_Timer = new UnhideTimer(this);
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public ShadowFiend(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool DeleteCorpseOnDeath
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool CanRummageCorpses
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x37A;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x379;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x381;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x37F;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x380;
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if (Backpack != null)
|
||||
Backpack.Destroy();
|
||||
|
||||
Effects.SendLocationEffect(Location, Map, 0x376A, 10, 1);
|
||||
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();
|
||||
|
||||
m_Timer = new UnhideTimer(this);
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if (m_Timer != null)
|
||||
m_Timer.Stop();
|
||||
|
||||
m_Timer = null;
|
||||
|
||||
base.OnAfterDelete();
|
||||
}
|
||||
|
||||
private class UnhideTimer : Timer
|
||||
{
|
||||
private readonly ShadowFiend m_Owner;
|
||||
public UnhideTimer(ShadowFiend owner)
|
||||
: base(TimeSpan.FromSeconds(30.0))
|
||||
{
|
||||
m_Owner = owner;
|
||||
Priority = TimerPriority.OneSecond;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if (m_Owner.Deleted)
|
||||
{
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
IPooledEnumerable eable = m_Owner.GetMobilesInRange(3);
|
||||
|
||||
foreach (Mobile m in eable)
|
||||
{
|
||||
if (m != m_Owner && m.Player && m.Hidden && m_Owner.CanBeHarmful(m) && m.IsPlayer())
|
||||
m.Hidden = false;
|
||||
}
|
||||
eable.Free();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a skeletal corpse")]
|
||||
public class SkelementalKnight : BaseCreature
|
||||
{
|
||||
public enum SkeletalType
|
||||
{
|
||||
Fire,
|
||||
Cold,
|
||||
Poison,
|
||||
Energy
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public SkelementalKnight()
|
||||
: this(Utility.RandomBool() ? SkeletalType.Energy : SkeletalType.Poison)
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public SkelementalKnight(SkeletalType type)
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Skelemental Knight";
|
||||
Body = 0x93;
|
||||
BaseSoundID = 451;
|
||||
|
||||
int fire = 100, cold = 100, poison = 100, energy = 100;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SkeletalType.Fire:
|
||||
{
|
||||
Hue = 2634;
|
||||
SetDamageType(ResistanceType.Fire, 100);
|
||||
cold = 5;
|
||||
break;
|
||||
}
|
||||
case SkeletalType.Cold:
|
||||
{
|
||||
Hue = 2581;
|
||||
SetDamageType(ResistanceType.Cold, 100);
|
||||
fire = 5;
|
||||
break;
|
||||
}
|
||||
case SkeletalType.Poison:
|
||||
{
|
||||
Hue = 2688;
|
||||
SetDamageType(ResistanceType.Poison, 100);
|
||||
energy = 5;
|
||||
break;
|
||||
}
|
||||
case SkeletalType.Energy:
|
||||
{
|
||||
Hue = 2717;
|
||||
SetDamageType(ResistanceType.Energy, 100);
|
||||
poison = 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SetStr(200, 250);
|
||||
SetDex(70, 95);
|
||||
SetInt(35, 60);
|
||||
|
||||
SetHits(110, 150);
|
||||
|
||||
SetDamage(8, 18);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 0);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 95);
|
||||
SetResistance(ResistanceType.Fire, fire);
|
||||
SetResistance(ResistanceType.Cold, cold);
|
||||
SetResistance(ResistanceType.Poison, poison);
|
||||
SetResistance(ResistanceType.Energy, energy);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 60.0, 80.0);
|
||||
SetSkill(SkillName.Tactics, 85.0, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 85.0, 100.0);
|
||||
SetSkill(SkillName.DetectHidden, 40.0);
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 40;
|
||||
|
||||
switch (Utility.Random(6))
|
||||
{
|
||||
case 0:
|
||||
PackItem(new PlateArms());
|
||||
break;
|
||||
case 1:
|
||||
PackItem(new PlateChest());
|
||||
break;
|
||||
case 2:
|
||||
PackItem(new PlateGloves());
|
||||
break;
|
||||
case 3:
|
||||
PackItem(new PlateGorget());
|
||||
break;
|
||||
case 4:
|
||||
PackItem(new PlateLegs());
|
||||
break;
|
||||
case 5:
|
||||
PackItem(new PlateHelm());
|
||||
break;
|
||||
}
|
||||
|
||||
PackItem(new Scimitar());
|
||||
PackItem(new WoodenShield());
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
public SkelementalKnight(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool BleedImmune { get { return true; } }
|
||||
|
||||
public override TribeType Tribe { get { return TribeType.Undead; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get
|
||||
{
|
||||
return OppositionGroup.FeyAndUndead;
|
||||
}
|
||||
}
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Average);
|
||||
AddLoot(LootPack.Meager);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a skeletal corpse")]
|
||||
public class SkelementalMage : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SkelementalMage()
|
||||
: this(Utility.RandomBool() ? SkelementalKnight.SkeletalType.Cold : SkelementalKnight.SkeletalType.Fire)
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public SkelementalMage(SkelementalKnight.SkeletalType type)
|
||||
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Skelemental Mage";
|
||||
Body = 0x32;
|
||||
BaseSoundID = 451;
|
||||
|
||||
int fire = 100, cold = 100, poison = 100, energy = 100;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SkelementalKnight.SkeletalType.Fire:
|
||||
{
|
||||
Hue = 2634;
|
||||
SetDamageType(ResistanceType.Fire, 100);
|
||||
cold = 5;
|
||||
break;
|
||||
}
|
||||
case SkelementalKnight.SkeletalType.Cold:
|
||||
{
|
||||
Hue = 2581;
|
||||
SetDamageType(ResistanceType.Cold, 100);
|
||||
fire = 5;
|
||||
break;
|
||||
}
|
||||
case SkelementalKnight.SkeletalType.Poison:
|
||||
{
|
||||
Hue = 2688;
|
||||
SetDamageType(ResistanceType.Poison, 100);
|
||||
energy = 5;
|
||||
break;
|
||||
}
|
||||
case SkelementalKnight.SkeletalType.Energy:
|
||||
{
|
||||
Hue = 2717;
|
||||
SetDamageType(ResistanceType.Energy, 100);
|
||||
poison = 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SetStr(200, 250);
|
||||
SetDex(70, 100);
|
||||
SetInt(100, 130);
|
||||
|
||||
SetHits(100, 150);
|
||||
|
||||
SetDamage(8, 18);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 0);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 95);
|
||||
SetResistance(ResistanceType.Fire, fire);
|
||||
SetResistance(ResistanceType.Cold, cold);
|
||||
SetResistance(ResistanceType.Poison, poison);
|
||||
SetResistance(ResistanceType.Energy, energy);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 60.0, 80.0);
|
||||
SetSkill(SkillName.Tactics, 75.0, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 85.0, 100.0);
|
||||
SetSkill(SkillName.DetectHidden, 50.0);
|
||||
SetSkill(SkillName.Magery, 110.0, 120.0);
|
||||
SetSkill(SkillName.Meditation, 150.0, 155.0);
|
||||
SetSkill(SkillName.Focus, 0.0, 60.0);
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
|
||||
VirtualArmor = 38;
|
||||
PackReg(3);
|
||||
PackNecroReg(3, 10);
|
||||
PackItem(new Bone());
|
||||
}
|
||||
|
||||
public SkelementalMage(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool BleedImmune { get { return true; } }
|
||||
public override OppositionGroup OppositionGroup { get { return OppositionGroup.FeyAndUndead; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Regular; } }
|
||||
public override TribeType Tribe { get { return TribeType.Undead; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Average);
|
||||
AddLoot(LootPack.LowScrolls);
|
||||
AddLoot(LootPack.Potions);
|
||||
}
|
||||
|
||||
public override void OnBeforeDamage(Mobile from, ref int totalDamage, Server.DamageType type)
|
||||
{
|
||||
if (Region.IsPartOf("Khaldun") && IsChampionSpawn && !Caddellite.CheckDamage(from, type))
|
||||
{
|
||||
totalDamage = 0;
|
||||
}
|
||||
|
||||
base.OnBeforeDamage(from, ref totalDamage, type);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user