RunUO/Scripts/Engines/ConPVP/ArenaGump.cs

296 lines
No EOL
7.2 KiB
C#

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;
namespace Server.Engines.ConPVP
{
public class ArenasMoongate : Item
{
public override string DefaultName
{
get { return "arena moongate"; }
}
[Constructable]
public ArenasMoongate() : base( 0x1FD4 )
{
Movable = false;
Light = LightType.Circle300;
}
public ArenasMoongate( Serial serial ) : base( serial )
{
}
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();
Light = LightType.Circle300;
}
public bool UseGate( Mobile from )
{
if ( DuelContext.CheckCombat( from ) )
{
from.SendMessage( 0x22, "You have recently been in combat with another player and cannot use this moongate." );
return false;
}
else if ( from.Spell != null )
{
from.SendLocalizedMessage( 1049616 ); // You are too busy to do that at the moment.
return false;
}
else
{
from.CloseGump( typeof( ArenaGump ) );
from.SendGump( new ArenaGump( from, this ) );
if ( !from.Hidden || from.AccessLevel == AccessLevel.Player )
Effects.PlaySound( from.Location, from.Map, 0x20E );
return true;
}
}
public override void OnDoubleClick( Mobile from )
{
if ( from.InRange( GetWorldLocation(), 1 ) )
UseGate( from );
else
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that
}
public override bool OnMoveOver( Mobile m )
{
return ( !m.Player || UseGate( m ) );
}
}
public class ArenaGump : Gump
{
private Mobile m_From;
private ArenasMoongate m_Gate;
private List<Arena> m_Arenas;
private void Append( StringBuilder sb, LadderEntry le )
{
if ( le == null )
return;
if ( sb.Length > 0 )
sb.Append( ", " );
sb.Append( le.Mobile.Name );
}
public override void OnResponse( NetState sender, RelayInfo info )
{
if ( info.ButtonID != 1 )
return;
int[] switches = info.Switches;
if ( switches.Length == 0 )
return;
int opt = switches[0];
if ( opt < 0 || opt >= m_Arenas.Count )
return;
Arena arena = m_Arenas[opt];
if ( !m_From.InRange( m_Gate.GetWorldLocation(), 1 ) || m_From.Map != m_Gate.Map )
{
m_From.SendLocalizedMessage( 1019002 ); // You are too far away to use the gate.
}
else if ( DuelContext.CheckCombat( m_From ) )
{
m_From.SendMessage( 0x22, "You have recently been in combat with another player and cannot use this moongate." );
}
else if ( m_From.Spell != null )
{
m_From.SendLocalizedMessage( 1049616 ); // You are too busy to do that at the moment.
}
else if ( m_From.Map == arena.Facet && arena.Zone.Contains( m_From ) )
{
m_From.SendLocalizedMessage( 1019003 ); // You are already there.
}
else
{
BaseCreature.TeleportPets( m_From, arena.GateIn, arena.Facet );
m_From.Combatant = null;
m_From.Warmode = false;
m_From.Hidden = true;
m_From.MoveToWorld( arena.GateIn, arena.Facet );
Effects.PlaySound( arena.GateIn, arena.Facet, 0x1FE );
}
}
public ArenaGump( Mobile from, ArenasMoongate gate ) : base( 50, 50 )
{
m_From = from;
m_Gate = gate;
m_Arenas = Arena.Arenas;
AddPage( 0 );
int height = 12 + 20 + (m_Arenas.Count * 31) + 24 + 12;
AddBackground( 0, 0, 499+40, height, 0x2436 );
List<Arena> list = m_Arenas;
for ( int i = 1; i < list.Count; i += 2 )
AddImageTiled( 12, 32 + (i * 31), 475+40, 30, 0x2430 );
AddAlphaRegion( 10, 10, 479+40, height - 20 );
AddColumnHeader( 35, null );
AddColumnHeader( 115, "Arena" );
AddColumnHeader( 325, "Participants" );
AddColumnHeader( 40, "Obs" );
AddButton( 499+40 - 12 - 63 - 4 - 63, height - 12 - 24, 247, 248, 1, GumpButtonType.Reply, 0 );
AddButton( 499+40 - 12 - 63, height - 12 - 24, 241, 242, 2, GumpButtonType.Reply, 0 );
for ( int i = 0; i < list.Count; ++i )
{
Arena ar = list[i];
string name = ar.Name;
if ( name == null )
name = "(no name)";
int x = 12;
int y = 32 + (i * 31);
int color = ( ar.Players.Count > 0 ? 0xCCFFCC : 0xCCCCCC );
AddRadio( x + 3, y + 1, 9727, 9730, false, i );
x += 35;
AddBorderedText( x + 5, y + 5, 115 - 5, name, color, 0 );
x += 115;
StringBuilder sb = new StringBuilder();
if ( ar.Players.Count > 0 )
{
Ladder ladder = Ladder.Instance;
if ( ladder == null )
continue;
LadderEntry p1 = null, p2 = null, p3 = null, p4 = null;
for ( int j = 0; j < ar.Players.Count; ++j )
{
Mobile mob = (Mobile)ar.Players[j];
LadderEntry c = ladder.Find( mob );
if ( p1 == null || c.Index < p1.Index )
{
p4 = p3;
p3 = p2;
p2 = p1;
p1 = c;
}
else if ( p2 == null || c.Index < p2.Index )
{
p4 = p3;
p3 = p2;
p2 = c;
}
else if ( p3 == null || c.Index < p3.Index )
{
p4 = p3;
p3 = c;
}
else if ( p4 == null || c.Index < p4.Index )
{
p4 = c;
}
}
Append( sb, p1 );
Append( sb, p2 );
Append( sb, p3 );
Append( sb, p4 );
if ( ar.Players.Count > 4 )
sb.Append( ", ..." );
}
else
{
sb.Append( "Empty" );
}
AddBorderedText( x + 5, y + 5, 325 - 5, sb.ToString(), color, 0 );
x += 325;
AddBorderedText( x, y + 5, 40, Center( ar.Spectators.ToString() ), color, 0 );
}
}
public string Center( string text )
{
return String.Format( "<CENTER>{0}</CENTER>", text );
}
public string Color( string text, int color )
{
return String.Format( "<BASEFONT COLOR=#{0:X6}>{1}</BASEFONT>", color, text );
}
private void AddBorderedText( int x, int y, int width, string text, int color, int borderColor )
{
/*AddColoredText( x - 1, y, width, text, borderColor );
AddColoredText( x + 1, y, width, text, borderColor );
AddColoredText( x, y - 1, width, text, borderColor );
AddColoredText( x, y + 1, width, text, borderColor );*/
/*AddColoredText( x - 1, y - 1, width, text, borderColor );
AddColoredText( x + 1, y + 1, width, text, borderColor );*/
AddColoredText( x, y, width, text, color );
}
private void AddColoredText( int x, int y, int width, string text, int color )
{
if ( color == 0 )
AddHtml( x, y, width, 20, text, false, false );
else
AddHtml( x, y, width, 20, Color( text, color ), false, false );
}
private int m_ColumnX = 12;
private void AddColumnHeader( int width, string name )
{
AddBackground( m_ColumnX, 12, width, 20, 0x242C );
AddImageTiled( m_ColumnX + 2, 14, width - 4, 16, 0x2430 );
if ( name != null )
AddBorderedText( m_ColumnX, 13, width, Center( name ), 0xFFFFFF, 0 );
m_ColumnX += width;
}
}
}