@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { if (!mob.clans().iterator().hasNext()) { mob.tell(L("You aren't even a member of a clan.")); return false; } final Pair<Clan, Integer> clanPair = CMLib.clans().findPrivilegedClan(mob, Clan.Function.CLAN_BENEFITS); if (clanPair == null) { mob.tell(L("You are not authorized to draw from the power of your clan.")); return false; } final Clan C = clanPair.first; Room clanHomeRoom = null; clanHomeRoom = CMLib.map().getRoom(C.getRecall()); if (clanHomeRoom == null) { mob.tell(L("Your clan does not have a clan home.")); return false; } if (!CMLib.flags().canAccess(mob, clanHomeRoom)) { mob.tell(L("You can't use this magic to get there from here.")); return false; } if (!CMLib.law().doesOwnThisProperty(C.clanID(), clanHomeRoom)) { mob.tell(L("Your clan no longer owns that room.")); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg( mob, null, this, CMMsg.MASK_MOVE | verbalCastCode(mob, mob, auto), L("^S<S-NAME> invoke(s) a teleportation spell.^?")); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); final Set<MOB> h = properTargets(mob, givenTarget, false); if (h == null) return false; final Room thisRoom = mob.location(); for (final Object element : h) { final MOB follower = (MOB) element; final CMMsg enterMsg = CMClass.getMsg( follower, clanHomeRoom, this, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, L("<S-NAME> appears in a puff of red smoke.")); final CMMsg leaveMsg = CMClass.getMsg( follower, thisRoom, this, CMMsg.MSG_LEAVE | CMMsg.MASK_MAGIC, L("<S-NAME> disappear(s) in a puff of red smoke.")); if (thisRoom.okMessage(follower, leaveMsg) && clanHomeRoom.okMessage(follower, enterMsg)) { if (follower.isInCombat()) { CMLib.commands().postFlee(follower, ("NOWHERE")); follower.makePeace(false); } thisRoom.send(follower, leaveMsg); clanHomeRoom.bringMobHere(follower, false); clanHomeRoom.send(follower, enterMsg); follower.tell(L("\n\r\n\r")); CMLib.commands().postLook(follower, true); } } } } else beneficialWordsFizzle( mob, null, L("<S-NAME> attempt(s) to invoke transportation, but fizzle(s) the spell.")); // return whether it worked return success; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if ((auto || mob.isMonster()) && ((commands.size() < 1) || (((String) commands.firstElement()).equals(mob.name())))) { commands.clear(); if (mob.numItems() > 0) commands.addElement(mob.getRandomItem()); commands.addElement(CMLib.map().getRandomArea().Name()); } final Room oldRoom = mob.location(); if (commands.size() < 2) { mob.tell(L("Teleport what object to what place or person?")); return false; } final String objectName = (String) commands.firstElement(); final Item target = mob.findItem(null, objectName); if (target == null) { mob.tell(L("You don't seem to have an item '@x1'.", objectName)); return false; } if (target.amWearingAt(Wearable.IN_INVENTORY)) { mob.tell(L("You seem to be wearing or holding the item '@x1'.", objectName)); return false; } String searchWhat = null; if (commands.size() > 2) { final String s = (String) commands.elementAt(1); if (s.equalsIgnoreCase("room")) searchWhat = "R"; if (s.equalsIgnoreCase("area")) searchWhat = "E"; if (s.equalsIgnoreCase("mob")) searchWhat = "M"; if (s.equalsIgnoreCase("monster")) searchWhat = "M"; if (s.equalsIgnoreCase("player")) searchWhat = "P"; if (s.equalsIgnoreCase("user")) searchWhat = "P"; if (s.equalsIgnoreCase("item")) searchWhat = "I"; if (s.equalsIgnoreCase("object")) searchWhat = "I"; if (searchWhat != null) commands.removeElementAt(1); } if (searchWhat == null) searchWhat = "ERIPM"; final String destinationString = CMParms.combine(commands, 1).trim().toUpperCase(); final List<Room> candidates = CMLib.map().findWorldRoomsLiberally(mob, destinationString, searchWhat, 10, 600000); if (candidates.size() == 0) { mob.tell(L("You don't know of a place called '@x1'.", destinationString.toLowerCase())); return false; } if (CMLib.flags().isSitting(mob) || CMLib.flags().isSleeping(mob)) { mob.tell(L("You need to stand up!")); return false; } Room newRoom = null; int tries = 0; while ((tries < 20) && (newRoom == null)) { newRoom = candidates.get(CMLib.dice().roll(1, candidates.size(), -1)); if (((newRoom.roomID().length() == 0) && (CMLib.dice().rollPercentage() > 50)) || ((newRoom.domainType() == Room.DOMAIN_OUTDOORS_AIR) && (CMLib.dice().rollPercentage() > 10))) { newRoom = null; continue; } final CMMsg enterMsg = CMClass.getMsg( mob, newRoom, null, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, null); if (!newRoom.okMessage(mob, enterMsg)) newRoom = null; tries++; } if ((newRoom == null) || (newRoom == oldRoom)) { mob.tell(L("Your magic seems unable to send anything there.")); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); final CMMsg msg = CMClass.getMsg( mob, target, this, somanticCastCode(mob, target, auto), L("^S<S-NAME> invoke(s) a teleportation spell upon <T-NAME>.^?")); if (oldRoom.okMessage(mob, msg)) { oldRoom.send(mob, msg); newRoom.bringMobHere(mob, false); target.unWear(); success = CMLib.commands().postDrop(mob, target, true, false, false) && (!mob.isMine(target)); oldRoom.bringMobHere(mob, false); if (success) { oldRoom.show(mob, target, null, CMMsg.MSG_OK_VISUAL, L("<T-NAME> vanishes!")); newRoom.showOthers( mob, target, null, CMMsg.MSG_OK_VISUAL, L("<T-NAME> appear(s) out of nowhere!")); } else mob.tell(L("Nothing happens.")); } // return whether it worked return success; }