GithubHelp home page GithubHelp logo

runuo.t2a's People

Contributors

grimoric avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

runuo.t2a's Issues

Xmlspawner possible?

Downloaded the repo and got it working - thanks so much for this, my friends and I love the T2A era.

I'd like to add some surprises for them - is using XmlSpawner a possibility?

Bank Check

Bank checks were in the last patch of T2A. Not sure if you are keeping them but if so here is a problem.
Bankers do not recognize bank checks in bankbox and will tell you your gold balance is 0 no matter what the check value is.

Cliloc Errors

I was using 5.0.9.1 client and seeing cliloc errors on the crafting gumps in the place you would usually see the skillname for (as far as I could tell) every item in that same spot on the gumps.

image

House Keys Newbied

House keys are blessed still. Not sure if you want to keep this for anti griefing purposes.

A few mobs

StrongMongbat and DreadSpider

I saw where you had started to remove those two mobs. Those are both T2A! I looked through and didn't see any other mishaps though, awesome work sir

Healers are Yellow

(R21) Vendors are looking good with blue names but healers still have yellow names. Healer.cs line 23 NameHue = 0x35;

Deco File for magencia bank

Can you add these items to the magencia.cfg file so that when you decorate the bank in magencia is fully generated?

#Bank Door
MetalDoor2 0x06CF (Facing=NorthCCW)
3735 2147 20

#Bank BookShelves
FullBookcase 0x0A97
3729 2144 20
3731 2144 20

#Bank Chest
FillableMetalGoldenChest 0x0E41
3730 2144 20
3732 2144 20

#Bank Wooden Chair
WoodenChair 0x0B57
3730 2146 20

#Bank Bulletin Board
BulletinBoard 0x1E5F
3728 2152 20

#Bank Benches 1
Static 0x0B93
3728 2155 20
3728 2150 20

#Bank Benches 2
Static 0x0B94
3728 2154 20
3728 2149 20

#Bank Metal Box
FillableMetalBox 0x09A8
3729 2147 26

No MagicResist gains / Monsters Attack Messages

Hello Grimoric, first of all thank you for your amazing work! Take this "Issue" I am posting with some grains of salt, as I never played OSI, but only freeshards back in T2A - UOR times. I noticed these 2 problems, and a minor thing:

  • I remember attack messages as being PublicOverHead above attacker, like "Agressor is attacking Agressed", wich is a bit different from what we have now. Also there is a check inplace that prevents messages if Agressor and Agressed aren't players. I remember seeing attack messages when attacked by NPCs back in the day.
  • There is no MagicResist skill gains when fighting spell casting NPCs, so I looked in the code and couldn't find any SkillChecks for it in Spell base.
  • On a last note, there is no messages for drinking Bevarage, so one can't tell if the Character is drinking, and when it is full.

If you allow me I can submit this changes. Sorry the multiple edits on this ticket, had to correct my writing.

Regards,
Paulo

Decoration Command Crashes Server

When I start up the server and use decorate under the wordbuilding commands the server crashes. Here is the crashlog.
`Server Crash Report

RunUO Version 1.0, Build 0.15
Operating System: Microsoft Windows NT 6.2.9200.0
.NET Framework: 4.0.30319.42000
Time: 3/6/2017 12:36:25 AM
Mobiles: 1
Items: 32224
Exception:
System.ArgumentException: Type not found for header: 'ChampionSkullPlatform 0x1'
at Server.Commands.DecorationList.Read(StreamReader ip)
at Server.Commands.DecorationList.ReadAll(String path)
at Server.Commands.Decorate.Generate(String folder, Map[] maps)
at Server.Commands.Decorate.Decorate_OnCommand(CommandEventArgs e)
at Server.Commands.CommandSystem.Handle(Mobile from, String text, MessageType type)
at Server.Gumps.AdminGump.InvokeCommand(String c)
at Server.Gumps.AdminGump.OnResponse(NetState sender, RelayInfo info)
at Server.Network.PacketHandlers.DisplayGumpResponse(NetState state, PacketReader pvSrc)
at Server.Network.MessagePump.HandleReceive(NetState ns)
at Server.Network.MessagePump.Slice()
at Server.Core.Main(String[] args)

Clients:

  • Count: 1
  • 127.0.0.1: (account = admin) (mobile = 0x1 'Delphi')`

Ethereals.cs causes save corruption

This edits works

using System;
using Server.Mobiles;
using Server.Items;
using Server.Spells;

namespace Server.Mobiles
{
public class EtherealMount : Item, IMount, IMountItem
{
private int m_MountedID;
private int m_RegularID;
private Mobile m_Rider;
private bool m_IsRewardItem;
private bool m_IsDonationItem;

