Server Crash Report
===================

RunUO Version 0.5, Build 5781.27764
Operating System: Microsoft Windows NT 5.2.3790 Service Pack 2
.NET Framework: 4.0.30319.1
Time: 2015-11-1 13:46:53
Mobiles: 41476
Items: 214435
Exception:
System.OverflowException: Value was either too large or too small for an Int32.
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at Server.Items.AgeChangeDeed.ChooseAge.OnResponse(Mobile from, String number)
at Server.Network.PacketHandlers.UnicodePromptResponse(NetState state, PacketReader pvSrc) in d:\ServUO\Server\Network\PacketHandlers.cs:line 1023
at Server.Network.MessagePump.HandleReceive(NetState ns) in d:\ServUO\Server\Network\MessagePump.cs:line 198
at Server.Network.MessagePump.Slice() in d:\ServUO\Server\Network\MessagePump.cs:line 121
at Server.Core.Main(String[] args) in d:\ServUO\Server\Main.cs:line 571



Restart behavior occurs by accident, report I send out, attached to my script, please help me.
 

Attachments

  • PacketHandlers.cs
    81.9 KB · Views: 0
  • MessagePump.cs
    7.5 KB · Views: 0
  • Main.cs
    21 KB · Views: 0
Please post your age change deed script. It seems someone is putting a number that is larger than Int32.MaxValue which is 2,147,483,647
 
yeah the problem was that a user was entering in a number that was larger than possible for an int32 which caused the stackoverflow. For example someone entering 999999999999999999999999 will crash the server because it is way too large.

To fix this you need to check that the number is not too large.

To do this please put this code in your script
Code:
				uint checkInt;
				if (!(uint.TryParse(number, out checkInt)))
				{
					from.SendMessage("Please enter a valid Number!");
					from.AddToBackpack(new AgeChangeDeed());
					return;
				}

After
Code:
				if ( !(System.Text.RegularExpressions.Regex.IsMatch(number, @"^[0-9]+$")) )
				{
					from.SendMessage( Utility.RandomMinMax(2,600), "您必須鍵入一個數字!" );
					from.AddToBackpack( new AgeChangeDeed() );
					return;
				}

This will make sure that whatever number someone enters is valid. In fact it could be used instead of the regex check on the string if you wanted to remove unneeded code.
 
private class ChooseAge : Prompt
{
public ChooseAge( Mobile from )
{
}

public override void OnResponse( Mobile from, string number )
{
uint checkInt;
if (!(uint.TryParse(number, out checkInt)))
{
from.SendMessage("Please enter a valid Number!");
from.AddToBackpack(new AgeChangeDeed());
return;
}
if ( !(System.Text.RegularExpressions.Regex.IsMatch(number, @"^[0-9]+$")) )
{
from.SendMessage( Utility.RandomMinMax(2,600), "您必須鍵入一個數字!" );
from.AddToBackpack( new AgeChangeDeed() );
return;
}
else if ( int.Parse(number) < 15 )
{
from.SendMessage( Utility.RandomMinMax(2,600), "開始年齡不能小於 15 歲!" );
from.AddToBackpack( new AgeChangeDeed() );
return;
}
else if ( int.Parse(number) > 55 )
{
from.SendMessage( Utility.RandomMinMax(2,600), "開始年齡不能大於 55 歲!" );
from.AddToBackpack( new AgeChangeDeed() );
return;
}
else
{
((Account)from.Account).SetTag( "Age of " + (from.RawName), number );
((Account)from.Account).SetTag( "LastRenewAge " + (from.RawName), (DateTime.Now).ToString() );
from.SendMessage( Utility.RandomMinMax(2,600), "記錄你的年齡。你現在 {0} 歲.", number );
if ( Server.Commands.AgeCommands.AgeStatModEnabled )
{
Server.Commands.AgeCommands.ApplyAgeStatMod( from );
}
}
}


My approach is correct? Not very experienced using c #
 
Back