public bool UserDetected(int[] boxIds, byte jobId)
    {
        Job job = (Job)jobId;
        List <Character> players = Field.State.Players.Values.ToList();

        if (job != Job.None)
        {
            players = players.Where(x => x.Value.Job == job).ToList();
        }

        foreach (int boxId in boxIds)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box == null)
            {
                return(false);
            }

            if (players.Any(player => FieldManager.IsPlayerInBox(box, player)))
            {
                return(true);
            }
        }

        return(false);
    }
Beispiel #2
0
    public void EndMiniGame(int winnerBoxId, MiniGame type, bool isOnlyWinner)
    {
        MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, winnerBoxId);

        if (box is null)
        {
            return;
        }

        foreach (IFieldObject <Player> player in Field.State.Players.Values)
        {
            if (!FieldManager.IsPlayerInBox(box, player))
            {
                continue;
            }

            switch (type)
            {
            case MiniGame.LudibriumEscape:
                PlayerTrigger trigger = player.Value.Triggers.FirstOrDefault(x => x.Key == "gameStart");
                player.Value.Triggers.Remove(trigger);
                player.Value.Session.Send(ResultsPacket.Rounds(1, 1));
                break;

            case MiniGame.OXQuiz:
                player.Value.Session.Send(ResultsPacket.Rounds(10, 10));
                break;
            }
        }
    }
    public bool MonsterDead(int[] spawnPointIds, bool arg2)
    {
        // TODO: Needs a better check for multiple mob spawns
        foreach (int spawnPointId in spawnPointIds)
        {
            MapEventNpcSpawnPoint spawnPoint = MapEntityMetadataStorage.GetMapEventNpcSpawnPoint(Field.MapId, spawnPointId);
            if (spawnPoint == null)
            {
                continue;
            }

            foreach (string npcId in spawnPoint.NpcIds)
            {
                if (!int.TryParse(npcId, out int id))
                {
                    continue;
                }

                if (Field.State.Mobs.Values.Any(x => x.Value.Id == id && !x.IsDead))
                {
                    return(false);
                }
            }
        }

        return(true);
    }
Beispiel #4
0
    public void MiniGameGiveReward(int winnerBoxId, string contentType, MiniGame type)
    {
        MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, winnerBoxId);

        if (box is null)
        {
            return;
        }

        List <IFieldObject <Player> > players = new();

        foreach (IFieldObject <Player> player in Field.State.Players.Values)
        {
            if (FieldManager.IsPlayerInBox(box, player))
            {
                players.Add(player);
            }
        }
        foreach (IFieldObject <Player> player in players)
        {
            if (contentType == "miniGame")
            {
                List <Item> items = RewardContentMetadataStorage.GetRewardItems(3, player.Value.Levels.Level);
                foreach (Item item in items)
                {
                    player.Value.Inventory.AddItem(player.Value.Session, item, true);
                }
            }
            else if (contentType == "UserOpenMiniGameExtraReward")
            {
            }
        }
    }
Beispiel #5
0
    public void MiniGameCameraDirection(int boxId, int cameraId)
    {
        MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);

        if (box is null)
        {
            return;
        }

        List <IFieldObject <Player> > boxPlayers = new();

        foreach (IFieldObject <Player> player in Field.State.Players.Values)
        {
            if (FieldManager.IsPlayerInBox(box, player))
            {
                boxPlayers.Add(player);
            }
        }

        Random random = Random.Shared;
        int    index  = random.Next(boxPlayers.Count);
        IFieldObject <Player> randomPlayer = boxPlayers[index];

        Field.BroadcastPacket(LocalCameraPacket.Camera(cameraId, 1, randomPlayer.ObjectId));
    }
