Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
        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;
        }