	[CommandProperty( AccessLevel.GameMaster )]
	public bool IsRewardItem
	{
		get { return m_IsRewardItem; }
		set { m_IsRewardItem = value; }
	}

	public override double DefaultWeight
	{
		get { return 1.0; }
	}

	[CommandProperty( AccessLevel.GameMaster, AccessLevel.Administrator )]
	public bool IsDonationItem
	{
		get { return m_IsDonationItem; }
		set { m_IsDonationItem = value; InvalidateProperties(); }
	}

	[Constructable]
	public EtherealMount( int itemID, int mountID )
		: base( itemID )
	{
		m_MountedID = mountID;
		m_RegularID = itemID;
		m_Rider = null;

		Layer = Layer.Invalid;

		LootType = LootType.Blessed;
	}

	public override void GetProperties( ObjectPropertyList list )
	{
		base.GetProperties( list );

		if( m_IsDonationItem )
		{
			list.Add( "Donation Ethereal" );
			list.Add( "7.5 sec slower cast time if not a 9mo. Veteran" );
		}
	}

	[CommandProperty( AccessLevel.GameMaster )]
	public int MountedID
	{
		get
		{
			return m_MountedID;
		}
		set
		{
			if( m_MountedID != value )
			{
				m_MountedID = value;

				if( m_Rider != null )
					ItemID = value;
			}
		}
	}

	[CommandProperty( AccessLevel.GameMaster )]
	public int RegularID
	{
		get
		{
			return m_RegularID;
		}
		set
		{
			if( m_RegularID != value )
			{
				m_RegularID = value;

				if( m_Rider == null )
					ItemID = value;
			}
		}
	}

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

	public override bool DisplayLootType { get { return false; } }

	public virtual int FollowerSlots { get { return 1; } }

	public void RemoveFollowers()
	{
		if( m_Rider != null )
			m_Rider.Followers -= FollowerSlots;

		if( m_Rider != null && m_Rider.Followers < 0 )
			m_Rider.Followers = 0;
	}

	public void AddFollowers()
	{
		if( m_Rider != null )
			m_Rider.Followers += FollowerSlots;
	}

	public virtual bool Validate( Mobile from )
	{
		if( Parent == null )
		{
			from.SayTo( from,1010095 ); // This must be on your person to use.
			return false;
		}
		else if( from.IsBodyMod && !from.Body.IsHuman )
		{
			from.SendLocalizedMessage( 1061628 ); // You can't do that while polymorphed.
			return false;
		}
		else if( from.HasTrade )
		{
			from.SendLocalizedMessage( 1042317, "", 0x41 ); // You may not ride at this time
			return false;
		}
		else if( (from.Followers + FollowerSlots) > from.FollowersMax )
		{
			from.SendLocalizedMessage( 1049679 ); // You have too many followers to summon your mount.
			return false;
		}

		return true;
	}

	public override void OnDoubleClick( Mobile from )
	{
		if( Validate( from ) )
			new EtherealSpell( this, from ).Cast();
	}

	public override void Serialize( GenericWriter writer )
	{
		base.Serialize( writer );

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

		writer.Write( m_IsDonationItem );
		writer.Write( m_IsRewardItem );

		writer.Write( (int)m_MountedID );
		writer.Write( (int)m_RegularID );
		writer.Write( m_Rider );
	}

	public override void Deserialize( GenericReader reader )
	{
		base.Deserialize( reader );
		LootType = LootType.Blessed;

		int version = reader.ReadInt();

		switch( version )
		{
			case 3:
				{
					m_IsDonationItem = reader.ReadBool();
					goto case 2;
				}
			case 2:
				{
					m_IsRewardItem = reader.ReadBool();
					goto case 0;
				}
			case 1: reader.ReadInt(); goto case 0;
			case 0:
				{
					m_MountedID = reader.ReadInt();
					m_RegularID = reader.ReadInt();
					m_Rider = reader.ReadMobile();

					if( m_MountedID == 0x3EA2 )
						m_MountedID = 0x3EAA;

					break;
				}
		}

		AddFollowers();

		if( version < 3 && Weight == 0 )
			Weight = -1;
	}

	public override DeathMoveResult OnParentDeath( Mobile parent )
	{
		Rider = null;//get off, move to pack

		return DeathMoveResult.RemainEquiped;
	}

	public static void Dismount( Mobile m )
	{
		IMount mount = m.Mount;

		if( mount != null )
			mount.Rider = null;
	}

