IEnumerator ClientArtifactEquip(int itemId, LobbyMessageInfo info)
    {
        LobbyPlayer player = LobbyServer.GetLobbyPlayer(info);

        // Wait for all actions to execute
        while (player.artifactsEditingFlag)
        {
            yield return(null);
        }

        try {
            var arti = new Artifact(itemId);

            player.artifactsEditingFlag = true;
            if (player.artifactTree.AddArtifact(itemId))
            {
                player.artifactInventory.RemoveArtifact(arti);
                Lobby.RPC("ArtifactEquip", player.peer, itemId);

                // Save changes
                yield return(ArtifactsDB.SetArtifactTree(
                                 player,
                                 player.artifactTree
                                 ));

                yield return(ArtifactsDB.SetArtifactInventory(
                                 player,
                                 player.artifactInventory
                                 ));
            }
        } finally {
            player.artifactsEditingFlag = false;
        }
    }
    IEnumerator ClientArtifactDiscard(byte level, byte slotId, LobbyMessageInfo info)
    {
        LobbyPlayer player = LobbyServer.GetLobbyPlayer(info);

        // Wait for all actions to execute
        while (player.artifactsEditingFlag)
        {
            yield return(null);
        }

        try {
            player.artifactsEditingFlag = true;
            player.artifactInventory.bags[level].RemoveItemSlot(slotId);
            Lobby.RPC("ArtifactDiscard", player.peer, level, slotId);

            // Save changes
            yield return(ArtifactsDB.SetArtifactTree(
                             player,
                             player.artifactTree
                             ));

            yield return(ArtifactsDB.SetArtifactInventory(
                             player,
                             player.artifactInventory
                             ));
        } finally {
            player.artifactsEditingFlag = false;
        }
    }
    IEnumerator ClientArtifactUnequip(byte level, byte slotIndex, LobbyMessageInfo info)
    {
        LobbyPlayer player = LobbyServer.GetLobbyPlayer(info);

        // Wait for all actions to execute
        while (player.artifactsEditingFlag)
        {
            yield return(null);
        }

        var slot = player.artifactTree.slots[level][slotIndex];

        if (slot.artifact == null)
        {
            yield break;
        }

        try {
            player.artifactsEditingFlag = true;
            player.artifactInventory.AddArtifact(slot.artifact);
            slot.artifact = null;
            Lobby.RPC("ArtifactUnequip", player.peer, level, slotIndex);

            // Save changes
            yield return(ArtifactsDB.SetArtifactTree(
                             player,
                             player.artifactTree
                             ));

            yield return(ArtifactsDB.SetArtifactInventory(
                             player,
                             player.artifactInventory
                             ));
        } finally {
            player.artifactsEditingFlag = false;
        }
    }