Updated Meso & Arrow drops + Aran change jobs fix + improved concurrency

Added meso drop data for many mobs that were missing mesos.
Enhanced arrow drop data, now dropping bundles instead of unitary items.
Fixed issues with several Aran change jobs crashing the player shortly after changing jobs.
Improved concurrency in MapleGuild, MapleAlliance and MaplePlayerShop.
New tools: MapleArrowFetcher and MapleMesoFetcher, that were used to compile the updated drop data info.
This commit is contained in:
ronancpl
2017-11-01 13:34:26 -02:00
parent 44949aea37
commit 64af2cfa00
192 changed files with 44793 additions and 271 deletions

View File

@@ -1008,45 +1008,62 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
this.remainingAp += 5;
}
int job_ = job.getId() % 1000; // lame temp "fix"
if (job_ == 100) {
if (job_ == 100) { // 1st warrior
maxhp += Randomizer.rand(200, 250);
} else if (job_ == 200) {
} else if (job_ == 200) { // 1st mage
maxmp += Randomizer.rand(100, 150);
} else if (job_ % 100 == 0) {
} else if (job_ % 100 == 0) { // 1st others
maxhp += Randomizer.rand(100, 150);
maxhp += Randomizer.rand(25, 50);
} else if (job_ > 0 && job_ < 200) {
} else if (job_ > 0 && job_ < 200) { // 2nd~4th warrior
maxhp += Randomizer.rand(300, 350);
} else if (job_ < 300) {
} else if (job_ < 300) { // 2nd~4th mage
maxmp += Randomizer.rand(450, 500);
} //handle KoC here (undone)
else if (job_ > 0 && job_ != 1000) {
} else if (job_ > 0) { // 2nd~4th others
maxhp += Randomizer.rand(300, 350);
maxmp += Randomizer.rand(150, 200);
}
/*
//aran perks?
int newJobId = newJob.getId();
if(newJobId == 2100) { // become aran1
maxhp += 275;
maxmp += 15;
} else if(newJobId == 2110) { // become aran2
maxmp += 275;
} else if(newJobId == 2111) { // become aran3
maxhp += 275;
maxmp += 275;
}
*/
if (maxhp >= 30000) {
maxhp = 30000;
}
if (maxmp >= 30000) {
maxmp = 30000;
}
if (!isGM()) {
for (byte i = 1; i < 5; i++) {
gainSlots(i, 4, true);
}
}
List<Pair<MapleStat, Integer>> statup = new ArrayList<>(5);
statup.add(new Pair<>(MapleStat.MAXHP, Integer.valueOf(maxhp)));
statup.add(new Pair<>(MapleStat.MAXMP, Integer.valueOf(maxmp)));
statup.add(new Pair<>(MapleStat.AVAILABLEAP, remainingAp));
statup.add(new Pair<>(MapleStat.AVAILABLESP, remainingSp[GameConstants.getSkillBook(job.getId())]));
statup.add(new Pair<>(MapleStat.JOB, Integer.valueOf(job.getId())));
client.announce(MaplePacketCreator.updatePlayerStats(statup, this));
if (dragon != null) {
getMap().broadcastMessage(MaplePacketCreator.removeDragon(dragon.getObjectId()));
dragon = null;
}
recalcLocalStats();
client.announce(MaplePacketCreator.updatePlayerStats(statup, this));
silentPartyUpdate();
if (this.guildid > 0) {
getGuild().broadcast(MaplePacketCreator.jobMessage(0, job.getId(), name), this.getId());
@@ -1062,7 +1079,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if (getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) {
cancelBuffStats(MapleBuffStat.MONSTER_RIDING);
}
createDragon();
createDragon();
}
}
@@ -3162,21 +3179,26 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
private boolean isSingletonStatup(MapleBuffStat mbs) {
switch(mbs) {
case RECOVERY:
case HPREC:
case MPREC:
case SUMMON:
case PUPPET:
case DRAGONBLOOD:
case MONSTER_RIDING:
case MORPH:
case HYPERBODYHP:
case HYPERBODYMP:
return true;
switch(mbs) { //HPREC and MPREC are supposed to be singleton
case COUPON_EXP1:
case COUPON_EXP2:
case COUPON_EXP3:
case COUPON_EXP4:
case COUPON_DRP1:
case COUPON_DRP2:
case COUPON_DRP3:
case WATK:
case WDEF:
case MATK:
case MDEF:
case ACC:
case AVOID:
case SPEED:
case JUMP:
return false;
default:
return false;
return true;
}
}
@@ -6003,7 +6025,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
switch (job.getId()) {
case 100:
case 1100:
case 2100://?
case 2100:
tstr = 35;
tap = ((getLevel() - 10) * levelap) + 14;
tsp += ((getLevel() - 10) * 3);

View File

@@ -1133,19 +1133,19 @@ public class Commands {
short quantity = 1;
if(sub.length >= 3) quantity = Short.parseShort(sub[2]);
if (ItemConstants.isPet(itemId)) {
player.message("You cannot create a pet with this command.");
break;
}
if (sub[0].equals("item")) {
int petid = -1;
if (ItemConstants.isPet(itemId)) {
petid = MaplePet.createPet(itemId);
}
byte flag = 0;
byte flag = 0;
if(player.gmLevel() < 3) {
flag |= ItemConstants.ACCOUNT_SHARING;
flag |= ItemConstants.UNTRADEABLE;
}
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, flag, -1);
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), -1, flag, -1);
} else {
Item toDrop;
if (MapleItemInformationProvider.getInstance().getInventoryType(itemId) == MapleInventoryType.EQUIP) {
@@ -2127,20 +2127,17 @@ public class Commands {
break;
}
int itemid = 0;
short multiply = 0;
itemid = Integer.parseInt(sub[1]);
multiply = Short.parseShort(sub[2]);
int itemid = Integer.parseInt(sub[1]);
short multiply = Short.parseShort(sub[2]);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item it = ii.getEquipById(itemid);
it.setOwner(player.getName());
MapleInventoryType type = ii.getInventoryType(itemid);
if (type.equals(MapleInventoryType.EQUIP)) {
Item it = ii.getEquipById(itemid);
it.setOwner(player.getName());
hardsetItemStats((Equip) it, multiply);
MapleInventoryManipulator.addFromDrop(c, it);
} else {
player.dropMessage("Make sure it's an equippable item.");
}

View File

@@ -60,6 +60,7 @@ public class MaplePet extends Item {
public static MaplePet loadFromDb(int itemid, short position, int petid) {
try {
System.out.println("fetching " + petid);
MaplePet ret = new MaplePet(itemid, position, petid);
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT name, level, closeness, fullness, summoned FROM pets WHERE petid = ?"); // Get pet details..

View File

@@ -331,18 +331,21 @@ public class MapleAlliance {
public boolean addGuild(int gid) {
synchronized (guilds) {
if(guilds.size() == capacity || getGuildIndex(gid) > -1) return false;
guilds.add(gid);
return true;
}
return true;
}
private int getGuildIndex(int gid) {
for (int i = 0; i < guilds.size(); i++) {
if (guilds.get(i) == gid) {
return i;
synchronized (guilds) {
for (int i = 0; i < guilds.size(); i++) {
if (guilds.get(i) == gid) {
return i;
}
}
return -1;
}
return -1;
}
public void setRankTitle(String[] ranks) {
@@ -354,13 +357,15 @@ public class MapleAlliance {
}
public List<Integer> getGuilds() {
List<Integer> guilds_ = new LinkedList<>();
for (int guild : guilds) {
if (guild != -1) {
guilds_.add(guild);
synchronized(guilds) {
List<Integer> guilds_ = new LinkedList<>();
for (int guild : guilds) {
if (guild != -1) {
guilds_.add(guild);
}
}
return guilds_;
}
return guilds_;
}
public String getAllianceNotice() {
@@ -396,14 +401,16 @@ public class MapleAlliance {
}
public MapleGuildCharacter getLeader() {
for(Integer gId: guilds) {
MapleGuild guild = Server.getInstance().getGuild(gId);
MapleGuildCharacter mgc = guild.getMGC(guild.getLeaderId());
if(mgc.getAllianceRank() == 1) return mgc;
synchronized(guilds) {
for(Integer gId: guilds) {
MapleGuild guild = Server.getInstance().getGuild(gId);
MapleGuildCharacter mgc = guild.getMGC(guild.getLeaderId());
if(mgc.getAllianceRank() == 1) return mgc;
}
return null;
}
return null;
}
public void dropMessage(String message) {
@@ -411,9 +418,11 @@ public class MapleAlliance {
}
public void dropMessage(int type, String message) {
for(Integer gId: guilds) {
MapleGuild guild = Server.getInstance().getGuild(gId);
guild.dropMessage(type, message);
synchronized(guilds) {
for(Integer gId: guilds) {
MapleGuild guild = Server.getInstance().getGuild(gId);
guild.dropMessage(type, message);
}
}
}

View File

@@ -35,6 +35,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import net.server.Server;
import net.server.channel.Channel;
import tools.DatabaseConnection;
@@ -47,7 +50,10 @@ public class MapleGuild {
private enum BCOp {
NONE, DISBAND, EMBLEMCHANGE
}
private final List<MapleGuildCharacter> members;
private final Lock membersLock = new ReentrantLock(true);
private String rankTitles[] = new String[5]; // 1 = master, 2 = jr, 5 = lowest member
private String name, notice;
private int id, gp, logo, logoColor, leader, capacity, logoBG, logoBGColor, signature, allianceId;
@@ -122,7 +128,9 @@ public class MapleGuild {
l.clear();
}
}
synchronized (members) {
membersLock.lock();
try {
for (MapleGuildCharacter mgc : members) {
if (!mgc.isOnline()) {
continue;
@@ -131,7 +139,10 @@ public class MapleGuild {
if (ch != null) ch.add(mgc.getId());
//Unable to connect to Channel... error was here
}
} finally {
membersLock.unlock();
}
bDirty = false;
}
@@ -169,7 +180,13 @@ public class MapleGuild {
ps.setInt(1, this.id);
ps.execute();
ps.close();
this.broadcast(MaplePacketCreator.guildDisband(this.id));
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.guildDisband(this.id));
} finally {
membersLock.unlock();
}
}
con.close();
@@ -238,7 +255,12 @@ public class MapleGuild {
}
public java.util.Collection<MapleGuildCharacter> getMembers() {
return java.util.Collections.unmodifiableCollection(members);
membersLock.lock();
try {
return java.util.Collections.unmodifiableCollection(members);
} finally {
membersLock.unlock();
}
}
public int getCapacity() {
@@ -282,13 +304,18 @@ public class MapleGuild {
}
public void guildMessage(final byte[] serverNotice) {
for (MapleGuildCharacter mgc : members) {
for (Channel cs : Server.getInstance().getChannelsFromWorld(world)) {
if (cs.getPlayerStorage().getCharacterById(mgc.getId()) != null) {
cs.getPlayerStorage().getCharacterById(mgc.getId()).getClient().announce(serverNotice);
break;
membersLock.lock();
try {
for (MapleGuildCharacter mgc : members) {
for (Channel cs : Server.getInstance().getChannelsFromWorld(world)) {
if (cs.getPlayerStorage().getCharacterById(mgc.getId()) != null) {
cs.getPlayerStorage().getCharacterById(mgc.getId()).getClient().announce(serverNotice);
break;
}
}
}
} finally {
membersLock.unlock();
}
}
@@ -297,9 +324,15 @@ public class MapleGuild {
}
public void dropMessage(int type, String message) {
for (MapleGuildCharacter mgc : members) {
if(mgc.getCharacter() != null)
mgc.getCharacter().dropMessage(type, message);
membersLock.lock();
try {
for (MapleGuildCharacter mgc : members) {
if(mgc.getCharacter() != null) {
mgc.getCharacter().dropMessage(type, message);
}
}
} finally {
membersLock.unlock();
}
}
@@ -308,25 +341,35 @@ public class MapleGuild {
}
public final void setOnline(int cid, boolean online, int channel) {
boolean bBroadcast = true;
for (MapleGuildCharacter mgc : members) {
if (mgc.getId() == cid) {
if (mgc.isOnline() && online) {
bBroadcast = false;
membersLock.lock();
try {
boolean bBroadcast = true;
for (MapleGuildCharacter mgc : members) {
if (mgc.getId() == cid) {
if (mgc.isOnline() && online) {
bBroadcast = false;
}
mgc.setOnline(online);
mgc.setChannel(channel);
break;
}
mgc.setOnline(online);
mgc.setChannel(channel);
break;
}
if (bBroadcast) {
this.broadcast(MaplePacketCreator.guildMemberOnline(id, cid, online), cid);
}
bDirty = true;
} finally {
membersLock.unlock();
}
if (bBroadcast) {
this.broadcast(MaplePacketCreator.guildMemberOnline(id, cid, online), cid);
}
bDirty = true;
}
public void guildChat(String name, int cid, String message) {
this.broadcast(MaplePacketCreator.multiChat(name, message, 2), cid);
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.multiChat(name, message, 2), cid);
} finally {
membersLock.unlock();
}
}
public String getRankTitle(int rank) {
@@ -377,7 +420,8 @@ public class MapleGuild {
}
public int addGuildMember(MapleGuildCharacter mgc, MapleCharacter chr) {
synchronized (members) {
membersLock.lock();
try {
if (members.size() >= capacity) {
return 0;
}
@@ -389,21 +433,28 @@ public class MapleGuild {
break;
}
}
this.broadcast(MaplePacketCreator.newGuildMember(mgc));
return 1;
} finally {
membersLock.unlock();
}
this.broadcast(MaplePacketCreator.newGuildMember(mgc));
return 1;
}
public void leaveGuild(MapleGuildCharacter mgc) {
this.broadcast(MaplePacketCreator.memberLeft(mgc, false));
synchronized (members) {
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.memberLeft(mgc, false));
members.remove(mgc);
bDirty = true;
} finally {
membersLock.unlock();
}
}
public void expelMember(MapleGuildCharacter initiator, String name, int cid) {
synchronized (members) {
membersLock.lock();
try {
java.util.Iterator<MapleGuildCharacter> itr = members.iterator();
MapleGuildCharacter mgc;
while (itr.hasNext()) {
@@ -441,15 +492,22 @@ public class MapleGuild {
}
}
System.out.println("Unable to find member with name " + name + " and id " + cid);
} finally {
membersLock.unlock();
}
}
public void changeRank(int cid, int newRank) {
for (MapleGuildCharacter mgc : members) {
if (cid == mgc.getId()) {
changeRank(mgc, newRank);
return;
membersLock.lock();
try {
for (MapleGuildCharacter mgc : members) {
if (cid == mgc.getId()) {
changeRank(mgc, newRank);
return;
}
}
} finally {
membersLock.unlock();
}
}
@@ -467,24 +525,39 @@ public class MapleGuild {
return;
}
this.broadcast(MaplePacketCreator.changeRank(mgc));
return;
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.changeRank(mgc));
} finally {
membersLock.unlock();
}
}
public void setGuildNotice(String notice) {
this.notice = notice;
writeToDB(false);
this.broadcast(MaplePacketCreator.guildNotice(this.id, notice));
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.guildNotice(this.id, notice));
} finally {
membersLock.unlock();
}
}
public void memberLevelJobUpdate(MapleGuildCharacter mgc) {
for (MapleGuildCharacter member : members) {
if (mgc.equals(member)) {
member.setJobId(mgc.getJobId());
member.setLevel(mgc.getLevel());
this.broadcast(MaplePacketCreator.guildMemberLevelJobUpdate(mgc));
break;
membersLock.lock();
try {
for (MapleGuildCharacter member : members) {
if (mgc.equals(member)) {
member.setJobId(mgc.getJobId());
member.setLevel(mgc.getLevel());
this.broadcast(MaplePacketCreator.guildMemberLevelJobUpdate(mgc));
break;
}
}
} finally {
membersLock.unlock();
}
}
@@ -507,7 +580,14 @@ public class MapleGuild {
public void changeRankTitle(String[] ranks) {
System.arraycopy(ranks, 0, rankTitles, 0, 5);
this.broadcast(MaplePacketCreator.rankTitleChange(this.id, ranks));
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.rankTitleChange(this.id, ranks));
} finally {
membersLock.unlock();
}
this.writeToDB(false);
}
@@ -519,8 +599,13 @@ public class MapleGuild {
else MapleAlliance.disbandAlliance(allianceId);
}
this.writeToDB(true);
this.broadcast(null, -1, BCOp.DISBAND);
membersLock.lock();
try {
this.writeToDB(true);
this.broadcast(null, -1, BCOp.DISBAND);
} finally {
membersLock.unlock();
}
}
public void setGuildEmblem(short bg, byte bgcolor, short logo, byte logocolor) {
@@ -529,16 +614,27 @@ public class MapleGuild {
this.logo = logo;
this.logoColor = logocolor;
this.writeToDB(false);
this.broadcast(null, -1, BCOp.EMBLEMCHANGE);
membersLock.lock();
try {
this.broadcast(null, -1, BCOp.EMBLEMCHANGE);
} finally {
membersLock.unlock();
}
}
public MapleGuildCharacter getMGC(int cid) {
for (MapleGuildCharacter mgc : members) {
if (mgc.getId() == cid) {
return mgc;
membersLock.lock();
try {
for (MapleGuildCharacter mgc : members) {
if (mgc.getId() == cid) {
return mgc;
}
}
return null;
} finally {
membersLock.unlock();
}
return null;
}
public boolean increaseCapacity() {
@@ -547,7 +643,14 @@ public class MapleGuild {
}
capacity += 5;
this.writeToDB(false);
this.broadcast(MaplePacketCreator.guildCapacityChange(this.id, this.capacity));
membersLock.lock();
try {
this.broadcast(MaplePacketCreator.guildCapacityChange(this.id, this.capacity));
} finally {
membersLock.unlock();
}
return true;
}
@@ -614,10 +717,15 @@ public class MapleGuild {
public void resetAllianceGuildPlayersRank() {
try {
for(MapleGuildCharacter mgc: members) {
if(mgc.isOnline()) {
mgc.setAllianceRank(5);
membersLock.lock();
try {
for(MapleGuildCharacter mgc: members) {
if(mgc.isOnline()) {
mgc.setAllianceRank(5);
}
}
} finally {
membersLock.unlock();
}
Connection con = DatabaseConnection.getConnection();
@@ -633,7 +741,7 @@ public class MapleGuild {
}
}
public int getIncreaseGuildCost(int size) {
public static int getIncreaseGuildCost(int size) {
return 500000 * (size - 6) / 6;
}
}

View File

@@ -80,8 +80,11 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
public boolean hasFreeSlot() {
synchronized (visitors) {
visitorLock.lock();
try {
return visitors[0] == null || visitors[1] == null || visitors[2] == null;
} finally {
visitorLock.unlock();
}
}
@@ -90,7 +93,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
private void addVisitor(MapleCharacter visitor) {
synchronized (visitors) {
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] == null) {
visitors[i] = visitor;
@@ -101,6 +105,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
break;
}
}
} finally {
visitorLock.unlock();
}
}
@@ -109,13 +115,19 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
owner.getMap().removeMapObject(this);
owner.setPlayerShop(null);
}
for (int i = 0; i < 3; i++) {
if (visitors[i] != null && visitors[i].getId() == visitor.getId()) {
visitors[i] = null;
visitor.setSlot(-1);
this.broadcast(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1));
return;
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null && visitors[i].getId() == visitor.getId()) {
visitors[i] = null;
visitor.setSlot(-1);
this.broadcast(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1));
return;
}
}
} finally {
visitorLock.unlock();
}
}
@@ -124,7 +136,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
owner.getMap().removeMapObject(this);
owner.setPlayerShop(null);
} else {
synchronized (visitors) {
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null && visitors[i].getId() == visitor.getId()) {
visitor.setSlot(-1); //absolutely cant remove player slot for late players without dc'ing them... heh
@@ -143,6 +156,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
return;
}
}
} finally {
visitorLock.unlock();
}
if(this.getOwner().getPlayerShop() != null) visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(this.getOwner(), 4));
@@ -150,8 +165,11 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
public boolean isVisitor(MapleCharacter visitor) {
synchronized (visitors) {
visitorLock.lock();
try {
return visitors[0] == visitor || visitors[1] == visitor || visitors[2] == visitor;
} finally {
visitorLock.unlock();
}
}
@@ -187,7 +205,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
synchronized (c.getPlayer()) {
if (c.getPlayer().getMeso() >= (long) pItem.getPrice() * quantity) {
if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) {
c.getPlayer().gainMeso(-pItem.getPrice() * quantity, true);
c.getPlayer().gainMeso(-pItem.getPrice() * quantity, false);
owner.gainMeso(pItem.getPrice() * quantity, true);
pItem.setBundles((short) (pItem.getBundles() - quantity));
if (pItem.getBundles() < 1) {
@@ -209,17 +227,21 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
public void broadcastToVisitors(final byte[] packet) {
synchronized (visitors) {
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null) {
visitors[i].getClient().announce(packet);
}
}
} finally {
visitorLock.unlock();
}
}
public void broadcastRestoreToVisitors() {
synchronized (visitors) {
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null) {
visitors[i].getClient().announce(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1));
@@ -233,12 +255,16 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
recoverChatLog();
} finally {
visitorLock.unlock();
}
}
public void removeVisitors() {
List<MapleCharacter> visitorList = new ArrayList<>(3);
synchronized (visitors) {
visitorLock.lock();
try {
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null) {
@@ -249,6 +275,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
} catch (Exception e) {
e.printStackTrace();
}
} finally {
visitorLock.unlock();
}
for(MapleCharacter mc : visitorList) forceRemoveVisitor(mc);
@@ -412,7 +440,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
return false;
}
synchronized (visitors) {
visitorLock.lock();
try {
if (this.hasFreeSlot() && !this.isVisitor(chr)) {
this.addVisitor(chr);
chr.setPlayerShop(this);
@@ -422,6 +451,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
return false;
} finally {
visitorLock.unlock();
}
}