public static void Action(Client pClient, Packet pPacket) { int uniqueIdentifier; short moveIdentifier; bool isUsingAbility; byte usingAbility; Coordinates projectileTarget; if (!pPacket.ReadInt(out uniqueIdentifier) || !pPacket.ReadShort(out moveIdentifier) || !pPacket.ReadBool(out isUsingAbility) || !pPacket.ReadByte(out usingAbility) || !pPacket.ReadCoordinates(out projectileTarget) || !pPacket.ReadSkip(5)) { pClient.Disconnect(); return; } Mob mob = pClient.Player.Map.GetMob(uniqueIdentifier); if (mob == null || mob.Controller != pClient.Player) return; int rewindOffset = pPacket.Cursor; Coordinates unknownPosition; if (!pPacket.ReadCoordinates(out unknownPosition) || !pClient.Player.Map.ReadMovement(mob, pPacket)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_MOB_ACTION_CONFIRM); packet.WriteInt(uniqueIdentifier); packet.WriteShort(moveIdentifier); packet.WriteBool(isUsingAbility); packet.WriteUShort((ushort)mob.Mana); packet.WriteByte(0x00); // Ability Identifier packet.WriteByte(0x00); // Ability Level pClient.SendPacket(packet); pPacket.Rewind(rewindOffset); packet = new Packet(EOpcode.SMSG_MOB_ACTION); packet.WriteInt(uniqueIdentifier); packet.WriteBool(isUsingAbility); packet.WriteByte(usingAbility); packet.WriteCoordinates(projectileTarget); packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); pClient.Player.Map.UpdateMobControllers(true); }
public static void ScriptTrigger(Client pClient, Packet pPacket) { string name; if (!pPacket.ReadSkip(1) || !pPacket.ReadString(out name)) { pClient.Disconnect(); return; } Portal portal = pClient.Player.Map.GetPortal(name); if (portal == null || portal.Script == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Script Blocked {1}", pClient.Host, name); pClient.Player.SendPortalBlocked(); return; } Log.WriteLine(ELogLevel.Info, "[{0}] Portal Script Triggered {1}", pClient.Host, portal.Script.GetType().FullName); portal.Script.Execute(pClient.Player, portal); }
public static void Move(Client pClient, Packet pPacket) { if (!pPacket.ReadSkip(9)) { pClient.Disconnect(); return; } int rewindOffset = pPacket.Cursor; pClient.Player.Map.ReadMovement(pClient.Player, pPacket); pPacket.Rewind(rewindOffset); Packet packet = new Packet(EOpcode.SMSG_PLAYER_MOVE); packet.WriteInt(pClient.Player.Identifier); packet.WriteInt(0); packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); if (pClient.Player.Foothold == 0) { } else pClient.Player.FallCount = 0; pClient.Player.Map.UpdateMobControllers(true); }
public static void Teleport(Client pClient, Packet pPacket) { int mapIdentifier; if (!pPacket.ReadSkip(1) || !pPacket.ReadInt(out mapIdentifier)) { pClient.Disconnect(); return; } if (mapIdentifier == -1) { string portalName; if (!pPacket.ReadString(out portalName)) { pClient.Disconnect(); return; } Portal portal = pClient.Player.Map.GetPortal(portalName); if (portal == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Map mapDestination = Server.GetActiveMap(portal.Data.ToMapIdentifier); if (mapDestination == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Portal portalDestination = mapDestination.GetPortal(portal.Data.ToName); if (portalDestination == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Log.WriteLine(ELogLevel.Info, "[{0}] Portal Triggered {1}", pClient.Host, portal.Data.Name); pClient.Player.Map.RemovePlayer(pClient.Player); pClient.Player.Map = mapDestination; pClient.Player.Map.AddPlayer(pClient.Player); pClient.Player.Spawn = portalDestination.Index; pClient.Player.Position.X = portalDestination.Data.X; pClient.Player.Position.Y = portalDestination.Data.Y; pClient.Player.Stance = 0; pClient.Player.Foothold = 0; pClient.Player.FallCount = 0; pClient.Player.SendMapChange(); pClient.Player.EnterMap(); } }
public static void PlayerDelete(Client pClient, Packet pPacket) { int identifier; if (!pPacket.ReadSkip(4) || !pPacket.ReadInt(out identifier) || (long)Database.Scalar("SELECT COUNT(*) FROM player WHERE identifier=@identifier AND account_identifier=@account_identifier", new MySqlParameter("@identifier", identifier), new MySqlParameter("@account_identifier", pClient.Account.Identifier)) == 0) { pClient.Disconnect(); return; } Database.Execute("DELETE FROM player WHERE identifier=@identifier", new MySqlParameter("@identifier", identifier)); SendPlayerDelete(pClient, identifier); }
internal bool ReadMovement(IMoveable pMoveable, Packet pPacket) { byte movements; Coordinates position = null; ushort foothold = 0; byte stance = 0; if (!pPacket.ReadByte(out movements)) return false; while (movements-- > 0) { byte type; if (!pPacket.ReadByte(out type)) return false; switch (type) { case 0: case 5: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadSkip(4) || !pPacket.ReadUShort(out foothold) || !pPacket.ReadByte(out stance) || !pPacket.ReadSkip(2)) return false; break; case 1: case 2: case 6: case 13: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadByte(out stance) || !pPacket.ReadUShort(out foothold)) return false; break; case 3: case 4: case 7: case 8: case 9: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadSkip(4) || !pPacket.ReadByte(out stance)) return false; break; case 10: if (!pPacket.ReadSkip(1)) return false; break; case 11: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadUShort(out foothold) || !pPacket.ReadByte(out stance) || !pPacket.ReadSkip(2)) return false; break; case 12: case 16: if (!pPacket.ReadSkip(7)) return false; break; case 14: if (!pPacket.ReadSkip(9)) return false; break; case 15: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadSkip(6) || !pPacket.ReadUShort(out foothold) || !pPacket.ReadByte(out stance) || !pPacket.ReadSkip(2)) return false; break; case 17: if (!pPacket.ReadCoordinates(out position) || !pPacket.ReadUShort(out foothold) || !pPacket.ReadByte(out stance) || !pPacket.ReadSkip(6)) return false; break; default: return false; } } if (position != null) { pMoveable.Position = position; pMoveable.Foothold = foothold; pMoveable.Stance = stance; } return true; }