Full Version : Carpet Addon
xmlspawner >>Scripting Support >>Carpet Addon


<< Prev | Next >>

Haazen- 07-19-2006
I recieved this crash trying to use a CarpetAddonDeed. Someone posted a version of this that they claim works in 2.0 I compaired the scripts and there is very little difference.
But their script will not compile due to "ref house". The version I have has worked for years with no problem. So I figure fixing it would be better than adding a new script that doesn't work.

Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
at Server.Items.BaseAddon.CheckHouse(Mobile from, Point3D p, Map map, Int32 height, List`1& list) in g:\2.0\Scripts\Items\Addons\BaseAddon.cs:line 175
at Server.Items.BaseAddon.CouldFit(IPoint3D p, Map map, Mobile from, List`1& houses) in g:\2.0\Scripts\Items\Addons\BaseAddon.cs:line 128
at Server.Gumps.CarpetGump.OnResponse(NetState sender, RelayInfo info) in g:\2.0\Scripts\Custom\CarpetAddonDeed.cs:line 145
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)

I added the try / catch to BaseAddon.cs and it stopped the crashes.

BaseAddon.cs

CODE
public static bool CheckHouse( Mobile from, Point3D p, Map map, int height, ref List<BaseHouse> list )
{
BaseHouse house = BaseHouse.FindHouseAt( p, map, height );

if ( from == null || house == null || !house.IsOwner( from ) )
return false;
try{
if ( !list.Contains( house ) )
list.Add( house );
}
catch{return false;}

return true;
}



Then I would just recieve the message "You can only place this in a house that you own!"
Commenting out the lines in CarpetAddonDeed.cs stopped the message.

CarpetAddonDeed.cs
CODE
Server.Spells.SpellHelper.GetSurfaceTop( ref m_P3D );

List<BaseHouse> houses = null;

AddonFitResult res = addon.CouldFit( m_P3D, m_Map, from, ref houses );

if ( res == AddonFitResult.Valid )
addon.MoveToWorld( new Point3D( m_P3D ), m_Map );
else if ( res == AddonFitResult.Blocked )
from.SendLocalizedMessage( 500269 ); // You cannot build that there.
//  else if ( res == AddonFitResult.NotInHouse )
//   from.SendLocalizedMessage( 500274 ); // You can only place this in a house that you own!
else if ( res == AddonFitResult.DoorsNotClosed )
 from.SendMessage( "You must close all house doors before placing this." );


So I stopped the crash and the message but still I have a non-working Carpet deed. Can you point me in a direction to try and fix this.

If I need to post more script, please tell me. The BaseAddon.cs and BaseAddonDeed.cs are distro.

Thanks for your help.

ArteGordon- 07-20-2006
It is this null list that is causing the crash

CODE

List<BaseHouse> houses = null;

AddonFitResult res = addon.CouldFit( m_P3D, m_Map, from, ref houses );


I would recommend making this fix to the CheckHouse method

CODE

 public static bool CheckHouse( Mobile from, Point3D p, Map map, int height, ref List<BaseHouse> list )
 {
  BaseHouse house = BaseHouse.FindHouseAt( p, map, height );

  if ( from == null || house == null || !house.IsOwner( from ) )
   return false;

  if (list == null)
   list = new List<BaseHouse>();

  if ( !list.Contains( house ) )
   list.Add( house );

  return true;
 }

Haazen- 07-20-2006
Thx this fixed it.