	[CommandProperty( AccessLevel.GameMaster )]
	public Mobile Rider
	{
		get
		{
			return m_Rider;
		}
		set
		{
			if( value != m_Rider )
			{
				if( value == null )
				{
					Internalize();
					UnmountMe();

					RemoveFollowers();
					m_Rider = value;
				}
				else
				{
					if( m_Rider != null )
						Dismount( m_Rider );

					Dismount( value );

					RemoveFollowers();
					m_Rider = value;
					AddFollowers();

					MountMe();
				}
			}
		}
	}

	public virtual int EtherealHue { get { return 0; } }//Changed hue from 0x4001 to 0

	public void UnmountMe()
	{
		Container bp = m_Rider.Backpack;

		ItemID = m_RegularID;
		Layer = Layer.Invalid;
		Movable = true;

		if( Hue == EtherealHue )
			Hue = 0;

		if( bp != null )
		{
			bp.DropItem( this );
		}
		else
		{
			Point3D loc = m_Rider.Location;
			Map map = m_Rider.Map;

			if( map == null || map == Map.Internal )
			{
				loc = m_Rider.LogoutLocation;
				map = m_Rider.LogoutMap;
			}

			MoveToWorld( loc, map );
		}
	}

	public void MountMe()
	{
		ItemID = m_MountedID;
		Layer = Layer.Mount;
		Movable = false;

		if( Hue == 0 )
			Hue = EtherealHue;

		ProcessDelta();
		m_Rider.ProcessDelta();
		m_Rider.EquipItem( this );
		m_Rider.ProcessDelta();
		ProcessDelta();
	}

	public IMount Mount
	{
		get
		{
			return this;
		}
	}

	public static void StopMounting( Mobile mob )
	{
		if( mob.Spell is EtherealSpell )
			((EtherealSpell)mob.Spell).Stop();
	}

	public void OnRiderDamaged( int amount, Mobile from, bool willKill )
	{
	}

	private class EtherealSpell : Spell
	{
		private static SpellInfo m_Info = new SpellInfo( "Ethereal Mount", "", 230 );

		private EtherealMount m_Mount;
		private Mobile m_Rider;

		public EtherealSpell( EtherealMount mount, Mobile rider )
			: base( rider, null, m_Info )
		{
			m_Rider = rider;
			m_Mount = mount;
		}

		public override bool ClearHandsOnCast { get { return false; } }
		public override bool RevealOnCast { get { return false; } }

		public override TimeSpan GetCastRecovery()
		{
			return TimeSpan.Zero;
		}

		public override double CastDelayFastScalar { get { return 0; } }

		public override TimeSpan CastDelayBase
		{
			get
			{
				return TimeSpan.FromSeconds( 2.0 );
			}
		}

		public override int GetMana()
		{
			return 0;
		}

		public override bool ConsumeReagents()
		{
			return true;
		}

		public override bool CheckFizzle()
		{
			return true;
		}

		private bool m_Stop;

		public void Stop()
		{
			m_Stop = true;
			Disturb( DisturbType.Hurt, false, false );
		}

		public override bool CheckDisturb( DisturbType type, bool checkFirst, bool resistable )
		{
			if( type == DisturbType.EquipRequest || type == DisturbType.UseRequest/* || type == DisturbType.Hurt*/ )
				return false;

			return true;
		}

		public override void DoHurtFizzle()
		{
			if( !m_Stop )
				base.DoHurtFizzle();
		}

		public override void DoFizzle()
		{
			if( !m_Stop )
				base.DoFizzle();
		}

		public override void OnDisturb( DisturbType type, bool message )
		{
			if( message && !m_Stop )
				Caster.SendLocalizedMessage( 1049455 ); // You have been disrupted while attempting to summon your ethereal mount!

			//m_Mount.UnmountMe();
		}

		public override void OnCast()
		{
			if( !m_Mount.Deleted && m_Mount.Rider == null && m_Mount.Validate( m_Rider ) )
				m_Mount.Rider = m_Rider;

			FinishSequence();
		}
	}
}

public class EtherealHorse : EtherealMount
{
	public override int LabelNumber { get { return 1041298; } } // Ethereal Horse Statuette

	[Constructable]
	public EtherealHorse()
		: base( 0x20DD, 0x3EAA )
	{
	}

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

		if( Name == "an ethereal horse" )
			Name = null;

		if( ItemID == 0x2124 )
			ItemID = 0x20DD;
	}
}

public class EtherealLlama : EtherealMount
{
	public override int LabelNumber { get { return 1041300; } } // Ethereal Llama Statuette

	[Constructable]
	public EtherealLlama()
		: base( 0x20F6, 0x3EAB )
	{
	}

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

		if( Name == "an ethereal llama" )
			Name = null;
	}
}

public class EtherealOstard : EtherealMount
{
	public override int LabelNumber { get { return 1041299; } } // Ethereal Ostard Statuette

