Reformat and clean up "client" package

This commit is contained in:
P0nk
2021-09-09 23:21:39 +02:00
parent 07f55fa53c
commit 9bf1b68924
108 changed files with 1770 additions and 1543 deletions

View File

@@ -468,7 +468,7 @@ public class DueyProcessor {
c.add(Calendar.DATE, -30);
final Timestamp ts = new Timestamp(c.getTime().getTime());
try (Connection con = DatabaseConnection.getConnection()){
try (Connection con = DatabaseConnection.getConnection()) {
List<Integer> toRemove = new LinkedList<>();
try (PreparedStatement ps = con.prepareStatement("SELECT `PackageId` FROM dueypackages WHERE `TimeStamp` < ?")) {
ps.setTimestamp(1, ts);

View File

@@ -45,27 +45,26 @@ import java.util.LinkedList;
import java.util.List;
/**
*
* @author RonanLana - synchronization of Fredrick modules and operation results
*/
public class FredrickProcessor {
private static int[] dailyReminders = new int[]{2, 5, 10, 15, 30, 60, 90, Integer.MAX_VALUE};
private static final int[] dailyReminders = new int[]{2, 5, 10, 15, 30, 60, 90, Integer.MAX_VALUE};
private static byte canRetrieveFromFredrick(Character chr, List<Pair<Item, InventoryType>> items) {
if (!Inventory.checkSpotsAndOwnership(chr, items)) {
List<Integer> itemids = new LinkedList<>();
for (Pair<Item, InventoryType> it : items) {
itemids.add(it.getLeft().getItemId());
}
if (chr.canHoldUniques(itemids)) {
return 0x22;
} else {
return 0x20;
}
}
int netMeso = chr.getMerchantNetMeso();
if (netMeso > 0) {
if (!chr.canHoldMeso(netMeso)) {
@@ -76,26 +75,26 @@ public class FredrickProcessor {
return 0x21;
}
}
return 0x0;
}
public static int timestampElapsedDays(Timestamp then, long timeNow) {
return (int) ((timeNow - then.getTime()) / (1000 * 60 * 60 * 24));
}
private static String fredrickReminderMessage(int daynotes) {
String msg;
if (daynotes < 4) {
msg = "Hi customer! I am Fredrick, the Union Chief of the Hired Merchant Union. A reminder that " + dailyReminders[daynotes] + " days have passed since you used our service. Please reclaim your stored goods at FM Entrance.";
} else {
msg = "Hi customer! I am Fredrick, the Union Chief of the Hired Merchant Union. " + dailyReminders[daynotes] + " days have passed since you used our service. Consider claiming back the items before we move them away for refund.";
}
return msg;
}
public static void removeFredrickLog(int cid) {
try (Connection con = DatabaseConnection.getConnection()) {
removeFredrickLog(con, cid);
@@ -103,14 +102,14 @@ public class FredrickProcessor {
sqle.printStackTrace();
}
}
private static void removeFredrickLog(Connection con, int cid) throws SQLException {
try (PreparedStatement ps = con.prepareStatement("DELETE FROM `fredstorage` WHERE `cid` = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
}
public static void insertFredrickLog(int cid) {
try (Connection con = DatabaseConnection.getConnection()) {
@@ -124,11 +123,11 @@ public class FredrickProcessor {
sqle.printStackTrace();
}
}
public static void removeFredrickReminders(int cid) {
removeFredrickReminders(Collections.singletonList(new Pair<>(cid, 0)));
}
private static void removeFredrickReminders(List<Pair<Integer, Integer>> expiredCids) {
List<String> expiredCnames = new LinkedList<>();
for (Pair<Integer, Integer> id : expiredCids) {
@@ -150,7 +149,7 @@ public class FredrickProcessor {
e.printStackTrace();
}
}
public static void runFredrickSchedule() {
try (Connection con = DatabaseConnection.getConnection()) {
List<Pair<Integer, Integer>> expiredCids = new LinkedList<>();
@@ -263,7 +262,7 @@ public class FredrickProcessor {
return false;
}
}
public static void fredrickRetrieveItems(Client c) { // thanks Gustav for pointing out the dupe on Fredrick handling
if (c.tryacquireClient()) {
try {
@@ -272,20 +271,21 @@ public class FredrickProcessor {
List<Pair<Item, InventoryType>> items;
try {
items = ItemFactory.MERCHANT.loadItems(chr.getId(), false);
byte response = canRetrieveFromFredrick(chr, items);
if (response != 0) {
chr.sendPacket(PacketCreator.fredrickMessage(response));
return;
}
chr.withdrawMerchantMesos();
if (deleteFredrickItems(chr.getId())) {
HiredMerchant merchant = chr.getHiredMerchant();
if(merchant != null)
if (merchant != null) {
merchant.clearItems();
}
for (Pair<Item, InventoryType> it : items) {
Item item = it.getLeft();

View File

@@ -38,170 +38,171 @@ import tools.FilePrinter;
import tools.PacketCreator;
/**
*
* @author Matze
* @author Ronan - inventory concurrency protection on storing items
*/
public class StorageProcessor {
public static void storageAction(InPacket p, Client c) {
ItemInformationProvider ii = ItemInformationProvider.getInstance();
Character chr = c.getPlayer();
Storage storage = chr.getStorage();
byte mode = p.readByte();
if (chr.getLevel() < 15){
chr.dropMessage(1, "You may only use the storage once you have reached level 15.");
public static void storageAction(InPacket p, Client c) {
ItemInformationProvider ii = ItemInformationProvider.getInstance();
Character chr = c.getPlayer();
Storage storage = chr.getStorage();
byte mode = p.readByte();
if (chr.getLevel() < 15) {
chr.dropMessage(1, "You may only use the storage once you have reached level 15.");
c.sendPacket(PacketCreator.enableActions());
return;
}
if (c.tryacquireClient()) {
try {
if (mode == 4) { // take out
byte type = p.readByte();
byte slot = p.readByte();
if (slot < 0 || slot > storage.getSlots()) { // removal starts at zero
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to work with storage slot " + slot);
c.disconnect(true, false);
return;
}
slot = storage.getSlot(InventoryType.getByType(type), slot);
Item item = storage.getItem(slot);
if (item != null) {
if (ii.isPickupRestricted(item.getItemId()) && chr.haveItemWithId(item.getItemId(), true)) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0C));
return;
}
int takeoutFee = storage.getTakeOutFee();
if (chr.getMeso() < takeoutFee) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0B));
return;
} else {
chr.gainMeso(-takeoutFee, false);
}
if (InventoryManipulator.checkSpace(c, item.getItemId(), item.getQuantity(), item.getOwner())) {
if (storage.takeOut(item)) {
chr.setUsedStorage();
KarmaManipulator.toggleKarmaFlagToUntradeable(item);
InventoryManipulator.addFromDrop(c, item, false);
String itemName = ii.getName(item.getItemId());
FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " took out " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")");
storage.sendTakenOut(c, item.getInventoryType());
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0A));
}
}
} else if (mode == 5) { // store
short slot = p.readShort();
int itemId = p.readInt();
short quantity = p.readShort();
InventoryType invType = ItemConstants.getInventoryType(itemId);
Inventory inv = chr.getInventory(invType);
if (slot < 1 || slot > inv.getSlotLimit()) { //player inv starts at one
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to store item at slot " + slot);
c.disconnect(true, false);
return;
}
if (quantity < 1) {
c.sendPacket(PacketCreator.enableActions());
return;
}
if (c.tryacquireClient()) {
}
if (storage.isFull()) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x11));
return;
}
int storeFee = storage.getStoreFee();
if (chr.getMeso() < storeFee) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0B));
} else {
Item item;
inv.lockInventory(); // thanks imbee for pointing a dupe within storage
try {
if (mode == 4) { // take out
byte type = p.readByte();
byte slot = p.readByte();
if (slot < 0 || slot > storage.getSlots()) { // removal starts at zero
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to work with storage slot " + slot);
c.disconnect(true, false);
return;
}
slot = storage.getSlot(InventoryType.getByType(type), slot);
Item item = storage.getItem(slot);
if (item != null) {
if (ii.isPickupRestricted(item.getItemId()) && chr.haveItemWithId(item.getItemId(), true)) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0C));
return;
}
int takeoutFee = storage.getTakeOutFee();
if (chr.getMeso() < takeoutFee) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0B));
return;
} else {
chr.gainMeso(-takeoutFee, false);
}
if (InventoryManipulator.checkSpace(c, item.getItemId(), item.getQuantity(), item.getOwner())) {
if (storage.takeOut(item)) {
chr.setUsedStorage();
KarmaManipulator.toggleKarmaFlagToUntradeable(item);
InventoryManipulator.addFromDrop(c, item, false);
String itemName = ii.getName(item.getItemId());
FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " took out " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")");
storage.sendTakenOut(c, item.getInventoryType());
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0A));
}
}
} else if (mode == 5) { // store
short slot = p.readShort();
int itemId = p.readInt();
short quantity = p.readShort();
InventoryType invType = ItemConstants.getInventoryType(itemId);
Inventory inv = chr.getInventory(invType);
if (slot < 1 || slot > inv.getSlotLimit()) { //player inv starts at one
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to store item at slot " + slot);
c.disconnect(true, false);
return;
}
if (quantity < 1) {
c.sendPacket(PacketCreator.enableActions());
return;
}
if (storage.isFull()) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x11));
return;
}
int storeFee = storage.getStoreFee();
if (chr.getMeso() < storeFee) {
c.sendPacket(PacketCreator.getStorageError((byte) 0x0B));
} else {
Item item;
inv.lockInventory(); // thanks imbee for pointing a dupe within storage
try {
item = inv.getItem(slot);
if (item != null && item.getItemId() == itemId && (item.getQuantity() >= quantity || ItemConstants.isRechargeable(itemId))) {
if (ItemConstants.isWeddingRing(itemId) || ItemConstants.isWeddingToken(itemId)) {
c.sendPacket(PacketCreator.enableActions());
return;
}
if (ItemConstants.isRechargeable(itemId)) {
quantity = item.getQuantity();
}
InventoryManipulator.removeFromSlot(c, invType, slot, quantity, false);
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
item = item.copy(); // thanks Robin Schulz & BHB88 for noticing a inventory glitch when storing items
} finally {
inv.unlockInventory();
}
chr.gainMeso(-storeFee, false, true, false);
KarmaManipulator.toggleKarmaFlagToUntradeable(item);
item.setQuantity(quantity);
storage.store(item); // inside a critical section, "!(storage.isFull())" is still in effect...
chr.setUsedStorage();
String itemName = ii.getName(item.getItemId());
FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " stored " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")");
storage.sendStored(c, ItemConstants.getInventoryType(itemId));
}
} else if (mode == 6) { // arrange items
if(YamlConfig.config.server.USE_STORAGE_ITEM_SORT) storage.arrangeItems(c);
c.sendPacket(PacketCreator.enableActions());
} else if (mode == 7) { // meso
int meso = p.readInt();
int storageMesos = storage.getMeso();
int playerMesos = chr.getMeso();
if ((meso > 0 && storageMesos >= meso) || (meso < 0 && playerMesos >= -meso)) {
if (meso < 0 && (storageMesos - meso) < 0) {
meso = Integer.MIN_VALUE + storageMesos;
if (meso < playerMesos) {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else if (meso > 0 && (playerMesos + meso) < 0) {
meso = Integer.MAX_VALUE - playerMesos;
if (meso > storageMesos) {
c.sendPacket(PacketCreator.enableActions());
return;
}
}
storage.setMeso(storageMesos - meso);
chr.gainMeso(meso, false, true, false);
chr.setUsedStorage();
FilePrinter.print(FilePrinter.STORAGE + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + (meso > 0 ? " took out " : " stored ") + Math.abs(meso) + " mesos");
storage.sendMeso(c);
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else if (mode == 8) {// close... unless the player decides to enter cash shop!
storage.close();
item = inv.getItem(slot);
if (item != null && item.getItemId() == itemId && (item.getQuantity() >= quantity || ItemConstants.isRechargeable(itemId))) {
if (ItemConstants.isWeddingRing(itemId) || ItemConstants.isWeddingToken(itemId)) {
c.sendPacket(PacketCreator.enableActions());
return;
}
if (ItemConstants.isRechargeable(itemId)) {
quantity = item.getQuantity();
}
InventoryManipulator.removeFromSlot(c, invType, slot, quantity, false);
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
item = item.copy(); // thanks Robin Schulz & BHB88 for noticing a inventory glitch when storing items
} finally {
c.releaseClient();
inv.unlockInventory();
}
chr.gainMeso(-storeFee, false, true, false);
KarmaManipulator.toggleKarmaFlagToUntradeable(item);
item.setQuantity(quantity);
storage.store(item); // inside a critical section, "!(storage.isFull())" is still in effect...
chr.setUsedStorage();
String itemName = ii.getName(item.getItemId());
FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " stored " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")");
storage.sendStored(c, ItemConstants.getInventoryType(itemId));
}
} else if (mode == 6) { // arrange items
if (YamlConfig.config.server.USE_STORAGE_ITEM_SORT) {
storage.arrangeItems(c);
}
c.sendPacket(PacketCreator.enableActions());
} else if (mode == 7) { // meso
int meso = p.readInt();
int storageMesos = storage.getMeso();
int playerMesos = chr.getMeso();
if ((meso > 0 && storageMesos >= meso) || (meso < 0 && playerMesos >= -meso)) {
if (meso < 0 && (storageMesos - meso) < 0) {
meso = Integer.MIN_VALUE + storageMesos;
if (meso < playerMesos) {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else if (meso > 0 && (playerMesos + meso) < 0) {
meso = Integer.MAX_VALUE - playerMesos;
if (meso > storageMesos) {
c.sendPacket(PacketCreator.enableActions());
return;
}
}
storage.setMeso(storageMesos - meso);
chr.gainMeso(meso, false, true, false);
chr.setUsedStorage();
FilePrinter.print(FilePrinter.STORAGE + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + (meso > 0 ? " took out " : " stored ") + Math.abs(meso) + " mesos");
storage.sendMeso(c);
} else {
c.sendPacket(PacketCreator.enableActions());
return;
}
} else if (mode == 8) {// close... unless the player decides to enter cash shop!
storage.close();
}
} finally {
c.releaseClient();
}
}
}
}