Exemplo n.º 1
0
 public static CoordF TileToWorld(CoordF tilePos)
 {
     const int w = TileWidth / 2;
     const int h = TileHeight / 2;
     return new CoordF(
         tilePos.X * w - tilePos.Y * w,
         tilePos.X * h + tilePos.Y * h
     );
 }
Exemplo n.º 2
0
        public CoordF ScreenToTile(CoordF screenPos)
        {
            const int w = TileWidth / 2;
            const int h = TileHeight / 2;
            const float wh2 = 2 * w * h;
            int xoff = -(int)ViewOffset.X;
            int yoff = -(int)ViewOffset.Y;

            return new CoordF(
                (screenPos.X * h + screenPos.Y * w - xoff * h - yoff * w) / wh2,
                (-screenPos.X * h + screenPos.Y * w + xoff * h - yoff * w) / wh2
            );
        }
Exemplo n.º 3
0
    public Cube(Item item, int plotNumber, CoordF coordF, CoordF rotation, long homeLayoutId = 0, long homeId = 0)
    {
        Item       = item;
        PlotNumber = plotNumber;
        CoordF     = coordF;
        Rotation   = rotation;
        HomeId     = homeId;
        LayoutUid  = homeLayoutId;
        if (item.Id == 50400158) // Portal cube
        {
            PortalSettings = new(coordF.ToByte());
        }

        Uid = DatabaseManager.Cubes.Insert(this);
    }
Exemplo n.º 4
0
        public void Warp(CoordF coord, CoordF rotation, int mapId)
        {
            MapId     = mapId;
            Coord     = coord;
            Rotation  = rotation;
            SafeBlock = coord;

            if (!UnlockedMaps.Contains(MapId))
            {
                UnlockedMaps.Add(MapId);
            }

            DatabaseManager.UpdateCharacter(this);
            Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer));
        }
Exemplo n.º 5
0
    private static void HandleHomePortal(GameSession session, IFieldObject <Portal> fieldPortal)
    {
        IFieldObject <Cube> srcCube = session.FieldManager.State.Cubes.Values
                                      .FirstOrDefault(x => x.Value.PortalSettings is not null &&
                                                      x.Value.PortalSettings.PortalObjectId == fieldPortal.ObjectId);

        if (srcCube is null)
        {
            return;
        }

        string destinationTarget = srcCube.Value.PortalSettings.DestinationTarget;

        if (string.IsNullOrEmpty(destinationTarget))
        {
            return;
        }

        switch (srcCube.Value.PortalSettings.Destination)
        {
        case UgcPortalDestination.PortalInHome:
            IFieldObject <Cube> destinationCube = session.FieldManager.State.Cubes.Values
                                                  .FirstOrDefault(x => x.Value.PortalSettings is not null &&
                                                                  x.Value.PortalSettings.PortalName == destinationTarget);
            if (destinationCube is null)
            {
                return;
            }
            session.Player.FieldPlayer.Coord = destinationCube.Coord;
            CoordF coordF = destinationCube.Coord;
            session.Player.Move(coordF, session.Player.FieldPlayer.Rotation);
            break;

        case UgcPortalDestination.SelectedMap:
            session.Player.Warp(int.Parse(destinationTarget));
            break;

        case UgcPortalDestination.FriendHome:
            long friendAccountId = long.Parse(destinationTarget);
            Home home            = GameServer.HomeManager.GetHomeById(friendAccountId);
            if (home is null)
            {
                return;
            }
            session.Player.WarpGameToGame((int)Map.PrivateResidence, instanceId: home.InstanceId);
            break;
        }
    }
Exemplo n.º 6
0
        public static List <CoordF> SelectPoints(int spawnRadius = Block.BLOCK_SIZE)
        {
            List <CoordF> spawnOffsets = new List <CoordF>();
            int           spawnSize    = 2 * (spawnRadius / Block.BLOCK_SIZE);

            for (int i = 0; i <= spawnSize; i++)
            {
                for (int j = 0; j <= spawnSize; j++)
                {
                    spawnOffsets.Add(CoordF.From(i * Block.BLOCK_SIZE - spawnRadius, j * Block.BLOCK_SIZE - spawnRadius, 0));
                }
            }
            Random offsetRNG = new Random();

            return(spawnOffsets.OrderBy(x => offsetRNG.Next()).ToList());
        }
