1 /* $Id$ */
2 /***************************************************************************
3  *                   (C) Copyright 2003-2011 - 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 utilities;
14 
15 import java.util.Date;
16 import java.util.Iterator;
17 import java.util.List;
18 
19 import org.apache.log4j.Logger;
20 
21 import games.stendhal.common.constants.Events;
22 import games.stendhal.common.parser.WordList;
23 import games.stendhal.server.core.engine.SingletonRepository;
24 import games.stendhal.server.core.engine.StendhalRPZone;
25 import games.stendhal.server.core.engine.transformer.PlayerTransformer;
26 import games.stendhal.server.entity.ActiveEntity;
27 import games.stendhal.server.entity.Entity;
28 import games.stendhal.server.entity.RPEntity;
29 import games.stendhal.server.entity.creature.Creature;
30 import games.stendhal.server.entity.item.Item;
31 import games.stendhal.server.entity.item.StackableItem;
32 import games.stendhal.server.entity.npc.ConversationStates;
33 import games.stendhal.server.entity.npc.NPC;
34 import games.stendhal.server.entity.npc.SpeakerNPC;
35 import games.stendhal.server.entity.player.Player;
36 import games.stendhal.server.entity.slot.PlayerSlot;
37 import games.stendhal.server.maps.MockStendhalRPRuleProcessor;
38 import games.stendhal.server.maps.MockStendlRPWorld;
39 import marauroa.common.game.RPClass;
40 import marauroa.common.game.RPEvent;
41 import marauroa.common.game.RPObject;
42 import marauroa.common.game.RPSlot;
43 import utilities.RPClass.ItemTestHelper;
44 
45 public abstract class PlayerTestHelper {
46 	private static Logger logger = Logger.getLogger(PlayerTestHelper.class);
47 
48 	/**
49 	 * Create a named player.
50 	 *
51 	 * @param name
52 	 * @return player
53 	 */
createPlayer(final String name)54 	public static Player createPlayer(final String name) {
55 		generatePlayerRPClasses();
56 
57 		final RPObject object = new RPObject();
58 		object.put("name", name);
59 		final Player pl = (Player) new PlayerTransformer().transform(object);
60 		final Iterator<RPEvent> eventsIterator = pl.eventsIterator();
61 		while(eventsIterator.hasNext()) {
62 			eventsIterator.next();
63 			eventsIterator.remove();
64 		}
65 
66 		pl.setName(name);
67 
68 		//addEmptySlots(pl);
69 
70 		return pl;
71 	}
72 
73 	/**
74 	 * Register a player in rule processor, world and zone.
75 	 *
76 	 * @param player
77 	 * @param zoneName
78 	 */
registerPlayer(final Player player, final String zoneName)79 	public static void registerPlayer(final Player player, final String zoneName) {
80 		registerPlayer(player, SingletonRepository.getRPWorld().getZone(zoneName));
81 	}
82 
83 	/**
84 	 * Register a player in rule processor, world and zone.
85 	 *
86 	 * @param player
87 	 * @param zone
88 	 */
registerPlayer(final Player player, final StendhalRPZone zone)89 	public static void registerPlayer(final Player player, final StendhalRPZone zone) {
90 		registerPlayer(player);
91 
92 		zone.add(player);
93 	}
94 
95 	/**
96 	 * Register a player in rule processor and world.
97 	 *
98 	 * @param player
99 	 */
registerPlayer(final Player player)100 	public static void registerPlayer(final Player player) {
101 		MockStendhalRPRuleProcessor.get().addPlayer(player);
102 
103 		MockStendlRPWorld.get().add(player);
104 	}
105 
createPlayerWithOutFit(final String name)106 	public static Player createPlayerWithOutFit(final String name) {
107 		final Player player = createPlayer(name);
108 
109 		player.setOutfit(1, 1, 1, 0, 0, 0, 1, 0, 0);
110 
111 		return player;
112 	}
113 
114 	/**
115 	 * Remove a player from rule processor, world and zone.
116 	 *
117 	 * @param player
118 	 * @param zone
119 	 */
unregisterPlayer(final Player player, final StendhalRPZone zone)120 	public static void unregisterPlayer(final Player player, final StendhalRPZone zone) {
121 		zone.remove(player);
122 		removePlayer(player);
123 	}
124 
125 	/**
126 	 * Remove a player from rule processor, world and zone.
127 	 *
128 	 * @param playerName
129 	 * @param zone
130 	 */
removePlayer(final String playerName, final StendhalRPZone zone)131 	public static void removePlayer(final String playerName, final StendhalRPZone zone) {
132 		final Player player = MockStendhalRPRuleProcessor.get().getPlayer(playerName);
133 
134 		if (player != null) {
135 			unregisterPlayer(player, zone);
136 		}
137 	}
138 
139 	/**
140 	 * Remove a player from rule processor, world and zone.
141 	 *
142 	 * @param playerName
143 	 * @param zoneName
144 	 */
removePlayer(final String playerName, final String zoneName)145 	public static void removePlayer(final String playerName, final String zoneName) {
146 		removePlayer(playerName, MockStendlRPWorld.get().getZone(zoneName));
147 	}
148 
149 	/**
150 	 * Remove a player from world and rule processor.
151 	 *
152 	 * @param playerName
153 	 */
removePlayer(final String playerName)154 	public static void removePlayer(final String playerName) {
155 		final Player player = MockStendhalRPRuleProcessor.get().getPlayer(playerName);
156 
157 		if (player != null) {
158 			removePlayer(player);
159 		}
160 	}
161 
162 	/**
163 	 * Remove a player from world and rule processor.
164 	 *
165 	 * @param player
166 	 */
removePlayer(final Player player)167 	public static void removePlayer(final Player player) {
168 		if (player != null) {
169 			final String name = player.getName();
170 
171 			MockStendlRPWorld.get().remove(player.getID());
172 			MockStendhalRPRuleProcessor.get().getOnlinePlayers().remove(player);
173 
174 			if (name != null) {
175 				WordList.getInstance().unregisterSubjectName(name);
176 			}
177 		}
178 	}
179 
180 	/**
181 	 * Remove all players from world and rule processor.
182 	 */
removeAllPlayers()183 	public static void removeAllPlayers() {
184 		MockStendhalRPRuleProcessor.get().clearPlayers();
185 	}
186 
187 	/**
188 	 * Equip the player with the given amount of money.
189 	 *
190 	 * @param player
191 	 * @param amount
192 	 * @return success flag
193 	 */
equipWithMoney(final Player player, final int amount)194 	public static boolean equipWithMoney(final Player player, final int amount) {
195 		return equipWithStackableItem(player, "money", amount);
196 	}
197 
198 	/**
199 	 * Equip the player with the given items.
200 	 *
201 	 * @param player
202 	 * @param clazz
203 	 * @return success flag
204 	 */
equipWithItem(final Player player, final String clazz)205 	public static boolean equipWithItem(final Player player, final String clazz) {
206 		ItemTestHelper.generateRPClasses();
207 		final Item item = SingletonRepository.getEntityManager().getItem(clazz);
208 
209 		return player.equipToInventoryOnly(item);
210 	}
211 
212 
213 	/**
214 	 * Equip the player with the given item and set the given item string.
215 	 *
216 	 * @param player
217 	 * @param clazz
218 	 * @param info
219 	 * @return success flag
220 	 */
equipWithItem(final Player player, final String clazz, final String info)221 	public static boolean equipWithItem(final Player player, final String clazz, final String info) {
222 		ItemTestHelper.generateRPClasses();
223 		final Item item = SingletonRepository.getEntityManager().getItem(clazz);
224 		item.setInfoString(info);
225 
226 		return player.equipToInventoryOnly(item);
227 	}
228 
229 	/**
230 	 * Equip the player with the given amount of items.
231 	 *
232 	 * @param player
233 	 * @param clazz
234 	 * @param amount
235 	 * @return success flag
236 	 */
equipWithStackableItem(final Player player, final String clazz, final int amount)237 	public static boolean equipWithStackableItem(final Player player, final String clazz, final int amount) {
238 		final StackableItem item = (StackableItem) SingletonRepository.getEntityManager().getItem(clazz);
239 		item.setQuantity(amount);
240 
241 		return player.equipToInventoryOnly(item);
242 	}
243 
244 	/**
245 	 *
246 	 * @param player
247 	 * @param clazz
248 	 * @param slot
249 	 * @return true if it could be equipped to slot, false otherwise
250 	 */
equipWithItemToSlot(final Player player, final String clazz, final String slot)251 	public static boolean equipWithItemToSlot(final Player player, final String clazz, final String slot) {
252 		ItemTestHelper.generateRPClasses();
253 		final Item item = SingletonRepository.getEntityManager().getItem(clazz);
254 		return player.equip(slot, item);
255 	}
256 
257 	/**
258 	 * Reset the conversation state of the NPC.
259 	 *
260 	 * @param npc
261 	 * 		SpeakerNPC
262 	 */
resetNPC(final SpeakerNPC npc)263 	public static void resetNPC(final SpeakerNPC npc) {
264 		if (npc != null) {
265 			npc.setCurrentState(ConversationStates.IDLE);
266 		}
267 	}
268 
269 	/**
270 	 * Reset the conversation state of the named NPC.
271 	 *
272 	 * @param npcName
273 	 * 		NPC string name
274 	 */
resetNPC(final String npcName)275 	public static void resetNPC(final String npcName) {
276 		resetNPC(SingletonRepository.getNPCList().get(npcName));
277 	}
278 
279 	/**
280 	 * Remove the named NPC.
281 	 *
282 	 * @param npcName
283 	 */
removeNPC(final String npcName)284 	public static void removeNPC(final String npcName) {
285 		SingletonRepository.getNPCList().remove(npcName);
286 	}
287 
addEmptySlots(final Player player)288 	public static void addEmptySlots(final Player player) {
289 		//		"bag", "rhand", "lhand", "head", "armor",
290 		//		"legs", "feet", "finger", "cloak", "keyring"
291 		player.addSlot(new PlayerSlot("bag"));
292 		player.addSlot(new PlayerSlot("lhand"));
293 		player.addSlot(new PlayerSlot("rhand"));
294 		player.addSlot(new PlayerSlot("armor"));
295 		player.addSlot(new PlayerSlot("head"));
296 		player.addSlot(new PlayerSlot("legs"));
297 		player.addSlot(new PlayerSlot("feet"));
298 		player.addSlot(new PlayerSlot("finger"));
299 		player.addSlot(new PlayerSlot("cloak"));
300 		player.addSlot(new PlayerSlot("keyring"));
301 		player.addSlot(new RPSlot("!quests"));
302 		player.getSlot("!quests").add(new RPObject());
303 		player.addSlot(new RPSlot("!kills"));
304 		player.getSlot("!kills").add(new RPObject());
305 		player.addSlot(new RPSlot("!tutorial"));
306 		player.getSlot("!tutorial").add(new RPObject());
307 		player.addSlot(new RPSlot("!visited"));
308 		player.getSlot("!visited").add(new RPObject());
309 	}
310 
generateEntityRPClasses()311 	public static void generateEntityRPClasses() {
312 		if (!RPClass.hasRPClass("entity")) {
313 			Entity.generateRPClass();
314 		}
315 
316 		if (!RPClass.hasRPClass("active_entity")) {
317 			ActiveEntity.generateRPClass();
318 		}
319 
320 		if (!RPClass.hasRPClass("rpentity")) {
321 			RPEntity.generateRPClass();
322 		}
323 	}
324 
generateNPCRPClasses()325 	public static void generateNPCRPClasses() {
326 		generateEntityRPClasses();
327 
328 		if (!RPClass.hasRPClass("npc")) {
329 			NPC.generateRPClass();
330 		}
331 	}
332 
generatePlayerRPClasses()333 	public static void generatePlayerRPClasses() {
334 		generateEntityRPClasses();
335 
336 		if (!RPClass.hasRPClass("player")) {
337 			Player.generateRPClass();
338 		}
339 	}
340 
generateCreatureRPClasses()341 	public static void generateCreatureRPClasses() {
342 		generateNPCRPClasses();
343 
344 		if (!RPClass.hasRPClass("creature")) {
345 			Creature.generateRPClass();
346 		}
347 	}
348 
dumpQuests(final Player player)349 	public static void dumpQuests(final Player player) {
350 		final List<String> quests = player.getQuests();
351 		for (final String quest : quests) {
352 			logger.info(quest + "=" + player.getQuest(quest));
353 		}
354 	}
355 
356 	/**
357 	 * Set the (order) time in a quest slot back the specified number of seconds.
358 	 * @param player
359 	 * @param questSlot
360 	 * @param index
361 	 * @param seconds
362 	 */
setPastTime(final Player player, final String questSlot, final int index, final long seconds)363 	public static void setPastTime(final Player player, final String questSlot, final int index, final long seconds) {
364 		final long pastTime = new Date().getTime() - seconds*1000;
365 
366 		player.setQuest(questSlot, index, Long.toString(pastTime));
367 	}
368 
369 	/**
370 	 * Query the player's events for private messages.
371 	 * @param player
372 	 * @return message text
373 	 */
getPrivateReply(final Player player)374 	public static String getPrivateReply(final Player player) {
375 		String reply = null;
376 
377 		for (final RPEvent event : player.events()) {
378 			if (event.getName().equals(Events.PRIVATE_TEXT)) {
379 				reply = event.get("text");
380 			}
381 		}
382 
383 		player.clearEvents();
384 
385 		return reply;
386 	}
387 }
388