Beispiel #6
0
    public void PlaySystemSoundInBox(int[] boxIds, string sound)
    {
        if (boxIds != null)
        {
            foreach (int boxId in boxIds)
            {
                MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
                if (box is null)
                {
                    return;
                }

                foreach (IFieldObject <Player> player in Field.State.Players.Values)
                {
                    if (FieldManager.IsPlayerInBox(box, player))
                    {
                        player.Value.Session.Send(SystemSoundPacket.Play(sound));
                    }
                }
            }

            return;
        }

        Field.BroadcastPacket(SystemSoundPacket.Play(sound));
    }
Beispiel #7
0
    public int GetUserCount(int boxId, int userTagId)
    {
        if (boxId == 0)
        {
            return(Field.State.Players.Values.Count);
        }

        MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);

        if (box is null)
        {
            return(0);
        }

        int userCount = 0;

        foreach (IFieldActor <Player> player in Field.State.Players.Values)
        {
            if (FieldManager.IsPlayerInBox(box, player))
            {
                userCount++;
            }
        }

        return(userCount);
    }
    public void MoveUser(int mapId, int triggerId, int boxId)
    {
        List <Character> players = Field.State.Players.Values.ToList();

        if (boxId != 0)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box is null)
            {
                return;
            }

            players = players.Where(player => FieldManager.IsPlayerInBox(box, player)).ToList();
        }

        // move player back to return map
        if (mapId == 0 && triggerId == 0)
        {
            foreach (IFieldObject <Player> player in players)
            {
                player.Value.Warp(player.Value.ReturnMapId, player.Value.ReturnCoord);
            }

            return;
        }

        if (mapId == Field.MapId)
        {
            IFieldObject <Portal> portal = Field.State.Portals.Values.First(p => p.Value.Id == triggerId);
            foreach (IFieldObject <Player> player in players)
            {
                player.Value.Move(portal.Coord, portal.Rotation, isTrigger: true);
            }

            return;
        }

        CoordF    moveCoord;
        CoordF    moveRotation;
        MapPortal dstPortal = MapEntityMetadataStorage.GetPortals(mapId).FirstOrDefault(portal => portal.Id == triggerId);

        if (dstPortal == null)
        {
            MapPlayerSpawn spawn = MapEntityMetadataStorage.GetRandomPlayerSpawn(mapId);
            moveCoord    = spawn.Coord.ToFloat();
            moveRotation = spawn.Rotation.ToFloat();
        }
        else
        {
            moveCoord    = dstPortal.Coord.ToFloat();
            moveRotation = dstPortal.Rotation.ToFloat();
        }

        foreach (IFieldObject <Player> player in players)
        {
            player.Value.Warp(mapId, moveCoord, moveRotation, instanceId: 1);
        }
    }