	[Constructable]
	public EtherealOstard()
		: base( 0x2135, 0x3EAC )
	{
	}

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

		if( Name == "an ethereal ostard" )
			Name = null;
	}
}

public class EtherealRidgeback : EtherealMount
{
	public override int LabelNumber { get { return 1049747; } } // Ethereal Ridgeback Statuette

	[Constructable]
	public EtherealRidgeback()
		: base( 0x2615, 0x3E9A )
	{
	}

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

		if( Name == "an ethereal ridgeback" )
			Name = null;
	}
}

public class EtherealUnicorn : EtherealMount
{
	public override int LabelNumber { get { return 1049745; } } // Ethereal Unicorn Statuette

	[Constructable]
	public EtherealUnicorn()
		: base( 0x25CE, 0x3E9B )
	{
	}

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

		if( Name == "an ethereal unicorn" )
			Name = null;
	}
}

public class EtherealBeetle : EtherealMount
{
	public override int LabelNumber { get { return 1049748; } } // Ethereal Beetle Statuette

	[Constructable]
	public EtherealBeetle()
		: base( 0x260F, 0x3E97 )
	{
	}

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

		if( Name == "an ethereal beetle" )
			Name = null;
	}
}

public class EtherealKirin : EtherealMount
{
	public override int LabelNumber { get { return 1049746; } } // Ethereal Ki-Rin Statuette

	[Constructable]
	public EtherealKirin()
		: base( 0x25A0, 0x3E9C )
	{
	}

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

		if( Name == "an ethereal kirin" )
			Name = null;
	}
}

public class EtherealSwampDragon : EtherealMount
{
	public override int LabelNumber { get { return 1049749; } } // Ethereal Swamp Dragon Statuette

	[Constructable]
	public EtherealSwampDragon()
		: base( 0x2619, 0x3E98 )
	{
	}

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

		if( Name == "an ethereal swamp dragon" )
			Name = null;
	}
}

public class RideablePolarBear : EtherealMount
{
	public override int LabelNumber { get { return 1076159; } } // Rideable Polar Bear 
	public override int EtherealHue { get { return 0; } }

	[Constructable]
	public RideablePolarBear() : base( 0x20E1, 0x3EC5 )
	{
	}

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

	public override void Serialize( GenericWriter writer )
	{
		base.Serialize( writer );

		writer.WriteEncodedInt( 0 ); // version
	}

	public override void Deserialize( GenericReader reader )
	{
		base.Deserialize( reader );

		int version = reader.ReadEncodedInt();
	}
}	

public class EtherealCuSidhe : EtherealMount
{
	public override int LabelNumber { get { return 1080386; } } // Ethereal Cu Sidhe Statuette

	[Constructable]
	public EtherealCuSidhe() : base( 0x2D96, 0x3E91 )
	{
	}

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

	public override void Serialize( GenericWriter writer )
	{
		base.Serialize( writer );

		writer.WriteEncodedInt( 0 ); // version
	}

	public override void Deserialize( GenericReader reader )
	{
		base.Deserialize( reader );

		int version = reader.ReadEncodedInt();
	}
}

public class ChargerOfTheFallen : EtherealMount
{
	public override int LabelNumber { get { return 1074816; } } // Charger of the Fallen Statuette

	[Constructable]
	public ChargerOfTheFallen()
		: base( 0x2D9C, 0x3E92 )
	{
	}

	public override int EtherealHue { get { return 0; } }

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

}

Britain.cfg

In Britain.cfg line 4236 and 4303 can be removed as it is not accurate to T2A. This removes the second book and quill to make it accurate to the UO Demo deco scheme.

T2A FeatureFlags and Music handling

Hi,
I would like to know what extra features would be enabled in the Ultima Online client if an 'LBR' flag is sent instead of 'T2A'?
I know the music handling is different, but is there anything else that would negatively impact a T2A shard?
When the T2A flag is sent then the client plays MIDIs from the 'Music' folder.
When the LBR flag is sent then the client plays MP3s from the 'Music\Digital' folder.

The reason why I'm asking is that the old T2A way of playing music isn't very compatible with newer clients such as 5.0.8.4 and 5.0.9.1. There is a slight delay that freezes the client when changing MIDIs.
I know that there is a 'music fix' client hack so that MP3s can be played back in the Music folder instead of the MIDIs so that the client doesn't hang, but there still is an issue where changing regions that the music packet is ignored(sometimes).

A few years back there was a discussion on the Second Age forums: http://forums.uosecondage.com/viewtopic.php?f=8&t=38503
http://forums.uosecondage.com/viewtopic.php?p=333658#p333658

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.