RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

How To ... create race(Tutorial)

thema

Wanderer
BaseRaceGate Update.

Okay I modified the BaseRaceGate class to give you a working version of most of what I think y'all are looking for.

That is Beards, Masks, Starting values for Int, Str and Dex, and Race Skin Hues.

I'm pretty certain that anything not covered can soon be added by reading the code.

I serialised it properly too so if you already have a BaseRaceGate you won't have to erase first :D

I've tested it on my shard and it seems ok.

BaseRaceGate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public enum raceBeard
{
None,
Random,
LongBeard,
ShortBeard,
Goatee,
Mustache,
MediumShortBeard,
MediumLongBeard,
Vandyke
}

public enum raceMask
{
None,
Random,
OrcMask,
BearMask,
DeerMask,
SavageMask,
HornedTribalMask,
TribalMask
}

public enum raceHue
{
None,
Neutral,
Yellow,
Red,
Snake,
Green,
Orange
}


public abstract class BaseRaceGate : Item
{
private bool m_Active, m_Creatures;
private Point3D m_PointDest;
private Map m_MapDest;
private RaceType m_Race;
private raceHue m_RaceHue; // Character Skin Color
private int m_Str;
private int m_Dex;
private int m_Int;
private raceBeard m_Beard; // Set this to a Beard Value to add a beard on male & female characters.
private raceMask m_Mask; // Set this to a Mask Value to add a Mask to the character.

[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 raceHue RaceHue
{
get { return m_RaceHue; }
set { m_RaceHue = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceStr
{
get { return m_Str; }
set { m_Str = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceDex
{
get { return m_Dex; }
set { m_Dex = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceInt
{
get { return m_Int; }
set { m_Int = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public raceBeard RaceBeard
{
get { return m_Beard; }
set { m_Beard = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public raceMask RaceMask
{
get { return m_Mask; }
set { m_Mask = 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; // Just the color of the RaceGate.
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;
m_RaceHue = raceHue.None; // Utility.RandomNeutralHue() .RandomOrangeHue() .RandomSnakeHue() .RandomYellowHue() .RandomGreenHue()
m_Str = 10;
m_Dex = 10;
m_Int = 10;
m_Beard = raceBeard.None;
m_Mask = raceMask.None;
}

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;

if ( someperso != null )
{
if ( someperso.m_Race == RaceType.None )
{
someperso.InitStats( m_Str, m_Dex, m_Int ); // set the character's stats
someperso.m_Race = m_Race;
someperso.Name += " the " + Name;

if ( m_RaceHue != raceHue.None )
{
switch ( m_RaceHue )
{
case raceHue.Neutral: someperso.Hue = Utility.RandomNeutralHue(); break;
case raceHue.Yellow: someperso.Hue = Utility.RandomYellowHue(); break;
case raceHue.Red: someperso.Hue = Utility.RandomRedHue(); break;
case raceHue.Snake: someperso.Hue = Utility.RandomSnakeHue(); break;
case raceHue.Green: someperso.Hue = Utility.RandomGreenHue(); break;
case raceHue.Orange: someperso.Hue = Utility.RandomOrangeHue(); break;
}

}

if ( m_Beard != raceBeard.None )
{
Item beard = new Item( 0x203E );
switch ( m_Beard )
{
case raceBeard.Random: beard = new Item( Utility.RandomList( 0x203E, 0x203F, 0x2040, 0x2041, 0x204B, 0x204C, 0x204D ) ); break;
case raceBeard.LongBeard: beard = new Item( 0x203E ); break;
case raceBeard.ShortBeard: beard = new Item( 0x203F ); break;
case raceBeard.Goatee: beard = new Item( 0x2040 ); break;
case raceBeard.Mustache: beard = new Item( 0x2041 ); break;
case raceBeard.MediumShortBeard: beard = new Item( 0x204B ); break;
case raceBeard.MediumLongBeard: beard = new Item( 0x204C ); break;
case raceBeard.Vandyke: beard = new Item( 0x204D ); break;
}
if ( someperso.Hair != null )
beard.Hue = someperso.Hair.Hue;
else beard.Hue = Utility.RandomHairHue();
beard.Layer = Layer.FacialHair;
beard.Movable = false;

someperso.AddItem( beard );
}

if ( m_Mask != raceMask.None )
{
Item mask = new Item( 0x1546 );
if ( someperso.Female == true )
{
switch ( m_Mask )
{
case raceMask.Random: mask = new Item( Utility.RandomList( 0x1546, 0x1548, 0x154C, 0x154A, 0x141C, 0x154C ) ); break;
case raceMask.BearMask: mask = new Item( 0x1546 ); break;
case raceMask.DeerMask: mask = new Item( 0x1548 ); break;
case raceMask.TribalMask: mask = new Item( 0x154C ); break;
case raceMask.HornedTribalMask: mask = new Item( 0x154A ); break;
case raceMask.OrcMask: mask = new Item( 0x141C ); break;
case raceMask.SavageMask: mask = new Item( 0x154C ); break;
}
}
else
{
switch ( m_Mask )
{
case raceMask.Random: mask = new Item( Utility.RandomList( 0x1545, 0x1547, 0x154B, 0x1549, 0x141B, 0x154B ) ); break;
case raceMask.BearMask: mask = new Item( 0x1545 ); break;
case raceMask.DeerMask: mask = new Item( 0x1547 ); break;
case raceMask.TribalMask: mask = new Item( 0x154B ); break;
case raceMask.HornedTribalMask: mask = new Item( 0x1549 ); break;
case raceMask.OrcMask: mask = new Item( 0x141B ); break;
case raceMask.SavageMask: mask = new Item( 0x154B ); break;
}
}

mask.Hue = someperso.Hue;
mask.Layer = Layer.Helm;
mask.Movable = false;

someperso.AddItem( mask );
}

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) 3 ); // version

writer.Write( (int)m_RaceHue );
writer.Write( m_Str );
writer.Write( m_Dex );
writer.Write( m_Int );
writer.Write( (int)m_Beard );
writer.Write( (int)m_Mask );

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 3:
{
m_RaceHue = (raceHue)reader.ReadInt();
m_Str = reader.ReadInt();
m_Dex = reader.ReadInt();
m_Int = reader.ReadInt();
m_Beard = (raceBeard)reader.ReadInt();
m_Mask = (raceMask)reader.ReadInt();
goto case 2;
}
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]

Here's an example of how to use it.
This works with the PlayerMobile Class I posted earlier.

SpiderGnomeGate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public class SpiderGnomeGate : BaseRaceGate
{
[Constructable]
public SpiderGnomeGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x044b;
Name = "SpiderGnome";
Race = RaceType.SpiderGnome;
PointDest = new Point3D( 4091, 3137, 22 );
RaceBeard = raceBeard.Random;
RaceHue = raceHue.Snake;
RaceMask = raceMask.Random;
}

public SpiderGnomeGate( 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]

Enjoy!


Thema
 

thema

Wanderer
Updated PlayerMobile for RunUO Beta21

If you're using my PlayerMobile class then you'll need this.

Please check the versioning for yourself. I think it's ok, but I won't take responsibility for your losing saved characters.

[code:1]
using System;
using System.Collections;
using Server;
using Server.Misc;
using Server.Items;

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; }
}
}

public static void Initialize()
{
EventSink.Login += new LoginEventHandler( OnLogin );
EventSink.Logout += new LogoutEventHandler( OnLogout );
}

private static void OnLogin( LoginEventArgs e )
{
if ( e.Mobile is PlayerMobile )
((PlayerMobile)e.Mobile).m_SessionStart = DateTime.Now;
}

private static void OnLogout( LogoutEventArgs e )
{
if ( e.Mobile is PlayerMobile )
{
PlayerMobile pm = (PlayerMobile)e.Mobile;
pm.m_GameTime += DateTime.Now - pm.m_SessionStart;
}
}

public override void OnDamage( int amount, Mobile from, bool willKill )
{
if ( amount > 0 )
{
BandageContext c = BandageContext.GetContext( this );

if ( c != null )
c.Slip();
}

base.OnDamage( amount, from, willKill );
}

private ArrayList m_VisList;
private Hashtable m_AntiMacroTable;
private TimeSpan m_GameTime;
private TimeSpan m_ShortTermElapse;
private TimeSpan m_LongTermElapse;
private DateTime m_SessionStart;

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();

m_GameTime = TimeSpan.Zero;
m_ShortTermElapse = TimeSpan.FromHours( 8.0 );
m_LongTermElapse = TimeSpan.FromHours( 40.0 );
}

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 Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();

switch ( version )
{
case 2:
{
m_LongTermElapse = reader.ReadTimeSpan();
m_ShortTermElapse = reader.ReadTimeSpan();
m_GameTime = reader.ReadTimeSpan();
goto case 1;
}

case 1:
{
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();
goto case 0;
}
case 0:
break;
}
}

public override void Serialize( GenericWriter 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 );
}

//decay our kills
if ( m_ShortTermElapse < this.GameTime )
{
m_ShortTermElapse = this.GameTime + TimeSpan.FromHours( 8 );
if ( ShortTermMurders > 0 )
--ShortTermMurders;
}

if ( m_LongTermElapse < this.GameTime )
{
m_LongTermElapse = this.GameTime + TimeSpan.FromHours( 40 );
if ( Kills > 0 )
--Kills;
}

base.Serialize( writer );

writer.Write( (int)2 );//version

//version 2
writer.Write( m_LongTermElapse );
writer.Write( m_ShortTermElapse );
writer.Write( this.GameTime );
//version 1
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 void ResetKillTime()
{
m_ShortTermElapse = this.GameTime + TimeSpan.FromHours( 8 );
m_LongTermElapse = this.GameTime + TimeSpan.FromHours( 40 );
}

[CommandProperty( AccessLevel.GameMaster )]
public TimeSpan GameTime
{
get
{
if ( NetState != null )
return m_GameTime + (DateTime.Now - m_SessionStart);
else
return m_GameTime;
}
}

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]
 

thema

Wanderer
Updated BaseRaceGate.cs

This updates BaseRaceGates to include Dark skins, and White hair for Drow races.
It also introduces a beardHue.Shaved type for the removal of facial hair on Elves, for those purists that believe that Elves do not have facial hair.
And hairHue.Shaved for removal of Hair for those that think Orcs and such can do without it.

[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public enum raceBeard
{
None,
Random,
LongBeard,
ShortBeard,
Goatee,
Mustache,
MediumShortBeard,
MediumLongBeard,
Vandyke
}

public enum raceMask
{
None,
Random,
OrcMask,
BearMask,
DeerMask,
SavageMask,
HornedTribalMask,
TribalMask
}

public enum raceHue
{
None,
Neutral,
Yellow,
Red,
Snake,
Green,
Orange,
Dark
}

public enum hairHue
{
None,
Shaved,
Neutral,
Yellow,
Red,
Snake,
Green,
Orange,
White
}


public enum beardHue
{
None,
Shaved,
Neutral,
Yellow,
Red,
Snake,
Green,
Orange,
White
}

public abstract class BaseRaceGate : Item
{
private bool m_Active, m_Creatures;
private Point3D m_PointDest;
private Map m_MapDest;
private RaceType m_Race;
private raceHue m_RaceHue; // Character Skin Color
private int m_Str;
private int m_Dex;
private int m_Int;
private raceBeard m_Beard; // Set this to a Beard Value to add a beard on male & female characters.
private raceMask m_Mask; // Set this to a Mask Value to add a Mask to the character.
private hairHue m_HairHue; // Change the Race's Hair
private beardHue m_BeardHue; // & Beard Colour.

[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 raceHue RaceHue
{
get { return m_RaceHue; }
set { m_RaceHue = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceStr
{
get { return m_Str; }
set { m_Str = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceDex
{
get { return m_Dex; }
set { m_Dex = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public int RaceInt
{
get { return m_Int; }
set { m_Int = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public raceBeard RaceBeard
{
get { return m_Beard; }
set { m_Beard = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public hairHue HairHue
{
get { return m_HairHue; }
set { m_HairHue = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public beardHue BeardHue
{
get { return m_BeardHue; }
set { m_BeardHue = value; }
}

[CommandProperty( AccessLevel.GameMaster )]
public raceMask RaceMask
{
get { return m_Mask; }
set { m_Mask = 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; // Just the color of the RaceGate.
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;
m_RaceHue = raceHue.None; // Utility.RandomNeutralHue() .RandomOrangeHue() .RandomSnakeHue() .RandomYellowHue() .RandomGreenHue()
m_Str = 30;
m_Dex = 30;
m_Int = 30;
m_Beard = raceBeard.None;
m_Mask = raceMask.None;
m_HairHue = hairHue.None;
m_BeardHue = beardHue.None;
}

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;

if ( someperso != null )
{
if ( someperso.m_Race == RaceType.None )
{
someperso.InitStats( m_Str, m_Dex, m_Int ); // set the character's stats
someperso.m_Race = m_Race;
someperso.Name += " the " + Name;

if ( m_RaceHue != raceHue.None )
{
switch ( m_RaceHue )
{
case raceHue.Neutral: someperso.Hue = Utility.RandomNeutralHue(); break;
case raceHue.Yellow: someperso.Hue = Utility.RandomYellowHue(); break;
case raceHue.Red: someperso.Hue = Utility.RandomRedHue(); break;
case raceHue.Snake: someperso.Hue = Utility.RandomSnakeHue(); break;
case raceHue.Green: someperso.Hue = Utility.RandomGreenHue(); break;
case raceHue.Orange: someperso.Hue = Utility.RandomOrangeHue(); break;
case raceHue.Dark: someperso.Hue = Utility.RandomList( 692, 697, 702, 703, 704, 707, 708, 717 ); break; }

}

if ( m_Beard != raceBeard.None )
{
Item beard = new Item( 0x203E );
switch ( m_Beard )
{
case raceBeard.Random: beard = new Item( Utility.RandomList( 0x203E, 0x203F, 0x2040, 0x2041, 0x204B, 0x204C, 0x204D ) ); break;
case raceBeard.LongBeard: beard = new Item( 0x203E ); break;
case raceBeard.ShortBeard: beard = new Item( 0x203F ); break;
case raceBeard.Goatee: beard = new Item( 0x2040 ); break;
case raceBeard.Mustache: beard = new Item( 0x2041 ); break;
case raceBeard.MediumShortBeard: beard = new Item( 0x204B ); break;
case raceBeard.MediumLongBeard: beard = new Item( 0x204C ); break;
case raceBeard.Vandyke: beard = new Item( 0x204D ); break;
}

if ( someperso.Hair != null )
beard.Hue = someperso.Hair.Hue;
else beard.Hue = Utility.RandomHairHue();
beard.Layer = Layer.FacialHair;
beard.Movable = false;

someperso.AddItem( beard );
}

if ( m_HairHue != hairHue.None && someperso.Hair != null )
{
switch ( m_HairHue )
{
case hairHue.Shaved: someperso.Hair.Delete(); break;
case hairHue.Neutral: someperso.Hair.Hue = Utility.RandomNeutralHue(); break;
case hairHue.Yellow: someperso.Hair.Hue = Utility.RandomYellowHue(); break;
case hairHue.Red: someperso.Hair.Hue = Utility.RandomRedHue(); break;
case hairHue.Snake: someperso.Hair.Hue = Utility.RandomSnakeHue(); break;
case hairHue.Green: someperso.Hair.Hue = Utility.RandomGreenHue(); break;
case hairHue.Orange: someperso.Hair.Hue = Utility.RandomOrangeHue(); break;
case hairHue.White: someperso.Hair.Hue = 1153; break;
}

}

if ( m_BeardHue != beardHue.None && someperso.Beard != null )
{
switch ( m_BeardHue )
{
case beardHue.Shaved: someperso.Beard.Delete(); break;
case beardHue.Neutral: someperso.Beard.Hue = Utility.RandomNeutralHue(); break;
case beardHue.Yellow: someperso.Beard.Hue = Utility.RandomYellowHue(); break;
case beardHue.Red: someperso.Beard.Hue = Utility.RandomRedHue(); break;
case beardHue.Snake: someperso.Beard.Hue = Utility.RandomSnakeHue(); break;
case beardHue.Green: someperso.Beard.Hue = Utility.RandomGreenHue(); break;
case beardHue.Orange: someperso.Beard.Hue = Utility.RandomOrangeHue(); break;
case beardHue.White: someperso.Beard.Hue = 1153; break;
}

}

if ( m_Mask != raceMask.None )
{
Item mask = new Item( 0x1546 );
if ( someperso.Female == true )
{
switch ( m_Mask )
{
case raceMask.Random: mask = new Item( Utility.RandomList( 0x1546, 0x1548, 0x154C, 0x154A, 0x141C, 0x154C ) ); break;
case raceMask.BearMask: mask = new Item( 0x1546 ); break;
case raceMask.DeerMask: mask = new Item( 0x1548 ); break;
case raceMask.TribalMask: mask = new Item( 0x154C ); break;
case raceMask.HornedTribalMask: mask = new Item( 0x154A ); break;
case raceMask.OrcMask: mask = new Item( 0x141C ); break;
case raceMask.SavageMask: mask = new Item( 0x154C ); break;
}
}
else
{
switch ( m_Mask )
{
case raceMask.Random: mask = new Item( Utility.RandomList( 0x1545, 0x1547, 0x154B, 0x1549, 0x141B, 0x154B ) ); break;
case raceMask.BearMask: mask = new Item( 0x1545 ); break;
case raceMask.DeerMask: mask = new Item( 0x1547 ); break;
case raceMask.TribalMask: mask = new Item( 0x154B ); break;
case raceMask.HornedTribalMask: mask = new Item( 0x1549 ); break;
case raceMask.OrcMask: mask = new Item( 0x141B ); break;
case raceMask.SavageMask: mask = new Item( 0x154B ); break;
}
}

mask.Hue = someperso.Hue;
mask.Layer = Layer.Helm;
mask.Movable = false;

someperso.AddItem( mask );
}

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) 4 ); // version

writer.Write( (int)m_BeardHue );
writer.Write( (int)m_HairHue );

writer.Write( (int)m_RaceHue );
writer.Write( m_Str );
writer.Write( m_Dex );
writer.Write( m_Int );
writer.Write( (int)m_Beard );
writer.Write( (int)m_Mask );

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 4:
{
m_BeardHue = (beardHue)reader.ReadInt();
m_HairHue = (hairHue)reader.ReadInt();
goto case 3;
}
case 3:
{
m_RaceHue = (raceHue)reader.ReadInt();
m_Str = reader.ReadInt();
m_Dex = reader.ReadInt();
m_Int = reader.ReadInt();
m_Beard = (raceBeard)reader.ReadInt();
m_Mask = (raceMask)reader.ReadInt();
goto case 2;
}
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]

Please report bugs.

Thema.
 

thema

Wanderer
RaceGates

Here's my RaceGates to give you an idea of how you might use them.

OrogGate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public class OrogGate : BaseRaceGate
{
[Constructable]
public OrogGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x0485;
Name = "Orog";
Race = RaceType.Orog;
RaceMask = raceMask.OrcMask;
RaceStr = 40;
RaceHue = raceHue.Snake;
BeardHue = beardHue.Shaved;
HairHue = hairHue.Shaved;
PointDest = new Point3D( 476, 3552, 0 );
}

public OrogGate( 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]

DrowGate.cs
[code:1]
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public class DrowGate : BaseRaceGate
{
[Constructable]
public DrowGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x047e;
Name = "Drow";
HairHue = hairHue.White;
BeardHue = beardHue.White;
Race = RaceType.Drow;
RaceHue = raceHue.Dark;
PointDest = new Point3D( 3154, 1138, 0 );
}

public DrowGate( 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]

DwarfGate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public class DwarfGate : BaseRaceGate
{
[Constructable]
public DwarfGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x0498;
Name = "Dwarf";
Race = RaceType.Dwarf;
RaceBeard = raceBeard.Random;

PointDest = new Point3D( 2570, 450, 5 );
}

public DwarfGate( 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]

OrcGate.cs
[code:1]
using System;
using Server;
using Server.Items;
using Server.Mobiles;

namespace Server.Scripts
{
public class OrcGate : BaseRaceGate
{
[Constructable]
public OrcGate() : base( new Point3D( 0, 0, 0 ), Map.Felucca, false )
{
Hue = 0x0493;
Name = "Orc";
Race = RaceType.Orc;
RaceMask = raceMask.OrcMask;
RaceStr = 40;
RaceHue = raceHue.Snake;
BeardHue = beardHue.Shaved;
HairHue = hairHue.Shaved;
PointDest = new Point3D( 1488, 3502, 2 );
}

public OrcGate( 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]

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;
BeardHue = beardHue.Shaved;

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]

Thema
 

thema

Wanderer
Updated BaseRaceGate + SelectionGump for Custom Enums

Sorry it took so long, but here it is.

The BaseraceGate class with a rough but workable Gump for selecting character attributes.

I moved my BaseRaceGates class to a new thread because of the age & depth of this one.
Plus someone else started a newer thread with similar RaceGates derived from ours here, which would mean people not getting to see ours and being able to decide which they prefer.

Thema
 

David

Moderate
Wow your timing is perfect. I was just begining to work on this very thing. *grins happily* But it is getting hard to keep up with you.
 

thema

Wanderer
Thanks David.

I do try LoL.


No really. All this is what I'm wanting for my shard. This is why I'm being so driven by it. I may even look at being able to put together a complete WotC Dungeons & Dragons(r) Style D20 System Character Generator.

If you check out the new thread. I've posted again with an improved Gump.
I'm still not happy with it, and would welcome any contributions.

Thema
 
Top