Exemplo n.º 7
0
 public MapLiftableObject(string entityId, int itemId, int itemStackCount, string maskQuestId, string maskQuestState, string effectQuestId, string effectQuestState,
                          int itemLifeTime, int regenCheckTime, int liftableFinishTime, CoordF position, CoordF rotation)
 {
     EntityId               = entityId;
     ItemId                 = itemId;
     ItemStackCount         = itemStackCount;
     MaskQuestId            = maskQuestId;
     MaskQuestState         = maskQuestState;
     EffectQuestId          = effectQuestId;
     EffectQuestState       = effectQuestState;
     ItemLifeTime           = itemLifeTime;
     LiftableRegenCheckTime = regenCheckTime;
     LiftableFinishTime     = liftableFinishTime;
     Position               = position;
     Rotation               = rotation;
 }
Exemplo n.º 8
0
        private static void HandleFirstSent(GameSession session, PacketReader packet)
        {
            long  skillSN    = packet.ReadLong();
            int   unkValue   = packet.ReadInt();
            int   skillId    = packet.ReadInt();
            short skillLevel = packet.ReadShort();

            packet.ReadByte();
            CoordF coords = packet.Read <CoordF>();

            packet.ReadShort();
            SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, unkValue);

            session.FieldPlayer.Value.SkillCast = skillCast;
            session.Send(SkillUsePacket.SkillUse(skillCast, coords));
        }
Exemplo n.º 9
0
 public MobCommand()
 {
     Aliases = new()
     {
         "mob"
     };
     Description = "Spawn a MOB from id.";
     Parameters  = new()
     {
         new Parameter <int>("id", "The id of the MOB.", 21000001),
         new Parameter <short>("ani", "The animation of the MOB.", 1),
         new Parameter <short>("dir", "The rotation of the MOB.", 2700),
         new Parameter <CoordF>("coord", "The position of the MOB.", CoordF.From(0, 0, 0)),
     };
     Usage = "/mob [id] [ani] [dir] [coord]";
 }
Exemplo n.º 10
0
 public NpcCommand()
 {
     Aliases = new()
     {
         "npc"
     };
     Description = "Spawn a NPC from id.";
     Parameters  = new()
     {
         new Parameter <int>("id", "The id of the NPC.", 11003146),
         new Parameter <short>("ani", "The animation of the NPC.", 1),
         new Parameter <short>("dir", "The rotation of the NPC.", 2700),
         new Parameter <CoordF>("coord", "The position of the NPC.", CoordF.From(0, 0, 0)),
     };
     Usage = "/npc [id] [ani] [dir] [coord]";
 }
Exemplo n.º 11
0
        public long ExpirationTimestamp; // TODO: Remove from field if expired

        public AdBalloon(string id, int interactId, InteractObjectState state, InteractObjectType type, IFieldObject <Player> owner, InstallBillboard metadata, string title, string description, bool publicHouse) : base(id, interactId, type, state)
        {
            Owner               = owner.Value;
            Position            = owner.Coord;
            Rotation            = owner.Rotation;
            Model               = metadata.Model;
            Asset               = metadata.Asset;
            NormalState         = metadata.NormalState;
            Reactable           = metadata.Reactable;
            Scale               = metadata.Scale;
            Title               = title;
            Description         = description;
            PublicHouse         = publicHouse;
            CreationTimestamp   = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount;
            ExpirationTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount + metadata.Duration;
        }
