001    /**
002     * This software is provided under the terms of the Minecraft Forge Public
003     * License v1.0.
004     */
005    
006    package net.minecraftforge.common;
007    
008    import java.util.Arrays;
009    import java.util.HashSet;
010    import java.util.LinkedList;
011    import java.util.List;
012    import java.util.Set;
013    
014    import net.minecraft.stats.Achievement;
015    
016    public class AchievementPage
017    {
018        private String name;
019        private LinkedList<Achievement> achievements;
020    
021        public AchievementPage(String name, Achievement... achievements)
022        {
023            this.name = name;
024            this.achievements = new LinkedList<Achievement>(Arrays.asList(achievements));
025        }
026    
027        public String getName()
028        {
029            return name;
030        }
031    
032        public List<Achievement> getAchievements()
033        {
034            return achievements;
035        }
036        
037        private static LinkedList<AchievementPage> achievementPages = new LinkedList<AchievementPage>();
038        
039        /**
040         * Registers an achievement page.
041         * @param page The page.
042         */
043        public static void registerAchievementPage(AchievementPage page)
044        {
045            if (getAchievementPage(page.getName()) != null)
046            {
047                throw new RuntimeException("Duplicate achievement page name \"" + page.getName() + "\"!");
048            }
049            achievementPages.add(page);
050        }
051        
052        /**
053         * Will return an achievement page by its index on the list.
054         * @param index The page's index.
055         * @return the achievement page corresponding to the index or null if invalid index
056         */
057        public static AchievementPage getAchievementPage(int index)
058        {
059            return achievementPages.get(index);
060        }
061        
062        /**
063         * Will return an achievement page by its name.
064         * @param name The page's name.
065         * @return the achievement page with the given name or null if no such page
066         */
067        public static AchievementPage getAchievementPage(String name)
068        {
069            for (AchievementPage page : achievementPages)
070            {
071                if (page.getName().equals(name))
072                {
073                    return page;
074                }
075            }
076            return null;
077        }
078        
079        /**
080         * Will return the list of achievement pages.
081         * @return the list's size
082         */
083        public static Set<AchievementPage> getAchievementPages()
084        {
085            return new HashSet<AchievementPage>(achievementPages);
086        }
087        
088        /**
089         * Will return whether an achievement is in any page or not.
090         * @param achievement The achievement.
091         */
092        public static boolean isAchievementInPages(Achievement achievement)
093        {
094            for (AchievementPage page : achievementPages)
095            {
096                if (page.getAchievements().contains(achievement)) 
097                {
098                    return true;
099                }
100            }
101            return false;
102        }
103        
104        public static String getTitle(int index)
105        {
106            return index == -1 ? "Minecraft" : getAchievementPage(index).getName();
107        }
108    }