1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Courageous True Line of Sight *CRASH*

Discussion in 'Script Support' started by sahisahi, Jan 12, 2018.

  1. sahisahi
    Offline

    sahisahi Member

    Joined:
    Jan 13, 2016
    Messages:
    497
    Likes Received:
    13
    So i installed this system today, i made all the core edits and compiled fine, whenever i log in and move the server crash, these crash never happened before so they must be related to the edits i added to mobile.cs

    *----------*
    Crashlog
    *----------*
    Exception:
    System.NullReferenceException: Object reference not set to an instance of an object.
    at Server.Mobile.InvalidateLos()
    at Server.Mobile.SetLocation(Point3D newLocation, Boolean isTeleport)
    at Server.Mobiles.PlayerMobile.SetLocation(Point3D loc, Boolean isTeleport) in c:\TestShard\Scripts\Mobiles\PlayerMobile.cs:line 2322
    at Server.Mobile.Move(Direction d)
    at Server.Mobiles.PlayerMobile.Move(Direction d) in c:TestShard\Scripts\Mobiles\PlayerMobile.cs:line 2213
    at Server.Network.PacketHandlers.MovementReq(NetState state, PacketReader pvSrc)
    at Server.Network.MessagePump.HandleReceive(NetState ns)
    at Server.Network.MessagePump.Slice()



    PlayerMobile.cs

    Code (C#):
    1.     public override void SetLocation( Point3D loc, bool isTeleport )
    2.         {
    3.             if ( !isTeleport && AccessLevel == AccessLevel.Player )
    4.             {
    5.                 // moving, not teleporting
    6.                 int zDrop = ( Location.Z - loc.Z );
    7.  
    8.                 if ( zDrop > 20 ) // we fell more than one story
    9.                     Hits -= ((zDrop / 20) * 10) - 5; // deal some damage; does not kill, disrupt, etc
    10.             }
    11.                            
    12.  
    13.             base.SetLocation( loc, isTeleport ); ///LINE 2322
    14.  
    15.             if ( isTeleport || --m_NextProtectionCheck == 0 )
    16.                 RecheckTownProtection();
    17.         }

    Code (C#):
    1.         public override bool Move( Direction d )
    2.         {
    3.             /*
    4.             NetState ns = this.NetState;
    5.  
    6.             if ( ns != null )
    7.             {
    8.                 if ( HasGump( typeof( ResurrectGump ) ) ) {
    9.                     if ( Alive ) {
    10.                         CloseGump( typeof( ResurrectGump ) );
    11.                     } else {
    12.                         SendLocalizedMessage( 500111 ); // You are frozen and cannot move.
    13.                         return false;
    14.                     }
    15.                 }
    16.             }*/
    17.  
    18.             TimeSpan speed = ComputeMovementSpeed( d );
    19.  
    20.             if ( !Alive )
    21.                 MovementImpl.IgnoreMovableImpassables = true;
    22.  
    23.             bool res = base.Move( d ); //LINE 2213
    24.  
    25.             MovementImpl.IgnoreMovableImpassables = false;
    26.  
    27.             if ( !res )
    28.                 return false;
    29.  
    30.             m_NextMovementTime += speed;
    31.  
    32.             return true;
    33.         }
    The next methods are the Edits made in Mobile.cs all the edits are marked with // XXX LOS BEGIN, next method is the one that is in the crash


    Code (C#):
    1.     public virtual void SetLocation( Point3D newLocation, bool isTeleport )
    2.         {
    3.             if( m_Deleted )
    4.                 return;
    5.  
    6.             Point3D oldLocation = m_Location;
    7.  
    8.             if( oldLocation != newLocation )
    9.             {
    10.                 m_Location = newLocation;
    11.                 UpdateRegion();
    12.  
    13.                 BankBox box = FindBankNoCreate();
    14.  
    15.                 if( box != null && box.Opened )
    16.                     box.Close();
    17.  
    18.                 if( m_NetState != null )
    19.                     m_NetState.ValidateAllTrades();
    20.  
    21.                 if( m_Map != null )
    22.                     m_Map.OnMove( oldLocation, this );
    23.  
    24.                 if( isTeleport && m_NetState != null )
    25.                 {
    26.                     m_NetState.Sequence = 0;
    27.  
    28.                     if (m_NetState.StygianAbyss)
    29.                         m_NetState.Send(new MobileUpdate(this));
    30.                     else
    31.                         m_NetState.Send(new MobileUpdateOld(this));
    32.  
    33.                     ClearFastwalkStack();
    34.                 }
    35.  
    36.                 Map map = m_Map;
    37.  
    38.                 if( map != null )
    39.                 {
    40.                       // XXX LOS BEGIN
    41.                     if (m_NetState != null) InvalidateLos(); // things without netstate do not benefit from Los mgmt
    42.                     // XXX LOS END
    43.                     // First, send a remove message to everyone who can no longer see us. (inOldRange && !inNewRange)
    44.                     Packet removeThis = null;
    45.  
    46.                     IPooledEnumerable eable = map.GetClientsInRange( oldLocation );
    47.  
    48.                     foreach( NetState ns in eable )
    49.                     {
    50.                          // XXX LOS BEGIN
    51.                         if
    52.                         (
    53.                             ns != m_NetState
    54.                             &&
    55.                             (
    56.                                 !Utility.InUpdateRange(newLocation, ns.Mobile.Location)
    57.                                 ||
    58.                                 !ns.Mobile.CanSee(this)
    59.                             )
    60.                         )
    61.                         {
    62.                             if (removeThis == null) removeThis = this.RemovePacket;
    63.  
    64.                             ns.Mobile.RemoveLos(this);
    65.  
    66.                             ns.Send(removeThis);
    67.                         }
    68.                         // XXX LOS END
    69.                     }
    70.  
    71.                     eable.Free();
    72.  
    73.                     NetState ourState = m_NetState;
    74.  
    75.                     // Check to see if we are attached to a client
    76.                     if( ourState != null )
    77.                     {
    78.                         eable = map.GetObjectsInRange( newLocation, Core.GlobalMaxUpdateRange );
    79.  
    80.                         // We are attached to a client, so it's a bit more complex. We need to send new items and people to ourself, and ourself to other clients
    81.                         foreach( object o in eable )
    82.                         {
    83.                             if( o is Item )
    84.                             {
    85.                                 Item item = (Item)o;
    86.                                    // XXX LOS BEGIN
    87.                                 if (CanSee(item))
    88.                                 {
    89.                                     item.SendInfoTo(ourState);
    90.                                     this.AddLos(item); // optimization
    91.                                 }
    92.                                 // XXX LOS END
    93.  
    94.                                 int range = item.GetUpdateRange( this );
    95.                                 Point3D loc = item.Location;
    96.  
    97.                                 if( !Utility.InRange( oldLocation, loc, range ) && Utility.InRange( newLocation, loc, range ) && CanSee( item ) )
    98.                                     item.SendInfoTo( ourState );
    99.                             }
    100.                             else if( o != this && o is Mobile )
    101.                             {
    102.                                 Mobile m = (Mobile)o;
    103.  
    104.                                 if( !Utility.InUpdateRange( newLocation, m.m_Location ) )
    105.                                     continue;
    106.                                   // XXX LOS BEGIN  2018
    107.                                 if
    108.                                 (
    109.                                     m.m_NetState != null
    110.                                     &&
    111.                                     !InLos(this)
    112.                                     &&
    113.                                     m.CanSee(this)
    114.                                 )
    115.                                 {
    116.                                     if (LOS.Config.GetInstance().SquelchNames > 0) m_LosRecent.Update(m, m);
    117.  
    118.                                     m.AddLos(this); // optimization
    119.  
    120.                                     m.m_NetState.Send(new MobileIncoming(m, this));
    121.  
    122.                                     if (IsDeadBondedPet) m.m_NetState.Send(new BondedStatus(0, m_Serial, 1));
    123.  
    124.                                     if (ObjectPropertyList.Enabled)
    125.                                     {
    126.                                         m.m_NetState.Send(OPLPacket);
    127.  
    128.                                         //foreach ( Item item in m_Items )
    129.                                         //    m.m_NetState.Send( item.OPLPacket );
    130.                                     }
    131.                                 }
    132.  
    133.                                 //----------------------------------------------
    134.                                 // this player; update my view based on my move
    135.                                 //----------------------------------------------
    136.  
    137.                                 if
    138.                                 (
    139.                                     !InLos(m)
    140.                                     &&
    141.                                     this.CanSee(m)
    142.                                 )
    143.                                 {
    144.                                     if (LOS.Config.GetInstance().SquelchNames > 0) m_LosRecent.Update(m, m);
    145.  
    146.                                     this.AddLos(m); // optimization
    147.  
    148.                                     ourState.Send(new MobileIncoming(this, m));
    149.  
    150.                                     if (m.IsDeadBondedPet) ourState.Send(new BondedStatus(0, m.m_Serial, 1));
    151.  
    152.                                     if (ObjectPropertyList.Enabled)
    153.                                     {
    154.                                         ourState.Send(m.OPLPacket);
    155.                                     }
    156.                                 }
    157.                                 // XXX LOS END
    158.  
    159.                                 bool inOldRange = Utility.InUpdateRange( oldLocation, m.m_Location );
    160.  
    161.                                 if( (isTeleport || !inOldRange) && m.m_NetState != null && m.CanSee( this ) && (!HasFilter || InLOS(m)))
    162.                                 {
    163.                                     if ( m.m_NetState.StygianAbyss )
    164.                                     {
    165.                                         m.m_NetState.Send(new MobileIncoming(m, this));
    166.  
    167.                                         if (m_Poison != null)
    168.                                             m.m_NetState.Send(new HealthbarPoison(this));
    169.  
    170.                                         if (m_Blessed || m_YellowHealthbar)
    171.                                             m.m_NetState.Send(new HealthbarYellow(this));
    172.                                     }
    173.                                     else
    174.                                     {
    175.                                         m.m_NetState.Send(new MobileIncomingOld(m, this));
    176.                                     }
    177.  
    178.                                     if( IsDeadBondedPet )
    179.                                         m.m_NetState.Send( new BondedStatus( 0, m_Serial, 1 ) );
    180.  
    181.                                     if( ObjectPropertyList.Enabled )
    182.                                     {
    183.                                         m.m_NetState.Send( OPLPacket );
    184.  
    185.                                         //foreach ( Item item in m_Items )
    186.                                         //    m.m_NetState.Send( item.OPLPacket );
    187.                                     }
    188.                                 }
    189.  
    190.                                 if( !inOldRange && CanSee( m ) && (!HasFilter || InLOS(m)))
    191.                                 {
    192.                                     if ( ourState.StygianAbyss )
    193.                                     {
    194.                                         ourState.Send(new MobileIncoming(this, m));
    195.  
    196.                                         if (m.Poisoned)
    197.                                             ourState.Send(new HealthbarPoison(m));
    198.  
    199.                                         if (m.Blessed || m.YellowHealthbar)
    200.                                             ourState.Send(new HealthbarYellow(m));
    201.                                     }
    202.                                     else
    203.                                     {
    204.                                         ourState.Send(new MobileIncomingOld(this, m));
    205.                                     }
    206.  
    207.                                     if( m.IsDeadBondedPet )
    208.                                         ourState.Send( new BondedStatus( 0, m.m_Serial, 1 ) );
    209.  
    210.                                     if( ObjectPropertyList.Enabled )
    211.                                     {
    212.                                         ourState.Send( m.OPLPacket );
    213.  
    214.                                         //foreach ( Item item in m.m_Items )
    215.                                         //    ourState.Send( item.OPLPacket );
    216.                                     }
    217.                                 }
    218.                             }
    219.                         }
    220.  
    221.                         eable.Free();
    222.                     }
    223.                     else
    224.                     {
    225.                         eable = map.GetClientsInRange( newLocation );
    226.  
    227.                         // We're not attached to a client, so simply send an Incoming
    228.                         foreach( NetState ns in eable )
    229.                         {
    230.                              // XXX LOS BEGIN
    231.                             if (!ns.Mobile.InLos(this) && ns.Mobile.CanSee(this))
    232.                             {
    233.                                 if (LOS.Config.GetInstance().SquelchNames > 0) m_LosRecent.Update(ns.Mobile, ns.Mobile);
    234.  
    235.                                 ns.Mobile.AddLos(this); // optimization
    236.  
    237.                                 ns.Send(new MobileIncoming(ns.Mobile, this));
    238.  
    239.                                 if (IsDeadBondedPet)
    240.                                     ns.Send(new BondedStatus(0, m_Serial, 1));
    241.  
    242.                                 if (ObjectPropertyList.Enabled)
    243.                                 {
    244.                                     ns.Send(OPLPacket);
    245.                                 }
    246.                             }
    247.                             // XXX LOS END
    248.                             if( (isTeleport || !Utility.InUpdateRange( oldLocation, ns.Mobile.Location )) && ns.Mobile.CanSee( this ) )
    249.                             {
    250.                                 if ( ns.StygianAbyss )
    251.                                 {
    252.                                     ns.Send(new MobileIncoming(ns.Mobile, this));
    253.  
    254.                                     if (m_Poison != null)
    255.                                         ns.Send(new HealthbarPoison(this));
    256.  
    257.                                     if (m_Blessed || m_YellowHealthbar)
    258.                                         ns.Send(new HealthbarYellow(this));
    259.                                 }
    260.                                 else
    261.                                 {
    262.                                     ns.Send(new MobileIncomingOld(ns.Mobile, this));
    263.                                 }
    264.  
    265.                                 if( ObjectPropertyList.Enabled )
    266.                                 {
    267.                                     ns.Send( OPLPacket );
    268.  
    269.                                     //foreach ( Item item in m_Items )
    270.                                     //    ns.Send( item.OPLPacket );
    271.                                 }
    272.                             }
    273.                         }
    274.  
    275.                         eable.Free();
    276.                     }
    277.                 }
    278.  
    279.                 OnLocationChange( oldLocation );
    280.  
    281.                 this.Region.OnLocationChanged( this, oldLocation );
    282.             }
    283.         }


    Code (C#):
    1.         public virtual void Kill()
    2.         {
    3.             if( !CanBeDamaged() )
    4.                 return;
    5.             else if( !Alive || IsDeadBondedPet )
    6.                 return;
    7.             else if( m_Deleted )
    8.                 return;
    9.             else if( !Region.OnBeforeDeath( this ) )
    10.                 return;
    11.             else if( !OnBeforeDeath() )
    12.                 return;
    13.  
    14.             BankBox box = FindBankNoCreate();
    15.  
    16.             if( box != null && box.Opened )
    17.                 box.Close();
    18.  
    19.             if( m_NetState != null )
    20.                 m_NetState.CancelAllTrades();
    21.  
    22.             if( m_Spell != null )
    23.                 m_Spell.OnCasterKilled();
    24.             //m_Spell.Disturb( DisturbType.Kill );
    25.  
    26.             if( m_Target != null )
    27.                 m_Target.Cancel( this, TargetCancelType.Canceled );
    28.  
    29.             DisruptiveAction();
    30.  
    31.             Warmode = false;
    32.  
    33.             DropHolding();
    34.  
    35.             Hits = 0;
    36.             Stam = 0;
    37.             Mana = 0;
    38.  
    39.             Poison = null;
    40.             Combatant = null;
    41.  
    42.             if( Paralyzed )
    43.             {
    44.                 Paralyzed = false;
    45.  
    46.                 if( m_ParaTimer != null )
    47.                     m_ParaTimer.Stop();
    48.             }
    49.  
    50.             if( Frozen )
    51.             {
    52.                 Frozen = false;
    53.  
    54.                 if( m_FrozenTimer != null )
    55.                     m_FrozenTimer.Stop();
    56.             }
    57.  
    58.             List<Item> content = new List<Item>();
    59.             List<Item> equip = new List<Item>();
    60.             List<Item> moveToPack = new List<Item>();
    61.  
    62.             List<Item> itemsCopy = new List<Item>( m_Items );
    63.  
    64.             Container pack = this.Backpack;
    65.  
    66.             for( int i = 0; i < itemsCopy.Count; ++i )
    67.             {
    68.                 Item item = itemsCopy[i];
    69.  
    70.                 if( item == pack )
    71.                     continue;
    72.  
    73.                 DeathMoveResult res = GetParentMoveResultFor( item );
    74.  
    75.                 switch( res )
    76.                 {
    77.                     case DeathMoveResult.MoveToCorpse:
    78.                         {
    79.                             content.Add( item );
    80.                             equip.Add( item );
    81.                             break;
    82.                         }
    83.                     case DeathMoveResult.MoveToBackpack:
    84.                         {
    85.                             moveToPack.Add( item );
    86.                             break;
    87.                         }
    88.                 }
    89.             }
    90.  
    91.             if( pack != null )
    92.             {
    93.                 List<Item> packCopy = new List<Item>( pack.Items );
    94.  
    95.                 for( int i = 0; i < packCopy.Count; ++i )
    96.                 {
    97.                     Item item = packCopy[i];
    98.  
    99.                     DeathMoveResult res = GetInventoryMoveResultFor( item );
    100.  
    101.                     if( res == DeathMoveResult.MoveToCorpse )
    102.                         content.Add( item );
    103.                     else
    104.                         moveToPack.Add( item );
    105.                 }
    106.  
    107.                 for( int i = 0; i < moveToPack.Count; ++i )
    108.                 {
    109.                     Item item = moveToPack[i];
    110.  
    111.                     if( RetainPackLocsOnDeath && item.Parent == pack )
    112.                         continue;
    113.  
    114.                     pack.DropItem( item );
    115.                 }
    116.             }
    117.  
    118.             HairInfo hair = null;
    119.             if( m_Hair != null )
    120.                 hair = new HairInfo( m_Hair.ItemID, m_Hair.Hue );
    121.  
    122.             FacialHairInfo facialhair = null;
    123.             if( m_FacialHair != null )
    124.                 facialhair = new FacialHairInfo( m_FacialHair.ItemID, m_FacialHair.Hue );
    125.  
    126.             Container c = (m_CreateCorpse == null ? null : m_CreateCorpse( this, hair, facialhair, content, equip ));
    127.  
    128.  
    129.             /*m_Corpse = c;
    130.  
    131.             for ( int i = 0; c != null && i < content.Count; ++i )
    132.                 c.DropItem( (Item)content[i] );
    133.  
    134.             if ( c != null )
    135.                 c.MoveToWorld( this.Location, this.Map );*/
    136.  
    137.             if( m_Map != null )
    138.             {
    139.                 Packet animPacket = null;//new DeathAnimation( this, c );
    140.                 Packet remPacket = null;//this.RemovePacket;
    141.  
    142.                 IPooledEnumerable eable = m_Map.GetClientsInRange( m_Location );
    143.  
    144.                 foreach( NetState state in eable )
    145.                 {
    146.                     if( state != m_NetState && (!state.Mobile.HasFilter || InLOS( state.Mobile ) ) )
    147.                     {
    148.                         if( animPacket == null )
    149.                             animPacket = Packet.Acquire( new DeathAnimation( this, c ) );
    150.  
    151.                         state.Send( animPacket );
    152.  
    153.                         if( !state.Mobile.CanSee( this ) )
    154.                         {
    155.                             if( remPacket == null )
    156.                                 remPacket = this.RemovePacket;
    157.                                 // XXX LOS BEGIN
    158.                             state.Mobile.RemoveLos(this);
    159.                             // XXX LOS END
    160.  
    161.                             state.Send( remPacket );
    162.                         }
    163.                     }
    164.                 }
    165.  
    166.                 Packet.Release( animPacket );
    167.  
    168.                 eable.Free();
    169.             }
    170.  
    171.             Region.OnDeath( this );
    172.             OnDeath( c );
    173.         }

    Code (C#):
    1. public void SendRemovePacket( bool everyone )
    2.         {
    3.             if( m_Map != null )
    4.             {
    5.                 Packet p = null;
    6.  
    7.                 IPooledEnumerable eable = m_Map.GetClientsInRange( m_Location );
    8.  
    9.                 foreach( NetState state in eable )
    10.                 {
    11.                     if( state != m_NetState && (everyone || !state.Mobile.CanSee( this )) )
    12.                     {
    13.                         if( p == null )
    14.                             p = this.RemovePacket;
    15.                           // XXX LOS BEGIN
    16.                         state.Mobile.RemoveLos(this);
    17.                         // XXX LOS END
    18.  
    19.                         state.Send( p );
    20.                     }
    21.                 }
    22.  
    23.                 eable.Free();
    24.             }
    25.         }

    Code (C#):
    1.         public void ClearScreen()
    2.         {
    3.             NetState ns = m_NetState;
    4.  
    5.             if( m_Map != null && ns != null )
    6.             {
    7.                 IPooledEnumerable eable = m_Map.GetObjectsInRange( m_Location, Core.GlobalMaxUpdateRange );
    8.  
    9.                 foreach( object o in eable )
    10.                 {
    11.                       // XXX LOS BEGIN
    12.                     RemoveLos(o);
    13.                     // XXX LOS END
    14.                     if( o is Mobile )
    15.                     {
    16.                         Mobile m = (Mobile)o;
    17.  
    18.                         if( m != this && Utility.InUpdateRange( m_Location, m.m_Location ) )
    19.                             ns.Send( m.RemovePacket );
    20.                     }
    21.                     else if( o is Item )
    22.                     {
    23.                         Item item = (Item)o;
    24.  
    25.                         if( InRange( item.Location, item.GetUpdateRange( this ) ) )
    26.                             ns.Send( item.RemovePacket );
    27.                     }
    28.                 }
    29.  
    30.                 eable.Free();
    31.             }
    32.         }
    Code (C#):
    1.     [CommandProperty( AccessLevel.GameMaster )]
    2.         public virtual bool Hidden
    3.         {
    4.             get
    5.             {
    6.                 return m_Hidden;
    7.             }
    8.             set
    9.             {
    10.                 if( m_Hidden != value )
    11.                 {
    12.                     m_AllowedStealthSteps = 0;
    13.  
    14.                     m_Hidden = value;
    15.                     //Delta( MobileDelta.Flags );
    16.  
    17.                     if( m_Map != null )
    18.                     {
    19.                         Packet p = null;
    20.  
    21.                         IPooledEnumerable eable = m_Map.GetClientsInRange( m_Location );
    22.  
    23.                         foreach( NetState state in eable )
    24.                         {
    25.                             if( !state.Mobile.CanSee( this ) )
    26.                             {
    27.                                 if( p == null )
    28.                                     p = this.RemovePacket;
    29.                                    // XXX LOS BEGIN
    30.                                 state.Mobile.RemoveLos(this);
    31.                                 // XXX LOS END
    32.  
    33.                                 state.Send( p );
    34.                             }
    35.                             else if( !state.Mobile.HasFilter || InLOS( state.Mobile ) )
    36.                             {
    37.                                 if (state.StygianAbyss)
    38.                                     state.Send(new MobileIncoming(state.Mobile, this));
    39.                                 else
    40.                                     state.Send(new MobileIncomingOld(state.Mobile, this));
    41.  
    42.                                 if( IsDeadBondedPet )
    43.                                     state.Send( new BondedStatus( 0, m_Serial, 1 ) );
    44.  
    45.                                 if( ObjectPropertyList.Enabled )
    46.                                 {
    47.                                     state.Send( OPLPacket );
    48.  
    49.                                     //foreach ( Item item in m_Items )
    50.                                     //    state.Send( item.OPLPacket );
    51.                                 }
    52.                             }
    53.                         }
    54.  
    55.                         eable.Free();
    56.                     }
    57.                 }
    58.             }
    59.         }

    Code (C#):
    1.     public virtual bool CanSee( Item item )
    2.         {
    3.               // XXX LOS BEGIN
    4.             bool canSee = true;
    5.  
    6.             if (m_Deleted || item.Deleted || m_Map == Map.Internal || item.Map == Map.Internal || m_Map != item.Map) canSee = false;
    7.  
    8.             else if (item.Parent != null)
    9.             {
    10.                 if (item.Parent is Item)
    11.                 {
    12.                     if (!CanSee((Item)item.Parent)) canSee = false;
    13.                     else canSee =
    14.                         m_AccessLevel > AccessLevel.Counselor
    15.                         ||
    16.                         item.Visible
    17.                         ;
    18.                 }
    19.                 else if (item.Parent is Mobile)
    20.                 {
    21.                     if (!CanSee((Mobile)item.Parent)) canSee = false;
    22.                     else canSee =
    23.                         m_AccessLevel > AccessLevel.Counselor
    24.                         ||
    25.                         item.Visible
    26.                         ;
    27.                 }
    28.             }
    29.  
    30.             else if (item is BankBox)
    31.             {
    32.                 BankBox box = item as BankBox;
    33.  
    34.                 if (box != null && m_AccessLevel <= AccessLevel.Counselor && (box.Owner != this || !box.Opened))
    35.                     canSee = false;
    36.             }
    37.             else if (item is SecureTradeContainer)
    38.             {
    39.                 SecureTrade trade = ((SecureTradeContainer)item).Trade;
    40.  
    41.                 if (trade != null && trade.From.Mobile != this && trade.To.Mobile != this)
    42.                     canSee = false;
    43.             }
    44.             else if (!Utility.InRange(this.Location, item.Location, 15))
    45.             {
    46.                 canSee = false;
    47.             }
    48.  
    49.             else
    50.             {
    51.                 canSee =
    52.                     m_AccessLevel > AccessLevel.Counselor
    53.                     ||
    54.                     (item.Visible && CheckLos(item))
    55.                     ;
    56.             }
    57.  
    58.             //Console.WriteLine("LOS: \"{0}\" sees \"{1}\", ID={2} ? {3}", this.Name, item.Name, item.ItemID, canSee );
    59.  
    60.             return canSee;
    61.             // XXX LOS END
    62.         }

    Code (C#):
    1.    // XXX LOS BEGIN
    2.         public virtual bool CanSee(Mobile m)
    3.         {
    4.             bool canSee = true;
    5.  
    6.             if (this == m) canSee = true;
    7.  
    8.             else if (!Utility.InRange(this.Location, m.Location, 15)) canSee = false;
    9.  
    10.             else if (m_Deleted || m.m_Deleted || m_Map == Map.Internal || m.m_Map == Map.Internal || this.m_Map != m.m_Map) canSee = false;
    11.  
    12.             else if (this.AccessLevel > AccessLevel.Player && (this.AccessLevel >= m.AccessLevel || this.AccessLevel >= AccessLevel.Administrator)) canSee = true;
    13.  
    14.             else canSee =
    15.                 !m.Hidden              // hidden cant be seen regardless
    16.                 &&
    17.                 (
    18.                     (                  // account for ghosts and what not
    19.                          m.Alive
    20.                          ||
    21.                          Core.SE && Skills.SpiritSpeak.Value >= 100.0
    22.                          ||
    23.                          !this.Alive
    24.                          ||
    25.                          m.Warmode
    26.                      )
    27.                      &&
    28.                      CheckLos(m)
    29.                  );
    30.  
    31.             //Console.WriteLine("LOS: \"{0}\" sees \"{1}\" ? {2}", this.Name, m.Name, canSee );
    32.             //if( AccessLevel = AccessLevel.Player || LOS.Config.GetInstance().LosForMobs )
    33.             //if( canSee && addLos ) AddLos( m );
    34.  
    35.             return canSee;
    36.         }
    37.  
    38.         //------------------------------------------------------------------------------
    39.         //  CheckLos() -- this is where the real line of sight checking is actually
    40.         //     done.
    41.         //------------------------------------------------------------------------------
    42.         public bool CheckLos(IEntity o)
    43.         {
    44.             //if( this.NetState == null )
    45.             //Console.WriteLine( "Checking LOS for {0} --> {1}", this.Name, o is Mobile ? ((Mobile)o).Name : ((Item)o).Name );
    46.  
    47.             Point3D viewer = this.Location;
    48.             Point3D target = o.Location;
    49.  
    50.             //if( o is Item ) Console.WriteLine( "Checking LOS for item {0},{1},{2} --> {3},{4},{5} \"{6}\"",
    51.             //    viewer.X, viewer.Y, viewer.Z, target.X, target.Y, target.Z, o.GetType().Name
    52.             //    );
    53.  
    54.             //  CHECK NO UP IN CAN_SEE, No need here
    55.             //
    56.             // if ( !Utility.InRange( viewer, target, 15 ) )                        
    57.             // {
    58.             //     return false; // LOS stops resolving at a range of 15
    59.             // }
    60.  
    61.             if (o is Item)
    62.             {
    63.                 Item item = (Item)o;
    64.  
    65.                 //--------------------------------------------------------------
    66.                 //  Immovable items always visible
    67.                 //--------------------------------------------------------------
    68.  
    69.                 if (!item.Movable)
    70.                 {
    71.                     if (LOS.Values.Corpse.IsInstanceOfType(item))
    72.                     {
    73.                         PropertyInfo info = LOS.Values.Corpse.GetProperty("Owner");
    74.  
    75.                         Mobile owner = (Mobile)info.GetValue(item, null);
    76.  
    77.                         if (owner == this) return true;
    78.                     }
    79.                     else return true;
    80.                 }
    81.  
    82.  
    83.                 //--------------------------------------------------------------
    84.                 //  Not lossed items always visible
    85.                 //--------------------------------------------------------------
    86.  
    87.                 if (LOS.Config.GetInstance().NotLossed(item.ItemID | 0x4000))
    88.                 {
    89.                     return true;
    90.                 }
    91.  
    92.                 //--------------------------------------------------------------
    93.                 //  All items are visible if we're not lossing them.
    94.                 //--------------------------------------------------------------
    95.  
    96.                 if (!LOS.Config.GetInstance().Items)
    97.                 {
    98.                     return true;
    99.                 }
    100.             }
    101.             else if (o is Mobile)
    102.             {
    103.                 if (this.Player)
    104.                 {
    105.                     if (!LOS.Config.GetInstance().Mobiles)
    106.                     {
    107.                         return true;  // if mobile is off, we can see all mobiles
    108.                     }
    109.                 }
    110.                 else
    111.                 {
    112.                     if (!LOS.Config.GetInstance().LosForMobs)
    113.                     {
    114.                         return true;  // if this is an npc mob, and los for npcs if off, the npc mob sees all
    115.                     }
    116.                     else if (Utility.InRange(viewer, target, 7))
    117.                     {
    118.                         return true;
    119.                     }
    120.                 }
    121.             }
    122.  
    123.             //------------------------------------------------------------------
    124.             // if LOS is not on on this facet, don't use LOS
    125.             //------------------------------------------------------------------
    126.  
    127.             if (!LOS.Config.GetInstance().FacetOn(this.Map.Name))
    128.             {
    129.                 return true;
    130.             }
    131.  
    132.             //------------------------------------------------------------------
    133.             // if LOS is off, don't use LOS
    134.             //------------------------------------------------------------------
    135.  
    136.             if (!LOS.Config.GetInstance().On)
    137.             {
    138.                 return true;
    139.             }
    140.  
    141.             //------------------------------------------------------------------
    142.             //  Maybe perform symmetric los; this creates balance: if I can't LOS you,
    143.             //  you can't LOS me. This has nothing to do with hidden or other characteristics
    144.             //  at this point, just basic LOS. This can be used to remedy certain
    145.             //  defects of the LOS system that some might regard as unfair...
    146.             //------------------------------------------------------------------
    147.  
    148.             if (LOS.Config.GetInstance().Symmetric)
    149.             {
    150.                 return
    151.                     this.Map.LOS.Visible(viewer, target)
    152.                     &&
    153.                     this.Map.LOS.Visible(target, viewer)
    154.                     ;
    155.             }
    156.             else
    157.             {
    158.                 return
    159.                     this.Map.LOS.Visible(viewer, target)
    160.                     ;
    161.             }
    162.         }
    163.  
    164.         //------------------------------------------------------------------------------
    165.         //  InvalidateLos() -- this function sends a remove packet to mobiles that
    166.         //    have just gone out of our line of site. This needs to be done because the
    167.         //    client "dead reckons" (stores last position) mobiles by default.
    168.         //------------------------------------------------------------------------------
    169.  
    170.         public void InvalidateLos()
    171.         {
    172.             if (m_LosCurrent.Count > 0)
    173.             {
    174.                 Dictionary<Object, Object> culls = new Dictionary<Object, Object>();
    175.  
    176.                 foreach (Object o in m_LosCurrent.Keys)
    177.                 {
    178.                     if (o is Mobile)
    179.                     {
    180.                         Mobile m = (Mobile)o;
    181.  
    182.                         if (!CanSee(m)) culls.Add(m, m);
    183.                     }
    184.                     else if (o is Item)
    185.                     {
    186.                         Item i = (Item)o;
    187.  
    188.                         if (!CanSee(i)) culls.Add(i, i);
    189.                     }
    190.                 }
    191.  
    192.                 foreach (Object o in culls.Keys)
    193.                 {
    194.                     RemoveLos(o);
    195.                     Packet p = o is Mobile ? ((Mobile)o).RemovePacket : ((Item)o).RemovePacket;
    196.                     NetState state = this.NetState;
    197.                     if (state != null)
    198.                     {
    199.                         state.Send(p);
    200.                     }
    201.                 }
    202.             }
    203.         }
    204.  
    205.  
    206.         public bool InLos(Object o)
    207.         {
    208.             if (m_LosCurrent.ContainsKey(o)) return true;
    209.             else return false;
    210.         }
    211.  
    212.         public void AddLos(Object o)
    213.         {
    214.             if (m_NetState == null) return; // things without a netstate cannot benefit from LOS list optimization
    215.             if (!m_LosCurrent.ContainsKey(o)) m_LosCurrent.Add(o, o);
    216.         }
    217.  
    218.         public void RemoveLos(Object o)
    219.         {
    220.             if (m_NetState == null) return; // things without a netstate cannot benefit from LOS list optimization
    221.             if (m_LosCurrent.ContainsKey(o)) m_LosCurrent.Remove(o);
    222.         }
    223.         // XXX LOS END

    Sorry for the big post
     
Similar Threads: Courageous True
Forum Title Date
General Discussion ServUO with Courageous' True LOS Nov 10, 2014
Script Support IsCriminal // XMLSpawner SETONTRIGMOB/Criminal/true not functional Apr 23, 2017
Custom Releases AI True Speed Nov 4, 2016
General Discussion creating a "true" UO shard Aug 8, 2015
Script Support public override bool IsInvulnerable { get { return true; } } not working? May 31, 2015