Exemplo n.º 12
0
 // Initializes all values to be saved into the database
 public Player(long accountId, string name, byte gender, Job job, SkinColor skinColor)
 {
     AccountId   = accountId;
     Name        = name;
     Gender      = gender;
     Job         = job;
     GameOptions = new GameOptions();
     Wallet      = new Wallet(this, meso: 0, meret: 0, gameMeret: 0, eventMeret: 0, valorToken: 0, treva: 0, rue: 0,
                              haviFruit: 0, mesoToken: 0, bank: 0);
     Levels           = new Levels(this, playerLevel: 1, exp: 0, restExp: 0, prestigeLevel: 1, prestigeExp: 0, new List <MasteryExp>());
     Timestamps       = new TimeInfo(DateTimeOffset.UtcNow.ToUnixTimeSeconds());
     MapId            = 52000065;
     Coord            = CoordF.From(-675, 525, 600); // Intro map (52000065)
     Stats            = new PlayerStats(strBase: 10, dexBase: 10, intBase: 10, lukBase: 10, hpBase: 500, critRateBase: 10);
     Motto            = "Motto";
     ProfileUrl       = "";
     HomeName         = "HomeName";
     CreationTime     = DateTimeOffset.Now.ToUnixTimeSeconds() + Environment.TickCount;
     TitleId          = 0;
     InsigniaId       = 0;
     Titles           = new List <int>();
     ChatSticker      = new List <ChatSticker>();
     FavoriteStickers = new List <int>();
     Emotes           = new List <int>()
     {
         90200011, 90200004, 90200024, 90200041, 90200042, 90200057, 90200043, 90200022, 90200031, 90200005, 90200006, 90200003, 90200092, 90200077, 90200073, 90200023, 90200001, 90200019, 90200020, 90200021
     };
     SkillTabs = new List <SkillTab> {
         new SkillTab(job)
     };
     StatPointDistribution = new StatDistribution(20);
     Inventory             = new Inventory();
     BankInventory         = new BankInventory();
     Mailbox     = new Mailbox();
     BuddyList   = new List <Buddy>();
     QuestList   = new List <QuestStatus>();
     TrophyCount = new int[3] {
         0, 0, 0
     };
     ReturnMapId   = (int)Map.Tria;
     ReturnCoord   = CoordF.From(-900, -900, 3000);
     GroupChatId   = new int[3];
     SkinColor     = skinColor;
     UnlockedTaxis = new List <int>();
     UnlockedMaps  = new List <int>();
     CharacterId   = DatabaseManager.CreateCharacter(this);
 }
Exemplo n.º 13
0
        private static void HandleAoeDamage(GameSession session, PacketReader packet)
        {
            List <(IFieldObject <Mob>, DamageHandler)> mobs = new List <(IFieldObject <Mob>, DamageHandler)>();
            long   skillSN        = packet.ReadLong();
            int    unkValue       = packet.ReadInt();
            int    playerObjectId = packet.ReadInt();
            CoordF coords         = packet.Read <CoordF>();
            CoordF coords2        = packet.Read <CoordF>();
            CoordF coords3        = packet.Read <CoordF>();

            packet.ReadByte();
            byte count = packet.ReadByte();

            packet.ReadInt();

            bool isCrit = DamageHandler.RollCrit(session.Player.Stats[PlayerStatId.CritRate].Current);

            for (int i = 0; i < count; i++)
            {
                int entity = packet.ReadInt();
                packet.ReadByte();

                IFieldObject <Mob> mob = session.FieldManager.State.Mobs.GetValueOrDefault(entity);
                if (mob != null)
                {
                    DamageHandler damage = DamageHandler.CalculateDamage(session.FieldPlayer.Value.SkillCast, session.FieldPlayer.Value, mob.Value, isCrit);

                    mob.Value.Damage(damage.Damage);
                    session.Send(StatPacket.UpdateMobStats(mob));

                    if (mob.Value.IsDead)
                    {
                        HandleMobKill(session, mob);
                    }

                    if (mob.Value.Id == 29000128) // Temp fix for tutorial barrier
                    {
                        session.Send("4F 00 03 E8 03 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 03 D0 07 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 08 01 04 01 00 00".ToByteArray());
                    }

                    mobs.Add((mob, damage));
                }
            }
            session.Send(SkillDamagePacket.ApplyDamage(skillSN, unkValue, coords, session.FieldPlayer, mobs));
        }
