예제 #1
0
    public override void Execute(GameCommandTrigger trigger)
    {
        Player    player      = trigger.Session.Player;
        Character fieldPlayer = player.FieldPlayer;

        int  mountId = trigger.Get <int>("mountId");
        byte enable  = trigger.Get <byte>("enable");

        if (enable is 0)
        {
            player.Mount = null; // Remove mount from player
            trigger.Session.FieldManager.BroadcastPacket(MountPacket.StopRide(fieldPlayer, true));
            trigger.Session.Send(KeyTablePacket.SendHotbars(player.GameOptions));
            return;
        }

        IFieldObject <Mount> fieldMount = trigger.Session.FieldManager.RequestFieldObject(new Mount
        {
            Type = RideType.Default,
            Id   = mountId,
            Uid  = 0
        });

        fieldMount.Value.Players[0] = fieldPlayer;
        player.Mount = fieldMount;

        trigger.Session.FieldManager.BroadcastPacket(MountPacket.StartRide(fieldPlayer));
    }
        private static void HandleStartRide(GameSession session, PacketReader packet)
        {
            RideType type    = (RideType)packet.ReadByte();
            int      mountId = packet.ReadInt();

            packet.ReadLong();
            long mountUid = packet.ReadLong();

            // [46-0s] (UgcPacketHelper.Ugc()) but client doesn't set this data?

            if (type == RideType.UseItem && !session.Player.Inventory.Items.ContainsKey(mountUid))
            {
                return;
            }

            IFieldObject <Mount> fieldMount =
                session.FieldManager.RequestFieldObject(new Mount
            {
                Type = type,
                Id   = mountId,
                Uid  = mountUid,
            });

            fieldMount.Value.Players[0] = session.FieldPlayer;
            session.Player.Mount        = fieldMount;

            Packet startPacket = MountPacket.StartRide(session.FieldPlayer);

            session.FieldManager.BroadcastPacket(startPacket);
        }
        private static void HandleStartMultiPersonRide(GameSession session, PacketReader packet)
        {
            int otherPlayerObjectId = packet.ReadInt();

            if (!session.FieldManager.State.Players.TryGetValue(otherPlayerObjectId, out IFieldObject <Player> otherPlayer) || otherPlayer.Value.Mount == null)
            {
                return;
            }

            bool isFriend      = BuddyManager.IsFriend(session.Player, otherPlayer.Value);
            bool isGuildMember = session.Player != null && otherPlayer.Value.Guild != null && session.Player.Guild.Id == otherPlayer.Value.Guild.Id;
            bool isPartyMember = session.Player.Party == otherPlayer.Value.Party;

            if (!isFriend &&
                !isGuildMember &&
                !isPartyMember)
            {
                return;
            }

            int index = Array.FindIndex(otherPlayer.Value.Mount.Value.Players, 0, otherPlayer.Value.Mount.Value.Players.Length, x => x == null);

            otherPlayer.Value.Mount.Value.Players[index] = session.FieldPlayer;
            session.Player.Mount = otherPlayer.Value.Mount;
            session.FieldManager.BroadcastPacket(MountPacket.StartTwoPersonRide(otherPlayerObjectId, session.FieldPlayer.ObjectId, (byte)(index - 1)));
        }
예제 #4
0
    private static void HandleChangeRide(GameSession session, PacketReader packet)
    {
        int  mountId  = packet.ReadInt();
        long mountUid = packet.ReadLong();

        if (!session.Player.Inventory.HasItem(mountUid))
        {
            return;
        }

        Item item = session.Player.Inventory.GetByUid(mountUid);

        if (item.IsExpired())
        {
            return;
        }

        if (item.TransferFlag.HasFlag(ItemTransferFlag.Binds) && !item.IsBound())
        {
            item.BindItem(session.Player);
        }

        PacketWriter changePacket = MountPacket.ChangeRide(session.Player.FieldPlayer.ObjectId, mountId, mountUid);

        session.FieldManager.BroadcastPacket(changePacket);
    }
예제 #5
0
    private static void HandleStopRide(GameSession session, PacketReader packet)
    {
        packet.ReadByte();
        bool forced = packet.ReadBool(); // Going into water without amphibious riding

        session.Player.Mount = null;     // Remove mount from player
        session.FieldManager.BroadcastPacket(MountPacket.StopRide(session.Player.FieldPlayer, forced));
    }
예제 #6
0
        private static void HandleChangeRide(GameSession session, PacketReader packet)
        {
            int  mountId  = packet.ReadInt();
            long mountUid = packet.ReadLong();

            Packet changePacket = MountPacket.ChangeRide(session.FieldPlayer.ObjectId, mountId, mountUid);

            session.FieldManager.BroadcastPacket(changePacket);
        }
