For those who want a little more.
Here's my BaseRaceGate Class and PlayerMobile class.
Both are working fine with Beta20 and the playerMobile class also has space for classes, alignments, levels, experience points.
BaseRaceGate
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;
namespace Server.Scripts
{
public abstract class BaseRaceGate : Item
{
private bool m_Active, m_Creatures;
private Point3D m_PointDest;
private Map m_MapDest;
private RaceType m_Race; // private RaceType PgRace;
[CommandProperty( AccessLevel.GameMaster )]
public bool Active
{
get { return m_Active; }
set { m_Active = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public RaceType Race
{
get { return m_Race; } // get { return PgRace; }
set { m_Race = value; } // set { PgRace = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public Point3D PointDest
{
get { return m_PointDest; }
set { m_PointDest = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public Map MapDest
{
get { return m_MapDest; }
set { m_MapDest = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Creatures
{
get { return m_Creatures; }
set { m_Creatures = value; }
}
public BaseRaceGate( Point3D pointDest, Map mapDest, bool creatures ) : base( 0x0F6C)
{
Visible = true;
Movable = false;
Hue = 0x047f;
Light = LightType.Circle300;
Name = "Human";
m_Race = RaceType.Human;
m_Active = true;
m_PointDest = new Point3D( 1069, 1025, 5 );
m_MapDest = Map.Felucca;
m_Creatures = creatures;
}
public override void OnSingleClick( Mobile from )
{
LabelTo( from, Name ); // RaceGate
if ( m_Active )
{
if ( m_MapDest != null && m_PointDest != Point3D.Zero )
LabelTo( from, "{0} [{1}]", m_PointDest, m_MapDest );
else if ( m_MapDest != null )
LabelTo( from, "[{0}]", m_MapDest );
else if ( m_PointDest != Point3D.Zero )
LabelTo( from, m_PointDest.ToString() );
}
else
{
LabelTo( from, "(inactive)" );
}
}
public override bool OnMoveOver( Mobile m )
{
Mobile somemobile = m;
PlayerMobile someperso = somemobile as PlayerMobile; // MyMobile someperso = somemobile as MyMobile;
if ( someperso != null )
{
if ( someperso.m_Race == RaceType.None ) // if ( someperso.PgRace == RaceType.None )
{
switch ( someperso.Str )
{
case 95:
{
someperso.InitStats(75, 115, 40); //set the charater's stats
break;
}
case 85:
{
someperso.InitStats(65, 40, 95); //set the charater's stats
break;
}
case 60:
{
someperso.InitStats(40, 40, 40); //set the charater's stats
break;
}
}
someperso.m_Race = m_Race; // someperso.PgRace = PgRace;
someperso.Name += " the " + Name;
someperso.SendMessage("You are now a {0}!", Name);
}
else someperso.SendMessage("Be satisfied with your race!"
;
}
if ( m_Active )
{
if ( !m_Creatures && !m.Player )
return true;
Map map = m_MapDest;
if ( map == null )
map = m.Map;
Point3D p = m_PointDest;
if ( p == Point3D.Zero )
p = m.Location;
Server.Mobiles.BaseCreature.TeleportPets( m, p, map );
if ( m_MapDest != null )
m.Map = m_MapDest;
if ( m_PointDest != Point3D.Zero )
m.Location = m_PointDest;
return false;
}
return true;
}
public BaseRaceGate( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 2 ); // version
writer.Write( (int)m_Race );
writer.Write( m_Creatures );
writer.Write( m_Active );
writer.Write( m_PointDest );
writer.Write( m_MapDest );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 2:
{
m_Race = (RaceType)reader.ReadInt();
goto case 1;
}
case 1:
{
m_Creatures = reader.ReadBool();
goto case 0;
}
case 0:
{
m_Active = reader.ReadBool();
m_PointDest = reader.ReadPoint3D();
m_MapDest = reader.ReadMap();
break;
}
}
}
}
}
[/code:1]
PlayerMobile version for shards upgrading from the RunUO PlayerMobile Class, or with no players, or who don't mind wiping clean.
[code:1]
using System;
using System.Collections;
using Server;
using Server.Misc;
namespace Server.Mobiles
{
public enum RaceType
{
None,
Human, HalfElf, Elf, Avariel, Dwarf, Halfling, Kender, Gnome,
SpiderGnome, Drow, Orc, Orog, Dwergar, Vampire, Lich, Skeleton
}
public enum ClassType
{
None, Fighter, Mage, Cleric, Thief, Bard, Druid
}
public enum AlignmentType
{
None, LawfulGood, Good, ChaoticGood, LawfulNeutral, TrueNeutral, ChaoticNeutral, LawfulEvil, Evil, ChaoticEvil
}
public class PlayerMobile : Mobile
{
private class CountAndTimeStamp
{
private int m_Count;
private DateTime m_Stamp;
public CountAndTimeStamp()
{
}
public DateTime TimeStamp { get{ return m_Stamp; } }
public int Count
{
get { return m_Count; }
set { m_Count = value; m_Stamp = DateTime.Now; }
}
}
private ArrayList m_VisList;
private Hashtable m_AntiMacroTable;
public RaceType m_Race = RaceType.None;
public ClassType m_Class = ClassType.None;
public AlignmentType m_Alignment = AlignmentType.None;
public int m_Level = 1;
public int m_CurrentExperience = 0;
public int m_ExperienceNeeded = 1000;
[CommandProperty( AccessLevel.GameMaster )]
public RaceType Race
{
get { return m_Race; }
set { m_Race = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public ClassType Class
{
get { return m_Class; }
set { m_Class = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public AlignmentType Alignment
{
get { return m_Alignment; }
set { m_Alignment = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int Level
{
get { return m_Level; }
set { m_Level = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int CurrentExperience
{
get { return m_CurrentExperience; }
set { m_CurrentExperience = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int ExperienceNeeded
{
get { return m_ExperienceNeeded; }
set { m_ExperienceNeeded = value; }
}
public PlayerMobile()
{
m_VisList = new ArrayList();
m_AntiMacroTable = new Hashtable();
}
public PlayerMobile( Serial s ) : base( s )
{
m_VisList = new ArrayList();
m_AntiMacroTable = new Hashtable();
}
public ArrayList VisibilityList
{
get
{
return m_VisList;
}
}
public bool AntiMacroCheck( Skill skill, object obj )
{
if ( obj == null || m_AntiMacroTable == null || this.AccessLevel != AccessLevel.Player )
return true;
Hashtable tbl = (Hashtable)m_AntiMacroTable[skill];
if ( tbl == null )
m_AntiMacroTable[skill] = tbl = new Hashtable();
CountAndTimeStamp count = (CountAndTimeStamp)tbl[obj];
if ( count != null )
{
if ( count.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
{
count.Count = 1;
return true;
}
else
{
++count.Count;
if ( count.Count <= SkillCheck.Allowance )
return true;
else
return false;
}
}
else
{
tbl[obj] = count = new CountAndTimeStamp();
count.Count = 1;
return true;
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
foreach ( Hashtable t in m_AntiMacroTable.Values )
{
ArrayList remove = new ArrayList();
foreach ( CountAndTimeStamp time in t.Values )
{
if ( time.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
remove.Add( time );
}
for (int i=0;i<remove.Count;++i)
t.Remove( remove
);
}
writer.Write( (int) 0 );
writer.Write( (int)m_Race );
writer.Write( (int)m_Class );
writer.Write( (int)m_Alignment );
writer.Write( (int)m_Level );
writer.Write( (int)m_CurrentExperience );
writer.Write( (int)m_ExperienceNeeded );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_Race = (RaceType)reader.ReadInt();
m_Class = (ClassType)reader.ReadInt();
m_Alignment = (AlignmentType)reader.ReadInt();
m_Level = reader.ReadInt();
m_CurrentExperience = reader.ReadInt();
m_ExperienceNeeded = reader.ReadInt();
}
public override bool CanSee( Mobile m )
{
if ( m is PlayerMobile && ((PlayerMobile)m).m_VisList.Contains( this ) )
return true;
else
return base.CanSee( m );
}
}
}
[/code:1]
PlayerMobile properly serilised for those moving up from the an earlier PlayerMobile class posted here.
[code:1]
using System;
using System.Collections;
using Server;
using Server.Misc;
namespace Server.Mobiles
{
public enum RaceType
{
None,
Human, HalfElf, Elf, Avariel, Dwarf, Halfling, Kender, Gnome,
SpiderGnome, Drow, Orc, Orog, Dwergar, Vampire, Lich, Skeleton
}
public enum ClassType
{
None, Fighter, Mage, Cleric, Thief, Bard, Druid
}
public enum AlignmentType
{
None, LawfulGood, Good, ChaoticGood, LawfulNeutral, TrueNeutral, ChaoticNeutral, LawfulEvil, Evil, ChaoticEvil
}
public class PlayerMobile : Mobile
{
private class CountAndTimeStamp
{
private int m_Count;
private DateTime m_Stamp;
public CountAndTimeStamp()
{
}
public DateTime TimeStamp { get{ return m_Stamp; } }
public int Count
{
get { return m_Count; }
set { m_Count = value; m_Stamp = DateTime.Now; }
}
}
private ArrayList m_VisList;
private Hashtable m_AntiMacroTable;
public RaceType m_Race = RaceType.None;
public ClassType m_Class = ClassType.None;
public AlignmentType m_Alignment = AlignmentType.None;
public int m_Level = 1;
public int m_CurrentExperience = 0;
public int m_ExperienceNeeded = 1000;
[CommandProperty( AccessLevel.GameMaster )]
public RaceType Race
{
get { return m_Race; }
set { m_Race = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public ClassType Class
{
get { return m_Class; }
set { m_Class = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public AlignmentType Alignment
{
get { return m_Alignment; }
set { m_Alignment = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int Level
{
get { return m_Level; }
set { m_Level = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int CurrentExperience
{
get { return m_CurrentExperience; }
set { m_CurrentExperience = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int ExperienceNeeded
{
get { return m_ExperienceNeeded; }
set { m_ExperienceNeeded = value; }
}
public PlayerMobile()
{
m_VisList = new ArrayList();
m_AntiMacroTable = new Hashtable();
}
public PlayerMobile( Serial s ) : base( s )
{
m_VisList = new ArrayList();
m_AntiMacroTable = new Hashtable();
}
public ArrayList VisibilityList
{
get
{
return m_VisList;
}
}
public bool AntiMacroCheck( Skill skill, object obj )
{
if ( obj == null || m_AntiMacroTable == null || this.AccessLevel != AccessLevel.Player )
return true;
Hashtable tbl = (Hashtable)m_AntiMacroTable[skill];
if ( tbl == null )
m_AntiMacroTable[skill] = tbl = new Hashtable();
CountAndTimeStamp count = (CountAndTimeStamp)tbl[obj];
if ( count != null )
{
if ( count.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
{
count.Count = 1;
return true;
}
else
{
++count.Count;
if ( count.Count <= SkillCheck.Allowance )
return true;
else
return false;
}
}
else
{
tbl[obj] = count = new CountAndTimeStamp();
count.Count = 1;
return true;
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
foreach ( Hashtable t in m_AntiMacroTable.Values )
{
ArrayList remove = new ArrayList();
foreach ( CountAndTimeStamp time in t.Values )
{
if ( time.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
remove.Add( time );
}
for (int i=0;i<remove.Count;++i)
t.Remove( remove );
}
writer.Write( (int) 1 );
writer.Write( (int)m_Class );
writer.Write( (int)m_Alignment );
writer.Write( (int)m_Level );
writer.Write( (int)m_CurrentExperience );
writer.Write( (int)m_ExperienceNeeded );
writer.Write( (int)m_Race );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 1:
{
m_Class = (ClassType)reader.ReadInt();
m_Alignment = (AlignmentType)reader.ReadInt();
m_Level = reader.ReadInt();
m_CurrentExperience = reader.ReadInt();
m_ExperienceNeeded = reader.ReadInt();
goto case 0;
}
case 0:
{
m_Race = (RaceType)reader.ReadInt();
break;
}
}
}
public override bool CanSee( Mobile m )
{
if ( m is PlayerMobile && ((PlayerMobile)m).m_VisList.Contains( this ) )
return true;
else
return base.CanSee( m );
}
}
}
[/code:1]
Finally an example of how to use the class.
Elfgate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;
namespace Server.Scripts
{
public class ElfGate : BaseRaceGate
{
[Constructable]
public ElfGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x0491;
Name = "Elf";
Race = RaceType.Elf;
PointDest = new Point3D( 1325, 284, 5 );
}
public ElfGate( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}
[/code:1]
If even more is needed it is simple to everride the OnMoveOver event. or better yet, add the needed extras to the BaseRaceGate class.
Thema