Exemplo n.º 14
0
        public override void Execute(GameCommandTrigger trigger)
        {
            int   id    = trigger.Get <int>("id");
            short level = trigger.Get <short>("level") > 0 ? trigger.Get <short>("level") : (short)1;

            if (SkillMetadataStorage.GetSkill(id) == null)
            {
                trigger.Session.SendNotice($"Skill with id: {id} is not defined.");
                return;
            }

            SkillCast             skillCast = new SkillCast(id, level, GuidGenerator.Long(), trigger.Session.ServerTick, trigger.Session.FieldPlayer.ObjectId, trigger.Session.ClientTick);
            CoordF                empty     = CoordF.From(0, 0, 0);
            IFieldObject <Player> player    = trigger.Session.FieldPlayer;

            trigger.Session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast, player.Coord, empty, empty));
        }
Exemplo n.º 15
0
        private static void HandleSyncSkills(GameSession session, PacketReader packet)
        {
            long   skillSN     = packet.ReadLong();
            int    skillId     = packet.ReadInt();
            short  skillLevel  = packet.ReadShort();
            byte   motionPoint = packet.ReadByte();
            CoordF position    = packet.Read <CoordF>();
            CoordF unkCoords   = packet.Read <CoordF>();
            CoordF rotation    = packet.Read <CoordF>();
            CoordF unknown     = packet.Read <CoordF>();
            bool   toggle      = packet.ReadBool();

            packet.ReadInt();
            packet.ReadByte();

            session.FieldManager.BroadcastPacket(SkillSyncPacket.Sync(skillSN, session.FieldPlayer, position, rotation, toggle), session);
        }
Exemplo n.º 16
0
        public static bool IsPlayerInBox(MapTriggerBox box, IFieldObject <Player> player)
        {
            CoordF minCoord = CoordF.From(
                box.Position.X - box.Dimension.X / 2,
                box.Position.Y - box.Dimension.Y / 2,
                box.Position.Z - box.Dimension.Z / 2);

            CoordF maxCoord = CoordF.From(
                box.Position.X + box.Dimension.X / 2,
                box.Position.Y + box.Dimension.Y / 2,
                box.Position.Z + box.Dimension.Z / 2);

            bool min = player.Coord.X >= minCoord.X && player.Coord.Y >= minCoord.Y && player.Coord.Z >= minCoord.Z;
            bool max = player.Coord.X <= maxCoord.X && player.Coord.Y <= maxCoord.Y && player.Coord.Z <= maxCoord.Z;

            return(min && max);
        }
Exemplo n.º 17
0
        private static void HandleAddFurnishing(GameSession session, PacketReader packet)
        {
            CoordB coord    = packet.Read <CoordB>();
            byte   padding  = packet.ReadByte();
            int    itemId   = packet.ReadInt();
            long   itemUid  = packet.ReadLong();
            byte   padding2 = packet.ReadByte();
            CoordF rotation = packet.Read <CoordF>();

            int plotNumber = MapMetadataStorage.GetPlotNumber(session.Player.MapId, coord);

            if (plotNumber < 0)
            {
                return;
            }

            // TODO: Check if player has rights to this plot

            FurnishingShopMetadata shopMetadata = FurnishingShopMetadataStorage.GetMetadata(itemId);

            if (shopMetadata == null || !shopMetadata.Buyable)
            {
                return;
            }

            if (itemUid == 0) // player needs to purchase
            {
                if (!PurchaseFurnishingItem(session, shopMetadata))
                {
                    return;
                }


                Item item = new Item(itemId);

                //TODO: Add and remove appropriate item to warehouse inventory and furnishing inventory

                Cube cube = new Cube(item, plotNumber);

                IFieldObject <Cube> fieldCube = session.FieldManager.RequestFieldObject(cube);
                fieldCube.Coord    = coord.ToFloat();
                fieldCube.Rotation = rotation;
                session.FieldManager.AddCube(fieldCube, session.FieldPlayer);
            }
        }