Beispiel #9
0
    public MushkingRoyaleSession(int mapId)
    {
        MapPlayerSpawn spawn = MapEntityMetadataStorage.GetRandomPlayerSpawn(mapId);

        MapId         = mapId;
        SpawnPosition = spawn.Coord;
        SpawnRotation = spawn.Rotation;
        SessionId     = GameServer.MushkingRoyaleSessionManager.GetSessionId();
        InstanceId    = SessionId;
        GameServer.MushkingRoyaleSessionManager.AddSession(this);
    }
    public static void HandleCreateDungeon(GameSession session, PacketReader packet)
    {
        int    dungeonId  = packet.ReadInt();
        bool   groupEnter = packet.ReadBool();
        Player player     = session.Player;

        if (player.DungeonSessionId != -1)
        {
            session.SendNotice("Leave your current dungeon before opening another.");
            return;
        }

        int            dungeonLobbyId = DungeonStorage.GetDungeonByDungeonId(dungeonId).LobbyFieldId;
        MapPlayerSpawn spawn          = MapEntityMetadataStorage.GetRandomPlayerSpawn(dungeonLobbyId);

        DungeonSession dungeonSession = GameServer.DungeonManager.CreateDungeonSession(dungeonId, groupEnter ? DungeonType.Group : DungeonType.Solo);

        //TODO: Send packet that greys out enter alone / enter as party when already in a dungeon session (sendRoomDungeon packet/s).
        //the session belongs to the party leader
        if (groupEnter)
        {
            Party party = player.Party;
            if (party.DungeonSessionId != -1)
            {
                session.SendNotice("Need to reset dungeon before entering another instance");
                return;
            }
            foreach (Player member in party.Members)
            {
                if (member.DungeonSessionId != -1)
                {
                    session.SendNotice($"{member.Name} is still in a Dungeon Instance.");
                    return;
                }
            }
            party.DungeonSessionId = dungeonSession.SessionId;
            party.BroadcastPacketParty(PartyPacket.PartyHelp(dungeonId));
            //TODO: Update Party with dungeon Info via party packets (0d,0e and others are involved).
        }
        else // solo join dungeon
        {
            player.DungeonSessionId = dungeonSession.SessionId;
        }
        session.Player.Warp(dungeonLobbyId, instanceId: dungeonSession.DungeonInstanceId);
        //TODO: things after map is created here: spawn doctor npc.
        //This packet sets the banner in the dungeon that displays the dungeonname and the playersize it was created for.
        //party.BroadcastPacketParty(DungeonWaitPacket.Show(dungeonId, DungeonStorage.GetDungeonByDungeonId(dungeonId).MaxUserCount));
    }
    public bool QuestUserDetected(int[] boxes, int[] questIds, byte[] modes, byte arg4)
    {
        byte mode = modes[0];

        foreach (int boxId in boxes)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box is null)
            {
                return(false);
            }

            List <Character> players = Field.State.Players.Values.ToList();

            foreach (Character player in players)
            {
                if (!FieldManager.IsPlayerInBox(box, player))
                {
                    continue;
                }

                foreach (int questId in questIds)
                {
                    if (!player.Value.QuestData.TryGetValue(questId, out QuestStatus quest))
                    {
                        return(false);
                    }

                    switch (mode)
                    {
                    case 1:     // started
                        return(quest.State is QuestState.Started);

                    case 2:     // on going
                        return(quest.State is QuestState.Started && quest.Condition.All(x => x.Completed));

                    case 3:     // completed
                        return(quest.State is QuestState.Completed);
                    }
                }
            }
        }

        return(false);
    }
Beispiel #12
0
    public void EndMiniGameRound(int winnerBoxId, float expRate, bool isOnlyWinner, bool isGainLoserBonus, bool meso, MiniGame type)
    {
        MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, winnerBoxId);

        if (box is null)
        {
            return;
        }

        foreach (IFieldObject <Player> player in Field.State.Players.Values)
        {
            if (FieldManager.IsPlayerInBox(box, player))
            {
                // TODO: calculate correct amount of exp;
                player.Value.Levels.GainExp(10000);
            }
        }
    }
    public void AddBuff(int[] boxIds, int skillId, byte skillLevel, bool arg4, bool arg5, string feature)
    {
        foreach (int boxId in boxIds)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box is null)
            {
                return;
            }

            foreach (Character player in Field.State.Players.Values.Where(player => FieldManager.IsPlayerInBox(box, player)))
            {
                // TODO: Rework when buff system is implemented
                Status status = new(new(skillId, skillLevel), player.ObjectId, player.ObjectId, 1);
                StatusHandler.Handle(player.Value.Session, status);
            }
        }
    }
    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));
    }
