1 /* $Id$ */
2 /***************************************************************************
3  *                   (C) Copyright 2003-2010 - Stendhal                    *
4  ***************************************************************************
5  ***************************************************************************
6  *                                                                         *
7  *   This program is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU General Public License as published by  *
9  *   the Free Software Foundation; either version 2 of the License, or     *
10  *   (at your option) any later version.                                   *
11  *                                                                         *
12  ***************************************************************************/
13 package games.stendhal.server.entity.npc.condition;
14 
15 import java.util.Arrays;
16 import java.util.List;
17 
18 import games.stendhal.common.parser.Sentence;
19 import games.stendhal.server.core.config.annotations.Dev;
20 import games.stendhal.server.core.config.annotations.Dev.Category;
21 import games.stendhal.server.entity.Entity;
22 import games.stendhal.server.entity.npc.ChatCondition;
23 import games.stendhal.server.entity.player.Player;
24 
25 /**
26  * has the player completed the specified number of the specified achievements?
27  *
28  * @author madmetzger
29  */
30 @Dev(category=Category.STATS, label="Achievement?")
31 public class PlayerHasCompletedAchievementsCondition implements ChatCondition {
32 
33 	private final List<String> achievements;
34 
35 	private final int minimumToComplete;
36 
37 	/**
38 	 * PlayerHasCompletedAchievementsCondition
39 	 *
40 	 * @param minimum required number of achievements, -1 means all
41 	 * @param achievementIdentifiers list of achievements to check
42 	 */
43 	@Dev
PlayerHasCompletedAchievementsCondition(@evdefaultValue=R) int minimum, String... achievementIdentifiers)44 	public PlayerHasCompletedAchievementsCondition(@Dev(defaultValue="-1") int minimum, String... achievementIdentifiers) {
45 		achievements = Arrays.asList(achievementIdentifiers);
46 		if (minimum > -1) {
47 			minimumToComplete = minimum;
48 		} else {
49 			minimumToComplete = achievementIdentifiers.length;
50 		}
51 	}
52 
53 	/**
54 	 * PlayerHasCompletedAchievementsCondition
55 	 *
56 	 * @param achievementIdentifiers list of achievements to check
57 	 */
PlayerHasCompletedAchievementsCondition(String... achievementIdentifiers)58 	public PlayerHasCompletedAchievementsCondition(String... achievementIdentifiers) {
59 		this(-1, achievementIdentifiers);
60 	}
61 
62 	@Override
fire(Player player, Sentence sentence, Entity npc)63 	public boolean fire(Player player, Sentence sentence, Entity npc) {
64 		int reached = 0;
65 		for (String achievementIdentifier : achievements) {
66 			if(player.hasReachedAchievement(achievementIdentifier)) {
67 				reached = reached + 1;
68 			}
69 			if(reached >= minimumToComplete) {
70 				return true;
71 			}
72 		}
73 		return false;
74 	}
75 
76 	@Override
hashCode()77 	public int hashCode() {
78 		return 43793 * achievements.hashCode() + minimumToComplete;
79 	}
80 
81 	@Override
equals(final Object obj)82 	public boolean equals(final Object obj) {
83 		if (!(obj instanceof PlayerHasCompletedAchievementsCondition)) {
84 			return false;
85 		}
86 		PlayerHasCompletedAchievementsCondition other = (PlayerHasCompletedAchievementsCondition) obj;
87 		return (minimumToComplete == other.minimumToComplete)
88 			&& achievements.equals(other.achievements);
89 	}
90 }
91