Exemplo n.º 18
0
        public static Player Char2(long accountId, long characterId, string name = "Char2")
        {
            int job = 50;

            PlayerStats stats = PlayerStats.Default();

            List <SkillTab> skillTabs = new List <SkillTab>
            {
                XmlParser.ParseSkills(job)
            };

            return(new Player
            {
                SkillTabs = skillTabs,
                MapId = 2000062,
                AccountId = accountId,
                CharacterId = characterId,
                Level = 70,
                Name = name,
                Gender = 0,
                Motto = "Motto",
                HomeName = "HomeName",
                Coord = CoordF.From(2850, 2550, 1800),
                JobGroupId = job,
                SkinColor = new SkinColor()
                {
                    Primary = Color.Argb(0xFF, 0xEA, 0xBF, 0xAE)
                },
                CreationTime = DateTimeOffset.Now.ToUnixTimeSeconds() + Environment.TickCount,
                Equips = new Dictionary <ItemSlot, Item> {
                    { ItemSlot.ER, Item.EarMale() },
                    { ItemSlot.HR, Item.HairMale() },
                    { ItemSlot.FA, Item.FaceMale() },
                    { ItemSlot.FD, Item.FaceDecorationMale() },
                    { ItemSlot.CL, Item.CloathMale() },
                    { ItemSlot.SH, Item.ShoesMale() },
                },
                Stats = stats,
                GameOptions = new GameOptions(),
                Mesos = 10,
                Inventory = new Inventory(48),
                Mailbox = new Mailbox()
            });
        }
Exemplo n.º 19
0
    public static PacketWriter Sync(SkillCast skillCast, IFieldObject <Player> player, CoordF position, CoordF rotation, bool toggle)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.SKILL_SYNC);

        pWriter.WriteLong(skillCast.SkillSn);
        pWriter.WriteInt(player.ObjectId);
        pWriter.WriteInt(skillCast.SkillId);
        pWriter.WriteShort(skillCast.SkillLevel);
        pWriter.WriteByte();
        pWriter.Write(position);
        pWriter.Write(CoordF.From(0, 0, 0)); // unk
        pWriter.Write(rotation);
        pWriter.Write(CoordF.From(0, 0, 0)); // filler for many 00
        pWriter.WriteBool(toggle);
        pWriter.WriteInt();
        pWriter.WriteByte();

        return(pWriter);
    }
Exemplo n.º 20
0
    public static void UpdatePlayer(GameSession session, SyncState[] syncStates)
    {
        Player player = session.Player;
        IFieldActor <Player> fieldPlayer = player.FieldPlayer;

        CoordF coord = syncStates[0].Coord.ToFloat();

        CoordF coordUnderneath = coord;

        coordUnderneath.Z -= 50;

        CoordF blockUnderneath = Block.ClosestBlock(coordUnderneath);

        if (IsCoordSafe(player, syncStates[0].Coord, blockUnderneath))
        {
            CoordF safeBlock = Block.ClosestBlock(coord);
            // TODO: Knowing the state of the player using the animation is probably not the correct way to do this
            // we will need to know the state of the player for other things like counting time spent on ropes/running/walking/swimming
            if (syncStates[0].Animation2 is 7 or 132) // swimming
            {
                safeBlock.Z += Block.BLOCK_SIZE;      // Without this player will spawn under the water
            }

            safeBlock.Z += 10; // Without this player will spawn inside the block

            player.SafeBlock = safeBlock;
        }

        fieldPlayer.Coord    = coord;
        fieldPlayer.Rotation = new()
        {
            Z = syncStates[0].Rotation / 10
        };

        if (IsOutOfBounds(fieldPlayer.Coord, session.FieldManager.BoundingBox))
        {
            player.Move(player.SafeBlock, fieldPlayer.Rotation);
            player.FallDamage();
        }

        // not sure if this needs to be synced here
        fieldPlayer.Animation = syncStates[0].BoreAnimation;
    }
