/// <summary> /// </summary> /// <param name="charID"> /// </param> /// <param name="client"> /// </param> public void Read(int charID, ZoneClient client) { // Don't edit anything in this region // unless you are 300% sure you know what you're doing // Character is created and read when Client connects in Client.cs->CreateCharacter // client.CreateCharacter(charID); client.Server.Info( client, "Client connected. ID: {0} IP: {1} Character name: {2}", client.Character.Identity.Instance, client.ClientAddress, client.Character.Name); // now we have to start sending packets like // character stats, inventory, playfield info // and so on. I will put some packets here just // to get us in game. We have to start moving // these packets somewhere else and make packet // builders instead of sending (half) hardcoded // packets. /* send chat server info to client */ ChatServerInfo.Send(client); /* send playfield info to client */ PlayfieldAnarchyF.Send(client); var sendSCFUs = new IMSendPlayerSCFUs { toClient = client }; ((Playfield)client.Playfield).SendSCFUsToClient(sendSCFUs); /* set SocialStatus to 0 */ client.Character.Stats[521].BaseValue = 0; // Stat.SendDirect(client, 521, 0, false); var identity = new Identity { Type = IdentityType.CanbeAffected, Instance = charID }; /* Action 167 Animation and Stance Data maybe? */ var message = new CharacterActionMessage { Identity = identity, Action = CharacterActionType.ChangeAnimationAndStance, Target = Identity.None, Parameter1 = 0x00000000, Parameter2 = 0x00000001 }; client.SendCompressed(message); var gameTimeMessage = new GameTimeMessage { Identity = identity, Unknown1 = 30024.0f, Unknown3 = 185408, Unknown4 = 80183.3125f }; client.SendCompressed(gameTimeMessage); /* set SocialStatus to 0 */ // Stat.SendDirect(client, 521, 0, false); /* again */ // Stat.SendDirect(client, 521, 0, false); /* visual */ SimpleCharFullUpdate.SendToPlayfield(client); /* inventory, items and all that */ FullCharacter.Send(client); var specials = new[] { new SpecialAttackInfo { Unknown1 = 0x0000AAC0, Unknown2 = 0x00023569, Unknown3 = 0x00000064, Unknown4 = "MAAT" }, new SpecialAttackInfo { Unknown1 = 0x0000A431, Unknown2 = 0x0000A430, Unknown3 = 0x00000090, Unknown4 = "DIIT" }, new SpecialAttackInfo { Unknown1 = 0x00011294, Unknown2 = 0x00011295, Unknown3 = 0x0000008E, Unknown4 = "BRAW" } }; var specialAttackWeaponMessage = new SpecialAttackWeaponMessage { Identity = identity, Specials = specials }; client.SendCompressed(specialAttackWeaponMessage); // done // Timers are allowed to update client stats now. client.Character.DoNotDoTimers = false; // spawn all active monsters to client // TODO: Implement NonPlayerCharacterHandler // NonPlayerCharacterHandler.SpawnMonstersInPlayfieldToClient(client, client.Character.PlayField); // TODO: Implement VendorHandler // if (VendorHandler.GetNumberofVendorsinPlayfield(client.Character.PlayField) > 0) // { // Shops // VendorHandler.GetVendorsInPF(client); // } // WeaponItemFullCharUpdate Maybe the right location , First Check if weapons present usually in equipment // Packets.WeaponItemFullUpdate.Send(client, client.Character); // TODO: create a better alternative to ProcessTimers // client.Character.ProcessTimers(DateTime.Now + TimeSpan.FromMilliseconds(200)); client.Character.CalculateSkills(); AppearanceUpdate.AnnounceAppearanceUpdate((Character)client.Character); // done, so we call a hook. // Call all OnConnect script Methods Program.csc.CallMethod("OnConnect", (Character)client.Character); }
/// <summary> /// /// </summary> /// <param name="packet"></param> /// <param name="client"></param> public void Read(byte[] packet, Client client) { // Don't edit anything in this region // unless you are 300% sure you know what you're doing #region Do not edit MemoryStream memoryStream = new MemoryStream(packet); BinaryReader binaryReader = new BinaryReader(memoryStream); memoryStream.Position = 20; // we get character ID of a client and store // it in this ClientBase so we can use it later int charID = IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); binaryReader.Close(); memoryStream.Dispose(); client.Character = new Character(charID, 0); client.Character.Client = client; client.Character.ReadNames(); client.Server.Info( client, "Client connected. ID: {0} IP: {1}", client.Character.Id, client.TcpIP + " Character name: " + client.Character.Name); // now we have to start sending packets like // character stats, inventory, playfield info // and so on. I will put some packets here just // to get us in game. We have to start moving // these packets somewhere else and make packet // builders instead of sending (half) hardcoded // packets. // lets get char ID as byte array byte[] chrID = new[] { packet[20], packet[21], packet[22], packet[23] }; /* send chat server info to client */ ChatServerInfo.Send(client); /* send playfield info to client */ PlayfieldAnarchyF.Send(client); /* set SocialStatus to 0 */ client.Character.Stats.SetBaseValue(521, 0); Stat.Send(client, 521, 0, false); /* Action 167 Animation and Stance Data maybe? */ byte[] tempBytes = new byte[] { 0xDF, 0xDF, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x0c, 0x0e, chrID[0], chrID[1], chrID[2], chrID[3], 0x5E, 0x47, 0x77, 0x70, // CharacterAction 0x00, 0x00, 0xC3, 0x50, chrID[0], chrID[1], chrID[2], chrID[3], 0x00, 0x00, 0x00, 0x00, 0xA7, // 167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x01, 0x00, 0x00 }; client.SendCompressed(tempBytes); tempBytes = new byte[] { // current in game time 0xDF, 0xDF, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x2D, 0x00, 0x00, 0x0c, 0x0e, chrID[0], chrID[1], chrID[2], chrID[3], 0x5F, 0x52, 0x41, 0x2E, // GameTime 0x00, 0x00, 0xC3, 0x50, chrID[0], chrID[1], chrID[2], chrID[3], 0x01, 0x46, 0xEA, 0x90, 0x00, // 30024.0 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD4, 0x40, // 185408 0x47, 0x9C, 0x9B, 0xA8 // 80183.3125 }; client.SendCompressed(tempBytes); /* set SocialStatus to 0 */ Stat.Set(client, 521, 0, false); /* again */ Stat.Set(client, 521, 0, false); /* visual */ SimpleCharFullUpdate.SendToPlayfield(client); /* inventory, items and all that */ FullCharacter.Send(client); tempBytes = new byte[] { // this packet gives you (or anyone else) // special attacks like brawl, fling shot and so 0xDF, 0xDF, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x65, 0x00, 0x00, 0x0c, 0x0e, chrID[0], chrID[1], chrID[2], chrID[3], 0x1D, 0x3C, 0x0F, 0x1C, // SpecialAttackWeapon 0x00, 0x00, 0xC3, 0x50, chrID[0], chrID[1], chrID[2], chrID[3], 0x01, 0x00, 0x00, 0x0F, 0xC4, // (4036/1009)-1 = 3 special attacks 0x00, 0x00, 0xAA, 0xC0, // 43712 0x00, 0x02, 0x35, 0x69, // 144745 0x00, 0x00, 0x00, 0x64, // 100 0x4D, 0x41, 0x41, 0x54, // "MAAT" 0x00, 0x00, 0xA4, 0x31, // 42033 0x00, 0x00, 0xA4, 0x30, // 42032 0x00, 0x00, 0x00, 0x90, // 144 0x44, 0x49, 0x49, 0x54, // "DIIT" 0x00, 0x01, 0x12, 0x94, // 70292 0x00, 0x01, 0x12, 0x95, // 70293 0x00, 0x00, 0x00, 0x8E, // 142 0x42, 0x52, 0x41, 0x57, // "BRAW" 0x00, 0x00, 0x00, 0x07, // 7 0x00, 0x00, 0x00, 0x07, // 7 0x00, 0x00, 0x00, 0x07, // 7 0x00, 0x00, 0x00, 0x0E, // 14 0x00, 0x00, 0x00, 0x64 // 100 }; client.SendCompressed(tempBytes); // done #endregion // Timers are allowed to update client stats now. client.Character.DoNotDoTimers = false; // spawn all active monsters to client NonPlayerCharacterHandler.SpawnMonstersInPlayfieldToClient(client, client.Character.PlayField); if (VendorHandler.GetNumberofVendorsinPlayfield(client.Character.PlayField) > 0) { /* Shops */ VendorHandler.GetVendorsInPF(client); } // WeaponItemFullCharUpdate Maybe the right location , First Check if weapons present usually in equipment //Packets.WeaponItemFullUpdate.Send(client, client.Character); client.Character.ProcessTimers(DateTime.Now + TimeSpan.FromMilliseconds(200)); client.Character.CalculateSkills(); AppearanceUpdate.AnnounceAppearanceUpdate(client.Character); // done, so we call a hook. // Call all OnConnect script Methods Program.csc.CallMethod("OnConnect", client.Character); }