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