Exemplo n.º 21
0
        public static Packet AddBoss(IFieldObject <Mob> mob)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.FIELD_ADD_NPC);

            pWriter.WriteInt(mob.ObjectId);
            pWriter.WriteInt(mob.Value.Id);
            pWriter.Write(mob.Coord);
            pWriter.Write(CoordF.From(0, 0, 0));       // Unknown
            pWriter.WriteMapleString(mob.Value.Model); // StrA - kfm model string
            // If NPC is not valid, the packet seems to stop here

            // NPC Stat
            StatPacket.DefaultStatsMob(pWriter, mob);
            // NPC Stat
            pWriter.WriteLong();
            pWriter.WriteLong();
            pWriter.WriteInt();
            pWriter.WriteByte();
            int count = 0;

            pWriter.WriteInt(count); // branch
            for (int i = 0; i < count; i++)
            {
                pWriter.WriteInt();
                pWriter.WriteInt();
                pWriter.WriteInt();
                pWriter.WriteInt();
                pWriter.WriteInt();
                pWriter.WriteInt();
                pWriter.WriteShort();
                pWriter.WriteInt();
                pWriter.WriteByte();
                pWriter.WriteLong();
            }
            // Unknown
            pWriter.WriteLong();
            pWriter.WriteByte();
            pWriter.WriteInt(1);
            pWriter.WriteInt();
            pWriter.WriteByte();

            return(pWriter);
        }
Exemplo n.º 22
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            string entityId     = packet.ReadMapleString();
            long   skillSN      = packet.ReadLong();
            int    skillId      = packet.ReadInt();
            short  skillLevel   = packet.ReadShort();
            short  unkShort     = packet.ReadShort();
            int    unkInt       = packet.ReadInt();
            CoordF playerCoords = packet.Read <CoordF>();

            if (!MapEntityStorage.IsVibrateObject(session.Player.MapId, entityId))
            {
                return;
            }

            SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, session.ServerTick);

            session.FieldManager.BroadcastPacket(VibratePacket.Vibrate(entityId, skillCast, session.FieldPlayer));
        }
Exemplo n.º 23
0
 private static void HandleTypeOfDamage(PacketReader packet)
 {
     long skillSN = packet.ReadLong();
     packet.ReadByte();
     CoordF coords = packet.Read<CoordF>();
     CoordF coords2 = packet.Read<CoordF>();
     int count = packet.ReadByte();
     packet.ReadInt();
     for (int i = 0; i < count; i++)
     {
         packet.ReadLong();
         packet.ReadInt();
         packet.ReadByte();
         if (packet.ReadBool())
         {
             packet.ReadLong();
         }
     }
 }
        private void HandleAcceptEmote(GameSession session, PacketReader packet)
        {
            int    buddyEmoteId      = packet.ReadInt();
            long   senderCharacterId = packet.ReadLong();
            CoordF senderCoords      = packet.Read <CoordF>();
            CoordF selfCoords        = packet.Read <CoordF>();
            int    rotation          = packet.ReadInt();

            Player buddy = GameServer.Storage.GetPlayerById(senderCharacterId);

            if (buddy == null)
            {
                return;
            }

            buddy.Session.Send(BuddyEmotePacket.SendAccept(buddyEmoteId, session.Player));
            session.Send(BuddyEmotePacket.StartEmote(buddyEmoteId, buddy.Session.Player, session.Player, selfCoords, rotation));
            buddy.Session.Send(BuddyEmotePacket.StartEmote(buddyEmoteId, buddy.Session.Player, session.Player, selfCoords, rotation));
        }
Exemplo n.º 25
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        string entityId     = packet.ReadString();
        long   skillSN      = packet.ReadLong();
        int    skillId      = packet.ReadInt();
        short  skillLevel   = packet.ReadShort();
        short  unkShort     = packet.ReadShort();
        int    unkInt       = packet.ReadInt();
        CoordF playerCoords = packet.Read <CoordF>();

        Player player = session.Player;

        if (!MapEntityMetadataStorage.IsVibrateObject(player.MapId, entityId))
        {
            return;
        }

        session.FieldManager.BroadcastPacket(VibratePacket.Vibrate(entityId, player.FieldPlayer.SkillCast));
    }
