public override void Deserialize( GenericReader gr ) { base.Deserialize( gr ); int version = gr.ReadInt(); if ( version > 6 ) { int nreput = gr.ReadInt(); for(int t = 0;t < nreput;t++ ) { int krep = gr.ReadInt(); int vrep = gr.ReadInt(); reputationAdjustments[ krep ] = vrep; } } if ( version > 5 ) { int nact = gr.ReadInt(); for(int t = 0;t < nact;t++ ) actionBar.Add( new Action( gr ) ); } if ( version > 4 ) { int nf = gr.ReadInt(); for(int t = 0;t < nf;t++ ) { UInt64 gu = (UInt64)gr.ReadInt64(); friends.Add( gu ); string user = gr.ReadString(); friends.Add( user ); } } if ( version > 2 ) { BindingPointX = gr.ReadFloat(); BindingPointY = gr.ReadFloat(); BindingPointZ = gr.ReadFloat(); BindingPointMapId = (UInt16)gr.ReadInt(); } if ( version > 1 ) { bool pa = gr.ReadBool(); if ( pa ) { petActions = new int[ 11 ]; for(int t = 0;t < 11;t++ ) petActions[ t ] = gr.ReadInt(); } } int sum = gr.ReadInt(); if ( sum != 0 ) { UInt64 g = gr.ReadInt64(); if ( version > 7 ) { int sid = gr.ReadInt(); Summon = new BaseCreature( gr ); Summon.Id = sid; } // Summon = (Mobile)MobileList.TempSummon[ g ]; Summon.SummonedBy = this; ( Summon as BaseCreature ).AIEngine = new SummonedAI( this, Summon as BaseCreature ); } sum = gr.ReadInt(); if ( sum != 0 ) { Charm = (Mobile)MobileList.TempSummon[ gr.ReadInt64() ]; Charm.CharmedBy = this; ( Charm as BaseCreature ).AIEngine = new SummonedAI( this, Charm as BaseCreature ); } CorpseLocationX = gr.ReadFloat(); CorpseLocationY = gr.ReadFloat(); CorpseLocationZ = gr.ReadFloat(); if ( version > 3 ) CorpseMapId = (ushort)gr.ReadShort(); corpsGuid = gr.ReadInt64(); zones = new uint[ 32 ]; for(int t = 0;t < 32;t++ ) zones[ t ] = (uint)gr.ReadInt(); int exi = gr.ReadInt(); if ( exi == 1 ) { mark = new Position( gr.ReadFloat(), gr.ReadFloat(), gr.ReadFloat(), gr.ReadInt() ); } ammoType = gr.ReadInt(); race = (Races)gr.ReadByte(); if ( version == 0 ) Classe = (Classes)gr.ReadByte(); gender = gr.ReadByte(); skin = gr.ReadByte(); face = gr.ReadByte(); hairStyle = gr.ReadByte(); hairColour = gr.ReadByte(); facialHair = gr.ReadByte(); copper = (uint)gr.ReadInt(); int nactq = 20; for(int t = 0;t < nactq;t++ ) { int vv = gr.ReadInt(); if ( vv == 1 ) { ActiveQuest aq = new ActiveQuest( gr ); if ( aq.Id > 0 ) AddQuest( aq ); } } int nq = gr.ReadInt(); for(int t = 0;t < nq;t++ ) { int id = gr.ReadInt(); questsDone[ id ] = true; } for(int g = 0;g < 8;g++ ) { int field = gr.ReadInt(); TaxiField[ g ] = (uint)field; } // RunSpeed = 11f; }
public float QuickDistance( Position p ) { if ( p.MapId != mapId ) return float.MaxValue; float a = p.X - X; float b = p.Y - Y; return a * a + b * b; }
void OnCommand( string cmd ) { if ( Player.AccessLevel == AccessLevels.PlayerLevel ) { string lower = cmd.ToLower(); if ( lower.StartsWith( ".help" ) ) { SendMessage( "Command lists" ); SendMessage( ".whois" ); SendMessage( ".mount" ); SendMessage( ".unmount" ); } else if ( lower.StartsWith( ".whois" ) ) { foreach( Account a in World.allConnectedAccounts ) { if ( a.SelectedChar != null ) SendMessage( a.SelectedChar.Name + " is online at ( " + a.SelectedChar.X.ToString() + "; " + a.SelectedChar.Y.ToString() + "; "+ a.SelectedChar.Z.ToString() + ") " ); } SendMessage( "User online : " + World.allConnectedAccounts.Count.ToString() ); } else if ( lower.StartsWith( ".mount" ) ) { if ( selection != null && selection is Mobile ) { if ( World.MountsList[ ( selection as Mobile ).Id ] != null ) Mount( selection as Mobile ); } } else if ( lower.StartsWith( ".unmount" ) ) { if ( this.MountModel != 0 ) UnMount(); } } else if ( Player.AccessLevel == AccessLevels.Admin ) { string lower = cmd.ToLower(); if ( lower.StartsWith( ".importspawner" ) ) { ImportSpawner(); } else if ( lower.StartsWith( ".exportspawner" ) ) { ExportSpawner(); } else if ( lower.StartsWith( ".import" ) ) { ImportWad(); } else if ( lower.StartsWith( ".help" ) ) { SendMessage( "Command lists" ); SendMessage( ".help" ); SendMessage( ".Addnpc [MobName|MobId] [amount] [faction]" ); SendMessage( ".AddItem ItemName [amount]" ); SendMessage( ".Addgo GameObjectNumber" ); SendMessage( ".AddSpawner [MobName|MobId] amount frequency" ); SendMessage( ".AddGoSpawner GameObjectId frequency [classname]" ); SendMessage( ".kill" ); SendMessage( ".nuke" ); SendMessage( ".info" ); SendMessage( ".where" ); SendMessage( ".remove" ); SendMessage( ".set xp Amount" ); SendMessage( ".set faction FactionNumber" ); SendMessage( ".set godmode [on/off]" ); SendMessage( ".set turbo [on/off]" ); SendMessage( ".password NewPassword" ); SendMessage( ".grant [account|selected char] AccessLevel" ); SendMessage( ".go LocationName | [ X Y Z MapId ]" ); SendMessage( ".addlocation LocationName" ); SendMessage( ".restart XMinutes" ); SendMessage( ".whois" ); SendMessage( ".broadcast Message" ); SendMessage( ".hide" ); SendMessage( ".unhide" ); SendMessage( ".docgen" ); SendMessage( ".removego" ); SendMessage( ".armagedon" ); SendMessage( ".mount" ); SendMessage( ".unmount" ); } else if ( lower.StartsWith( ".mount" ) ) { if ( selection != null && selection is Mobile ) { if ( World.MountsList[ ( selection as Mobile ).Id ] != null ) Mount( selection as Mobile ); } } else if ( lower.StartsWith( ".test" ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length != 3 ) { SendMessage( "Usage : .test MobName1 MobName2" ); return; } if ( testCombatStarted ) { SendMessage( "A fight test is not finished yet !!" ); return; } //tt[ 1 ] = "SilverwingWarrior"; //tt[ 2 ] = "RazorHillGrunt"; ConstructorInfo ct1 = Utility.FindConstructor( tt[ 1 ] , Utility.externAsm[ "creatures" ] ); ConstructorInfo ct2 = Utility.FindConstructor( tt[ 2 ] , Utility.externAsm[ "creatures" ] ); testCombatStarted = true; for(int t = 0;t < 50;t++ ) { BaseCreature bc = (BaseCreature)ct1.Invoke( null ); bc.Faction = Factions.Alliance; World.Add( bc, -13210f + (float)( Utility.Random( 50 ) - 25 ), 267.6f+ (float)( Utility.Random( 50 ) - 25 ), 22f, 0 ); team1.Add( bc ); bc = (BaseCreature)ct2.Invoke( null ); bc.Faction = Factions.Horde; World.Add( bc, -13210f + (float)( Utility.Random( 50 ) - 25 ), 287.6f+ (float)( Utility.Random( 50 ) - 25 ), 22f, 0 ); team2.Add( bc ); } MobBalance mb = new MobBalance( this ); } else if ( lower.StartsWith( ".." ) ) { string []ss = lower.Split( new char[] { ' ' } ); ff = (uint)Convert.ToInt32( ss[ 1 ] ); SendMessage("num = " + ff.ToString("X8" )); /* if ( selection is Mobile ) ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_DYNAMIC_FLAGS }, new object[] { ff } ); */ SendSmallUpdate( new int[]{ (int)UpdateFields.UNIT_FIELD_FACTIONTEMPLATE }, new object[]{ ff } ); } else if ( lower.StartsWith( ".close" ) ) { MainConsole.StopAllThread(); } else if ( lower.StartsWith( ".mars" ) ) {/* Hashtable hy = null; hy = World.mapZones.GetZoneHash( MapId, ZoneId, X, Y );//(Hashtable)World.mapZones.Azeroth[ MapId * 1024 + ZoneId ]; for(float x = X - 16;x < X + 16;x+=MapZones.UNITSIZE ) { for(float y = Y - 16;y < Y + 16;y++ ) { int coordy = (int)( y / ( MapZones.UNITSIZE * 0.5f ) ); int coordx = (int)( x / MapZones.UNITSIZE ); bool decal = false;; if ( (int)( coordy & 1 ) == 1 ) { decal = true; coordx -= (int)( MapZones.UNITSIZE * 0.5f ); } uint cx = (uint)( coordx + 0x8000 ); uint cy = (uint)( coordy + 0x8000 ); object o = hy[ (uint)( ( coordx << 16 ) + coordy ) ]; if ( o != null ) { float xx = (float)coordx * ( MapZones.UNITSIZE ); float yy = (float)coordy * MapZones.UNITSIZE * 0.5f; if ( decal ) { xx += MapZones.UNITSIZE * 0.5f; } GameObject go = World.Add( 621682, xx, yy, (float)o, MapId ); World.allSpawners[ linkedSpawner ].Bind( go ); } } } account.RefreshMobileList( true );*/ MapPoint mp = World.mapZones.NearestPoint( null, MapId, ZoneId, X, Y ); SendMessage( "X=" + mp.x.ToString() + " Y=" + mp.y.ToString() ); GameObject go = World.Add( 621682, mp.x , mp.y, mp.z, 0, MapId ); World.allSpawners[ linkedSpawner ].Bind( go ); account.RefreshMobileList( true ); //MainConsole.StopAllThread(); // Mobile.GetDirection( this, selection as Mobile ); // return; // p.Kill(); //for(float xxa = X - 10;xxa < //string []ss = lower.Split( new char[] { ' ' } ); //uint xff = (uint)Convert.ToUInt32( ss[ 1 ] ); // Items[ 24 ].SendSmallUpdate( new int[]{ (int)UpdateFields.ITEM_FIELD_FLAGS }, new object[]{ xff }, this ); /* Converter.ToBytes( cast.id, tempBuff, ref offset ); Converter.ToBytes( (byte)1, tempBuff, ref offset ); ToAllPlayerNear( OpCodes.SMSG_CAST_RESULT, tempBuff, offset ); offset = 4;*/ /*Converter.ToBytes( 6, tempBuff, ref offset ); Converter.ToBytes( (byte)2, tempBuff, ref offset ); Converter.ToBytes( (byte)xff, tempBuff, ref offset ); Converter.ToBytes( msg, tempBuff, ref offset ); ToAllPlayerNear( OpCodes.SMSG_CAST_RESULT, tempBuff, offset );*/ cast.id = 8613; cast.type = 2; //SpellFaillure( ( SpellFailedReason )xff ); /* int ff2 = (int)Convert.ToInt32( ss[ 2 ] ); SendMessage("num = " + xff.ToString("X8" )); int offset = 4; Converter.ToBytes( 1, tempBuff, ref offset ); Converter.ToBytes( xff, tempBuff, ref offset ); Converter.ToBytes( ff2, tempBuff, ref offset ); if ( selection is Mobile ) this.Send( OpCodes.SMSG_SET_FACTION_STANDING, tempBuff, offset ); */ // ReputationAdjustments[ World.FactionAssociated[ Factions.Stormwind ] ] = (int)xff; // this.Player.RefreshFactionReactions(); // ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { ff } ); } else if ( lower.StartsWith( ".mare" ) ) { /* if ( selection ==null ) return; string []ss = lower.Split( new char[] { ' ' } ); int ff1 = Convert.ToInt32( ss[ 1 ] ); // int ff2 = Convert.ToInt32( ss[ 2 ] ); SendMessage("num = " + ff1.ToString("X8" )); int offset = 4; Converter.ToBytes( selection.Guid, tempBuff, ref offset ); Converter.ToBytes( ff1, tempBuff, ref offset ); this.Send( OpCodes.SMSG_AI_REACTION, tempBuff, offset ); return;*/ /* if ( selection is Mobile ) ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.PLAYER_FLAGS }, new object[] { ff } ); */ /* for(int z = 0;z < 32;z++ ) zones[ z ] = 0; for(int z = 0; z < 32 * 32;z++) { if ( z >= ff1 && z < ff2 ) { int e = z % 32; int n = ( z / 32 ); zones[ n ] |= (uint)( 1 << ( e ) ); } } for(int z = 0;z < 32;z++ ) { this.SendSmallUpdate( new int[] { (int)UpdateFields.PLAYER_EXPLORED_ZONES_1 + z }, new object[] { zones[ z ] } ); }*/ } else if ( lower.StartsWith( ".marb" ) ) { string []ss = lower.Split( new char[] { ' ' } ); ff = (uint)Convert.ToInt32( ss[ 1 ] ); SendMessage("num = " + ff.ToString("X8" )); if ( selection is Mobile ) ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.PLAYER_FIELD_BYTES }, new object[] { ff } ); } else if ( lower.StartsWith( ".marf" ) ) { string []ss = lower.Split( new char[] { ' ' } ); ff = (uint)Convert.ToInt32( ss[ 1 ] ); SendMessage("num = " + ff.ToString("X8" )); if ( selection is Mobile ) ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_NPC_FLAGS }, new object[] { ff } ); } /*else if ( lower.StartsWith( ".s" ) ) { string []ss = lower.Split( new char[] { ' ' } ); SpellFaillure( (Server.SpellFailedReason)Convert.ToInt32( ss[ 1 ] ) ); }*/ /* else if ( lower.StartsWith( ".s" ) ) { string []ss = lower.Split( new char[] { ' ' } ); if ( ss.Length > 1 ) ff |= (uint)( 1 << Convert.ToInt32( ss[ 1 ] ) ); if ( selection is Character ) ( selection as Character ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { ff } ); else ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { ff } ); Console.WriteLine("rage = {0}", ff.ToString("X8" )); } else if ( lower.StartsWith( ".u" ) ) { string []ss = lower.Split( new char[] { ' ' } ); if ( ss.Length > 1 ) ff &= (uint)0xffffffff ^ (uint)( 1 << Convert.ToInt32( ss[ 1 ] ) ); if ( selection is Character ) ( selection as Character ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { ff } ); else ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[] { (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { ff } ); Console.WriteLine("rage = {0}", ff.ToString("X8" )); } */ else if ( lower.StartsWith( ".unmount" ) ) { if ( this.MountModel != 0 ) UnMount(); } else if ( lower.StartsWith( ".set faction" ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( selection is Mobile ) { if ( tt.Length == 3 ) { int fac = Convert.ToInt32( tt[ 2 ] ); ( selection as Mobile ).SendSmallUpdateToPlayerNearMe( new int[]{ (int)UpdateFields.UNIT_FIELD_FACTIONTEMPLATE }, new object[]{ (int)fac } ); } else SendMessage("Usage : .set faction FACTION_NUMBER" ); } else SendMessage("You must select a mobile first !" ); } else if ( lower.StartsWith( ".removego" ) ) { Object nearest = null; float nearestdist = float.MaxValue; foreach( Object o in World.allGameObjects ) { float dist = Distance( o ); if ( dist < nearestdist ) { nearestdist = dist; nearest = o; } } if ( nearest != null ) World.Remove( nearest, this ); } else if ( lower.StartsWith( ".docgen" ) ) { SendMessage("Documentation is being generated, please wait."); Console.WriteLine( "Documentation is being generated, please wait." ); DateTime startTime = DateTime.Now; Docs.Document(); DateTime endTime = DateTime.Now; Console.WriteLine("Documentation has been completed. The entire process took {0:F1} seconds.", (endTime - startTime).TotalSeconds ); SendMessage("Documentation has been completed. The entire process took " + (endTime - startTime).TotalSeconds.ToString( "F1" ) + " seconds." ); return; } else if ( lower == ".hide" ) { this.Visible = InvisibilityLevel.GM; AuraEffect st = gmInvisibilityAura; Aura aura = new Aura(); aura.OnRelease = new Aura.AuraReleaseDelegate( OnGMInvisibilityEnded ); AddAura( st, aura ); } else if ( lower.StartsWith( ".unhide" ) ) { this.Visible = InvisibilityLevel.Visible; this.ReleaseAura( gmInvisibilityAura ); } else if ( lower.StartsWith( ".whois" ) ) { foreach( Account a in World.allConnectedAccounts ) { if ( a.SelectedChar != null ) SendMessage( a.Username.ToString() + " : " + a.SelectedChar.Name + " is online at ( " + a.SelectedChar.X.ToString() + "; " + a.SelectedChar.Y.ToString() + "; "+ a.SelectedChar.Z.ToString() + ") " ); else SendMessage( a.Username.ToString() + " : [loggout]" ); } SendMessage( "User online : " + World.allConnectedAccounts.Count.ToString() ); } else if ( lower.StartsWith( ".broadcast " ) ) { string tt = cmd.Remove( 0, 11 ); foreach( Account a in World.allConnectedAccounts ) { if ( a.SelectedChar != null ) SendMessage( a.Username.ToString() + ", " + tt ); } } else if ( lower.StartsWith( ".restart " ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 2 ) { World.Restart( Convert.ToInt32( tt[ 1 ] ) ); } else SendMessage( "Usage : .restart minutes" ); } else if ( lower.StartsWith( ".addlocation " ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 2 ) { TextReader tr = new StreamReader( "./scripts/Globals/Locations.cs" ); string txt = tr.ReadToEnd(); tr.Close(); TextWriter tw = new StreamWriter( "./scripts/Globals/Locations.cs" ); int i = txt.IndexOf( "#region Locations" ); string ne = "\t\t\tWorld.Locations[ \"" + tt[ 1 ] + "\" ] = new Position( " + X.ToString() + "f, " + Y.ToString() + "f, " + Z.ToString() + "f, 0 );" + tw.NewLine; tw.Write( txt.Substring( 0, i + "#region Locations".Length ) ); tw.Write( tw.NewLine + ne ); tw.Write( txt.Substring( i + "#region Locations".Length ) ); // txt.Insert( i + "#region Locations".Length + 2, ne ); // tw.Write( txt ); tw.Close(); SendMessage( "Done : " + ne ); } else SendMessage( "Usage : .addlocation LocationName" ); } else if ( lower.StartsWith( ".zone" ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); this.ZoneUpdateRequested( Convert.ToInt32( tt[ 1 ] ) ); } else if ( lower.StartsWith( ".grant " ) ) { string acclevel = lower.Remove( 0, 7 ); string []tt = acclevel.Split( new char[]{ ' ' } ); Account acc = null; if ( tt.Length == 1 ) { if ( selection is Character ) { acclevel = tt[ 0 ]; acc = ( selection as Character ).Player; } else { SendMessage( "Can only be used on character" ); return; } } else { if ( tt.Length > 2 || tt.Length == 0 ) { SendMessage( "Usage : .grant [Account] AccessLevel" ); return; } acclevel = tt[ 1 ]; acc = World.allAccounts.FindByUserName( tt[ 0 ].ToUpper() ); if ( acc == null ) { SendMessage( tt[ 0 ] + " account not found !" ); return; } } if ( acclevel == "admin" ) { SendMessage( "The account " + acc.Username + " is now an administrator" ); acc.AccessLevel = AccessLevels.Admin; } else if ( acclevel == "gm" ) { SendMessage( "The account " + acc.Username + " is now a game master" ); acc.AccessLevel = AccessLevels.GM; } else if ( acclevel == "player" ) { SendMessage( "The account " + acc.Username + " have now player access level" ); acc.AccessLevel = AccessLevels.PlayerLevel; } else SendMessage( acclevel + " is not a valid access level !" ); } else if ( lower.StartsWith( ".password " ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length < 2 ) { SendMessage( "Usage : .password NewPassword" ); return; } Player.Password = tt[ 1 ]; SendMessage( "Your new password is : " + tt[ 1 ] ); SendMessage( "Don't forget it !" ); } else if ( lower.StartsWith( ".info" ) ) { if ( selection != null ) { string ret = ""; if ( selection is BaseSpawner ) { ( selection as BaseSpawner ).DisplayInfo( this ); // ret += "Spawner for " + ( selection as BaseSpawner ).Name; // SendMessage( ret ); return; } else if ( selection is Character ) ret += "Player : "; else if ( ( selection as Mobile ).SummonedBy != null ) ret += "Summoned creature : "; else ret += "Creature : "; Mobile mob = ( selection as Mobile ); ret += mob.Name + " Faction : " + mob.Faction.ToString(); SendMessage( ret ); ret = "Pos : " + mob.X.ToString() + ", " + mob.Y.ToString() + ", " + selection.Z.ToString() + ", " + selection.MapId.ToString(); SendMessage( ret ); ret = "HitPoints : " + mob.HitPoints.ToString() + " / " + mob.BaseHitPoints.ToString(); SendMessage( ret ); ret = "Mana : " + mob.Mana.ToString() + " / " + mob.BaseMana.ToString(); SendMessage( ret ); ret = "Level : " + mob.Level.ToString() + " / " + mob.Exp.ToString() + " Xp"; SendMessage( ret ); } else SendMessage( "You must select a mobile before" ); } else if ( lower.StartsWith( ".kill" ) ) { if ( selection != null && selection is Mobile ) { ( selection as Mobile ).LooseHits( this, ( selection as Mobile ).HitPoints, true ); } } else if ( lower.StartsWith( ".addgospawner" ) ) { GameObjectSpawner bc = null; string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 3 ) { try { if ( Utility.FindConstructor( tt[ 1 ] ) != null ) { ConstructorInfo cttest = Utility.FindConstructor( tt[ 1 ] ); GameObject go = (GameObject)cttest.Invoke( null ); if ( go.DefaultModel == 0 ) { SendMessage( "This class does not implement the DefaultModel property !" ); return; } bc = new GameObjectSpawner(); bc.Init( tt[ 1 ], Convert.ToInt32( tt[ 2 ] ) ); World.Add( bc, X, Y, Z, MapId ); } else { bc = new GameObjectSpawner(); int id = Convert.ToInt32( tt[ 1 ] ); bc.Init( id, Convert.ToInt32( tt[ 2 ] ) ); World.Add( bc, X, Y, Z, MapId ); } } catch( Exception ) { } } else if ( tt.Length == 4 ) { try { bc = new GameObjectSpawner(); int id = Convert.ToInt32( tt[ 1 ] ); bc.Init( id, Convert.ToInt32( tt[ 2 ] ), tt[ 3 ] ); World.Add( bc, X, Y, Z, MapId ); } catch( Exception ) { } } else SendMessage( "usage : .addgospawner gameobjectname frequency [gameobjectclass]" ); if ( bc != null )// Ajoute le spawner dans la liste des autres spawnpoints { if ( this.linkedSpawner == -1 )// No spawner near the player { } else { int num = World.allSpawners.Count - 1; ArrayList al = new ArrayList(); World.regSpawners[ num ] = al; for(int t = 0;t < num;t++ ) { BaseSpawner bs2 = World.allSpawners[ t ] as BaseSpawner; if ( bc.MapId != bs2.MapId ) continue; if ( bc.QuickDistance( bs2 ) < 150 * 150 ) al.Add( t ); } foreach( int i in al ) { ( World.regSpawners[ i ] as ArrayList ).Add( num ); } } } } else if ( lower.StartsWith( ".armagedon" ) ) { MobileList newMobs = new MobileList(); int n = 0; foreach( Mobile m in World.allMobiles ) if ( m is Character ) { newMobs.Add( m ); } else n++; n += World.allSpawners.Count; LinkedSpawner = -1; World.allSpawners.Clear(); World.allMobiles = newMobs; Player.RefreshMobileList( true ); SendMessage( n.ToString() + " mobs/spawners removed !" ); } else if ( lower.StartsWith( ".nuke" ) ) { MobileList newMobs = new MobileList(); int n = 0; foreach( Mobile m in World.allMobiles ) if ( m is Character )//|| m is BaseSpawner ) { newMobs.Add( m ); } else n++; World.allSpawners.Clear(); World.allMobiles = newMobs; SendMessage( n.ToString() + " mobs removed !" ); } else if ( lower.StartsWith( ".set godmode on" ) ) { if ( selection != null && selection is Mobile ) { ( selection as Mobile ).GodMode = true; } else GodMode = true; } else if ( lower.StartsWith( ".set godmode off" ) ) { if ( selection != null && selection is Mobile ) { ( selection as Mobile ).GodMode = false; } else GodMode = false; } else if ( lower.StartsWith( ".set turbo on" ) ) { RunSpeed = 40f; this.ChangeRunSpeed( 40f ); } else if ( lower.StartsWith( ".set turbo off" ) ) { RunSpeed = 7f; this.ChangeRunSpeed( 7f ); /* int offset = 4; Converter.ToBytes( 1, tempBuff, ref offset ); Converter.ToBytes( (byte)0, tempBuff, ref offset ); WalkSpeed = 4.777f; RunSpeed = 7f; this.PrepareUpdateData( tempBuff, ref offset , UpdateType.UpdateFull, false ); this.Send( OpCodes.SMSG_UPDATE_OBJECT, tempBuff, offset );*/ } else if ( lower.StartsWith( ".guid" ) ) { if ( selection == null ) SendMessage( "Guid : " + Guid.ToString( "X16" ) ); else SendMessage( "Guid : " + selection.Guid.ToString( "X16" ) ); } else if ( lower.StartsWith( ".addspawner" ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 4 ) { ConstructorInfo ct = null; try { MobileSpawner bc = new MobileSpawner(); try { int mid = (int)Convert.ToInt32( tt[ 1 ] ); ct = World.MobilePool( mid ); } catch(Exception) { ct = Utility.FindConstructor( tt[ 1 ], Utility.externAsm[ "creatures" ] ); if ( ct == null ) ct = Utility.FindConstructor( tt[ 1 ] ); } BaseCreature b = (BaseCreature)ct.Invoke( null ); float rec = float.MaxValue; foreach( BaseSpawner bs in World.allSpawners ) { float xx = X - bs.X; float yy = Y - bs.Y; xx *= xx; yy *= yy; xx += xx; if ( xx < rec && bs.MapId == MapId ) { rec = xx; bc.ZoneId = bs.ZoneId; bc.MapId = bs.MapId; } } //MapPoint mp = World.mapZones.NearestPoint( bc.MapId, bc.ZoneId, X, Y ); bc.RealX = X; bc.RealY = Y; bc.RealZ = Z; bc.Model = b.Model; bc.Id = 99999999 - b.Id; bc.Orientation = Orientation; bc.Init( ct, b.Id, Convert.ToInt32( tt[ 3 ] ), Convert.ToInt32( tt[ 2 ] ) ); World.Add( bc, X, Y, Z, MapId ); if ( this.linkedSpawner == -1 )// No spawner near the player { } else { int num = World.allSpawners.Count - 1; ArrayList al = new ArrayList(); World.regSpawners[ num ] = al; for(int t = 0;t < num;t++ ) { BaseSpawner bs2 = World.allSpawners[ t ] as BaseSpawner; if ( bc.MapId != bs2.MapId ) continue; if ( bc.QuickDistance( bs2 ) < 150 * 150 ) al.Add( t ); } foreach( int i in al ) { ( World.regSpawners[ i ] as ArrayList ).Add( num ); } } bc.ForceRespawn(); Player.RefreshMobileList( true ); } catch( Exception ) { } } else SendMessage( "usage : .addspawner mobname amount frequency" ); } else if ( lower.StartsWith( ".set xp" ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 3 ) { Character c = selection as Character; if ( c == null ) c = this; try { uint a = Convert.ToUInt32( tt[ 2 ] ) - c.Exp; c.EarnXP( (int)a ); } catch( Exception ) { this.SendMessage( "usage : .set xp amount" ); } } } else if ( lower.StartsWith( ".debug" ) ) { if ( selection != null ) { if ( selection is BaseCreature ) { BaseCreature bc = selection as BaseCreature; if ( bc.DebugSniffer != null ) { bc.DebugSniffer = null; SendMessage( "Debug Off" ); return; } else { bc.DebugSniffer = this; SendMessage( "Debug On" ); } } } } #region TRAJETS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else if ( lower.StartsWith( ".hidepath" ) ) { ArrayList toRemove = new ArrayList(); foreach( GameObject go in World.allGameObjects ) if ( go.Id >= 621680 && go.Id <= 621683 ) toRemove.Add( go ); foreach( GameObject go in toRemove ) World.allGameObjects.Remove( go ); this.account.RefreshMobileList( true ); } else if ( lower.StartsWith( ".showpath" ) ) { foreach( Trajet tr in World.trajets ) { bool start = true; foreach( Coord c in tr ) { GameObject go; if ( Distance( c.x, c.y, c.z ) < 400 * 400 ) { if ( c is Intersection ) { go = World.Add( 621682, c.x, c.y, c.z, MapId ); } else { if ( start ) go = World.Add( 621681, c.x, c.y, c.z, MapId ); else go = World.Add( 621680, c.x, c.y, c.z, MapId ); } } start = false; } } this.account.RefreshMobileList( true ); } else if ( lower.StartsWith( ".delpath" ) ) { if ( startTrajetFlag != null ) DestroyObject( startTrajetFlag.Guid ); World.RemoveTrajet( path ); path.Clear(); path = null;//World.AllocateTrajet(); SendMessage( "Path is removed" ); } else if ( lower.StartsWith( ".startpath" ) ) { if ( selection is MobileSpawner ) { World.trajets.Dirty = true; if ( startTrajetFlag != null ) DestroyObject( startTrajetFlag.Guid ); path = World.AllocateTrajet(); ( selection as MobileSpawner ).TrajetGuid = path.Guid; startTrajetFlag = World.Add( 621681, X, Y, Z, MapId ); foreach( Object o in this.KnownObjects ) if ( o is BaseCreature ) { if ( ( o as BaseCreature ).SpawnerLink == selection ) { ( o as BaseCreature ).Freeze = true; } } //startTrajetFlag.Decay = DateTime.Now.Add( TimeSpan.FromMinutes( 15.0 ) ); SendMessage( "Start a new path for the spawner" ); } else SendMessage( "You must select a spawner before starting a new path" ); } else if ( lower.StartsWith( ".endpath" ) ) { if ( startTrajetFlag != null ) { World.Remove( startTrajetFlag, this ); } if ( path != null && path.Count > 1 ) { path[ 0 ].previous = path[ path.Count - 1 ]; path[ path.Count - 1 ].next = path[ 0 ]; } foreach( Object o in this.KnownObjects ) if ( o is BaseCreature ) { if ( ( o as BaseCreature ).SpawnerLink == selection ) { ( o as BaseCreature ).Freeze = true; } } path = null; SendMessage( "Path loop completed" ); } #endregion TRAJETS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else if ( lower.StartsWith( ".cast " ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( selection != null && selection is Mobile ) { try { int i = Convert.ToInt32( tt[ 1 ] ); ( selection as Mobile ).FakeCast( i, this ); } catch( Exception ) { SendMessage( "Invalid spell id !" ); } } else SendMessage( "You must target a mobile !" ); } else if ( lower.StartsWith( ".additem " ) ) { string []tt = cmd.Split( new char[]{ ' ' } ); if ( tt.Length == 3 ) { try { CreateAndAddObject( tt[ 1 ], Convert.ToInt32( tt[ 2 ] ) ); } catch( Exception ) { this.SendMessage( "usage : .additem ItemName [number]" ); } } else if ( tt.Length == 2 ) CreateAndAddObject( tt[ 1 ] ); else this.SendMessage( "usage : .additem ItemName [number]" ); } else if ( lower.StartsWith( ".addgo " ) ) { try { cmd = cmd.Remove( 0, 7 ); string []tt = cmd.Split( new char[]{ ' ' } ); int i = Convert.ToInt32( tt[ 0 ] ); if ( GameObjectDescription.all[ i ]== null ) { SendMessage( "Unknow Game object " + i.ToString() ); return; } GameObject go = null; if ( World.GameObjectsAssociated.Exist( i ) ) { go = World.Add( i, Utility.ClassName( World.GameObjectsAssociated[ i ].ToString() ), X, Y, Z, MapId ); go.Id = i; } else go = World.Add( i, X, Y, Z, MapId ); if ( this.linkedSpawner == -1 ) { SendMessage( "You cannot place a game object here, first place a spawner !" ); } else { World.allSpawners[ linkedSpawner ].Bind( go ); account.RefreshMobileList( true ); } } catch( Exception ) { } } else if ( lower.StartsWith( ".where" ) ) { SendMessage( "X = " + X.ToString() + ", Y = " + Y.ToString() + ", Z = " + Z.ToString() + " mapId = " + this.MapId.ToString() ); } else if ( lower == ".remove" ) { if ( selection != null ) { selection.Delete(); if ( selection.Guid > 0xF100000000000000 ) { World.allSpawners.Remove( selection as BaseSpawner ); SendMessage( "Spawnpoint deleted" ); this.linkedSpawner = -1; } else { World.allMobiles.Remove( selection as Mobile ); SendMessage( ( selection as Mobile ).Name + " deleted" ); } account.HeartBeat(); } } else if ( lower.StartsWith( ".addnpc " ) ) { //SendMessage( cmd ); string []cmds = cmd.Split( new char[]{ ' ' } ); if ( cmds.Length < 2 ) { SendMessage( "Usage : .addnpc NpcName [howmany]" ); return; } Factions fact = Factions.NoFaction; int n = 1; if ( cmds.Length == 3 ) { try { n = Convert.ToInt32( cmds[ 2 ] ); } catch(Exception) { } } if ( cmds.Length == 4 ) { try { fact = (Factions)Convert.ToInt32( cmds[ 3 ] ); } catch(Exception) { } } for(int t = 0;t < n;t++ ) { ConstructorInfo ct = null; try { int mid = (int)Convert.ToInt32( cmds[ 1 ] ); ct = World.MobilePool( mid ); } catch(Exception) { ct = Utility.FindConstructor( cmds[ 1 ] , Utility.externAsm[ "creatures" ] ); if ( ct == null ) ct = Utility.FindConstructor( cmds[ 1 ] ); } if ( ct == null ) { SendMessage( cmds[ 1 ] + " is not a valid Npc !!!" ); return; } BaseCreature bc = null; try { bc = (BaseCreature)ct.Invoke( null ); } catch( Exception e ) { // Console.WriteLine( "{0}\n{1}\n{2}\n", e.Message, e.Source, e.StackTrace ); SendMessage( e.Message ); SendMessage( e.Source ); SendMessage( e.StackTrace ); return; } bc.X = X; bc.Y = Y; bc.Z = Z; bc.ZoneId = ZoneId; bc.MapId = MapId; bc.InitStats(); float nearest = float.MaxValue; BaseSpawner nearSpawner = null; foreach( BaseSpawner bs in World.allSpawners ) if ( bs.Distance( this ) < nearest ) { nearest = bs.Distance( this ); nearSpawner = bs; } if ( nearSpawner != null ) nearSpawner.Bind( bc ); World.allMobiles.Add( bc, true ); if ( fact != Factions.NoFaction ) bc.Faction = fact; Player.RefreshMobileList( true ); } } else if ( lower.StartsWith( ".move" ) ) { byte []b4 = new byte[] {0x00, 0x31, 0x96, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x32, 0x36, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x20, 0x6F, 0x66, 0x20, 0x57, 0x61, 0x72, 0x63, 0x72, 0x61, 0x66, 0x74, 0x00, 0x00}; int offset = 9; Converter.ToBytes( Guid, b4, ref offset ); Player.Handler.Send( 0x96, b4 ); foreach( Mobile m in World.allMobiles ) if ( !( m is Character ) ) m.MovementHeartBeat( account.Handler, this ); } else if ( lower.StartsWith( ".save" ) ) { MainConsole.world.SaveGame(); } else if ( lower.StartsWith( ".load" ) ) { } else /* if (lower.StartsWith( ".stest" )) { ConstructorInfo ct1 = Utility.FindConstructor( "RazorHillGrunt" , Utility.externAsm ); for(int i = 0;i < 400;i+=30 ) for(int t = i;t < i + 30;t++ ) { BaseCreature bc = (BaseCreature)ct1.Invoke( null ); bc.Faction = (Factions)t; bc.Name = "Faction " + t.ToString(); bc.Id = t + 65000; World.Add( bc, -13234f + (float)( t / 30 ) * 2, 238f+ (float)( t % 30 ) * 2, 22f, 0 ); bc.Freeze = true; } } else*/ if ( lower.StartsWith( ".mark" ) ) { mark = new Position( X, Y, Z, MapId ); SendMessage( "Mark at " + X.ToString() + ", " + Y.ToString() + ", " + Z.ToString() + ", " + MapId.ToString() ); } else if ( lower.StartsWith( ".recall" ) ) { if ( mark == null ) SendMessage( "You must mark a location first !" ); else Teleport( mark.X, mark.Y, mark.Z, mark.MapId ); } else if ( lower.StartsWith( ".go " ) ) { cmd = cmd.Remove( 0, 4 ); string []val = cmd.Split( new char[]{' '} ); if ( !( val.Length != 4 || val.Length != 2 ) ) { SendMessage( "Need at 1 or 4 parameters !" ); SendMessage( "usage : .go X Y Z MapId or .go Location" ); return; } if ( val.Length == 1 && World.Locations[ val[ 0 ] ] == null ) { SendMessage( val[ 0 ] + " is an unknown location" ); return; } if ( val.Length == 1 ) { Position pos = (Position)World.Locations[ val[ 0 ] ]; Teleport( pos.X, pos.Y, pos.Z, pos.MapId ); } else Teleport( Convert.ToSingle( val[ 0 ] ), Convert.ToSingle( val[ 1 ] ), Convert.ToSingle( val[ 2 ] ), Convert.ToInt32( val[ 3 ] ) ); } else if ( onCommand != null && !onCommand( this, cmd ) ) return; else SendMessage( "Unknown command !" ); } }
public CarpetPart( int itemID, Position info ) { m_ItemID = itemID; m_Info = info; }
public CarpetPart GetCarpetPart( Position pos ) { int i = (int)pos; if ( i < 0 || i >= m_Entries.Length ) i = 0; return m_Entries[i]; }
public ItemPart( int itemID, Position info, int offsetX, int offsetY ) { m_ItemID = itemID; m_Info = info; m_OffsetX = offsetX; m_OffsetY = offsetY; }
public void RefreshMobileListOld( bool force ) { if ( selectedChar == null ) return; ArrayList ko = new ArrayList(); ko.Add( selectedChar ); toSendFirstTime.Clear(); ArrayList myZone = World.allMobiles.GetContinent( selectedChar.MapId ); if ( ( !force && lastRefreshPos.QuickDistance( selectedChar ) < 150 * 150 ) ) { return; } // Console.WriteLine("RefreshMobileList5"); slowSpawnDelay++; lastRefreshPos = new Position( selectedChar.X, selectedChar.Y, selectedChar.Z, selectedChar.MapId ); //Console.WriteLine("RefreshMobileList6"); if ( this.accessLevel != AccessLevels.PlayerLevel ) { // Console.WriteLine("RefreshMobileList7"); int zone = 0; if ( World.zones[ selectedChar.ZoneId ] != null ) { zone = (int)World.zones[ selectedChar.ZoneId ]; } ArrayList sl = World.allSpawners.Nearest( selectedChar.MapId * 1024 + zone ); if ( sl != null ) { #if DEBUG selectedChar.SendMessage( "RefreshMobileList " + sl.Count.ToString() + "; " + selectedChar.ZoneId.ToString() + "; " + zone.ToString() ); #endif foreach( BaseSpawner m in sl ) { /* if ( m.Guid == 0xF10000000026A059 ) { selectedChar.SendMessage( "Dist : " + selectedChar.Distance( m ).ToString() ); }*/ float dist = selectedChar.Distance( m ); /* if ( dist < 50 * 50 ) { m.StillActive( selectedChar, false ); if ( knownObject.Contains( m ) ) ko.Add( m ); else {// l'objet n'est pas connu du client toSendFirstTime.Add( m ); } } else*/ if ( dist < 300 * 300 ) { m.StillActive( selectedChar ); if ( knownObject.Contains( m ) ) ko.Add( m ); else {// l'objet n'est pas connu du client toSendFirstTime.Add( m ); } } } } #if DEBUG else selectedChar.SendMessage("No spawn here ! " + zone.ToString() ); #endif } else { int zone = 0; if ( World.zones[ selectedChar.ZoneId ] != null ) { zone = (int)World.zones[ selectedChar.ZoneId ]; } ArrayList sl = World.allSpawners.Nearest( selectedChar.MapId * 1024 + zone ); if ( sl != null ) foreach( BaseSpawner m in sl ) if ( selectedChar.Distance( m ) < 300 * 300 ) m.StillActive( selectedChar ); } if ( myZone != null ) { foreach( Mobile m in myZone ) { if ( selectedChar.CanSee( m ) )//selectedChar.Distance( m ) < 300 * 300 * 2 ) { if ( m is BaseCreature ) ( m as BaseCreature ).StillActive( selectedChar ); { if ( knownObject.Contains( m ) ) ko.Add( m ); else {// l'objet n'est pas connu du client if ( !justLogged || m is Character ) toSendFirstTime.Add( m ); if ( m is Character && m != selectedChar ) playersNear.Add( m ); } } } } } if ( !justLogged ) { foreach( GameObject go in World.allGameObjects ) { if ( go.SeenBy( selectedChar ) ) { if ( knownObject.Contains( go ) ) ko.Add( go ); else {// l'objet n'est pas connu du client toSendFirstTime.Add( go ); } } } } foreach( Object m in knownObject ) { if ( /*m != selectedChar && */!ko.Contains( m ) ) {// l'objet n'est plus dans la zone du joueur selectedChar.DestroyObject( m.Guid ); if ( m is Character ) playersNear.Remove( m ); } } knownObject = ko; if ( justLogged ) { selectedChar.FullUpdate( toSendFirstTime ); foreach( Object m in toSendFirstTime ) if ( m is Character && m != selectedChar ) ( m as Character ).ItemsUpdateForOther( this ); selectedChar.ItemsUpdate(); if ( selectedChar.Summon != null ) selectedChar.SendPetActionBar(); } else { selectedChar.PartialUpdate( toSendFirstTime ); foreach( Object m in toSendFirstTime ) if ( m is Character && m != selectedChar ) ( m as Character ).ItemsUpdateForOther( this ); } //Console.WriteLine("RefreshMobileList23"); knownObject.AddRange( toSendFirstTime ); toSendFirstTime.Clear(); // all = DateTime.Now.Subtract( optim ); // World.localTime[ 3 ] = all.Ticks; if ( justLogged ) { // Console.WriteLine("RefreshMobileList24"); justLogged = false; RefreshMobileList( true ); // Console.WriteLine("RefreshMobileList25"); } #if DEBUG selectedChar.SendMessage( "K : " + knownObject.Count.ToString() ); #endif //Console.WriteLine("RefreshMobileList26"); }
public void RefreshMobileList( bool force ) { if ( selectedChar == null ) return; if ( !force ) { if ( lastRefreshPos.QuickDistance( selectedChar as Mobile ) < 10 * 10 ) return; lastRefreshPos = new Position( selectedChar.X, selectedChar.Y, selectedChar.Z, selectedChar.MapId ); } ArrayList ko = new ArrayList(); ko.Add( selectedChar ); toSendFirstTime.Clear(); if ( selectedChar.Summon != null ) { ko.Add( selectedChar.Summon ); if ( !knownObject.Contains( selectedChar.Summon ) ) toSendFirstTime.Add( selectedChar.Summon ); } foreach( Character ch in World.allConnectedChars ) { if ( knownObject.Contains( ch ) ) { ko.Add( ch ); if ( ch.Summon != null ) ko.Add( ch.Summon ); } else if ( ch.Distance( selectedChar ) < 150 * 150 ) {// l'objet n'est pas connu du client toSendFirstTime.Add( ch ); if ( ch.Summon != null ) toSendFirstTime.Add( ch.Summon ); if ( ch != selectedChar ) playersNear.Add( ch ); } } if ( selectedChar.LinkedSpawner == -1 || selectedChar.QuickDistance( World.allSpawners[ selectedChar.LinkedSpawner ] as BaseSpawner ) > 75 * 75 ) { int dist = int.MaxValue; int m = selectedChar.MapId; for( int t = 0;t < World.allSpawners.Count;t++ ) { BaseSpawner bs = World.allSpawners[ t ] as BaseSpawner; if ( bs.MapId != m ) continue; int odist = bs.QuickDistance( selectedChar ); if ( odist < dist ) { dist = odist; selectedChar.LinkedSpawner = t; } } } if ( selectedChar.LinkedSpawner != -1 ) { ArrayList al = World.regSpawners[ selectedChar.LinkedSpawner ] as ArrayList; if ( al != null ) { int bestt = selectedChar.LinkedSpawner; BaseSpawner best = World.allSpawners[ bestt ] as BaseSpawner; int dist = best.QuickDistance( selectedChar ); //selectedChar.SendMessage( "On " + al.Count.ToString() ); for(int t = -1;t < al.Count;t++ ) { BaseSpawner bs = best; if ( t >= 0 ) { int ind = (int)al[ t ]; if ( ind >= 0 ) { bs = (BaseSpawner)World.allSpawners[ ind ]; int d = bs.QuickDistance( selectedChar ); if ( d < dist ) { d = dist; bestt = (int)al[ t ]; } } } bs.StillActive( selectedChar ); if ( this.accessLevel != AccessLevels.PlayerLevel ) { if ( knownObject.Contains( bs ) ) ko.Add( bs ); else {// l'objet n'est pas connu du client toSendFirstTime.Add( bs ); } } foreach( Object m in bs.Objects ) { if ( selectedChar.CanSee( m ) )//selectedChar.Distance( m ) < 300 * 300 * 2 ) { if ( m is BaseCreature ) ( m as BaseCreature ).StillActive( selectedChar ); { if ( knownObject.Contains( m ) ) { ko.Add( m ); } else {// l'objet n'est pas connu du client toSendFirstTime.Add( m ); } } } } } selectedChar.LinkedSpawner = bestt; } } foreach( Object m in knownObject ) { if ( /*m != selectedChar && */!ko.Contains( m ) ) {// l'objet n'est plus dans la zone du joueur selectedChar.DestroyObject( m.Guid ); if ( m is Character ) playersNear.Remove( m ); } } knownObject = ko; if ( justLogged ) { selectedChar.FullUpdate( toSendFirstTime ); foreach( Object m in toSendFirstTime ) if ( m is Character && m != selectedChar ) ( m as Character ).ItemsUpdateForOther( this ); selectedChar.ItemsUpdate(); if ( selectedChar.Summon != null ) selectedChar.SendPetActionBar(); } else { selectedChar.PartialUpdate( toSendFirstTime ); foreach( Object m in toSendFirstTime ) if ( m is Character && m != selectedChar ) ( m as Character ).ItemsUpdateForOther( this ); } knownObject.AddRange( toSendFirstTime ); toSendFirstTime.Clear(); /* #if DEBUG selectedChar.SendMessage( "K : " + knownObject.Count.ToString() ); #endif */ }