public void CreateCharacterNew( GameClient state, PacketReader pvSrc ) { /*int unk1 = */ pvSrc.ReadInt32(); /*int unk2 = */ pvSrc.ReadInt32(); /*int unk3 = */ pvSrc.ReadByte(); string name = pvSrc.ReadString( 30 ); pvSrc.Seek( 2, SeekOrigin.Current ); int flags = pvSrc.ReadInt32(); pvSrc.Seek( 8, SeekOrigin.Current ); int prof = pvSrc.ReadByte(); pvSrc.Seek( 15, SeekOrigin.Current ); int genderRace = pvSrc.ReadByte(); int str = pvSrc.ReadByte(); int dex = pvSrc.ReadByte(); int intl = pvSrc.ReadByte(); int is1 = pvSrc.ReadByte(); int vs1 = pvSrc.ReadByte(); int is2 = pvSrc.ReadByte(); int vs2 = pvSrc.ReadByte(); int is3 = pvSrc.ReadByte(); int vs3 = pvSrc.ReadByte(); int is4 = pvSrc.ReadByte(); int vs4 = pvSrc.ReadByte(); int hue = pvSrc.ReadUInt16(); int hairVal = pvSrc.ReadInt16(); int hairHue = pvSrc.ReadInt16(); int hairValf = pvSrc.ReadInt16(); int hairHuef = pvSrc.ReadInt16(); pvSrc.ReadByte(); int cityIndex = pvSrc.ReadByte(); /*int charSlot = */ pvSrc.ReadInt32(); uint clientIP = pvSrc.ReadUInt32(); int shirtHue = pvSrc.ReadInt16(); int pantsHue = pvSrc.ReadInt16(); /* 0x00, 0x01 0x02, 0x03 -> Human Male, Human Female 0x04, 0x05 -> Elf Male, Elf Female 0x05, 0x06 -> Gargoyle Male, Gargoyle Female */ bool female = ( ( genderRace % 2 ) != 0 ); Race race = null; byte raceId = (byte) ( genderRace < 4 ? 0 : ( ( genderRace / 2 ) - 1 ) ); race = Race.Races[raceId]; if ( race == null ) race = Race.DefaultRace; clientIP = (uint) IPAddress.NetworkToHostOrder( (int) clientIP ); state.ClientAddress = new IPAddress( (long) clientIP ); CityInfo[] info = state.CityInfo; IAccount a = state.Account; if ( Utility.IsUsingMulticlient( state, Environment.Config.Login.MaxLoginsPerPC ) ) { Console.WriteLine( "Login: {0}: Multiclient detected, disconnecting...", state ); state.Send( new PopupMessage( PMMessage.LoginSyncError ) ); state.Dispose(); return; } if ( info == null || a == null || cityIndex < 0 || cityIndex >= info.Length ) { state.Dispose(); } else { // Check if anyone is using this account for ( int i = 0; i < a.Length; ++i ) { Mobile check = a[i]; if ( check != null && check.Map != Map.Internal ) { Console.WriteLine( "Login: {0}: Account in use", state ); state.Send( new PopupMessage( PMMessage.CharInWorld ) ); return; } } state.Flags = flags; CreateCharRequestEventArgs args = new CreateCharRequestEventArgs( state, a, name, female, hue, str, dex, intl, info[cityIndex], new SkillNameValue[4] { new SkillNameValue( (SkillName)is1, vs1 ), new SkillNameValue( (SkillName)is2, vs2 ), new SkillNameValue( (SkillName)is3, vs3 ), new SkillNameValue( (SkillName)is4, vs4 ), }, shirtHue, pantsHue, hairVal, hairHue, hairValf, hairHuef, prof, race ); state.BlockAllPackets = true; try { EventSink.Instance.InvokeCreateCharRequest( args ); } catch ( Exception ex ) { Logger.Error( "Exception disarmed in CreateCharRequest {0}: {1}", name, ex ); } Mobile m = args.Mobile; if ( m != null ) { state.Mobile = m; m.Client = state; state.BlockAllPackets = false; try { EventSink.Instance.InvokeCharacterCreated( new CharacterCreatedEventArgs( m ) ); } catch ( Exception ex ) { Logger.Error( "Exception disarmed in CharacterCreated {0}: {1}", m, ex ); } DoLogin( state, m ); } else { state.BlockAllPackets = false; state.Dispose(); } } }
public static void PlayCharacter( NetState state, PacketReader pvSrc ) { pvSrc.ReadInt32(); // 0xEDEDEDED string name = pvSrc.ReadString( 30 ); pvSrc.Seek( 2, SeekOrigin.Current ); int flags = pvSrc.ReadInt32(); if ( FeatureProtection.DisabledFeatures != 0 && ThirdPartyAuthCallback != null ) { bool authOK = false; ulong razorFeatures = (((ulong)pvSrc.ReadUInt32())<<32) | ((ulong)pvSrc.ReadUInt32()); if ( razorFeatures == (ulong)FeatureProtection.DisabledFeatures ) { bool match = true; for ( int i=0; match && i < m_ThirdPartyAuthKey.Length; i++ ) match = match && pvSrc.ReadByte() == m_ThirdPartyAuthKey[i]; if ( match ) authOK = true; } else { pvSrc.Seek( 16, SeekOrigin.Current ); } ThirdPartyAuthCallback( state, authOK ); } else { pvSrc.Seek( 24, SeekOrigin.Current ); } if ( ThirdPartyHackedCallback != null ) { pvSrc.Seek( -2, SeekOrigin.Current ); if ( pvSrc.ReadUInt16() == 0xDEAD ) ThirdPartyHackedCallback( state, true ); } if ( !state.Running ) return; int charSlot = pvSrc.ReadInt32(); int clientIP = pvSrc.ReadInt32(); IAccount a = state.Account; if ( a == null || charSlot < 0 || charSlot >= a.Length ) { state.Dispose(); } else { Mobile m = a[charSlot]; // Check if anyone is using this account for ( int i = 0; i < a.Length; ++i ) { Mobile check = a[i]; if ( check != null && check.Map != Map.Internal && check != m ) { Console.WriteLine( "Login: {0}: Account in use", state ); state.Send( new PopupMessage( PMMessage.CharInWorld ) ); return; } } if ( m == null ) { state.Dispose(); } else { if ( m.NetState != null ) m.NetState.Dispose(); NetState.ProcessDisposedQueue(); state.Send( new ClientVersionReq() ); state.BlockAllPackets = true; state.Flags = (ClientFlags)flags; state.Mobile = m; m.NetState = state; new LoginTimer( state, m ).Start(); } } }
public void PlayCharacter( GameClient state, PacketReader pvSrc ) { pvSrc.ReadInt32(); // 0xEDEDEDED /*string name = */ pvSrc.ReadString( 30 ); pvSrc.Seek( 2, SeekOrigin.Current ); int flags = pvSrc.ReadInt32(); pvSrc.Seek( 24, SeekOrigin.Current ); int charSlot = pvSrc.ReadInt32(); uint clientIP = pvSrc.ReadUInt32(); clientIP = (uint) IPAddress.NetworkToHostOrder( (int) clientIP ); state.ClientAddress = new IPAddress( (long) clientIP ); IAccount a = state.Account; if ( Utility.IsUsingMulticlient( state, Environment.Config.Login.MaxLoginsPerPC ) ) { Console.WriteLine( "Login: {0}: Multiclient detected, disconnecting...", state ); state.Send( new PopupMessage( PMMessage.LoginSyncError ) ); state.Dispose(); return; } if ( a == null || charSlot < 0 || charSlot >= a.Length ) { state.Dispose(); } else { Mobile m = a[charSlot]; // Check if anyone is using this account for ( int i = 0; i < a.Length; ++i ) { Mobile check = a[i]; if ( check != null && check.Map != Map.Internal && check != m ) { Console.WriteLine( "Login: {0}: Account in use", state ); state.Send( new PopupMessage( PMMessage.CharInWorld ) ); return; } } if ( m == null ) { state.Dispose(); } else { if ( m.Client != null ) m.Client.Dispose(); GameServer.Instance.ProcessDisposedQueue(); state.BlockAllPackets = true; state.Flags = flags; state.Mobile = m; m.Client = state; state.BlockAllPackets = false; DoLogin( state, m ); } } }