public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { Environmental openThis = null; String dir = ""; int dirCode = -1; Environmental E = null; if (commands.size() > 1) { dirCode = Directions.getGoodDirectionCode((String) commands.lastElement()); if (dirCode >= 0) { if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null) || (!mob.location().getExitInDir(dirCode).isOpen())) { mob.tell("You can't pull anything that way."); return false; } E = mob.location().getRoomInDir(dirCode); dir = " " + (((mob.location() instanceof SpaceShip) || (mob.location().getArea() instanceof SpaceShip)) ? Directions.getShipDirectionName(dirCode) : Directions.getDirectionName(dirCode)); commands.removeElementAt(commands.size() - 1); } } if (dir.length() == 0) { dirCode = Directions.getGoodDirectionCode((String) commands.lastElement()); if (dirCode >= 0) openThis = mob.location().getExitInDir(dirCode); } String itemName = CMParms.combine(commands, 1); if (openThis == null) openThis = mob.location().fetchFromRoomFavorItems(null, itemName); if (openThis == null) openThis = mob.location().fetchFromMOBRoomFavorsItems(mob, null, itemName, Wearable.FILTER_ANY); if ((openThis == null) || (!CMLib.flags().canBeSeenBy(openThis, mob))) { mob.tell("You don't see '" + itemName + "' here."); return false; } CMMsg msg = CMClass.getMsg(mob, openThis, E, CMMsg.MSG_PULL, "<S-NAME> pull(s) <T-NAME>" + dir + "."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); if ((dir.length() > 0) && (msg.tool() instanceof Room)) { Room R = (Room) msg.tool(); dirCode = CMLib.tracking().findRoomDir(mob, R); if ((dirCode >= 0) && (CMLib.tracking().walk(mob, dirCode, false, false, false, false))) { if (openThis instanceof Item) R.moveItemTo( (Item) openThis, ItemPossessor.Expire.Player_Drop, ItemPossessor.Move.Followers); else if (openThis instanceof MOB) CMLib.tracking() .walk((MOB) openThis, dirCode, ((MOB) openThis).isInCombat(), false, true, true); } } } return false; }
@Override public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (affected instanceof MOB)) { final MOB mob = (MOB) affected; if (!DATA.containsKey(mob)) DATA.put(mob, new int[DATA_TOTAL]); final int[] data = DATA.get(mob); if ((mob.session() != null) && (mob.session().getPreviousCMD() != null)) { if ((lastCommand != null) && (!CMParms.combine(mob.session().getPreviousCMD(), 0).equals(lastCommand))) { data[DATA_TYPEDCOMMAND]++; List<MOB> V = null; if (mob.session().getAddress() != null) V = IPS.get(mob.session().getAddress()); if (V != null) for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); if (M == mob) continue; if (M.session() == null) continue; if (!CMLib.flags().isInTheGame(M, true)) continue; final String hisLastCmd = CMParms.combine(mob.session().getPreviousCMD(), 0); final Archon_Multiwatch A = (Archon_Multiwatch) M.fetchEffect(ID()); if (A != null) { if ((A.lastCommand != null) && (!A.lastCommand.equals(hisLastCmd))) data[DATA_SYNCHROFOUND]++; break; } } } lastCommand = CMParms.combine(mob.session().getPreviousCMD(), 0); } } return true; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if (!(CMLib.intermud().imc2online())) { mob.tell(L("IMC2 is unavailable.")); return false; } commands.remove(0); if (commands.size() < 1) { IMC2Error(mob); return false; } final String str = (String) commands.get(0); if (!(CMLib.intermud().imc2online())) mob.tell(L("IMC2 is unavailable.")); else if (str.equalsIgnoreCase("list")) CMLib.intermud().giveIMC2MudList(mob); else if (str.equalsIgnoreCase("locate")) CMLib.intermud().i3locate(mob, CMParms.combine(commands, 1)); else if (str.equalsIgnoreCase("channels") && CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.IMC2)) CMLib.intermud().giveIMC2ChannelsList(mob); else if (str.equalsIgnoreCase("info")) CMLib.intermud().imc2mudInfo(mob, CMParms.combine(commands, 1)); else if (str.equalsIgnoreCase("restart") && CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.IMC2)) { try { mob.tell(CMLib.hosts().get(0).executeCommand("START IMC2")); } catch (final Exception e) { Log.errOut("IMC2Cmd", e); } } else IMC2Error(mob); return false; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 1) { mob.tell("Grow plants where?"); return false; } String areaName = CMParms.combine(commands, 0).trim().toUpperCase(); Room anyRoom = null; Room newRoom = null; try { List<Room> rooms = CMLib.map().findRooms(CMLib.map().rooms(), mob, areaName, true, 10); for (Room R : rooms) { anyRoom = R; if (R.domainType() == Room.DOMAIN_INDOORS_CAVE) { newRoom = R; break; } } } catch (NoSuchElementException e) { } if (newRoom == null) { if (anyRoom == null) mob.tell("You don't know of a place called '" + CMParms.combine(commands, 0) + "'."); else if ((anyRoom.domainType() & Room.INDOORS) == 0) mob.tell("There IS such a place, but it is outdoors, where your fungus will not grow."); else if ((anyRoom.domainType() == Room.DOMAIN_INDOORS_UNDERWATER) || (anyRoom.domainType() == Room.DOMAIN_INDOORS_WATERSURFACE)) mob.tell("There IS such a place, but it is on or in the water, so your magic would fail."); else mob.tell("There IS such a place, but it is not in a cave, so your magic would fail."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { CMMsg msg = CMClass.getMsg( mob, null, this, verbalCastCode(mob, null, auto), "^S<S-NAME> chant(s) about a far away place.^?"); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); Item newItem = Chant_SummonFungus.buildFungus(mob, newRoom); mob.tell("You feel a distant connection with " + newItem.name()); } } else beneficialWordsFizzle( mob, null, "<S-NAME> chant(s) about a far away place, but the magic fades."); // return whether it worked return success; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (commands != null) commands = new XVector(commands); if (!conCheck(mob, commands, givenTarget, auto, asLevel)) return false; Vector V = new Vector(); V.addElement(commands.elementAt(0)); MOB target = this.getTarget(mob, V, givenTarget); if (target == null) return false; commands.removeElementAt(0); int oldProficiency = proficiency(); if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; int levelDiff = ((mob.phyStats().level() + (2 * super.getXLEVELLevel(mob))) - target.phyStats().level()) * 10; if (levelDiff > 0) levelDiff = 0; boolean success = proficiencyCheck( mob, (mob.charStats().getStat(CharStats.STAT_CHARISMA) * 2) + levelDiff, auto); if (!success) { CMMsg msg = CMClass.getMsg( mob, target, this, CMMsg.MSG_SPEAK, "^T<S-NAME> tr(ys) to con <T-NAMESELF> to '" + CMParms.combine(commands, 0) + "', but <S-IS-ARE> unsuccessful.^?"); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); } else { CMMsg msg = CMClass.getMsg( mob, target, this, CMMsg.MSG_SPEAK, "^T<S-NAME> con(s) <T-NAMESELF> to '" + CMParms.combine(commands, 0) + "'.^?"); mob.recoverPhyStats(); CMMsg omsg = CMClass.getMsg(mob, target, null, CMMsg.MSG_ORDER, null); if ((mob.location().okMessage(mob, msg)) && (mob.location().okMessage(mob, omsg))) { mob.location().send(mob, msg); mob.location().send(mob, omsg); if (omsg.sourceMinor() == CMMsg.TYP_ORDER) target.enqueCommand(commands, Command.METAFLAG_FORCED | Command.METAFLAG_ORDER, 0); } target.recoverPhyStats(); } if (target == lastChecked) setProficiency(oldProficiency); lastChecked = target; return success; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { final StringBuilder msg = new StringBuilder(""); final Vector V = new Vector(); V.add(Integer.valueOf(Ability.ACODE_THIEF_SKILL)); V.add(Integer.valueOf(Ability.ACODE_SKILL)); V.add(Integer.valueOf(Ability.ACODE_COMMON_SKILL)); final String qual = CMParms.combine(commands, 1).toUpperCase(); if (parsedOutIndividualSkill(mob, qual, V)) return true; final int[] level = new int[1]; final int[] domain = new int[1]; final String[] domainName = new String[1]; domainName[0] = ""; level[0] = -1; parseDomainInfo(mob, commands, V, level, domain, domainName); int mask = Ability.ALL_ACODES; if (domain[0] >= 0) { mask = mask | Ability.ALL_DOMAINS; for (int v = 0; v < V.size(); v++) V.setElementAt(Integer.valueOf(((Integer) V.get(v)).intValue() + domain[0]), v); } if ((domain[0] >= 0) || (qual.length() == 0)) msg.append( L( "\n\r^HYour @x1skills:^? @x2", domainName[0].replace('_', ' '), getAbilities(mob, mob, V, mask, true, level[0]).toString())); if (!mob.isMonster()) mob.session().wraplessPrintln(msg.toString()); return false; }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if ((mob == null) || (mob.playerStats() == null)) return false; if (commands.size() < 2) { String pageBreak = (mob.playerStats().getPageBreak() != 0) ? ("" + mob.playerStats().getPageBreak()) : "Disabled"; mob.tell( "Change your page break to what? Your current page break setting is: " + pageBreak + ". Enter a number larger than 0 or 'disable'."); return false; } String newBreak = CMParms.combine(commands, 1); int newVal = mob.playerStats().getWrap(); if ((CMath.isInteger(newBreak)) && (CMath.s_int(newBreak) > 0)) newVal = CMath.s_int(newBreak); else if ("DISABLED".startsWith(newBreak.toUpperCase())) newVal = 0; else { mob.tell( "'" + newBreak + "' is not a valid setting. Enter a number larger than 0 or 'disable'."); return false; } mob.playerStats().setPageBreak(newVal); String pageBreak = (mob.playerStats().getPageBreak() != 0) ? ("" + mob.playerStats().getPageBreak()) : "Disabled"; mob.tell("Your new page break setting is: " + pageBreak + "."); return false; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { final String s = CMParms.combine(commands, 0); if (s.length() > 0) setMiscText(s); if (givenTarget != null) addMeIfNeccessary(mob, givenTarget, false, asLevel, maxTicks); return true; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { MOB target = CMLib.players().getLoadPlayer(CMParms.combine(commands, 0)); if (target == null) target = getTargetAnywhere(mob, commands, givenTarget, false, true, false); if (target == null) return false; final Archon_Record A = (Archon_Record) target.fetchEffect(ID()); if (A != null) { target.delEffect(A); if (target.playerStats() != null) target.playerStats().setLastUpdated(0); mob.tell(L("@x1 will no longer be recorded.", target.Name())); return true; } 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, target, this, CMMsg.MASK_MOVE | CMMsg.TYP_JUSTICE | (auto ? CMMsg.MASK_ALWAYS : 0), L("^F<S-NAME> begin(s) recording <T-NAMESELF>.^?")); CMLib.color().fixSourceFightColor(msg); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); final String filename = "/" + target.Name() + System.currentTimeMillis() + ".log"; final CMFile file = new CMFile(filename, null, CMFile.FLAG_LOGERRORS); if (!file.canWrite()) { if (!CMSecurity.isASysOp(mob) || (CMSecurity.isASysOp(target))) Log.sysOut("Record", mob.Name() + " failed to start recording " + target.name() + "."); } else { if (!CMSecurity.isASysOp(mob) || (CMSecurity.isASysOp(target))) Log.sysOut( "Record", mob.Name() + " started recording " + target.name() + " to /" + filename + "."); final Archon_Record A2 = (Archon_Record) copyOf(); final Session F = (Session) CMClass.getCommon("FakeSession"); F.initializeSession(null, Thread.currentThread().getThreadGroup().getName(), filename); if (target.session() == null) target.setSession(F); A2.sess = F; target.addNonUninvokableEffect(A2); mob.tell(L("Enter RECORD @x1 again to stop recording.", target.Name())); } } } else return beneficialVisualFizzle( mob, target, L("<S-NAME> attempt(s) to hush <T-NAMESELF>, but fail(s).")); return success; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if ((commands.size() == 1) && (commands.get(0) instanceof MOB)) { commands.add(getInventory((MOB) commands.get(0), mob, null)); return true; } final StringBuilder msg = getInventory(mob, mob, CMParms.combine(commands, 1)); if (msg.length() == 0) mob.tell(L("^HYou are carrying:\n\r^!Nothing!^?\n\r")); else if (!mob.isMonster()) mob.session().wraplessPrintln(L("^HYou are carrying:^?\n\r@x1", msg.toString())); return false; }
public boolean preInvoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel, int secondsElapsed, double actionsRemaining) { if (commands != null) commands = new XVector<String>(commands); if (!conCheck(mob, commands, givenTarget, auto, asLevel)) return false; Vector V = new Vector(); V.addElement(commands.get(0)); MOB target = this.getTarget(mob, V, givenTarget); if (target == null) return false; commands.remove(0); if (secondsElapsed > 0) { if ((secondsElapsed % 4) == 0) return mob.location() .show( mob, target, CMMsg.MSG_SPEAK, "^T<S-NAME> continue(s) conning <T-NAMESELF> to '" + CMParms.combine(commands, 0) + "'.^?"); return true; } CMMsg msg = CMClass.getMsg( mob, target, this, CMMsg.MSG_SPEAK, "^T<S-NAME> attempt(s) to con <T-NAMESELF> to '" + CMParms.combine(commands, 0) + "'.^?"); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); else return false; return true; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { Physical target = null; if (commands.size() > 0) { final String s = CMParms.combine(commands, 0); if (s.equalsIgnoreCase("room")) target = mob.location(); else if (s.equalsIgnoreCase("here")) target = mob.location(); else if (CMLib.english().containsString(mob.location().ID(), s) || CMLib.english().containsString(mob.location().name(), s) || CMLib.english().containsString(mob.location().displayText(), s)) target = mob.location(); } if (target == null) target = getTarget(mob, commands, givenTarget); if (target == null) return false; if ((target instanceof Room) && (target.fetchEffect(ID()) != null)) { mob.tell(L("This place is already under a teleportation ward.")); 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, target, this, verbalCastCode(mob, target, auto), auto ? L("<T-NAME> seem(s) magically protected.") : L("^S<S-NAME> invoke(s) a teleportation ward upon <T-NAMESELF>.^?")); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); if ((target instanceof Room) && (CMLib.law().doesOwnThisLand(mob, ((Room) target)))) { target.addNonUninvokableEffect((Ability) this.copyOf()); CMLib.database().DBUpdateRoom((Room) target); } else beneficialAffect(mob, target, asLevel, 0); } } else beneficialWordsFizzle( mob, target, L("<S-NAME> attempt(s) to invoke a teleportation ward, but fail(s).")); return success; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 3) { mob.tell( L("Specify a target, a property, number of ticks, and (optionally) some misc text!")); return false; } final Vector V = new XVector(commands.firstElement()); final Physical target = getAnyTarget(mob, V, givenTarget, Wearable.FILTER_ANY); if (target == null) return false; commands.removeElementAt(0); final String abilityStr = (String) commands.firstElement(); CMObject A = CMClass.getAbility(abilityStr); if (A == null) A = CMClass.getBehavior(abilityStr); if (A == null) A = CMClass.findAbility(abilityStr); if (A == null) A = CMClass.findBehavior(abilityStr); if (A == null) { mob.tell(L("No such ability or behavior as @x1!", abilityStr)); return false; } final String numTicks = ((String) commands.elementAt(1)).trim(); if ((!CMath.isInteger(numTicks)) || (CMath.s_int(numTicks) <= 0)) { mob.tell(L("'@x1' is not a number of ticks!", numTicks)); return false; } final String parms = CMParms.combine(commands, 2); if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; TemporaryAffects T = (TemporaryAffects) target.fetchEffect(ID()); if (T == null) { T = (TemporaryAffects) this.newInstance(); T.affects = new SVector<Object[]>(); T.startTickDown(mob, target, 10); T = (TemporaryAffects) target.fetchEffect(ID()); } if (T != null) { T.setMiscText("+" + A.ID() + " " + numTicks.trim() + " " + parms.trim()); T.makeLongLasting(); } return true; }
@Override public boolean execute(MOB mob, List<String> commands, int metaFlags) throws java.io.IOException { String parm = (commands.size() > 1) ? CMParms.combine(commands, 1) : ""; if ((mob.isAttributeSet(MOB.Attrib.AUTOASSIST) && (parm.length() == 0)) || (parm.equalsIgnoreCase("ON"))) { mob.setAttribute(MOB.Attrib.AUTOASSIST, false); mob.tell(L("Autoassist has been turned on.")); } else if ((!mob.isAttributeSet(MOB.Attrib.AUTOASSIST) && (parm.length() == 0)) || (parm.equalsIgnoreCase("OFF"))) { mob.setAttribute(MOB.Attrib.AUTOASSIST, true); mob.tell(L("Autoassist has been turned off.")); } else if (parm.length() > 0) { mob.tell( L( "Illegal @x1 argument: '@x2'. Try ON or OFF, or nothing to toggle.", getAccessWords()[0], parm)); } return false; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { final String whatToOpen = CMParms.combine(commands, 1); if (whatToOpen.length() == 0) { mob.tell(L("Open what?")); return false; } Environmental openThis = null; final int dirCode = Directions.getGoodDirectionCode(whatToOpen); if (dirCode >= 0) openThis = mob.location().getExitInDir(dirCode); if (openThis == null) openThis = mob.location().fetchFromMOBRoomItemExit(mob, null, whatToOpen, Wearable.FILTER_ANY); if ((openThis == null) || (!CMLib.flags().canBeSeenBy(openThis, mob))) { mob.tell(L("You don't see '@x1' here.", whatToOpen)); return false; } open(mob, openThis, whatToOpen, dirCode, false); return false; }
@Override public boolean execute(MOB mob, Vector<String> commands, int metaFlags) { String helpStr = CMParms.combine(commands, 1); if (CMLib.help().getArcHelpFile().size() == 0) { mob.tell("No archon help is available."); return false; } String thisTag = null; if (helpStr.length() == 0) { StringBuffer thisBuf = Resources.getFileResource("help/arc_help.txt", true); if (thisBuf != null) thisTag = thisBuf.toString(); } else thisTag = CMLib.help().getHelpText(helpStr, CMLib.help().getArcHelpFile(), mob); if (thisTag == null) { mob.tell( "No archon help is available on " + helpStr + " .\r\nEnter 'COMMANDS' for a command list, or 'TOPICS' for a complete list."); Log.errOut("Help: " + mob.name() + " wanted archon help on " + helpStr); } else if (!mob.isMonster()) mob.session().wraplessPrintln(thisTag); return false; }
protected void parseDomainInfo( MOB mob, Vector commands, Vector acodes, int[] level, int[] domain, String[] domainName) { level[0] = parseOutLevel(commands); final String qual = CMParms.combine(commands, 1).toUpperCase(); domain[0] = -1; if (qual.length() > 0) for (int i = 1; i < Ability.DOMAIN_DESCS.length; i++) if (Ability.DOMAIN_DESCS[i].replace('_', ' ').startsWith(qual)) { domain[0] = i << 5; break; } else if ((Ability.DOMAIN_DESCS[i].replace('_', ' ').indexOf('/') >= 0) && (Ability.DOMAIN_DESCS[i] .replace('_', ' ') .substring(Ability.DOMAIN_DESCS[i].indexOf('/') + 1) .startsWith(qual))) { domain[0] = i << 5; break; } if (domain[0] > 0) domainName[0] = Ability.DOMAIN_DESCS[domain[0] >> 5].toLowerCase(); if ((domain[0] < 0) && (qual.length() > 0)) { StringBuffer domains = new StringBuffer(""); domains.append("\n\rValid schools/domains are: "); for (int i = 1; i < Ability.DOMAIN_DESCS.length; i++) { boolean found = false; for (int a = 0; a < acodes.size(); a++) found = found || CMLib.ableMapper() .isDomainIncludedInAnyAbility(i << 5, ((Integer) acodes.get(a)).intValue()); if (found) domains.append(Ability.DOMAIN_DESCS[i].toLowerCase().replace('_', ' ') + ", "); } if (domains.toString().endsWith(", ")) domains = new StringBuffer(domains.substring(0, domains.length() - 2)); if (!mob.isMonster()) mob.session().wraplessPrintln(domains.toString() + "\n\r"); } else if (qual.length() > 0) domainName[0] += " "; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 2) { mob.tell(L("You must specify what to cast this on, and then what you want it to emote.")); return false; } final Vector<String> V = new Vector<String>(); V.addElement(commands.get(0)); final Item target = getTarget(mob, mob.location(), givenTarget, V, Wearable.FILTER_ANY); if (target == null) 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, target, this, verbalCastCode(mob, target, auto), null); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); mob.location() .show( mob, target, CMMsg.MSG_OK_ACTION, L("<T-NAME> @x1.", CMParms.combine(commands, 1))); } } else mob.location() .show( mob, target, CMMsg.MSG_OK_ACTION, L("<T-NAME> twitch(es) oddly, but does nothing more.")); // return whether it worked return success; }
public boolean invoke( MOB mob, Vector commands, Environmental givenTarget, boolean auto, int asLevel) { if (commands.size() < 1) { mob.tell("Create overgrowth where?"); return false; } String areaName = CMParms.combine(commands, 0).trim().toUpperCase(); Room anyRoom = null; Room newRoom = null; try { Vector rooms = CMLib.map().findRooms(CMLib.map().rooms(), mob, areaName, true, 10); for (Enumeration r = rooms.elements(); r.hasMoreElements(); ) { Room R = (Room) r.nextElement(); anyRoom = R; if ((R.domainType() & Room.INDOORS) == 0) { newRoom = R; break; } } } catch (NoSuchElementException e) { } if (newRoom == null) { if (anyRoom == null) mob.tell("You don't know of an place called '" + CMParms.combine(commands, 0) + "'."); else mob.tell("There IS such a place, but its not outdoors, so your magic would fail."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { CMMsg msg = CMClass.getMsg( mob, null, this, verbalCastCode(mob, null, auto), "^S<S-NAME> chant(s) about a far away place.^?"); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); Item newItem = null; if (newRoom.domainType() == Room.DOMAIN_INDOORS_CAVE) newItem = Chant_SummonFungus.buildFungus(mob, newRoom); else if ((newRoom.domainType() == Room.DOMAIN_OUTDOORS_UNDERWATER) || (newRoom.domainType() == Room.DOMAIN_OUTDOORS_WATERSURFACE)) newItem = Chant_SummonSeaweed.buildSeaweed(mob, newRoom); else if ((newRoom.domainType() == Room.DOMAIN_INDOORS_STONE) || (newRoom.domainType() == Room.DOMAIN_INDOORS_WOOD)) newItem = Chant_SummonHouseplant.buildHouseplant(mob, newRoom); else newItem = Chant_SummonPlants.buildPlant(mob, newRoom); mob.tell("You feel a distant connection with " + newItem.name()); } } else beneficialWordsFizzle( mob, null, "<S-NAME> chant(s) about a far away place, but the magic fades."); // return whether it worked return success; }
public boolean invoke( MOB mob, Vector commands, Environmental givenTarget, boolean auto, int asLevel) { if ((commands.size() < 1) && (givenTarget == null)) { mob.tell("Wizard Lock what?."); return false; } String targetName = CMParms.combine(commands, 0); Environmental target = null; int dirCode = Directions.getGoodDirectionCode(targetName); if (dirCode >= 0) target = mob.location().getExitInDir(dirCode); if (target == null) target = getTarget(mob, mob.location(), givenTarget, commands, Wearable.FILTER_ANY); if (target == null) return false; if ((!(target instanceof Container)) && (!(target instanceof Exit))) { mob.tell("You can't lock that."); return false; } if (target instanceof Container) { Container container = (Container) target; if ((!container.hasALid()) || (!container.hasALock())) { mob.tell("You can't lock that!"); return false; } } else if (target instanceof Exit) { Exit exit = (Exit) target; if (!exit.hasADoor()) { mob.tell("You can't lock that!"); return false; } } if (target.fetchEffect(this.ID()) != null) { mob.tell(target.name() + " is already magically locked!"); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { CMMsg msg = CMClass.getMsg( mob, target, this, verbalCastCode(mob, target, auto), auto ? "" : "^S<S-NAME> point(s) <S-HIS-HER> finger at <T-NAMESELF>, incanting.^?"); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); if (target instanceof Exit) { Exit exit = (Exit) target; exit.setDoorsNLocks( exit.hasADoor(), false, exit.defaultsClosed(), exit.hasALock(), true, exit.defaultsLocked()); Room R = mob.location(); Room R2 = null; for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) if (R.getExitInDir(d) == target) { R2 = R.getRoomInDir(d); break; } if ((CMLib.law().doesOwnThisProperty(mob, R)) || ((R2 != null) && (CMLib.law().doesOwnThisProperty(mob, R2)))) { target.addNonUninvokableEffect((Ability) copyOf()); CMLib.database().DBUpdateExits(R); } else beneficialAffect(mob, target, asLevel, Integer.MAX_VALUE / 2); mob.location().show(mob, target, CMMsg.MSG_OK_VISUAL, "<T-NAME> look(s) shut tight!"); } else if (target instanceof Container) { beneficialAffect(mob, target, asLevel, Integer.MAX_VALUE / 2); Container container = (Container) target; container.setLidsNLocks(container.hasALid(), false, container.hasALock(), true); mob.location().show(mob, target, CMMsg.MSG_OK_VISUAL, "<T-NAME> look(s) shut tight!"); } Ability lock = target.fetchEffect(ID()); if (lock != null) { lock.setMiscText(Integer.toString(mob.envStats().level())); if (target instanceof Exit) { Room R = mob.location(); if (!CMLib.law().doesHavePriviledgesHere(mob, R)) for (int a = 0; a < R.numEffects(); a++) if ((R.fetchEffect(a) instanceof LandTitle) && (((LandTitle) R.fetchEffect(a)).landOwner().length() > 0)) lock.setMiscText(lock.text() + " MALICIOUS"); } } } } else beneficialWordsFizzle( mob, target, "<S-NAME> point(s) at <T-NAMESELF>, incanting, but nothing happens."); // return whether it worked return success; }
@Override public int[] racialAbilityProficiencies() { return CMParms.combine(super.racialAbilityProficiencies(), racialAbilityProficiencies); }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { timeOut = 0; if (auto) return false; final Hashtable<String, String> H = getSongs(); if (commands.size() == 0) { final Song_Ode A = (Song_Ode) mob.fetchEffect(ID()); if ((A != null) && (A.whom != null) && (A.song == null)) { final String str = L("^S<S-NAME> finish(es) composing the @x1.^?", A.songOf()); final CMMsg msg = CMClass.getMsg( mob, null, this, (auto ? CMMsg.MASK_ALWAYS : 0) | CMMsg.MSG_DELICATE_SMALL_HANDS_ACT, str); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); mob.delEffect(A); getSongs().put(A.whom.name(), A.composition()); whom = null; return true; } return false; } final StringBuffer str = new StringBuffer(""); for (final Enumeration<String> e = H.keys(); e.hasMoreElements(); ) str.append(e.nextElement() + " "); mob.tell(L("Compose or sing an ode about whom?")); if (str.length() > 0) mob.tell(L("You presently have odes written about: @x1.", str.toString().trim())); return false; } String name = CMParms.combine(commands, 0); for (final Enumeration<String> e = H.keys(); e.hasMoreElements(); ) { final String key = e.nextElement(); if (CMLib.english().containsString(key, name)) { invoker = mob; originRoom = mob.location(); commonRoomSet = getInvokerScopeRoomSet(null); name = key; song = H.get(name); benefits = null; whom = mob.location().fetchInhabitant(name); if ((whom == null) || (!whom.name().equals(name))) whom = CMLib.players().getPlayer(name); if ((whom == null) || (!whom.name().equals(name))) { whom = CMClass.getMOB("StdMOB"); whom.setName(name); whom.setLocation(mob.location()); } return super.invoke(mob, commands, givenTarget, auto, asLevel); } } final MOB target = getTarget(mob, commands, givenTarget); if (target == null) return false; if (target == mob) { mob.tell(L("You may not compose an ode about yourself!")); return false; } final boolean success = proficiencyCheck(mob, 0, auto); if (success) { unsingAll(mob, mob); invoker = mob; originRoom = mob.location(); commonRoomSet = getInvokerScopeRoomSet(null); whom = target; final String str = L("^S<S-NAME> begin(s) to compose an @x1.^?", songOf()); final CMMsg msg = CMClass.getMsg( mob, null, this, (auto ? CMMsg.MASK_ALWAYS : 0) | CMMsg.MSG_DELICATE_SMALL_HANDS_ACT, str); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); invoker = mob; final Song_Ode newOne = (Song_Ode) copyOf(); newOne.whom = target; newOne.trail = new StringBuffer(""); newOne.song = null; mob.addEffect(newOne); } } else mob.location() .show(mob, null, CMMsg.MSG_NOISE, L("<S-NAME> lose(s) <S-HIS-HER> inspiration.")); return success; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { final Room R = mob.location(); boolean quiet = false; if ((commands != null) && (commands.size() > 1) && (((String) commands.lastElement()).equalsIgnoreCase("UNOBTRUSIVELY"))) { commands.remove(commands.size() - 1); quiet = true; } final String textMsg = "<S-NAME> look(s) "; if (R == null) return false; if ((commands != null) && (commands.size() > 1)) { Environmental thisThang = null; if ((commands.size() > 2) && (((String) commands.get(1)).equalsIgnoreCase("at"))) commands.remove(1); else if ((commands.size() > 2) && (((String) commands.get(1)).equalsIgnoreCase("to"))) commands.remove(1); final String ID = CMParms.combine(commands, 1); if ((ID.toUpperCase().startsWith("EXIT") && (commands.size() == 2)) && (CMProps.getIntVar(CMProps.Int.EXVIEW) != 1)) { final CMMsg exitMsg = CMClass.getMsg(mob, R, null, CMMsg.MSG_LOOK_EXITS, null); if ((CMProps.getIntVar(CMProps.Int.EXVIEW) >= 2) != mob.isAttribute(MOB.Attrib.BRIEF)) exitMsg.setValue(CMMsg.MASK_OPTIMIZE); if (R.okMessage(mob, exitMsg)) R.send(mob, exitMsg); return false; } if (ID.equalsIgnoreCase("SELF") || ID.equalsIgnoreCase("ME")) thisThang = mob; if (thisThang == null) thisThang = R.fetchFromMOBRoomFavorsItems(mob, null, ID, noCoinFilter); if (thisThang == null) thisThang = R.fetchFromMOBRoomFavorsItems(mob, null, ID, Wearable.FILTER_ANY); if ((thisThang == null) && (commands.size() > 2) && (((String) commands.get(1)).equalsIgnoreCase("in"))) { commands.remove(1); final String ID2 = CMParms.combine(commands, 1); thisThang = R.fetchFromMOBRoomFavorsItems(mob, null, ID2, Wearable.FILTER_ANY); if ((thisThang != null) && ((!(thisThang instanceof Container)) || (((Container) thisThang).capacity() == 0))) { mob.tell(L("That's not a container.")); return false; } } int dirCode = -1; Environmental lookingTool = null; if (thisThang == null) { dirCode = Directions.getGoodDirectionCode(ID); if (dirCode >= 0) { final Room room = R.getRoomInDir(dirCode); final Exit exit = R.getExitInDir(dirCode); if ((room != null) && (exit != null)) { thisThang = exit; lookingTool = room; } else { mob.tell(L("You don't see anything that way.")); return false; } } } if (thisThang != null) { String name = "at <T-NAMESELF>"; if ((thisThang instanceof Room) || (thisThang instanceof Exit)) { if (thisThang == R) name = "around"; else if (dirCode >= 0) name = ((R instanceof BoardableShip) || (R.getArea() instanceof BoardableShip)) ? Directions.getShipDirectionName(dirCode) : Directions.getDirectionName(dirCode); } final CMMsg msg = CMClass.getMsg(mob, thisThang, lookingTool, CMMsg.MSG_LOOK, textMsg + name + "."); if ((thisThang instanceof Room) && (mob.isAttribute(MOB.Attrib.AUTOEXITS)) && (CMProps.getIntVar(CMProps.Int.EXVIEW) != 1)) { final CMMsg exitMsg = CMClass.getMsg(mob, thisThang, lookingTool, CMMsg.MSG_LOOK_EXITS, null); if ((CMProps.getIntVar(CMProps.Int.EXVIEW) >= 2) != mob.isAttribute(MOB.Attrib.BRIEF)) exitMsg.setValue(CMMsg.MASK_OPTIMIZE); msg.addTrailerMsg(exitMsg); } if (R.okMessage(mob, msg)) R.send(mob, msg); } else mob.tell(L("You don't see that here!")); } else { if ((commands != null) && (commands.size() > 0)) if (((String) commands.get(0)).toUpperCase().startsWith("E")) { mob.tell(L("Examine what?")); return false; } final CMMsg msg = CMClass.getMsg( mob, R, null, CMMsg.MSG_LOOK, (quiet ? null : textMsg + "around."), CMMsg.MSG_LOOK, (quiet ? null : textMsg + "at you."), CMMsg.MSG_LOOK, (quiet ? null : textMsg + "around.")); if ((mob.isAttribute(MOB.Attrib.AUTOEXITS)) && (CMProps.getIntVar(CMProps.Int.EXVIEW) != 1) && (CMLib.flags().canBeSeenBy(R, mob))) { final CMMsg exitMsg = CMClass.getMsg(mob, R, null, CMMsg.MSG_LOOK_EXITS, null); if ((CMProps.getIntVar(CMProps.Int.EXVIEW) >= 2) != mob.isAttribute(MOB.Attrib.BRIEF)) exitMsg.setValue(CMMsg.MASK_OPTIMIZE); msg.addTrailerMsg(exitMsg); } if (R.okMessage(mob, msg)) R.send(mob, msg); } return false; }
public boolean invoke( MOB mob, Vector commands, Environmental givenTarget, boolean auto, int asLevel) { int autoGenerate = 0; if ((auto) && (givenTarget == this) && (commands.size() > 0) && (commands.firstElement() instanceof Integer)) { autoGenerate = ((Integer) commands.firstElement()).intValue(); commands.removeElementAt(0); givenTarget = null; } DVector enhancedTypes = enhancedTypes(mob, commands); randomRecipeFix(mob, addRecipes(mob, loadRecipes()), commands, autoGenerate); if (commands.size() == 0) { commonTell( mob, "Knit what? Enter \"knit list\" for a list, \"knit refit <item>\" to resize, \"knit scan\", or \"knit mend <item>\"."); return false; } if ((!auto) && (commands.size() > 0) && (((String) commands.firstElement()).equalsIgnoreCase("bundle"))) { bundling = true; if (super.invoke(mob, commands, givenTarget, auto, asLevel)) return super.bundle(mob, commands); return false; } Vector recipes = addRecipes(mob, loadRecipes()); String str = (String) commands.elementAt(0); String startStr = null; bundling = false; int duration = 4; if (str.equalsIgnoreCase("list")) { String mask = CMParms.combine(commands, 1); StringBuffer buf = new StringBuffer(""); int toggler = 1; int toggleTop = 2; for (int r = 0; r < toggleTop; r++) buf.append(CMStrings.padRight("Item", 28) + " Lvl " + CMStrings.padRight("Cloth", 5) + " "); buf.append("\n\r"); for (int r = 0; r < recipes.size(); r++) { Vector V = (Vector) recipes.elementAt(r); if (V.size() > 0) { String item = replacePercent((String) V.elementAt(RCP_FINALNAME), ""); int level = CMath.s_int((String) V.elementAt(RCP_LEVEL)); int wood = CMath.s_int((String) V.elementAt(RCP_WOOD)); wood = adjustWoodRequired(wood, mob); if ((level <= xlevel(mob)) && ((mask == null) || (mask.length() == 0) || mask.equalsIgnoreCase("all") || CMLib.english().containsString(item, mask))) { buf.append( CMStrings.padRight(item, 28) + " " + CMStrings.padRight("" + level, 3) + " " + CMStrings.padRight("" + wood, 5) + ((toggler != toggleTop) ? " " : "\n\r")); if (++toggler > toggleTop) toggler = 1; } } } if (toggler != 1) buf.append("\n\r"); commonTell(mob, buf.toString()); enhanceList(mob); return true; } if (str.equalsIgnoreCase("scan")) return publicScan(mob, commands); else if (str.equalsIgnoreCase("mend")) { building = null; mending = false; messedUp = false; Vector newCommands = CMParms.parse(CMParms.combine(commands, 1)); building = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (!canMend(mob, building, false)) return false; mending = true; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = "<S-NAME> start(s) mending " + building.name() + "."; displayText = "You are mending " + building.name(); verb = "mending " + building.name(); } else if (str.equalsIgnoreCase("refit")) { building = null; mending = false; refitting = false; messedUp = false; Vector newCommands = CMParms.parse(CMParms.combine(commands, 1)); building = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (building == null) return false; if ((building.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_CLOTH) { commonTell(mob, "That's not made of cloth. It can't be refitted."); return false; } if (!(building instanceof Armor)) { commonTell(mob, "You don't know how to refit that sort of thing."); return false; } if (building.envStats().height() == 0) { commonTell(mob, building.name() + " is already the right size."); return false; } refitting = true; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = "<S-NAME> start(s) refitting " + building.name() + "."; displayText = "You are refitting " + building.name(); verb = "refitting " + building.name(); } else { building = null; mending = false; messedUp = false; refitting = false; aborted = false; int amount = -1; if ((commands.size() > 1) && (CMath.isNumber((String) commands.lastElement()))) { amount = CMath.s_int((String) commands.lastElement()); commands.removeElementAt(commands.size() - 1); } String recipeName = CMParms.combine(commands, 0); Vector foundRecipe = null; Vector matches = matchingRecipeNames(recipes, recipeName, true); for (int r = 0; r < matches.size(); r++) { Vector V = (Vector) matches.elementAt(r); if (V.size() > 0) { int level = CMath.s_int((String) V.elementAt(RCP_LEVEL)); if ((autoGenerate > 0) || (level <= xlevel(mob))) { foundRecipe = V; break; } } } if (foundRecipe == null) { commonTell( mob, "You don't know how to knit a '" + recipeName + "'. Try \"" + triggerStrings()[0].toLowerCase() + " list\" for a list."); return false; } int woodRequired = CMath.s_int((String) foundRecipe.elementAt(RCP_WOOD)); woodRequired = adjustWoodRequired(woodRequired, mob); if (amount > woodRequired) woodRequired = amount; String misctype = (String) foundRecipe.elementAt(RCP_MISCTYPE); bundling = misctype.equalsIgnoreCase("BUNDLE"); int[] pm = {RawMaterial.MATERIAL_CLOTH}; int[][] data = fetchFoundResourceData( mob, woodRequired, "cloth", pm, 0, null, null, bundling, autoGenerate, enhancedTypes); if (data == null) return false; woodRequired = data[0][FOUND_AMT]; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; int lostValue = autoGenerate > 0 ? 0 : CMLib.materials() .destroyResources(mob.location(), woodRequired, data[0][FOUND_CODE], 0, null); building = CMClass.getItem((String) foundRecipe.elementAt(RCP_CLASSTYPE)); if (building == null) { commonTell( mob, "There's no such thing as a " + foundRecipe.elementAt(RCP_CLASSTYPE) + "!!!"); return false; } duration = getDuration( CMath.s_int((String) foundRecipe.elementAt(RCP_TICKS)), mob, CMath.s_int((String) foundRecipe.elementAt(RCP_LEVEL)), 4); String itemName = replacePercent( (String) foundRecipe.elementAt(RCP_FINALNAME), RawMaterial.CODES.NAME(data[0][FOUND_CODE])) .toLowerCase(); if (bundling) itemName = "a " + woodRequired + "# " + itemName; else if (itemName.endsWith("s")) itemName = "some " + itemName; else itemName = CMLib.english().startWithAorAn(itemName); building.setName(itemName); startStr = "<S-NAME> start(s) knitting " + building.name() + "."; displayText = "You are knitting " + building.name(); verb = "knitting " + building.name(); playSound = "scissor.wav"; building.setDisplayText(itemName + " lies here"); building.setDescription(itemName + ". "); if (bundling) building.baseEnvStats().setWeight(woodRequired); else building.baseEnvStats().setWeight(woodRequired / 2); int hardness = RawMaterial.CODES.HARDNESS(data[0][FOUND_CODE]) - 1; building.setBaseValue(CMath.s_int((String) foundRecipe.elementAt(RCP_VALUE))); building.setMaterial(data[0][FOUND_CODE]); building.baseEnvStats().setLevel(CMath.s_int((String) foundRecipe.elementAt(RCP_LEVEL))); building.setSecretIdentity("This is the work of " + mob.Name() + "."); int capacity = CMath.s_int((String) foundRecipe.elementAt(RCP_CAPACITY)); int canContain = CMath.s_int((String) foundRecipe.elementAt(RCP_CONTAINMASK)); int armordmg = CMath.s_int((String) foundRecipe.elementAt(RCP_ARMORDMG)); String spell = (foundRecipe.size() > RCP_SPELL) ? ((String) foundRecipe.elementAt(RCP_SPELL)).trim() : ""; if (bundling) building.setBaseValue(lostValue); addSpells(building, spell); if (building instanceof Weapon) { ((Weapon) building).setWeaponClassification(Weapon.CLASS_NATURAL); setWeaponTypeClass((Weapon) building, misctype); building.baseEnvStats().setDamage(armordmg); ((Weapon) building).setRawProperLocationBitmap(Wearable.WORN_WIELD | Wearable.WORN_HELD); ((Weapon) building).setRawLogicalAnd((capacity > 1)); } if (building instanceof Armor) { if (capacity > 0) { ((Armor) building).setCapacity(capacity + woodRequired); ((Armor) building).setContainTypes(canContain); } ((Armor) building).baseEnvStats().setArmor(0); if (armordmg != 0) ((Armor) building).baseEnvStats().setArmor(armordmg + (abilityCode() - 1) + hardness); setWearLocation(building, misctype, 0); } if (building instanceof Rideable) { setRideBasis((Rideable) building, misctype); } building.recoverEnvStats(); building.text(); building.recoverEnvStats(); } messedUp = !proficiencyCheck(mob, 0, auto); if (bundling) { messedUp = false; duration = 1; verb = "bundling " + RawMaterial.CODES.NAME(building.material()).toLowerCase(); startStr = "<S-NAME> start(s) " + verb + "."; displayText = "You are " + verb; } if (autoGenerate > 0) { commands.addElement(building); return true; } CMMsg msg = CMClass.getMsg(mob, building, this, CMMsg.MSG_NOISYMOVEMENT, startStr); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); building = (Item) msg.target(); beneficialAffect(mob, mob, asLevel, duration); enhanceItem(mob, building, enhancedTypes); } else if (bundling) { messedUp = false; aborted = false; unInvoke(); } return true; }
@Override protected boolean autoGenInvoke( final MOB mob, List<String> commands, Physical givenTarget, final boolean auto, final int asLevel, int autoGenerate, boolean forceLevels, List<Item> crafted) { if (super.checkStop(mob, commands)) return true; if (super.checkInfo(mob, commands)) return true; final PairVector<EnhancedExpertise, Integer> enhancedTypes = enhancedTypes(mob, commands); randomRecipeFix(mob, addRecipes(mob, loadRecipes()), commands, autoGenerate); if (commands.size() == 0) { commonTell( mob, L( "Make what? Enter \"mleatherwork list\" for a list, \"mleatherworkd info <item>\", \"mleatherwork refit <item>\" to resize," + " \"mleatherwork learn <item>\", \"mleatherwork scan\", \"mleatherwork mend <item>\", or \"mleatherwork stop\" to cancel.")); return false; } if ((!auto) && (commands.size() > 0) && ((commands.get(0)).equalsIgnoreCase("bundle"))) { bundling = true; if (super.invoke(mob, commands, givenTarget, auto, asLevel)) return super.bundle(mob, commands); return false; } final List<List<String>> recipes = addRecipes(mob, loadRecipes()); final String str = commands.get(0); playSound = "scissor.wav"; String startStr = null; bundling = false; int multiplier = 4; int duration = 4; if (str.equalsIgnoreCase("list")) { String mask = CMParms.combine(commands, 1); boolean allFlag = false; if (mask.equalsIgnoreCase("all")) { allFlag = true; mask = ""; } final StringBuffer buf = new StringBuffer(""); int toggler = 1; final int toggleTop = 2; final int[] cols = { CMLib.lister().fixColWidth(30, mob.session()), CMLib.lister().fixColWidth(3, mob.session()), CMLib.lister().fixColWidth(3, mob.session()) }; for (int r = 0; r < toggleTop; r++) buf.append( (r > 0 ? " " : "") + CMStrings.padRight(L("Item"), cols[0]) + " " + CMStrings.padRight(L("Lvl"), cols[1]) + " " + CMStrings.padRight(L("Amt"), cols[2])); buf.append("\n\r"); for (int r = 0; r < recipes.size(); r++) { final List<String> V = recipes.get(r); if (V.size() > 0) { final String item = replacePercent(V.get(RCP_FINALNAME), ""); final int level = CMath.s_int(V.get(RCP_LEVEL)); final String wood = getComponentDescription(mob, V, RCP_WOOD); if (wood.length() > 5) { if (toggler > 1) buf.append("\n\r"); toggler = toggleTop; } if (((level <= xlevel(mob)) || allFlag) && ((mask.length() == 0) || mask.equalsIgnoreCase("all") || CMLib.english().containsString(item, mask))) { buf.append( CMStrings.padRight(item, cols[0]) + " " + CMStrings.padRight("" + (level), cols[1]) + " " + CMStrings.padRightPreserve("" + wood, cols[2]) + ((toggler != toggleTop) ? " " : "\n\r")); if (++toggler > toggleTop) toggler = 1; } } } if (toggler != 1) buf.append("\n\r"); commonTell(mob, buf.toString()); enhanceList(mob); return true; } else if (((commands.get(0))).equalsIgnoreCase("learn")) { return doLearnRecipe(mob, commands, givenTarget, auto, asLevel); } else if (str.equalsIgnoreCase("scan")) return publicScan(mob, commands); else if (str.equalsIgnoreCase("mend")) { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; final Vector<String> newCommands = CMParms.parse(CMParms.combine(commands, 1)); buildingI = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (!canMend(mob, buildingI, false)) return false; activity = CraftingActivity.MENDING; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = L("<S-NAME> start(s) mending @x1.", buildingI.name()); displayText = L("You are mending @x1", buildingI.name()); verb = L("mending @x1", buildingI.name()); } else if (str.equalsIgnoreCase("refit")) { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; final Vector<String> newCommands = CMParms.parse(CMParms.combine(commands, 1)); buildingI = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (buildingI == null) return false; if ((buildingI.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_LEATHER) { commonTell(mob, L("That's not made of leather. That can't be refitted.")); return false; } if (!(buildingI instanceof Armor)) { commonTell(mob, L("You don't know how to refit that sort of thing.")); return false; } if (buildingI.phyStats().height() == 0) { commonTell(mob, L("@x1 is already the right size.", buildingI.name(mob))); return false; } activity = CraftingActivity.REFITTING; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = L("<S-NAME> start(s) refitting @x1.", buildingI.name()); displayText = L("You are refitting @x1", buildingI.name()); verb = L("refitting @x1", buildingI.name()); } else { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; aborted = false; int amount = -1; if ((commands.size() > 1) && (CMath.isNumber(commands.get(commands.size() - 1)))) { amount = CMath.s_int(commands.get(commands.size() - 1)); commands.remove(commands.size() - 1); } final String recipeName = CMParms.combine(commands, 0); List<String> foundRecipe = null; final List<List<String>> matches = matchingRecipeNames(recipes, recipeName, true); for (int r = 0; r < matches.size(); r++) { final List<String> V = matches.get(r); if (V.size() > 0) { final String name = V.get(RCP_FINALNAME); final int level = CMath.s_int(V.get(RCP_LEVEL)); if (level <= xlevel(mob)) { final int x = name.indexOf(' '); final Stage stage = Stage.valueOf(name.substring(0, x)); multiplier = stage.multiplier; foundRecipe = V; break; } } } if (foundRecipe == null) { commonTell( mob, L( "You don't know how to make a '@x1'. Try \"mleatherwork list\" for a list.", recipeName)); return false; } final String woodRequiredStr = foundRecipe.get(RCP_WOOD); final int[] compData = new int[CF_TOTAL]; final List<Object> componentsFoundList = getAbilityComponents( mob, woodRequiredStr, "make " + CMLib.english().startWithAorAn(recipeName), autoGenerate, compData); if (componentsFoundList == null) return false; int woodRequired = CMath.s_int(woodRequiredStr); woodRequired = adjustWoodRequired(woodRequired, mob); if (amount > woodRequired) woodRequired = amount; final int[] pm = {RawMaterial.MATERIAL_LEATHER}; final int[] pm1 = {RawMaterial.MATERIAL_METAL, RawMaterial.MATERIAL_MITHRIL}; final String misctype = foundRecipe.get(RCP_MISCTYPE); bundling = misctype.equalsIgnoreCase("BUNDLE"); final int[][] data = fetchFoundResourceData( mob, woodRequired, "leather", pm, (multiplier == 6) ? 1 : 0, (multiplier == 6) ? "metal" : null, (multiplier == 6) ? pm1 : null, bundling, autoGenerate, enhancedTypes); if (data == null) return false; fixDataForComponents(data, componentsFoundList); woodRequired = data[0][FOUND_AMT]; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final int lostValue = autoGenerate > 0 ? 0 : CMLib.materials() .destroyResourcesValue( mob.location(), woodRequired, data[0][FOUND_CODE], data[1][FOUND_CODE], null) + CMLib.ableComponents().destroyAbilityComponents(componentsFoundList); buildingI = CMClass.getItem(foundRecipe.get(RCP_CLASSTYPE)); if (buildingI == null) { commonTell(mob, L("There's no such thing as a @x1!!!", foundRecipe.get(RCP_CLASSTYPE))); return false; } duration = getDuration(multiplier * CMath.s_int(foundRecipe.get(RCP_TICKS)), mob, 30, 4); buildingI.setMaterial(super.getBuildingMaterial(woodRequired, data, compData)); String itemName = (replacePercent( foundRecipe.get(RCP_FINALNAME), RawMaterial.CODES.NAME(data[0][FOUND_CODE]))) .toLowerCase(); if (bundling) itemName = "a " + woodRequired + "# " + itemName; else if (itemName.endsWith("s")) itemName = "some " + itemName; else itemName = CMLib.english().startWithAorAn(itemName); buildingI.setName(itemName); startStr = L("<S-NAME> start(s) making @x1.", buildingI.name()); displayText = L("You are making @x1", buildingI.name()); verb = L("making @x1", buildingI.name()); buildingI.setDisplayText(L("@x1 lies here", itemName)); buildingI.setDescription(itemName + ". "); buildingI .basePhyStats() .setWeight(getStandardWeight(woodRequired + compData[CF_AMOUNT], bundling)); buildingI.setBaseValue(CMath.s_int(foundRecipe.get(RCP_VALUE)) * multiplier); buildingI.setSecretIdentity(getBrand(mob)); final int hardness = RawMaterial.CODES.HARDNESS(buildingI.material()) - 2; buildingI.basePhyStats().setLevel(CMath.s_int(foundRecipe.get(RCP_LEVEL)) + hardness); final int capacity = CMath.s_int(foundRecipe.get(RCP_CAPACITY)); final long canContain = getContainerType(foundRecipe.get(RCP_CONTAINMASK)); int armordmg = CMath.s_int(foundRecipe.get(RCP_ARMORDMG)); if (armordmg != 0) armordmg = armordmg + (multiplier - 1); if (bundling) buildingI.setBaseValue(lostValue); final String spell = (foundRecipe.size() > RCP_SPELL) ? foundRecipe.get(RCP_SPELL).trim() : ""; addSpells(buildingI, spell); if (buildingI instanceof Weapon) { ((Weapon) buildingI) .basePhyStats() .setAttackAdjustment(baseYield() + abilityCode() + (hardness * 5) - 1); ((Weapon) buildingI).setWeaponClassification(Weapon.CLASS_FLAILED); setWeaponTypeClass((Weapon) buildingI, misctype, Weapon.TYPE_SLASHING); buildingI.basePhyStats().setDamage(armordmg + hardness); ((Weapon) buildingI).setRawProperLocationBitmap(Wearable.WORN_WIELD | Wearable.WORN_HELD); ((Weapon) buildingI).setRawLogicalAnd((capacity > 1)); } if ((buildingI instanceof Armor) && (!(buildingI instanceof FalseLimb))) { if ((capacity > 0) && (buildingI instanceof Container)) { ((Container) buildingI).setCapacity(capacity + woodRequired); ((Container) buildingI).setContainTypes(canContain); } ((Armor) buildingI).basePhyStats().setArmor(0); if (armordmg != 0) ((Armor) buildingI) .basePhyStats() .setArmor(armordmg + (baseYield() + abilityCode() - 1) + hardness); setWearLocation(buildingI, misctype, 0); } if (buildingI instanceof Drink) { if (CMLib.flags().isGettable(buildingI)) { ((Drink) buildingI).setLiquidRemaining(0); ((Drink) buildingI).setLiquidHeld(capacity * 50); ((Drink) buildingI).setThirstQuenched(250); if ((capacity * 50) < 250) ((Drink) buildingI).setThirstQuenched(capacity * 50); } } buildingI.recoverPhyStats(); buildingI.text(); buildingI.recoverPhyStats(); } messedUp = !proficiencyCheck(mob, 0, auto); if (bundling) { messedUp = false; duration = 1; verb = L("bundling @x1", RawMaterial.CODES.NAME(buildingI.material()).toLowerCase()); startStr = L("<S-NAME> start(s) @x1.", verb); displayText = L("You are @x1", verb); } if (autoGenerate > 0) { crafted.add(buildingI); return true; } final CMMsg msg = CMClass.getMsg(mob, buildingI, this, getActivityMessageType(), startStr); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); buildingI = (Item) msg.target(); beneficialAffect(mob, mob, asLevel, duration); enhanceItem(mob, buildingI, enhancedTypes); } else if (bundling) { messedUp = false; aborted = false; unInvoke(); } return true; }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if (mob.location().numInhabitants() == 1) { mob.tell("You will need to find someone to teach you first."); return false; } if (commands.size() == 1) { mob.tell("Learn what? Enter QUALIFY or TRAIN to see what you can learn."); return false; } commands.removeElementAt(0); String teacherName = ""; if (commands.size() > 1) { teacherName = " " + (String) commands.lastElement(); if (teacherName.length() > 1) { commands.removeElementAt(commands.size() - 1); if ((commands.size() > 1) && (((String) commands.lastElement()).equalsIgnoreCase("FROM"))) commands.removeElementAt(commands.size() - 1); } else teacherName = ""; } String what = CMParms.combine(commands, 0); Vector V = Train.getAllPossibleThingsToTrainFor(); if (V.contains(what.toUpperCase().trim())) { Vector CC = CMParms.makeVector("SAY", "I would like to be trained in " + what); mob.doCommand(CC, metaFlags); if (teacherName.length() > 0) commands.addElement(teacherName.trim()); Command C = CMClass.getCommand("TRAIN"); if (C != null) C.execute(mob, commands, metaFlags); return true; } if (CMClass.findAbility(what + teacherName, mob) != null) { Vector CC = CMParms.makeVector("SAY", "I would like you to teach me " + what); mob.doCommand(CC, metaFlags); return true; } ExpertiseLibrary.ExpertiseDefinition theExpertise = null; Vector V2 = CMLib.expertises().myListableExpertises(mob); for (Enumeration e = V2.elements(); e.hasMoreElements(); ) { ExpertiseLibrary.ExpertiseDefinition def = (ExpertiseLibrary.ExpertiseDefinition) e.nextElement(); if ((def.name.equalsIgnoreCase(what + teacherName) || def.name.equalsIgnoreCase(what)) || (def.name.toLowerCase().startsWith((what + teacherName).toLowerCase()) && (CMath.isRomanNumeral(def.name.substring((what + teacherName).length()).trim()) || CMath.isNumber(def.name.substring((what + teacherName).length()).trim()))) || (def.name.toLowerCase().startsWith((what).toLowerCase()) && (CMath.isRomanNumeral(def.name.substring((what).length()).trim()) || CMath.isNumber(def.name.substring((what).length()).trim())))) { theExpertise = def; break; } } if (theExpertise == null) for (Enumeration e = CMLib.expertises().definitions(); e.hasMoreElements(); ) { ExpertiseLibrary.ExpertiseDefinition def = (ExpertiseLibrary.ExpertiseDefinition) e.nextElement(); if ((def.name.equalsIgnoreCase(what + teacherName) || def.name.equalsIgnoreCase(what))) { theExpertise = def; break; } } if (theExpertise != null) { Vector CC = CMParms.makeVector("SAY", "I would like you to teach me " + theExpertise.name); mob.doCommand(CC, metaFlags); return true; } for (int v = 0; v < V.size(); v++) if (((String) V.elementAt(v)).startsWith(what.toUpperCase().trim())) { Vector CC = CMParms.makeVector("SAY", "I would like to be trained in " + what); mob.doCommand(CC, metaFlags); if (teacherName.length() > 0) commands.addElement(teacherName.trim()); Command C = CMClass.getCommand("TRAIN"); if (C != null) C.execute(mob, commands, metaFlags); return true; } Vector CC = CMParms.makeVector("SAY", "I would like you to teach me " + what + teacherName); mob.doCommand(CC, metaFlags); return false; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (CMParms.combine(commands, 0).equalsIgnoreCase("auto")) { DATA.clear(); IPS.clear(); final Hashtable<String, List<MOB>> ipes = new Hashtable<String, List<MOB>>(); for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S.getAddress().length() > 0) && (S.mob() != null)) { List V = ipes.get(S.getAddress()); if (V == null) { V = new Vector(); ipes.put(S.getAddress(), V); } if (!V.contains(S.mob())) V.add(S.mob()); } } final StringBuffer rpt = new StringBuffer(""); for (final Enumeration e = ipes.keys(); e.hasMoreElements(); ) { final String addr = (String) e.nextElement(); final List<MOB> names = ipes.get(addr); if (names.size() > 1) { IPS.put(addr, names); rpt.append("Watch #" + (IPS.size()) + " added: "); for (int n = 0; n < names.size(); n++) { final MOB MN = names.get(n); if (MN.fetchEffect(ID()) == null) { final Ability A = (Ability) copyOf(); MN.addNonUninvokableEffect(A); A.setSavable(false); } rpt.append(MN.Name() + " "); } rpt.append("\n\r"); } } if (rpt.length() == 0) rpt.append("No users with duplicate IDs found. Try MULTIWATCH ADD name1 name2 ... "); mob.tell(rpt.toString()); return true; } else if (CMParms.combine(commands, 0).equalsIgnoreCase("stop")) { boolean foundLegacy = false; for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S != null) && (S.mob() != null) && (S.mob().fetchEffect(ID()) != null)) { foundLegacy = true; break; } } if ((DATA.size() == 0) && (IPS.size() == 0) && (!foundLegacy)) { mob.tell(L("Multiwatch is already off.")); return false; } for (final Enumeration<List<MOB>> e = IPS.elements(); e.hasMoreElements(); ) { final List<MOB> V = e.nextElement(); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); final Ability A = M.fetchEffect(ID()); if (A != null) M.delEffect(A); } } for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S != null) && (S.mob() != null)) { final MOB M = S.mob(); final Ability A = M.fetchEffect(ID()); if (A != null) M.delEffect(A); } } mob.tell(L("Multiplay watcher is now turned off.")); DATA.clear(); IPS.clear(); return true; } else if ((commands.size() > 1) && ((String) commands.firstElement()).equalsIgnoreCase("add")) { final Vector V = new Vector(); for (int i = 1; i < commands.size(); i++) { final String name = (String) commands.elementAt(i); final MOB M = CMLib.players().getPlayer(name); if ((M.session() != null) && (CMLib.flags().isInTheGame(M, true))) V.addElement(M); else mob.tell(L("'@x1' is not online.", name)); } if (V.size() > 1) { for (int n = 0; n < V.size(); n++) { final MOB MN = (MOB) V.elementAt(n); if (MN.fetchEffect(ID()) == null) { final Ability A = (Ability) copyOf(); MN.addNonUninvokableEffect(A); A.setSavable(false); } } IPS.put("MANUAL" + (IPS.size() + 1), V); mob.tell(L("Manual Watch #@x1 added.", "" + IPS.size())); } return true; } else if ((commands.size() == 0) && (DATA.size() > 0) && (IPS.size() > 0)) { final StringBuffer report = new StringBuffer(""); for (final Enumeration<String> e = IPS.keys(); e.hasMoreElements(); ) { final String key = e.nextElement(); int sync = 0; final List<MOB> V = IPS.get(key); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); final int data[] = DATA.get(M); if (data != null) sync += data[DATA_SYNCHROFOUND]; } report.append("^x" + key + "^?^., Syncs: " + sync + "\n\r"); report.append( CMStrings.padRight(L("Name"), 25) + CMStrings.padRight(L("Speech"), 15) + CMStrings.padRight(L("Socials"), 15) + CMStrings.padRight(L("CMD"), 10) + CMStrings.padRight(L("ORDERS"), 10) + "\n\r"); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); int data[] = DATA.get(M); if (data == null) data = new int[DATA_TOTAL]; report.append(CMStrings.padRight(M.Name(), 25)); report.append( CMStrings.padRight( data[DATA_GOODSPEECH] + "/" + data[DATA_DIRSPEECH] + "/" + data[DATA_ANYSPEECH], 15)); report.append( CMStrings.padRight( data[DATA_GOODSOCIAL] + "/" + data[DATA_DIRSOCIAL] + "/" + data[DATA_ANYSOCIAL], 15)); report.append(CMStrings.padRight(data[DATA_TYPEDCOMMAND] + "", 10)); report.append(CMStrings.padRight(data[DATA_ORDER] + "", 10)); report.append("\n\r"); } report.append("\n\r"); } mob.tell(report.toString()); return true; } else { mob.tell(L("Try MULTIWATCH AUTO, MULTIWATCH STOP, or MULTIWATCH ADD name1 name2..")); return false; } }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { String whatToRevoke = CMParms.combine(commands, 0); Physical target = null; if ((whatToRevoke.length() == 0) && (mob.location().numEffects() > 0)) target = mob.location(); else if (whatToRevoke.equalsIgnoreCase("room")) target = mob.location(); else if (whatToRevoke.equalsIgnoreCase("self")) target = mob; else { int dir = Directions.getGoodDirectionCode(whatToRevoke); if (dir >= 0) target = mob.location().getExitInDir(dir); else { target = mob.location().fetchFromRoomFavorMOBs(null, whatToRevoke); if (target == null) target = mob.findItem(null, whatToRevoke); } } if ((target == null) || (!CMLib.flags().canBeSeenBy(target, mob))) { mob.tell("Revoke from what? You don't see '" + whatToRevoke + "' here."); return false; } Ability revokeThis = null; for (int a = 0; a < target.numEffects(); a++) { Ability A = target.fetchEffect(a); if ((A != null) && (A.invoker() == mob) && (((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_SPELL) || ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_SONG) || ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_PRAYER) || ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_CHANT)) && (A.canBeUninvoked())) revokeThis = A; } if (revokeThis == null) { if (target instanceof Room) mob.tell("Revoke your magic from what?"); else mob.tell( mob, target, null, "<T-NAME> do(es) not appear to be affected by anything you can revoke."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { CMMsg msg = CMClass.getMsg( mob, null, this, CMMsg.MSG_HANDS, "<S-NAME> revoke(s) " + revokeThis.name() + " from " + target.name()); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); revokeThis.unInvoke(); } } else beneficialVisualFizzle( mob, target, "<S-NAME> attempt(s) to revoke " + revokeThis.name() + " from " + target.name() + ", but flub(s) it."); return success; }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { String memberStr = (commands.size() > 1) ? (String) commands.get(commands.size() - 1) : ""; String clanName = (commands.size() > 2) ? CMParms.combine(commands, 1, commands.size() - 1) : ""; Clan C = null; boolean skipChecks = mob.getClanRole(mob.Name()) != null; if (skipChecks) C = mob.getClanRole(mob.Name()).first; if (C == null) for (Pair<Clan, Integer> c : mob.clans()) if ((clanName.length() == 0) || (CMLib.english().containsString(c.first.getName(), clanName)) && (c.first.getAuthority(c.second.intValue(), Clan.Function.EXILE) != Authority.CAN_NOT_DO)) { C = c.first; break; } commands.clear(); commands.addElement(getAccessWords()[0]); commands.addElement(memberStr); StringBuffer msg = new StringBuffer(""); boolean found = false; if (memberStr.length() > 0) { if (C == null) { mob.tell( "You aren't allowed to exile anyone from " + ((clanName.length() == 0) ? "anything" : clanName) + "."); return false; } if (skipChecks || CMLib.clans().goForward(mob, C, commands, Clan.Function.EXILE, false)) { List<MemberRecord> apps = C.getMemberList(); if (apps.size() < 1) { mob.tell("There are no members in your " + C.getGovernmentName() + "."); return false; } for (MemberRecord member : apps) { if (member.name.equalsIgnoreCase(memberStr)) { found = true; } } if (found) { MOB M = CMLib.players().getLoadPlayer(memberStr); if (M == null) { mob.tell( memberStr + " was not found. Could not exile from " + C.getGovernmentName() + "."); return false; } if (skipChecks || CMLib.clans().goForward(mob, C, commands, Clan.Function.EXILE, true)) { if (C.getGovernment().getExitScript().trim().length() > 0) { Pair<Clan, Integer> curClanRole = M.getClanRole(C.clanID()); if (curClanRole != null) M.setClan(C.clanID(), curClanRole.second.intValue()); ScriptingEngine S = (ScriptingEngine) CMClass.getCommon("DefaultScriptingEngine"); S.setSavable(false); S.setVarScope("*"); S.setScript(C.getGovernment().getExitScript()); CMMsg msg2 = CMClass.getMsg(M, M, null, CMMsg.MSG_OK_VISUAL, null, null, "CLANEXIT"); S.executeMsg(M, msg2); S.dequeResponses(); S.tick(M, Tickable.TICKID_MOB); } CMLib.clans() .clanAnnounce( mob, "Member exiled from " + C.getGovernmentName() + " " + C.name() + ": " + M.Name()); mob.tell( M.Name() + " has been exiled from " + C.getGovernmentName() + " '" + C.clanID() + "'."); if ((M.session() != null) && (M.session().mob() == M)) M.tell( "You have been exiled from " + C.getGovernmentName() + " '" + C.clanID() + "'."); C.delMember(M); return false; } } else { msg.append(memberStr + " isn't a member of your " + C.getGovernmentName() + "."); } } else { msg.append( "You aren't in the right position to exile anyone from your " + C.getGovernmentName() + "."); } } else { msg.append("You haven't specified which member you are exiling."); } mob.tell(msg.toString()); return false; }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if (mob.session() == null) return true; PlayerStats pstats = mob.playerStats(); if (pstats == null) return true; if ((commands != null) && (commands.size() > 1) && (commands.elementAt(1) instanceof String) && (CMProps.getVar(CMProps.SYSTEM_MAILBOX).length() > 0)) { String name = CMParms.combine(commands, 1); if (name.equalsIgnoreCase("BOX")) { String journalName = CMProps.getVar(CMProps.SYSTEM_MAILBOX); Vector<JournalsLibrary.JournalEntry> msgs = CMLib.database().DBReadJournalMsgs(journalName); while ((mob.session() != null) && (!mob.session().killFlag())) { Vector mymsgs = new Vector(); StringBuffer messages = new StringBuffer( "^X" + CMStrings.padCenter(mob.Name() + "'s MailBox", 48) + "^?^.\n\r"); messages.append( "^X### " + CMStrings.padRight("From", 15) + " " + CMStrings.padRight("Date", 20) + " Subject^?^.\n\r"); for (int num = 0; num < msgs.size(); num++) { JournalsLibrary.JournalEntry thismsg = msgs.elementAt(num); String to = (String) thismsg.to; if (to.equalsIgnoreCase("ALL") || to.equalsIgnoreCase(mob.Name()) || (to.toUpperCase().trim().startsWith("MASK=") && CMLib.masking().maskCheck(to.trim().substring(5), mob, true))) { mymsgs.addElement(thismsg); messages.append( CMStrings.padRight("" + mymsgs.size(), 4) + CMStrings.padRight((thismsg.from), 16) + CMStrings.padRight(CMLib.time().date2String(thismsg.date), 21) + (thismsg.subj) + "\n\r"); } } if ((mymsgs.size() == 0) || (CMath.bset(metaFlags, Command.METAFLAG_POSSESSED)) || (CMath.bset(metaFlags, Command.METAFLAG_AS))) { if (CMath.bset(mob.getBitmap(), MOB.ATT_AUTOFORWARD)) mob.tell( "You have no email waiting, but then, it's probably been forwarded to you already."); else mob.tell("You have no email waiting."); return false; } Session S = mob.session(); try { if (S != null) S.snoopSuspension(1); mob.tell(messages.toString()); } finally { if (S != null) S.snoopSuspension(-1); } String s = mob.session().prompt("Enter a message #", ""); if ((!CMath.isInteger(s)) || (mob.session().killFlag())) return false; int num = CMath.s_int(s); if ((num <= 0) || (num > mymsgs.size())) mob.tell("That is not a valid number."); else while ((mob.session() != null) && (!mob.session().killFlag())) { JournalsLibrary.JournalEntry thismsg = (JournalsLibrary.JournalEntry) mymsgs.elementAt(num - 1); String key = thismsg.key; String from = thismsg.from; String date = CMLib.time().date2String(thismsg.date); String subj = thismsg.subj; String message = thismsg.msg; messages = new StringBuffer(""); messages.append("^XMessage :^?^." + num + "\n\r"); messages.append("^XFrom :^?^." + from + "\n\r"); messages.append("^XDate :^?^." + date + "\n\r"); messages.append("^XSubject :^?^." + subj + "\n\r"); messages.append("^X------------------------------------------------^?^.\n\r"); messages.append(message + "\n\r\n\r"); try { if (S != null) S.snoopSuspension(1); mob.tell(messages.toString()); } finally { if (S != null) S.snoopSuspension(-1); } s = mob.session() .choose("Would you like to D)elete, H)old, or R)eply (D/H/R)? ", "DHR", "H"); if (s.equalsIgnoreCase("H")) break; if (s.equalsIgnoreCase("R")) { if ((from.length() > 0) && (!from.equals(mob.Name())) && (!from.equalsIgnoreCase("BOX")) && (CMLib.players().getLoadPlayer(from) != null)) execute(mob, CMParms.makeVector(getAccessWords()[0], from), metaFlags); else mob.tell("You can not reply to this email."); } else if (s.equalsIgnoreCase("D")) { CMLib.database().DBDeleteJournal(journalName, key); msgs.remove(thismsg); mob.tell("Deleted."); break; } } } } else { MOB M = CMLib.players().getLoadPlayer(name); if (M == null) { mob.tell( "There is no player called '" + name + "' to send email to. If you were trying to read your mail, try EMAIL BOX. If you were trying to change your email address, just enter EMAIL without any parameters."); return false; } if (!CMath.bset(M.getBitmap(), MOB.ATT_AUTOFORWARD)) { if (!mob.session().confirm("Send email to '" + M.Name() + "' (Y/n)?", "Y")) return false; } else { if (!mob.session() .confirm( "Send email to '" + M.Name() + "', even though their AUTOFORWARD is turned off (y/N)?", "N")) return false; } if (CMProps.getIntVar(CMProps.SYSTEMI_MAXMAILBOX) > 0) { int count = CMLib.database() .DBCountJournal(CMProps.getVar(CMProps.SYSTEM_MAILBOX), null, M.Name()); if (count >= CMProps.getIntVar(CMProps.SYSTEMI_MAXMAILBOX)) { mob.tell(M.Name() + "'s mailbox is full."); return false; } } String subject = mob.session().prompt("Email Subject: ", "").trim(); if (subject.length() == 0) { mob.tell("Aborted"); return false; } String message = mob.session().prompt("Enter your message\n\r: ", "").trim(); if (message.trim().length() == 0) { mob.tell("Aborted"); return false; } message += "\n\r\n\rThis message was sent through the " + CMProps.getVar(CMProps.SYSTEM_MUDNAME) + " mail server at " + CMProps.getVar(CMProps.SYSTEM_MUDDOMAIN) + ", port" + CMProps.getVar(CMProps.SYSTEM_MUDPORTS) + ". Please contact the administrators regarding any abuse of this system.\n\r"; CMLib.database() .DBWriteJournal( CMProps.getVar(CMProps.SYSTEM_MAILBOX), mob.Name(), M.Name(), subject, message); mob.tell("Your email has been sent."); return true; } } if ((pstats.getEmail() == null) || (pstats.getEmail().length() == 0)) mob.session().println("\n\rYou have no email address on file for this character."); else { if (commands == null) return true; String change = mob.session() .prompt( "You currently have '" + pstats.getEmail() + "' set as the email address for this character.\n\rChange it (y/N)?", "N"); if (change.toUpperCase().startsWith("N")) return false; } if ((CMProps.getVar(CMProps.SYSTEM_EMAILREQ).toUpperCase().startsWith("PASS")) && (commands != null) && (CMProps.getVar(CMProps.SYSTEM_MAILBOX).length() > 0)) mob.session() .println( "\n\r** Changing your email address will cause you to be logged off, and a new password to be generated and emailed to the new address. **\n\r"); String newEmail = mob.session().prompt("New E-mail Address:"); if (newEmail == null) return false; newEmail = newEmail.trim(); if (!CMProps.getVar(CMProps.SYSTEM_EMAILREQ).toUpperCase().startsWith("OPTION")) { if (newEmail.length() < 6) return false; if (newEmail.indexOf("@") < 0) return false; String confirmEmail = mob.session() .prompt("Confirm that '" + newEmail + "' is correct by re-entering.\n\rRe-enter:"); if (confirmEmail == null) return false; confirmEmail = confirmEmail.trim(); if (confirmEmail.length() == 0) return false; if (!(newEmail.equalsIgnoreCase(confirmEmail))) return false; } pstats.setEmail(newEmail); CMLib.database().DBUpdateEmail(mob); if ((commands != null) && (CMProps.getVar(CMProps.SYSTEM_EMAILREQ).toUpperCase().startsWith("PASS")) && (CMProps.getVar(CMProps.SYSTEM_MAILBOX).length() > 0)) { String password = ""; for (int i = 0; i < 6; i++) password += (char) ('a' + CMLib.dice().roll(1, 26, -1)); pstats.setPassword(password); CMLib.database().DBUpdatePassword(mob.Name(), password); CMLib.database() .DBWriteJournal( CMProps.getVar(CMProps.SYSTEM_MAILBOX), mob.Name(), mob.Name(), "Password for " + mob.Name(), "Your new password for " + mob.Name() + " is: " + pstats.password() + "\n\rYou can login by pointing your mud client at " + CMProps.getVar(CMProps.SYSTEM_MUDDOMAIN) + " port(s):" + CMProps.getVar(CMProps.SYSTEM_MUDPORTS) + ".\n\rYou may use the PASSWORD command to change it once you are online."); mob.tell("You will receive an email with your new password shortly. Goodbye."); if (mob.session() != null) { try { Thread.sleep(1000); } catch (Exception e) { } mob.session().kill(false, false, false); } } return true; }