public static void F_INTERACT(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; if (cclient.Plr == null || !cclient.Plr.IsInWorld()) return; Log.Dump("F_INTERACT", packet.ToArray(), 0, packet.ToArray().Length); InteractMenu Menu = new InteractMenu(); Menu.Unk = packet.GetUint16(); Menu.Oid = packet.GetUint16(); Menu.Menu = packet.GetUint16(); Menu.Page = packet.GetUint8(); Menu.Num = packet.GetUint8(); Menu.SellCount = packet.GetUint16(); Menu.Count = packet.GetUint16(); Object Obj = cclient.Plr.Region.GetObject(Menu.Oid); if (Obj == null) return; if (Obj.GetDistanceTo(cclient.Plr) > 20) { Log.Error("F_INTERACT", "Distance = " + Obj.GetDistanceTo(cclient.Plr)); return; } Obj.SendInteract(cclient.Plr, Menu); }
public void HandlePacket(BaseClient client, PacketIn Packet) { Log.Dump("packethandle", Packet.ToArray(), 0, Packet.ToArray().Length); if (client == null || Packet == null) { Log.Error("TCPManager", "Packet || Client == null"); return; } PacketFunction packetHandler = null; if (Packet.Opcode < (ulong)m_packetHandlers.Length) { packetHandler = m_packetHandlers[Packet.Opcode]; } else if (!Errors.Contains(Packet.Opcode)) { Errors.Add(Packet.Opcode); Log.Error("TCPManager", "Can not handle :" + Packet.Opcode + "(" + Packet.Opcode.ToString("X8") + ")"); } if (packetHandler != null) { PacketHandlerAttribute[] packethandlerattribs = (PacketHandlerAttribute[])packetHandler.GetType().GetCustomAttributes(typeof(PacketHandlerAttribute), true); if (packethandlerattribs.Length > 0) { if (packethandlerattribs[0].State > client.State) { Log.Error("TCPManager", "Can not handle packet (" + Packet.Opcode.ToString("X8") + "), Invalid client state (" + client.GetIp + ")"); return; } } try { packetHandler.Invoke(client, Packet); } catch (Exception e) { Log.Error("TCPManager", "Packet handler error :" + Packet.Opcode + " " + e.ToString()); } } else if (!Errors.Contains(Packet.Opcode)) { Errors.Add(Packet.Opcode); Log.Error("TCPManager", "Can not Handle opcode :" + Packet.Opcode + "(" + Packet.Opcode.ToString("X8") + ")"); } }
public PacketIn DeCrypt(PacketIn packet) { if (m_crypts.Count <= 0) { return(packet); } ulong opcode = packet.Opcode; ulong size = packet.Size; long StartPos = packet.Position; foreach (KeyValuePair <ICryptHandler, CryptKey[]> Entry in m_crypts) { try { Log.Debug("Decrypt", "Decrypt with " + Entry.Key + ",Size=" + packet.Size); byte[] Buf = new byte[size]; long Pos = packet.Position; packet.Read(Buf, 0, (int)Buf.Length); packet.Position = Pos; PacketIn Pack = Entry.Key.Decrypt(Entry.Value[1], Buf); packet.Write(Pack.ToArray(), 0, Pack.ToArray().Length); packet.Opcode = opcode; packet.Size = size; } catch (Exception e) { Log.Error("BaseClient", "Decrypt Error : " + e.ToString()); continue; } } Log.Tcp("Decrypt", packet.ToArray(), 0, packet.ToArray().Length); packet.Position = StartPos; return(packet); }
static public void CMSG_AuthSessionTokenReq(BaseClient client, PacketIn packet) { Client cclient = client as Client; PacketOut Out = new PacketOut((byte)Opcodes.SMSG_AuthSessionTokenReply); AuthSessionTokenReq.Builder authReq = AuthSessionTokenReq.CreateBuilder(); authReq.MergeFrom(packet.ToArray()); string session = Encoding.ASCII.GetString(authReq.SessionToken.ToByteArray()); // Log.Debug("AuthSession", "session " + session); cclient.Username = ""; //username is not important anymore in 1.4.8 cclient.Token = session; AuthSessionTokenReply.Builder authReply = AuthSessionTokenReply.CreateBuilder(); authReply.SetResultCode(AuthSessionTokenReply.Types.ResultCode.RES_SUCCESS); Out.Write(authReply.Build().ToByteArray()); cclient.SendTCPCuted(Out); /* //TODO: need auth check if (Result != AuthResult.AUTH_SUCCESS) cclient.Disconnect(); else { cclient.Username = Username; cclient.Token = Token; }*/ }
public void HandlePacket(BaseClient client, PacketIn packet) { //#if DEBUG Log.Info("HandlePacket", $"Packet : {packet.Opcode} ({packet.Opcode.ToString("X8")})"); Log.Dump("HandlePacket", packet.ToArray(), 0, packet.ToArray().Length); //#endif if (client == null) { Log.Error("TCPManager", "Client == null"); return; } PacketFunction packetHandler = null; if (packet.Opcode < (ulong)m_packetHandlers.Length) { packetHandler = m_packetHandlers[packet.Opcode]; } else if (!Errors.Contains(packet.Opcode)) { Errors.Add(packet.Opcode); Log.Error("TCPManager", $"Can not handle :{packet.Opcode} ({packet.Opcode.ToString("X8")})"); } if (packetHandler != null) { /* * * The reflection code below seems to have been used to verify the client was in the correct state before the packet was handled. * However, it didn't actually work; eliminating the reflection and using an array implementation broke the emu and testing confirmed * the original check was broken, so I've eliminated it for now. * * * if (stateRequirement[packet.Opcode] > client.State) * { * Log.Error("TCPManager", $"Can not handle packet ({packet.Opcode.ToString("X8")}), Invalid client state {client.State} (expected {stateRequirement[packet.Opcode]}) ({client.GetIp()})"); * PacketHandlerAttribute[] packethandlerattribs = (PacketHandlerAttribute[])packetHandler.GetType().GetCustomAttributes(typeof(PacketHandlerAttribute), true); * if (packethandlerattribs.Length > 0) * { * Log.Error("TCPManager", $"Old code provided state {packethandlerattribs[0].State}"); * if (packethandlerattribs[0].State > client.State) * return; * } * else * { * Log.Error("TCPManager", "Old code was stateless"); * } * } */ try { packetHandler.Invoke(client, packet); } catch (Exception e) { Log.Error("TCPManager", $"Packet handler error :{packet.Opcode} {e}"); } } else if (!Errors.Contains(packet.Opcode)) { Errors.Add(packet.Opcode); Log.Error("TCPManager", $"Can not Handle opcode :{packet.Opcode} ({packet.Opcode.ToString("X8")})"); } }
public static void F_PLAYER_STATE2(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; if (cclient.Plr == null || !cclient.Plr.IsInWorld()) return; Player Plr = cclient.Plr; long Pos = packet.Position; PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2); Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size); Out.WriteByte(0); Plr.DispatchPacket(Out, false); packet.Position = Pos; UInt16 Key = packet.GetUint16(); byte Type = packet.GetUint8(); byte MoveingState = packet.GetUint8(); byte CombatByte = packet.GetUint8(); byte Strafe = packet.GetUint8(); UInt16 Heading = packet.GetUint16R(); UInt16 X = packet.GetUint16R(); UInt16 Y = packet.GetUint16R(); byte Unk1 = packet.GetUint8(); UInt16 Z = packet.GetUint16R(); byte zmod = packet.GetUint8(); // Log.Success("zMod ",""+zmod); // zmod is somewhat strange what i found out so far // z mod is 255 while standing // z mod is 0 while running and z is below 65535 // z mod is 1 while running and z is above 65535 // z mod can be 113 / 97 / 115 / 99 while running and z is below 65535 and enemy in target // z mod is 99 / 100 / 116 while running and z is above 65535 and enemy in target // z mod is 4 while running in water // z mod is 68 while swimming in water // z mod is ticking with 255 7 times then 68 while standing in deep water // z mod is 12 while running in water (that should lower your health / kill you and reduce movement speed) // z mod is ticking with 255 7 times then 12 while standing in lava if (packet.Size < 10) return; int z_temp = Z; Heading /= 8; X /= 2; Y /= 2; // z update if z is higher then 65535 if (zmod != 0 && zmod != 97 && zmod != 113 && zmod != 99 && zmod != 115) z_temp += 65535; if (Type != (byte)MovementTypes.NotMoving) Plr.IsMoving = true; else Plr.IsMoving = false; // Log.Success("Movement Before ", X + "," + Y + "," + Z + " ztemp"+ z_temp); if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF) { if (Plr.LastCX != 0 && Plr.LastCY != 0) { if (Plr.LastCX > 12288 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (X > 12288 && Plr.LastCX < 4096) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastCY > 24576 && Y < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Y > 24576 && Plr.LastCY < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastCX = X; Plr.LastCY = Y; X = Plr.Zone.CalculCombat(X, Plr.XOffset, true); Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false); Heading /= 2; z_temp /= 16; // combat offset z if (Plr._ZoneMgr.ZoneId == 161 || Plr._ZoneMgr.ZoneId == 162) { z_temp += 12288; } else z_temp += 4096; } else { if (Plr.LastX != 0 && Plr.LastY != 0) { if (Plr.LastX > 24576 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (Plr.LastX < 4096 && X > 24576) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastY > 24576 && Y < 4096) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Plr.LastY < 4096 && Y > 24576) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastX = X; Plr.LastY = Y; X = Plr.Zone.CalculPin(X, Plr.XOffset, true); Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false); Log.Success("4 ",""+z_temp); z_temp /= 4; } // if (Plr.IsInWorld() && Plr.Zone.ZoneId == 161) // Z += 16384; // Log.Success("Movement after", "X=" + X + ",Y=" + Y + ",Z=" + Z + ",ztemp = " + z_temp + "," + Type + "," + Unk1 + "," + CombatByte); Plr.SetPosition(X, Y,(ushort) z_temp, Heading); }
public static void F_REQUEST_INIT_PLAYER(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; Log.Dump("F_REQUEST_INIT_PLAYER", packet.ToArray(), 0, packet.ToArray().Length); if (cclient.Plr == null) return; foreach (Player Obj in cclient.Plr._PlayerRanged) Obj.SendMeTo(cclient.Plr); }
public static void F_PLAYER_STATE2(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; if (cclient.Plr == null || !cclient.Plr.IsInWorld()) return; Player Plr = cclient.Plr; try { long Pos = packet.Position; PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2); Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size); Out.WriteByte(0); Plr.DispatchPacket(Out, false); packet.Position = Pos; } catch (Exception e) { Log.Error("F_PLAYER_STATE2", e.ToString()); } if (packet.Size < 17) { Plr.IsMoving = false; return; } UInt16 Key = packet.GetUint16(); byte MoveByte = packet.GetUint8(); byte UnkByte = packet.GetUint8(); byte CombatByte = packet.GetUint8(); byte RotateByte = packet.GetUint8(); UInt16 Heading = packet.GetUint16R(); UInt16 X = packet.GetUint16R(); UInt16 Y = packet.GetUint16R(); byte Unk1 = packet.GetUint8(); UInt16 Z = packet.GetUint16R(); //byte Unk2 = packet.GetUint8(); Heading /= 8; X /= 2; Y /= 2; Z /= 2; if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF) { if (Plr.LastCX != 0 && Plr.LastCY != 0) { if (Plr.LastCX > 12288 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (X > 12288 && Plr.LastCX < 4096) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastCY > 24576 && Y < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Y > 24576 && Plr.LastCY < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastCX = X; Plr.LastCY = Y; X = Plr.Zone.CalculCombat(X, Plr.XOffset, true); Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false); Heading /= 2; Z += 32768; Z /= 4; } else { if (Plr.LastX != 0 && Plr.LastY != 0) { if (Plr.LastX > 24576 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (Plr.LastX < 4096 && X > 24576) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastY > 24576 && Y < 4096) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Plr.LastY < 4096 && Y > 24576) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastX = X; Plr.LastY = Y; X = Plr.Zone.CalculPin(X, Plr.XOffset, true); Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false); } Plr.SetPosition(X, Y, Z, Heading); }
static public void F_PLAYER_STATE2(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; if (cclient.Plr == null || !cclient.Plr.IsInWorld()) return; Player Plr = cclient.Plr; long Pos = packet.Position; PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2); Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size); Out.WriteByte(0); Plr.DispatchPacket(Out, false); packet.Position = Pos; UInt16 Key = packet.GetUint16(); byte Type = packet.GetUint8(); byte MoveingState = packet.GetUint8(); byte CombatByte = packet.GetUint8(); byte Strafe = packet.GetUint8(); UInt16 Heading = packet.GetUint16R(); UInt16 X = packet.GetUint16R(); UInt16 Y = packet.GetUint16R(); byte Unk1 = packet.GetUint8(); UInt16 Z = packet.GetUint16R(); if (packet.Size < 10) return; Heading /= 8; X /= 2; Y /= 2; Z /= 2; if (Type != (byte)MovementTypes.NotMoving) Plr.IsMoving = true; else Plr.IsMoving = false; //Log.Success("Movement Before ", X + "," + Y + "," + Z); if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF) { if (Plr.LastCX != 0 && Plr.LastCY != 0) { if (Plr.LastCX > 12288 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (X > 12288 && Plr.LastCX < 4096) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastCY > 24576 && Y < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Y > 24576 && Plr.LastCY < 8192) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastCX = X; Plr.LastCY = Y; X = Plr.Zone.CalculCombat(X, Plr.XOffset, true); Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false); Heading /= 2; Z += 32768; Z /= 4; Z /= 2; } else { if (Plr.LastX != 0 && Plr.LastY != 0) { if (Plr.LastX > 24576 && X < 4096) Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset); else if (Plr.LastX < 4096 && X > 24576) Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset); if (Plr.LastY > 24576 && Y < 4096) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1)); else if (Plr.LastY < 4096 && Y > 24576) Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1)); } Plr.LastX = X; Plr.LastY = Y; X = Plr.Zone.CalculPin(X, Plr.XOffset, true); Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false); Z /= 2; } if (Plr.IsInWorld() && Plr.Zone.ZoneId == 161) Z += 16384; //Log.Success("Movement after", "X=" + X + ",Y=" + Y + ",Z=" + Z + "," + Type + "," + Unk1 + "," + CombatByte); Plr.SetPosition(X, Y, Z, Heading); }