예제 #7
0
 public override void Handle(GameSession session, PacketReader packet)
 {
     if (session.Player.OnAirMount)
     {
         session.Player.OnAirMount = false;
     }
     if (session.Player.Mount != null)
     {
         session.FieldManager.BroadcastPacket(MountPacket.StopRide(session.FieldPlayer, false));
     }
 }
        private static void HandleChangeRide(GameSession session, PacketReader packet)
        {
            int  mountId  = packet.ReadInt();
            long mountUid = packet.ReadLong();

            if (!session.Player.Inventory.Items.ContainsKey(mountUid))
            {
                return;
            }

            Packet changePacket = MountPacket.ChangeRide(session.FieldPlayer.ObjectId, mountId, mountUid);

            session.FieldManager.BroadcastPacket(changePacket);
        }
        private static void HandleStopMultiPersonRide(GameSession session)
        {
            IFieldObject <Player> otherPlayer = session.Player.Mount.Value.Players[0];

            if (otherPlayer == null)
            {
                return;
            }

            session.FieldManager.BroadcastPacket(MountPacket.StopTwoPersonRide(otherPlayer.ObjectId, session.FieldPlayer.ObjectId));
            session.Send(UserMoveByPortalPacket.Move(session.FieldPlayer, otherPlayer.Coord, otherPlayer.Rotation));
            session.Player.Mount = null;
            if (otherPlayer.Value.Mount != null)
            {
                int index = Array.FindIndex(otherPlayer.Value.Mount.Value.Players, 0, otherPlayer.Value.Mount.Value.Players.Length, x => x.ObjectId == session.FieldPlayer.ObjectId);
                otherPlayer.Value.Mount.Value.Players[index] = null;
            }
        }
예제 #10
0
        private static void HandleStartRide(GameSession session, PacketReader packet)
        {
            var type    = (RideType)packet.ReadByte();
            int mountId = packet.ReadInt();

            packet.ReadLong();
            long mountUid = packet.ReadLong();
            // [46-0s] (UgcPacketHelper.Ugc()) but client doesn't set this data?

            IFieldObject <Mount> fieldMount =
                session.FieldManager.RequestFieldObject(new Mount {
                Type = type, Id = mountId, Uid = mountUid
            });

            session.Player.Mount = fieldMount;

            Packet startPacket = MountPacket.StartRide(session.FieldPlayer);

            session.FieldManager.BroadcastPacket(startPacket);
        }
예제 #11
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        float distance = packet.ReadFloat();

        if (distance > Block.BLOCK_SIZE * 6)
        {
            // TODO: Check if player has Safe ride enabled
            if (session.Player.Mount != null)
            {
                session.FieldManager.BroadcastPacket(MountPacket.StopRide(session.Player.FieldPlayer));
            }

            session.Player.FallDamage();
        }

        if (session.Player.OnAirMount)
        {
            session.Player.OnAirMount = false;
        }
    }
예제 #12
0
    private static void HandleStartRide(GameSession session, PacketReader packet)
    {
        RideType type    = (RideType)packet.ReadByte();
        int      mountId = packet.ReadInt();

        packet.ReadLong();
        long mountUid = packet.ReadLong();

        // [46-0s] (UgcPacketHelper.Ugc()) but client doesn't set this data?

        if (type == RideType.UseItem && !session.Player.Inventory.HasItem(mountUid))
        {
            return;
        }

        Item item = session.Player.Inventory.GetByUid(mountUid);

        if (item.IsExpired())
        {
            return;
        }

        IFieldObject <Mount> fieldMount = session.FieldManager.RequestFieldObject(new Mount
        {
            Type = type,
            Id   = mountId,
            Uid  = mountUid,
            Ugc  = item.Ugc
        });

        fieldMount.Value.Players[0] = session.Player.FieldPlayer;
        session.Player.Mount        = fieldMount;

        if (item.TransferFlag.HasFlag(ItemTransferFlag.Binds) && !item.IsBound())
        {
            item.BindItem(session.Player);
        }

        session.FieldManager.BroadcastPacket(MountPacket.StartRide(session.Player.FieldPlayer));
    }
예제 #13
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        float distance = packet.ReadFloat();

        if (distance > Block.BLOCK_SIZE * 6)
        {
            if (session.Player.Mount != null && session.Player.Levels.PrestigeLevel < (int)PrestigePerk.SafeRiding)
            {
                session.FieldManager.BroadcastPacket(MountPacket.StopRide(session.Player.FieldPlayer));
            }

            session.Player.FallDamage();
            TrophyManager.OnFallDamage(session.Player);
        }

        if (session.Player.OnAirMount)
        {
            session.Player.OnAirMount = false;
        }

        TrophyManager.OnFall(session.Player, distance);
    }