Implement merchant blacklist, blocking any listed characters from entering
This commit is contained in:
@@ -44,7 +44,6 @@ import tools.PacketCreator;
|
||||
import java.awt.*;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Matze
|
||||
@@ -286,8 +285,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler {
|
||||
|
||||
int oid = p.readInt();
|
||||
MapObject ob = chr.getMap().getMapObject(oid);
|
||||
if (ob instanceof PlayerShop) {
|
||||
PlayerShop shop = (PlayerShop) ob;
|
||||
if (ob instanceof PlayerShop shop) {
|
||||
shop.visitShop(chr);
|
||||
} else if (ob instanceof MiniGame) {
|
||||
p.skip(1);
|
||||
@@ -691,10 +689,26 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler {
|
||||
}
|
||||
c.sendPacket(PacketCreator.viewMerchantVisitorHistory(merchant.getVisitorHistory()));
|
||||
} else if (mode == Action.VIEW_BLACKLIST.getCode()) {
|
||||
List<String> blacklistedNames = List.of("Blanca", "Betsy", "Kevin", "Rosa", "Evan", "Terence",
|
||||
"Cecilia", "Gayle", "Erma", "Dorothy", "Willis", "Alberta", "Marilyn", "Myron", "Sheryl",
|
||||
"Marco", "Jose", "Kendra", "Laurence", "Victoria", "NonListed");
|
||||
c.sendPacket(PacketCreator.viewMerchantBlacklist(blacklistedNames));
|
||||
HiredMerchant merchant = chr.getHiredMerchant();
|
||||
if (merchant == null || !merchant.isOwner(chr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
c.sendPacket(PacketCreator.viewMerchantBlacklist(merchant.getBlacklist()));
|
||||
} else if (mode == Action.ADD_TO_BLACKLIST.getCode()) {
|
||||
HiredMerchant merchant = chr.getHiredMerchant();
|
||||
if (merchant == null || !merchant.isOwner(chr)) {
|
||||
return;
|
||||
}
|
||||
String chrName = p.readString();
|
||||
merchant.addToBlacklist(chrName);
|
||||
} else if (mode == Action.REMOVE_FROM_BLACKLIST.getCode()) {
|
||||
HiredMerchant merchant = chr.getHiredMerchant();
|
||||
if (merchant == null || !merchant.isOwner(chr)) {
|
||||
return;
|
||||
}
|
||||
String chrName = p.readString();
|
||||
merchant.removeFromBlacklist(chrName);
|
||||
} else if (mode == Action.MERCHANT_ORGANIZE.getCode()) {
|
||||
HiredMerchant merchant = chr.getHiredMerchant();
|
||||
if (merchant == null || !merchant.isOwner(chr)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -5221,7 +5221,7 @@ public class PacketCreator {
|
||||
/**
|
||||
* @param chrNames Blacklisted names. The first 20 names will be displayed, anything beyond does no difference.
|
||||
*/
|
||||
public static Packet viewMerchantBlacklist(List<String> chrNames) {
|
||||
public static Packet viewMerchantBlacklist(Set<String> chrNames) {
|
||||
final OutPacket p = OutPacket.create(SendOpcode.PLAYER_INTERACTION);
|
||||
p.writeByte(PlayerInteractionHandler.Action.VIEW_BLACKLIST.getCode());
|
||||
p.writeShort(chrNames.size());
|
||||
|
||||
Reference in New Issue
Block a user