Beispiel #15
0
    public void CreateMonster(int[] spawnPointIds, bool spawnAnimation, int arg3)
    {
        foreach (int spawnPointId in spawnPointIds)
        {
            MapEventNpcSpawnPoint spawnPoint = MapEntityMetadataStorage.GetMapEventNpcSpawnPoint(Field.MapId, spawnPointId);
            if (spawnPoint is null)
            {
                continue;
            }

            for (int i = 0; i < spawnPoint.Count; i++)
            {
                foreach (string npcId in spawnPoint.NpcIds)
                {
                    if (!int.TryParse(npcId, out int id))
                    {
                        continue;
                    }

                    short animation = -1;
                    if (spawnAnimation)
                    {
                        NpcMetadata npcMetadata = NpcMetadataStorage.GetNpcMetadata(id);
                        if (npcMetadata is null || !npcMetadata.StateActions.TryGetValue(NpcState.Normal, out (string, NpcAction, short)[] stateAction))
                        {
                            continue;
                        }

                        if (stateAction.Length == 0)
                        {
                            continue;
                        }

                        animation = AnimationStorage.GetSequenceIdBySequenceName(npcMetadata.NpcMetadataModel.Model, stateAction[0].Item1);
                    }

                    Npc npc = Field.RequestNpc(id, spawnPoint.Position, spawnPoint.Rotation, animation);
                    npc.SpawnPointId = spawnPointId;
                }
            }
        }
    }
Beispiel #16
0
    public void SpawnNpcRange(int[] rangeId, bool isAutoTargeting, byte randomPickCount, int score)
    {
        foreach (int spawnPointId in rangeId)
        {
            MapEventNpcSpawnPoint spawnPoint = MapEntityMetadataStorage.GetMapEventNpcSpawnPoint(Field.MapId, spawnPointId);
            if (spawnPoint == null)
            {
                continue;
            }

            foreach (string npcId in spawnPoint.NpcIds)
            {
                if (!int.TryParse(npcId, out int id))
                {
                    continue;
                }

                Npc npc = Field.RequestNpc(id, spawnPoint.Position, spawnPoint.Rotation);
                npc.SpawnPointId = spawnPointId;
            }
        }
    }
    public void SetAchievement(int boxId, string type, string trophySet)
    {
        List <Character> players = Field.State.Players.Values.ToList();

        if (boxId != 0)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box is null)
            {
                return;
            }

            players = players.Where(player => FieldManager.IsPlayerInBox(box, player)).ToList();
        }

        foreach (IFieldObject <Player> player in players)
        {
            if (type == "trigger")
            {
                TrophyManager.OnTrigger(player.Value, trophySet);
            }
        }
    }
    public void FaceEmotion(int spawnPointId, string emotionName)
    {
        if (spawnPointId == 0)
        {
            IFieldActor <Player> firstPlayer = Field.State.Players.FirstOrDefault().Value;
            Field.BroadcastPacket(TriggerPacket.SetFaceEmotion(firstPlayer.ObjectId, emotionName));
            return;
        }

        MapEventNpcSpawnPoint spawnPoint = MapEntityMetadataStorage.GetMapEventNpcSpawnPoint(Field.MapId, spawnPointId);

        if (spawnPoint is null)
        {
            return;
        }

        foreach (string npcId in spawnPoint.NpcIds)
        {
            if (!int.TryParse(npcId, out int id))
            {
                continue;
            }

            if (Field.State.Npcs.TryGetValue(id, out Npc npc))
            {
                Field.BroadcastPacket(TriggerPacket.SetFaceEmotion(npc.ObjectId, emotionName));
                return;
            }

            if (Field.State.Mobs.TryGetValue(id, out Npc mob))
            {
                Field.BroadcastPacket(TriggerPacket.SetFaceEmotion(mob.ObjectId, emotionName));
                return;
            }
        }
    }