Exemplo n.º 26
0
        // This also leaves decor planning
        private static void HandleReturnMap(GameSession session)
        {
            Player player = session.Player;

            if (player.IsInDecorPlanner)
            {
                player.IsInDecorPlanner = false;
                player.Guide            = null;
                player.Warp((int)Map.PrivateResidence, instanceId: --player.InstanceId);
                return;
            }

            CoordF returnCoord = player.ReturnCoord;

            returnCoord.Z += Block.BLOCK_SIZE;
            player.Warp(player.ReturnMapId, returnCoord, player.Rotation);
            player.ReturnMapId    = 0;
            player.VisitingHomeId = 0;
        }
Exemplo n.º 27
0
    protected override List <MagicPathMetadata> Parse()
    {
        List <MagicPathMetadata> magicPathList = new();

        foreach (PackFileEntry entry in Resources.XmlReader.Files)
        {
            if (!entry.Name.StartsWith("table/magicpath"))
            {
                continue;
            }

            XmlDocument document = Resources.XmlReader.GetXmlDocument(entry);

            XmlNodeList pathTypeList = document.SelectNodes("/ms2/type");
            foreach (XmlNode pathType in pathTypeList)
            {
                long id = long.Parse(pathType.Attributes["id"]?.Value ?? "0");

                List <MagicPathMove> pathMoves    = new();
                XmlNodeList          pathMoveList = pathType.SelectNodes("move");
                foreach (XmlNode pathMove in pathMoveList)
                {
                    int rotation = int.Parse(pathMove.Attributes["rotation"]?.Value ?? "0");

                    CoordF fireOffsetPosition = ParseCoordWithoutLastChar(pathMove.Attributes["fireOffsetPosition"]?.Value ?? "0,0,");
                    CoordF direction          = ParseCoordWithDuplicateDot(pathMove.Attributes["direction"]?.Value ?? "0");
                    CoordF controlValue0      = ParseCoordFromString(pathMove.Attributes["controlValue0"]?.Value ?? "0,0,0");
                    CoordF controlValue1      = ParseCoordFromString(pathMove.Attributes["controlValue1"]?.Value ?? "0,0,0");

                    bool  ignoreAdjust         = pathMove.Attributes["ignoreAdjustCubePosition"] is null;
                    bool  traceTargetOffsetPos = pathMove.Attributes["traceTargetOffsetPos"]?.Value == "1";
                    float distance             = float.Parse(pathMove.Attributes["distance"]?.Value ?? "0");

                    pathMoves.Add(new(rotation, fireOffsetPosition, direction, controlValue0, controlValue1, ignoreAdjust, traceTargetOffsetPos, distance));
                }

                MagicPathMetadata newMagicPath = new(id, pathMoves);
                magicPathList.Add(newMagicPath);
            }
        }

        return(magicPathList);
    }
Exemplo n.º 28
0
    public override void Execute(GameCommandTrigger trigger)
    {
        int mobId = trigger.Get <int>("id");

        if (NpcMetadataStorage.GetNpcMetadata(mobId) is null)
        {
            trigger.Session.Send(NoticePacket.Notice($"No MOB was found with the id: {mobId.ToString().Color(Color.DarkOliveGreen)}", NoticeType.Chat));
            return;
        }

        CoordF coord = trigger.Get <CoordF>("coord");

        if (coord == default)
        {
            coord = trigger.Session.Player.FieldPlayer.Coord;
        }

        trigger.Session.FieldManager.RequestMob(mobId, coord, CoordF.From(0.0f, 0.0f, trigger.Get <short>("dir")), trigger.Get <short>("ani"));
    }
