Implement merchant blacklist, blocking any listed characters from entering

This commit is contained in:
P0nk
2021-09-28 18:26:27 +02:00
parent 3a9305d0d9
commit 5cae3fc336
3 changed files with 61 additions and 12 deletions

View File

@@ -47,10 +47,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
@@ -78,6 +75,7 @@ public class HiredMerchant extends AbstractMapObject {
private MapleMap map;
private final Visitor[] visitors = new Visitor[3];
private final LinkedList<PastVisitor> visitorHistory = new LinkedList<>();
private final LinkedHashSet<String> blacklist = new LinkedHashSet<>(); // case-sensitive character names
private final Lock visitorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.VISITOR_MERCH, true);
private record Visitor(Character chr, Instant enteredAt) {}
@@ -489,6 +487,9 @@ public class HiredMerchant extends AbstractMapObject {
} else if (!this.isOpen()) {
chr.sendPacket(PacketCreator.getMiniRoomError(18));
return;
} else if (isBlacklisted(chr.getName())) {
chr.sendPacket(PacketCreator.getMiniRoomError(17));
return;
} else if (!this.addVisitor(chr)) {
chr.sendPacket(PacketCreator.getMiniRoomError(2));
return;
@@ -722,6 +723,40 @@ public class HiredMerchant extends AbstractMapObject {
return Collections.unmodifiableList(visitorHistory);
}
public void addToBlacklist(String chrName) {
visitorLock.lock();
try {
if (blacklist.size() >= BLACKLIST_LIMIT) {
return;
}
blacklist.add(chrName);
} finally {
visitorLock.unlock();
}
}
public void removeFromBlacklist(String chrName) {
visitorLock.lock();
try {
blacklist.remove(chrName);
} finally {
visitorLock.unlock();
}
}
public Set<String> getBlacklist() {
return Collections.unmodifiableSet(blacklist);
}
private boolean isBlacklisted(String chrName) {
visitorLock.lock();
try {
return blacklist.contains(chrName);
} finally {
visitorLock.unlock();
}
}
public int getMapId() {
return map.getId();
}