Beispiel #19
0
    private static void HandleEnter(GameSession session, PacketReader packet)
    {
        int globalEventId  = packet.ReadInt();
        int selectionIndex = packet.ReadInt();

        GlobalEvent globalEvent = GameServer.GlobalEventManager.GetEventById(globalEventId);

        if (globalEvent == null)
        {
            return;
        }

        Map map;

        switch (globalEvent.Events[selectionIndex])
        {
        case GlobalEventType.oxquiz:
            map = Map.MapleOXQuiz;
            break;

        case GlobalEventType.trap_master:
            map = Map.TrapMaster;
            break;

        case GlobalEventType.spring_beach:
            map = Map.SpringBeach;
            break;

        case GlobalEventType.crazy_runner:
            map = Map.CrazyRunners;
            break;

        case GlobalEventType.final_surviver:
            map = Map.SoleSurvivor;
            break;

        case GlobalEventType.great_escape:
            map = Map.LudibriumEscape;
            break;

        case GlobalEventType.dancedance_stop:
            map = Map.DanceDanceStop;
            break;

        case GlobalEventType.crazy_runner_shanghai:
            map = Map.ShanghaiCrazyRunners;
            break;

        case GlobalEventType.hideandseek:
            map = Map.HideAndSeek;
            break;

        case GlobalEventType.red_arena:
            map = Map.RedArena;
            break;

        case GlobalEventType.blood_mine:
            map = Map.CrimsonTearMine;
            break;

        case GlobalEventType.treasure_island:
            map = Map.TreasureIsland;
            break;

        case GlobalEventType.christmas_dancedance_stop:
            map = Map.HolidayDanceDanceStop;
            break;

        default:
            Logger.Warning("Unknown Global Event: {event}", globalEvent.Events[selectionIndex]);
            return;
        }

        session.Player.Mount = null;
        MapPortal portal = MapEntityMetadataStorage.GetPortals((int)map).FirstOrDefault(portal => portal.Id == 1);

        session.Player.Warp(map, portal.Coord.ToFloat(), portal.Rotation.ToFloat());
    }
Beispiel #20
0
    public void MoveNpc(int spawnTriggerId, string patrolDataName)
    {
        PatrolData patrolData = MapEntityMetadataStorage.GetPatrolData(Field.MapId, patrolDataName);

        Field.State.Npcs.Values.FirstOrDefault(x => x.SpawnPointId == spawnTriggerId)?.SetPatrolData(patrolData);
    }