Exemplo n.º 29
0
        private static void HandleAoeDamage(GameSession session, PacketReader packet)
        {
            List <IFieldObject <Mob> > mobs = new List <IFieldObject <Mob> >();
            long   skillSN        = packet.ReadLong();
            int    unkValue       = packet.ReadInt();
            int    playerObjectId = packet.ReadInt();
            CoordF coords         = packet.Read <CoordF>();
            CoordF coords2        = packet.Read <CoordF>();
            CoordF coords3        = packet.Read <CoordF>();

            packet.ReadByte();
            byte count = packet.ReadByte();

            packet.ReadInt();

            for (int i = 0; i < count; i++)
            {
                int entity = packet.ReadInt();
                mobs.Add(session.FieldManager.State.Mobs.GetValueOrDefault(entity));
                packet.ReadByte();
                if (mobs[i] != null)
                {
                    mobs[i].Value.UpdateStats(session.FieldPlayer.Value.SkillCast.GetDamage());
                    session.Send(StatPacket.UpdateMobStats(mobs[i]));

                    // TODO: There needs to be a more centralized way to give rewards from killing mobs...
                    // TODO: Add trophy, exp, meso and item drops
                    if (mobs[i].Value.IsDead)
                    {
                        QuestHelper.UpdateQuest(session, mobs[i].Value.Id.ToString(), "npc");
                    }

                    if (mobs[i].Value.Id == 29000128) // Temp fix for tutorial barrier
                    {
                        session.Send("4F 00 03 E8 03 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 03 D0 07 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 08 01 04 01 00 00".ToByteArray());
                    }
                }
            }
            session.Send(SkillDamagePacket.ApplyDamage(session.FieldPlayer, skillSN, unkValue, coords, mobs));
        }
Exemplo n.º 30
0
    private static void HandleCatch(GameSession session, PacketReader packet)
    {
        bool success = packet.ReadBool();

        CoordF guideBlock = Block.ClosestBlock(session.Player.Guide.Coord);

        guideBlock.Z -= Block.BLOCK_SIZE; // get liquid block coord
        MapBlock            block  = MapMetadataStorage.GetMapBlock(session.Player.MapId, guideBlock.ToShort());
        List <FishMetadata> fishes = FishMetadataStorage.GetValidFishes(session.Player.MapId, block.Attribute);

        //determine fish rarity
        List <FishMetadata> selectedFishRarities = FilterFishesByRarity(fishes);

        Random       rnd             = RandomProvider.Get();
        int          randomFishIndex = rnd.Next(selectedFishRarities.Count);
        FishMetadata fish            = selectedFishRarities[randomFishIndex];

        //determine fish size
        int fishSize = rnd.NextDouble() switch
        {
Exemplo n.º 31
0
    private static MapBlock ScanZAxisForLiquidBlock(CoordF checkBlock, int mapId)
    {
        for (int zAxis = 0; zAxis < 3; zAxis++)
        {
            if (MapMetadataStorage.BlockAboveExists(mapId, checkBlock.ToShort()))
            {
                return(null);
            }

            MapBlock block = MapMetadataStorage.GetMapBlock(mapId, checkBlock.ToShort());
            if (block == null || !IsLiquidBlock(block))
            {
                checkBlock.Z -= Block.BLOCK_SIZE;
                continue;
            }

            return(block);
        }
        return(null);
    }
Exemplo n.º 32
0
        public static Packet SkillUse(SkillCast skillCast, CoordF position, CoordF direction, CoordF rotation, int entityId)
        {
            SkillCastMap[skillCast.SkillSN] = skillCast;
            PacketWriter pWriter = PacketWriter.Of(SendOp.SKILL_USE);

            pWriter.WriteLong(skillCast.SkillSN);
            pWriter.WriteInt(skillCast.ServerTick);
            pWriter.WriteInt(entityId);
            pWriter.WriteInt(skillCast.SkillId);
            pWriter.WriteShort(skillCast.SkillLevel);
            pWriter.WriteByte();
            pWriter.Write(position.ToShort());
            pWriter.Write(direction);
            pWriter.Write(rotation); // rotation
            pWriter.WriteShort();
            pWriter.WriteByte();
            pWriter.WriteByte();

            return(pWriter);
        }
Exemplo n.º 33
0
 public void CenterOn(CoordF c)
 {
     var wc = TileToWorld(c);
     ViewOffset = new CoordF(wc.X - ViewSize.Width/2.0f, wc.Y - ViewSize.Height/2.0f);
 }
Exemplo n.º 34
0
 public CoordF TileToScreen(CoordF tilePos)
 {
     var c = TileToWorld(tilePos);
     return new CoordF(c.X - ViewOffset.X - TileWidth / 2, c.Y - ViewOffset.Y);
 }