RassenGate mit HuePicker

Hier könnt ihr eure Scripte vorstellen und Untereinander verbessern.
Antworten
Nachricht
Autor
Seyana
Senior Newbie
Beiträge: 43
Registriert: 17 Jan 2004 02:00

RassenGate mit HuePicker

#1 Beitrag von Seyana » 20 Apr 2006 15:58

Für jede Rasse ein Gate, hier als Beispiel für die Barbaren.
Beim Durchlaufen öffnet sich ein Haarfärbegump. Wenn man nichts wählt, wird alles geschlossen und ein Hinweis erscheint. Wenn man gewählt hat, erscheint ein Hautfärbegump. Erst wenn man dort auch gewählt hat, werden sämtliche Werte wie zB Skills und neue Position gesetzt.
Die Farbgumps sind vom HairDyeGump abgeleitet, mit dem Unterschied, dass nun nicht mehr verschiedene Kartenreiter zu sehen sind und die Farben direkt hintereinander aufgelistet werden.
Vielleicht lässt sich das auch besser lösen mit nur einem Gump, aber ehrlich gesagt bin ich froh, dass es überhaupt funktioniert...
using System;
using Server;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;

namespace Server.Items
{
public class BarbarGate : Item
{
[Constructable]
public BarbarGate() : base( 0xF6C )
{
Movable = false;
Hue = 0x1B9;
Name = "Barbaren Gate";
}

public BarbarGate( Serial serial ) : base( serial )
{
}

public override bool OnMoveOver( Mobile m )
{
if (m.Map.CanFit( m.Location, 16, false, false ) )
{
if ( m.Hair != null || m.Beard != null )
{
m.CloseGump( typeof( BodyDyeGump ) );
m.SendGump( new BodyDyeGump( this ) );
m.CloseGump( typeof( HairDyeGump ) );
m.SendGump( new HairDyeGump( this ) );
}
else
{
m.CloseGump( typeof( BodyDyeGump ) );
m.SendGump( new BodyDyeGump( this ) );
}
return false;
}
else
{
return false;
}
}

public class HairDyeGump : Gump
{
private BarbarGate m_HairDye;
private class HairDyeEntry
{
private string m_Name;
private int m_HueStart;
private int m_HueCount;
public string Name
{
get
{
return m_Name;
}
}
public int HueStart
{
get
{
return m_HueStart;
}
}
public int HueCount
{
get
{
return m_HueCount;
}
}
public HairDyeEntry( string name, int hueStart, int hueCount )
{
m_Name = name;
m_HueStart = hueStart;
m_HueCount = hueCount;
}
}
private static HairDyeEntry[] m_Entries = new HairDyeEntry[]
{
new HairDyeEntry( "*****", 337, 2 ),
new HairDyeEntry( "*****", 1502, 32 ),
new HairDyeEntry( "*****", 2201, 6 ),
};
public HairDyeGump( BarbarGate dye ) : base( 50, 50 )
{
m_HairDye = dye;
Closable=false;
Disposable=false;
Dragable=false;
Resizable=false;
AddPage( 0 );
AddBackground( 100, 10, 350, 355, 3600 );
AddLabel( 150, 25, 1153, "Haarfarbe" );
AddButton( 149, 328, 4005, 4007, 1, GumpButtonType.Reply, 1 );
AddLabel( 185, 329, 1153, "OK" );
int z=0;
for ( int i = 0; i < m_Entries.Length; ++i )
{
HairDyeEntry e = m_Entries;
for ( int j = 0; j < e.HueCount; ++j )
{
AddLabel( 145 + ((z / 16) * 80), 52 + ((z % 16) * 17), e.HueStart + j - 1, "*****" );
AddRadio( 127 + ((z / 16) * 80), 52 + ((z % 16) * 17), 210, 211, false, (i * 100) + j );
z=++z;
}
}
}
public override void OnResponse( NetState from, RelayInfo info )
{
Mobile m = from.Mobile;
int[] switches = info.Switches;
if ( info.ButtonID != 0 && switches.Length > 0)
{
Item hair = m.Hair;
Item beard = m.Beard;
// To prevent this from being exploited, the hue is abstracted into an internal list
int entryIndex = switches[0] / 100;
int hueOffset = switches[0] % 100;
if ( entryIndex >= 0 && entryIndex < m_Entries.Length )
{
HairDyeEntry e = m_Entries[entryIndex];
if ( hueOffset >= 0 && hueOffset < e.HueCount )
{
int hue = e.HueStart + hueOffset;
if ( hair != null )
hair.Hue = hue;
if ( beard != null )
beard.Hue = hue;
}
}
}
else
{
m.SendMessage( "Ihr muesst eine Farbe waehlen!" );
m.CloseGump( typeof( BodyDyeGump ) );
}
}
}

public class BodyDyeGump : Gump
{
private BarbarGate m_BodyDye;
private class BodyDyeEntry
{
private string m_Name;
private int m_HueStart;
private int m_HueCount;
public string Name
{
get
{
return m_Name;
}
}
public int HueStart
{
get
{
return m_HueStart;
}
}
public int HueCount
{
get
{
return m_HueCount;
}
}
public BodyDyeEntry( string name, int hueStart, int hueCount )
{
m_Name = name;
m_HueStart = hueStart;
m_HueCount = hueCount;
}
}
private static BodyDyeEntry[] m_Entries = new BodyDyeEntry[]
{
new BodyDyeEntry( "*****", 146, 1 ),
new BodyDyeEntry( "*****", 246, 1 ),
new BodyDyeEntry( "*****", 346, 1 ),
new BodyDyeEntry( "*****", 445, 2 ),
new BodyDyeEntry( "*****", 541, 1 ),
new BodyDyeEntry( "*****", 545, 2 ),
new BodyDyeEntry( "*****", 636, 1 ),
new BodyDyeEntry( "*****", 640, 2 ),
new BodyDyeEntry( "*****", 645, 1 ),
new BodyDyeEntry( "*****", 1002, 2 ),
new BodyDyeEntry( "*****", 2425, 3 ),
};
public BodyDyeGump( BarbarGate dye ) : base( 50, 50 )
{
m_BodyDye = dye;
Closable=false;
Disposable=false;
Dragable=false;
Resizable=false;
AddPage( 0 );
AddBackground( 100, 10, 350, 355, 3600 );
AddLabel( 150, 25, 1153, "Hautfarbe" );
AddButton( 149, 328, 4005, 4007, 1, GumpButtonType.Reply, 0 );
AddLabel( 185, 329, 1153, "OK" );
int z=0;
for ( int i = 0; i < m_Entries.Length; ++i )
{
BodyDyeEntry e = m_Entries;
for ( int j = 0; j < e.HueCount; ++j )
{
AddLabel( 145 + ((z / 16) * 80), 52 + ((z % 16) * 17), e.HueStart + j - 1, "*****" );
AddRadio( 127 + ((z / 16) * 80), 52 + ((z % 16) * 17), 210, 211, false, (i * 100) + j );
z=++z;
}
}
}
public override void OnResponse( NetState from, RelayInfo info )
{
Mobile m = from.Mobile;
int[] switches = info.Switches;
if ( info.ButtonID != 0 && switches.Length > 0 )
{
int entryIndex = switches[0] / 100;
int hueOffset = switches[0] % 100;
if ( entryIndex >= 0 && entryIndex < m_Entries.Length )
{
BodyDyeEntry e = m_Entries[entryIndex];
if ( hueOffset >= 0 && hueOffset < e.HueCount )
{
int hue = e.HueStart + hueOffset;
m.Hue = hue;
}
}
m.StatCap = 300;

m.Skills[SkillName.Alchemy].Cap = 0.0;
m.Skills[SkillName.Anatomy].Cap = 100.0; //usw.
m.Skills[SkillName.Anatomy].Base = 50.0; //usw.

//m.AddToBackpack( new OrcishKinMask() );

m.X = 1404;
m.Y = 3396;
m.Z = 0;

m.SendMessage( "Du bist nun ein Barbar!" );
}
else
{
m.SendMessage( "Ihr muesst eine Farbe waehlen!" );
}
}
}

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

dark lady lilith

#2 Beitrag von dark lady lilith » 19 Okt 2006 23:11

Der Script klappt super ;)
Nur eine Frage habe ich noch ich würde gerne ein Stat Cap einstellen, also kein komplettes so wie im Moment sonder zb ein Str cap von 140.
Wisst ihr was was ich in dem Script noch einfügen muss??

Danke

Sotho Tal Ker

#3 Beitrag von Sotho Tal Ker » 20 Okt 2006 08:18

Garnichts. Das wird über SkillCheck.cs geregelt. :)
Dort muss man die Abfrage, ob ein Statwert gesteigert werden kann zusätzlich um die Rasse erweitert werden, falls es rassenspezifisch sein soll. Ansonsten braucht man nur die 125 auf den gewünschten Wert setzen.
Hab die ganze Funktion mal angehangen, die bearbeitet werden muss.

Code: Alles auswählen

		public static bool CanRaise( Mobile from, Stat stat )
		{
			if ( !(from is BaseCreature && ((BaseCreature)from).Controlled) )
			{
				if ( from.RawStatTotal >= from.StatCap )
					return false;
			}

			switch ( stat )
			{
				case Stat.Str: return ( from.StrLock == StatLockType.Up && from.RawStr < 125 );
				case Stat.Dex: return ( from.DexLock == StatLockType.Up && from.RawDex < 125 );
				case Stat.Int: return ( from.IntLock == StatLockType.Up && from.RawInt < 125 );
			}

			return false;
		}

Antworten