Beispiel #21
0
    public void TalkFunction(GameSession session, int functionId, string function)
    {
        if (functionId == 0)
        {
            return;
        }

        List <ActionType> actions       = new();
        Script            npcScript     = ScriptLoader.GetScript($"Npcs/{Npc.Id}");
        DynValue          actionResults = npcScript?.RunFunction(function);

        if (actionResults == null)
        {
            return;
        }

        switch (actionResults.Type)
        {
        case DataType.Number:
            actions.Add((ActionType)actionResults.Number);
            break;

        case DataType.Tuple:
            foreach (DynValue value in actionResults.Tuple)
            {
                actions.Add((ActionType)value.Number);
            }

            break;

        default:
            return;
        }

        MapPortal portal = new();

        foreach (ActionType action in actions)
        {
            switch (action)
            {
            case ActionType.OpenWindow:
                DynValue windowResults = npcScript.RunFunction("actionWindow");
                session.Send(NpcTalkPacket.Action(ActionType.OpenWindow, windowResults.Tuple[0].String, windowResults.Tuple[1].String));
                break;

            case ActionType.Portal:
                DynValue portalResults = npcScript.RunFunction("actionPortal");
                portal = MapEntityMetadataStorage.GetPortals(session.Player.MapId).FirstOrDefault(portal => portal.Id == portalResults.Number);
                if (portal is null)
                {
                    return;
                }

                session.Send(NpcTalkPacket.Action(ActionType.Portal, "", "", portal.Id));
                break;

            case ActionType.ItemReward:
                DynValue itemResults = npcScript.RunFunction("actionItemReward");     // TODO: Support > 1 item
                Item     item        = new(id : (int)itemResults.Tuple[0].Number,
                                           amount : (int)itemResults.Tuple[2].Number,
                                           rarity : (int)itemResults.Tuple[1].Number);
                session.Player.Inventory.AddItem(session, item, true);
                session.Send(NpcTalkPacket.Action(action, "", "", 0, item));
                break;

            case ActionType.MoveMap:
                DynValue map = npcScript.RunFunction("actionMoveMap");

                int mapId    = (int)map.Tuple[0].Number;
                int portalId = (int)map.Tuple[1].Number;

                MapPortal portalDst = MapEntityMetadataStorage.GetPortals(mapId).FirstOrDefault(x => x.Id == portalId);
                if (portalDst is null)
                {
                    session.Player.Warp(mapId);
                    return;
                }

                session.Player.Warp(mapId, portalDst.Coord, portalDst.Rotation);
                break;
            }
        }

        // this needs to be sent after the UI window action
        if (actions.Contains(ActionType.Portal))
        {
            session.Player.Move(portal.Coord.ToFloat(), portal.Rotation.ToFloat());
        }
    }
    public void MoveUserPath(string movePath)
    {
        PatrolData patrolData = MapEntityMetadataStorage.GetPatrolData(Field.MapId, movePath);

        Field.MovePlayerAlongPath(Field.State.Players.First().Value, patrolData);
    }
    private static void HandleMove(GameSession session, PacketReader packet)
    {
        int srcMapId = packet.ReadInt();

        if (srcMapId != session.FieldManager.MapId)
        {
            return;
        }

        int portalId = packet.ReadInt();
        IFieldObject <Portal> fieldPortal = session.FieldManager.State.Portals.Values.FirstOrDefault(x => x.Value.Id == portalId);

        if (fieldPortal == default)
        {
            Logger.Warning("Unable to find portal: {portalId} in map: {srcMapId}", portalId, srcMapId);
            return;
        }

        Portal srcPortal = fieldPortal.Value;

        switch (srcPortal.PortalType)
        {
        case PortalTypes.Field:
            break;

        case PortalTypes.DungeonReturnToLobby:
            DungeonSession dungeonSession = GameServer.DungeonManager.GetDungeonSessionBySessionId(session.Player.DungeonSessionId);
            if (dungeonSession == null)
            {
                return;
            }
            session.Player.Warp(dungeonSession.DungeonLobbyId, instanceId: dungeonSession.DungeonInstanceId);
            return;

        case PortalTypes.LeaveDungeon:
            HandleLeaveInstance(session);
            return;

        case PortalTypes.Home:
            HandleHomePortal(session, fieldPortal);
            return;

        default:
            Logger.Warning("unknown portal type id: {portalType}", srcPortal.PortalType);
            break;
        }

        if (!MapEntityMetadataStorage.HasSafePortal(srcMapId) || srcPortal.TargetMapId == 0) // map is instance only
        {
            HandleLeaveInstance(session);
            return;
        }

        MapPortal dstPortal = MapEntityMetadataStorage.GetPortals(srcPortal.TargetMapId)
                              .FirstOrDefault(portal => portal.Id == srcPortal.TargetPortalId); // target map's portal id == source portal's targetPortalId

        if (dstPortal == default)
        {
            session.Player.Warp(srcPortal.TargetMapId);
            return;
        }

        CoordF coord = dstPortal.Coord.ToFloat();

        if (dstPortal.Name == "Portal_cube") // spawn on the next block if portal is a cube
        {
            if (dstPortal.Rotation.Z == Direction.SOUTH_EAST)
            {
                coord.Y -= Block.BLOCK_SIZE;
            }
            else if (dstPortal.Rotation.Z == Direction.NORTH_EAST)
            {
                coord.X += Block.BLOCK_SIZE;
            }
            else if (dstPortal.Rotation.Z == Direction.NORTH_WEST)
            {
                coord.Y += Block.BLOCK_SIZE;
            }
            else if (dstPortal.Rotation.Z == Direction.SOUTH_WEST)
            {
                coord.X -= Block.BLOCK_SIZE;
            }
        }

        session.Player.Warp(srcPortal.TargetMapId, coord, dstPortal.Rotation.ToFloat());
    }