Code Coupons + Worldmap update + Mini-games + Player Interaction wrap

Fixed several cases on the Cash Shop that would freeze some player actions when triggered, requiring exit Cash Shop to unstuck.
Implemented Code Coupons, supporting several items bundled on the same code, and also devised a way to automate code generation.
Added a current status on-demand option on the Buyback command. Info such as "current fee" or "time remaining" are available now.
Reviewed several cases where non-owned items would get stacked with owner-tagged items.
Added Door support for Happyville, Crimsonwood Keep.
Added worldmap tooltip support for some maps in Masteria's C. Keep and H. House.
Added Masteria region to the world map.
C. Keep interiors no longer relocates players to entrance after actions such as logout.
Overhauled minigame mechanics: from player boxes tooltip and in-match improvements to deploy different minigame types, accordingly with item description or player choice.
Fixed Amoria outskirts not relocating players to city after getting KO'ed.
Fixed issues with pets, rings and cash items being assigned the same cash unique ids leading to some quirks on the cash shop inventory.
Fixed an issue with the recently added HP/MP ratio update, arbitrarily taking off 1 point in certain cases.
Answer positions on the explorer's 3rd job quiz are now randomed.
Fixed several issues that showed up when the bcrypt system is disabled.
DOT from maps such as El Nath and Aqua Road now procs at a 5sec interval, GMS-like.
Improved performance of Whodrops and Search commands.
Concurrently protected player interaction handlers, thus mitigating several exploits on these lines.
Adjusted several expedition timers, such as Horntail, now having a more sane deadline.
Concurrently protected chair modules.
Fixed "seduce" debuff not working on chairs.
This commit is contained in:
ronancpl
2018-10-09 22:39:36 -03:00
parent 3a8377c283
commit 2b44b4baa2
213 changed files with 16547 additions and 11031 deletions

View File

@@ -80,6 +80,7 @@ import client.MapleCharacter;
import client.SkillFactory;
import client.inventory.Item;
import client.inventory.ItemFactory;
import client.inventory.manipulator.MapleCashidGenerator;
import client.newyear.NewYearCardRecord;
import constants.ItemConstants;
import constants.GameConstants;
@@ -90,7 +91,6 @@ import server.life.MaplePlayerNPCFactory;
import server.quest.MapleQuest;
import tools.AutoJCE;
import tools.DatabaseConnection;
import tools.FilePrinter;
import tools.Pair;
public class Server {
@@ -518,6 +518,34 @@ public class Server {
return couponRates;
}
public static void cleanNxcodeCoupons(Connection con) throws SQLException {
if (!ServerConstants.USE_CLEAR_OUTDATED_COUPONS) return;
long timeClear = System.currentTimeMillis() - 14 * 24 * 60 * 60 * 1000;
PreparedStatement ps = con.prepareStatement("SELECT * FROM nxcode WHERE expiration <= ?");
ps.setLong(1, timeClear);
ResultSet rs = ps.executeQuery();
if (!rs.isLast()) {
PreparedStatement ps2 = con.prepareStatement("DELETE FROM nxcode_items WHERE codeid = ?");
while (rs.next()) {
ps2.setInt(1, rs.getInt("id"));
ps2.addBatch();
}
ps2.executeBatch();
ps2.close();
ps2 = con.prepareStatement("DELETE FROM nxcode WHERE expiration <= ?");
ps2.setLong(1, timeClear);
ps2.executeUpdate();
ps2.close();
}
rs.close();
ps.close();
}
private void loadCouponRates(Connection c) throws SQLException {
PreparedStatement ps = c.prepareStatement("SELECT couponid, rate FROM nxcoupons");
ResultSet rs = ps.executeQuery();
@@ -818,6 +846,7 @@ public class Server {
ps.executeUpdate();
ps.close();
cleanNxcodeCoupons(c);
loadCouponRates(c);
updateActiveCoupons();
@@ -825,6 +854,9 @@ public class Server {
} catch (SQLException sqle) {
sqle.printStackTrace();
}
MapleCashidGenerator.loadExistentCashIdsFromDb();
IoBuffer.setUseDirectBuffer(false);
IoBuffer.setAllocator(new SimpleBufferAllocator());
acceptor = new NioSocketAcceptor();
@@ -893,17 +925,6 @@ public class Server {
online = true;
}
public void shutdown() {
try {
TimerManager.getInstance().stop();
acceptor.unbind();
} catch (NullPointerException e) {
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, e);
}
System.out.println("Server offline.");
System.exit(0);// BOEIEND :D
}
public static void main(String args[]) {
System.setProperty("wzpath", "wz");
Security.setProperty("crypto.policy", "unlimited");

View File

@@ -198,6 +198,7 @@ public final class Channel {
System.out.println("Shutting down Channel " + channel + " on World " + world);
closeAllMerchants();
disconnectAwayPlayers();
players.disconnectAll();
if(respawnTask != null) {
@@ -314,6 +315,10 @@ public final class Channel {
return world;
}
public World getWorldServer() {
return Server.getInstance().getWorld(world);
}
public void addPlayer(MapleCharacter chr) {
players.addPlayer(chr);
chr.announce(MaplePacketCreator.serverMessage(serverMessage));
@@ -393,6 +398,16 @@ public final class Channel {
public boolean canUninstall() {
return players.getSize() == 0 && playersAway.isEmpty();
}
private void disconnectAwayPlayers() {
World wserv = getWorldServer();
for (Integer cid : playersAway) {
MapleCharacter chr = wserv.getPlayerStorage().getCharacterById(cid);
if (chr != null && chr.isLoggedin()) {
chr.getClient().disconnect(true, false);
}
}
}
public class respawnMaps implements Runnable {
@@ -465,7 +480,7 @@ public final class Channel {
public void setServerMessage(String message) {
this.serverMessage = message;
broadcastPacket(MaplePacketCreator.serverMessage(message));
Server.getInstance().getWorld(world).resetDisabledServerMessages();
getWorldServer().resetDisabledServerMessages();
}
private static String [] getEvents(){
@@ -692,7 +707,7 @@ public final class Channel {
lock.unlock();
}
World wserv = Server.getInstance().getWorld(world);
World wserv = getWorldServer();
Pair<Integer, Integer> coupleId = wserv.getMarriageQueuedCouple(ret);
Pair<Boolean, Set<Integer>> typeGuests = wserv.removeMarriageQueued(ret);
@@ -704,7 +719,7 @@ public final class Channel {
}
public boolean isWeddingReserved(Integer weddingId) {
World wserv = Server.getInstance().getWorld(world);
World wserv = getWorldServer();
lock.lock();
try {
@@ -746,7 +761,7 @@ public final class Channel {
public int pushWeddingReservation(Integer weddingId, boolean cathedral, boolean premium, Integer groomId, Integer brideId) {
if(weddingId == null || isWeddingReserved(weddingId)) return -1;
World wserv = Server.getInstance().getWorld(world);
World wserv = getWorldServer();
wserv.putMarriageQueued(weddingId, cathedral, premium, groomId, brideId);
lock.lock();
@@ -935,7 +950,7 @@ public final class Channel {
public Pair<Integer, Integer> getWeddingCoupleForGuest(int guestId, boolean cathedral) {
lock.lock();
try {
return (isOngoingWeddingGuest(cathedral, guestId)) ? Server.getInstance().getWorld(world).getRelationshipCouple(getOngoingWedding(cathedral)) : null;
return (isOngoingWeddingGuest(cathedral, guestId)) ? getWorldServer().getRelationshipCouple(getOngoingWedding(cathedral)) : null;
} finally {
lock.unlock();
}
@@ -1038,7 +1053,7 @@ public final class Channel {
public void debugMarriageStatus() {
System.out.println(" ----- WORLD DATA -----");
Server.getInstance().getWorld(world).debugMarriageStatus();
getWorldServer().debugMarriageStatus();
System.out.println(" ----- CH. " + channel + " -----");
System.out.println(" ----- CATHEDRAL -----");

View File

@@ -24,7 +24,6 @@ package net.server.channel.handlers;
import client.MapleClient;
import client.MapleCharacter;
import net.AbstractMaplePacketHandler;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
public final class CancelChairHandler extends AbstractMaplePacketHandler {
@@ -35,21 +34,6 @@ public final class CancelChairHandler extends AbstractMaplePacketHandler {
MapleCharacter mc = c.getPlayer();
if(!mc.isLoggedinWorld()) return;
if (id == -1) { // Cancel Chair
mc.setChair(0);
if(mc.unregisterChairBuff()) {
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.cancelForeignChairSkillEffect(mc.getId()), false);
}
c.announce(MaplePacketCreator.cancelChair(-1));
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showChair(c.getPlayer().getId(), 0), false);
} else { // Use In-Map Chair
mc.setChair(id);
if(mc.registerChairBuff()) {
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.giveForeignChairSkillEffect(mc.getId()), false);
}
c.announce(MaplePacketCreator.cancelChair(id));
}
mc.sitChair(id == -1 ? 0 : id);
}
}

View File

@@ -38,8 +38,10 @@ import server.CashShop;
import server.CashShop.CashItem;
import server.CashShop.CashItemFactory;
import client.inventory.manipulator.MapleInventoryManipulator;
import constants.ServerConstants;
import tools.FilePrinter;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.data.input.SeekableLittleEndianAccessor;
public final class CashOperationHandler extends AbstractMaplePacketHandler {
@@ -62,18 +64,20 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
CashItem cItem = CashItemFactory.getItem(snCS);
if (!canBuy(cItem, cs.getCash(useNX))) {
FilePrinter.printError(FilePrinter.ITEM, "Denied to sell cash item with SN " + cItem.getSN());
c.announce(MaplePacketCreator.enableActions());
return;
}
if(ItemConstants.isCashStore(cItem.getItemId()) && chr.getLevel() < 16) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (action == 0x03) { // Item
if(ItemConstants.isMapleLife(cItem.getItemId()) && chr.getLevel() < 30) {
c.announce(MaplePacketCreator.enableActions());
if (ItemConstants.isCashStore(cItem.getItemId()) && chr.getLevel() < 16) {
c.enableCSActions();
return;
} else if (ItemConstants.isRateCoupon(cItem.getItemId()) && !ServerConstants.USE_SUPPLY_RATE_COUPONS) {
chr.dropMessage(1, "Rate coupons are currently unavailable to purchase.");
c.enableCSActions();
return;
} else if (ItemConstants.isMapleLife(cItem.getItemId()) && chr.getLevel() < 30) {
c.enableCSActions();
return;
}
@@ -95,20 +99,17 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
Map<String, String> recipient = MapleCharacter.getCharacterFromDatabase(slea.readMapleAsciiString());
String message = slea.readMapleAsciiString();
if (!canBuy(cItem, cs.getCash(4)) || message.length() < 1 || message.length() > 73) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (!checkBirthday(c, birthday)) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC4));
c.announce(MaplePacketCreator.enableActions());
return;
} else if (recipient == null) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xA9));
c.announce(MaplePacketCreator.enableActions());
return;
} else if (recipient.get("accountid").equals(String.valueOf(c.getAccID()))) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xA8));
c.announce(MaplePacketCreator.enableActions());
return;
}
cs.gift(Integer.parseInt(recipient.get("id")), chr.getName(), message, cItem.getSN());
@@ -139,7 +140,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
if (mode == 0) {
byte type = slea.readByte();
if (cs.getCash(cash) < 4000) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (chr.gainSlots(type, 4, false)) {
@@ -151,7 +152,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
CashItem cItem = CashItemFactory.getItem(slea.readInt());
int type = (cItem.getItemId() - 9110000) / 1000;
if (!canBuy(cItem, cs.getCash(cash))) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (chr.gainSlots(type, 8, false)) {
@@ -166,7 +167,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
byte mode = slea.readByte();
if (mode == 0) {
if (cs.getCash(cash) < 4000) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (chr.getStorage().gainSlots(4)) {
@@ -181,7 +182,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
CashItem cItem = CashItemFactory.getItem(slea.readInt());
if (!canBuy(cItem, cs.getCash(cash))) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (chr.getStorage().gainSlots(8)) {
@@ -196,7 +197,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
CashItem cItem = CashItemFactory.getItem(slea.readInt());
if (!canBuy(cItem, cs.getCash(cash))) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
@@ -206,13 +207,13 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.showCash(chr));
} else {
chr.dropMessage(1, "You have already used up all 12 extra character slots.");
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
} else if (action == 0x0D) { // Take from Cash Inventory
Item item = cs.findByCashId(slea.readInt());
if (item == null) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
if (chr.getInventory(item.getInventoryType()).addItem(item) != -1) {
@@ -240,11 +241,11 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
MapleInventory mi = chr.getInventory(MapleInventoryType.getByType(invType));
Item item = mi.findByCashId(cashId);
if (item == null) {
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
} else if(c.getPlayer().getPetIndex(item.getPetId()) > -1) {
chr.getClient().announce(MaplePacketCreator.serverNotice(1, "You cannot put the pet you currently equip into the Cash Shop inventory."));
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}
cs.addToInventory(item);
@@ -265,19 +266,19 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
/* if (partner.getGender() == chr.getGender()) {
chr.dropMessage("You and your partner are the same gender, please buy a friendship ring.");
c.announce(MaplePacketCreator.enableActions());
c.enableCSActions();
return;
}*/ //Gotta let them faggots marry too, hence why this is commented out <3
if(itemRing.toItem() instanceof Equip) {
Equip eqp = (Equip) itemRing.toItem();
int ringid = MapleRing.createRing(itemRing.getItemId(), chr, partner);
eqp.setRingId(ringid);
Pair<Integer, Integer> rings = MapleRing.createRing(itemRing.getItemId(), chr, partner);
eqp.setRingId(rings.getLeft());
cs.addToInventory(eqp);
c.announce(MaplePacketCreator.showBoughtCashItem(eqp, c.getAccID()));
cs.gift(partner.getId(), chr.getName(), text, eqp.getSN(), (ringid + 1));
cs.gift(partner.getId(), chr.getName(), text, eqp.getSN(), rings.getRight());
cs.gainCash(toCharge, itemRing, chr.getWorld());
chr.addCrushRing(MapleRing.loadFromDb(ringid));
chr.addCrushRing(MapleRing.loadFromDb(rings.getLeft()));
try {
chr.sendNote(partner.getName(), text, (byte) 1);
} catch (SQLException ex) {
@@ -288,17 +289,33 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
}
} else {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC4));
c.announce(MaplePacketCreator.enableActions());
}
c.announce(MaplePacketCreator.showCash(c.getPlayer()));
} else if (action == 0x20) { // everything is 1 meso...
int itemId = CashItemFactory.getItem(slea.readInt()).getItemId();
} else if (action == 0x20) {
int serialNumber = slea.readInt(); // thanks GabrielSin for detecting a potential exploit with 1 meso cash items.
if (serialNumber / 10000000 != 8) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC0));
return;
}
if (chr.getMeso() > 0) {
CashItem item = CashItemFactory.getItem(serialNumber);
if (item == null || !item.isOnSale()) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC0));
return;
}
int itemId = item.getItemId();
int itemPrice = item.getPrice();
if (itemPrice <= 0) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC0));
return;
}
if (chr.getMeso() >= itemPrice) {
if (chr.canHold(itemId)) {
chr.gainMeso(-1, false);
MapleInventoryManipulator.addById(c, itemId, (short) 1);
chr.gainMeso(-itemPrice, false);
MapleInventoryManipulator.addById(c, itemId, (short) 1, "", -1);
c.announce(MaplePacketCreator.showBoughtQuestItem(itemId));
}
}
@@ -321,13 +338,13 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
// Need to check to make sure its actually an equip and the right SN...
if(itemRing.toItem() instanceof Equip) {
Equip eqp = (Equip) itemRing.toItem();
int ringid = MapleRing.createRing(itemRing.getItemId(), chr, partner);
eqp.setRingId(ringid);
Pair<Integer, Integer> rings = MapleRing.createRing(itemRing.getItemId(), chr, partner);
eqp.setRingId(rings.getLeft());
cs.addToInventory(eqp);
c.announce(MaplePacketCreator.showBoughtCashItem(eqp, c.getAccID()));
cs.gift(partner.getId(), chr.getName(), text, eqp.getSN(), (ringid + 1));
cs.gift(partner.getId(), chr.getName(), text, eqp.getSN(), rings.getRight());
cs.gainCash(payment, -itemRing.getPrice());
chr.addFriendshipRing(MapleRing.loadFromDb(ringid));
chr.addFriendshipRing(MapleRing.loadFromDb(rings.getLeft()));
try {
chr.sendNote(partner.getName(), text, (byte) 1);
} catch (SQLException ex) {
@@ -338,7 +355,6 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
}
} else {
c.announce(MaplePacketCreator.showCashShopMessage((byte) 0xC4));
c.announce(MaplePacketCreator.enableActions());
}
c.announce(MaplePacketCreator.showCash(c.getPlayer()));

View File

@@ -50,7 +50,7 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
chr.setPetLootCd(currentServerTime());
//chr.setPetLootCd(currentServerTime());
/*long timeElapsed = currentServerTime() - chr.getAutobanManager().getLastSpam(8);
if(timeElapsed < 300) {

View File

@@ -4,6 +4,8 @@
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
Copyleft (L) 2016 - 2018 RonanLana (HeavenMS)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
@@ -21,107 +23,228 @@
*/
package net.server.channel.handlers;
import java.sql.SQLException;
import client.MapleClient;
import client.MapleCharacter;
import client.inventory.Item;
import client.inventory.manipulator.MapleInventoryManipulator;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.AbstractMaplePacketHandler;
import client.inventory.manipulator.MapleInventoryManipulator;
import net.server.Server;
import server.CashShop;
import server.MapleItemInformationProvider;
import tools.DatabaseConnection;
import tools.FilePrinter;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.data.input.SeekableLittleEndianAccessor;
/**
*
* @author Penguins (Acrylic)
* @author Ronan (HeavenMS)
*/
public final class CouponCodeHandler extends AbstractMaplePacketHandler {
private static List<Pair<Integer, Pair<Integer, Integer>>> getNXCodeItems(MapleCharacter chr, Connection con, int codeid) throws SQLException {
Map<Integer, Integer> couponItems = new HashMap<>();
Map<Integer, Integer> couponPoints = new HashMap<>(5);
PreparedStatement ps = con.prepareStatement("SELECT * FROM nxcode_items WHERE codeid = ?");
ps.setInt(1, codeid);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int type = rs.getInt("type"), item = rs.getInt("item");
if (type < 5) {
Integer i = couponPoints.get(type);
if (i != null) {
couponPoints.put(type, i + item);
} else {
couponPoints.put(type, item);
}
} else {
int quantity = rs.getInt("quantity");
Integer i = couponItems.get(item);
if (i != null) {
couponItems.put(item, i + quantity);
} else {
couponItems.put(item, quantity);
}
}
}
rs.close();
ps.close();
List<Pair<Integer, Pair<Integer, Integer>>> ret = new LinkedList<>();
if (!couponItems.isEmpty()) {
for (Entry<Integer, Integer> e : couponItems.entrySet()) {
int item = e.getKey(), qty = e.getValue();
if (MapleItemInformationProvider.getInstance().getName(item) == null) {
item = 4000000;
qty = 1;
FilePrinter.printError(FilePrinter.UNHANDLED_EVENT, "Error trying to redeem itemid " + item + " from codeid " + codeid + ".");
}
if (!chr.canHold(item, qty)) {
return null;
}
ret.add(new Pair<>(5, new Pair<>(item, qty)));
}
}
if (!couponPoints.isEmpty()) {
for (Entry<Integer, Integer> e : couponPoints.entrySet()) {
ret.add(new Pair<>(e.getKey(), new Pair<>(e.getValue(), 777)));
}
}
return ret;
}
private static Pair<Integer, List<Pair<Integer, Pair<Integer, Integer>>>> getNXCodeResult(MapleCharacter chr, String code) {
MapleClient c = chr.getClient();
List<Pair<Integer, Pair<Integer, Integer>>> ret = new LinkedList<>();
try {
if (!c.attemptCsCoupon()) {
return new Pair<>(-5, null);
}
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM nxcode WHERE code = ?");
ps.setString(1, code);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
return new Pair<>(-1, null);
}
if (rs.getString("retriever") != null) {
return new Pair<>(-2, null);
}
if (rs.getLong("expiration") < Server.getInstance().getCurrentTime()) {
return new Pair<>(-3, null);
}
int codeid = rs.getInt("id");
rs.close();
ps.close();
ret = getNXCodeItems(chr, con, codeid);
if (ret == null) {
return new Pair<>(-4, null);
}
ps = con.prepareStatement("UPDATE nxcode SET retriever = ? WHERE code = ?");
ps.setString(1, chr.getName());
ps.setString(2, code);
ps.executeUpdate();
ps.close();
con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
c.resetCsCoupon();
return new Pair<>(0, ret);
}
private static int parseCouponResult(int res) {
switch (res) {
case -1:
return 0xB0;
case -2:
return 0xB3;
case -3:
return 0xB2;
case -4:
return 0xBB;
default:
return 0xB1;
}
}
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
slea.skip(2);
String code = slea.readMapleAsciiString();
boolean validcode = false;
int type = -1;
int item = -1;
validcode = getNXCodeValid(code.toUpperCase(), validcode);
if (validcode) {
type = getNXCode(code, "type");
item = getNXCode(code, "item");
if (type != 5) {
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("UPDATE nxcode SET `valid` = 0 WHERE code = " + code);
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("UPDATE nxcode SET `user` = ? WHERE code = ?");
ps.setString(1, c.getPlayer().getName());
ps.setString(2, code);
ps.executeUpdate();
ps.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
if (c.tryacquireClient()) {
try {
Pair<Integer, List<Pair<Integer, Pair<Integer, Integer>>>> codeRes = getNXCodeResult(c.getPlayer(), code.toUpperCase());
int type = codeRes.getLeft();
if (type < 0) {
c.announce(MaplePacketCreator.showCashShopMessage((byte) parseCouponResult(type)));
} else {
List<Item> couponPackage = new LinkedList<>();
for (Pair<Integer, Pair<Integer, Integer>> p : codeRes.getRight()) {
type = p.getLeft();
int item = p.getRight().getLeft();
CashShop cs = c.getPlayer().getCashShop();
switch (type) {
case 0:
case 4:
cs.gainCash(1, item); //nxCredit
break;
case 1:
cs.gainCash(2, item); //maplePoint
break;
case 2:
cs.gainCash(4, item); //nxPrepaid
break;
case 3:
cs.gainCash(1, item);
cs.gainCash(4, (item / 5000));
break;
default:
short qty = p.getRight().getRight().shortValue();
if (MapleItemInformationProvider.getInstance().isCash(item)) {
Item it = CashShop.generateCouponItem(item, qty);
cs.addToInventory(it);
couponPackage.add(it);
} else {
MapleInventoryManipulator.addById(c, item, qty, "", -1);
}
//c.announce(MaplePacketCreator.showCouponRedeemedItem(item));
break;
}
}
if (!couponPackage.isEmpty()) {
c.announce(MaplePacketCreator.showBoughtCashPackage(couponPackage, c.getAccID()));
} else {
c.announce(MaplePacketCreator.showBoughtQuestItem(0));
}
c.enableCSActions();
}
} finally {
c.releaseClient();
}
switch (type) {
case 0:
case 1:
case 2:
c.getPlayer().getCashShop().gainCash(type, item);
break;
case 3:
c.getPlayer().getCashShop().gainCash(0, item);
c.getPlayer().getCashShop().gainCash(2, (item / 5000));
break;
case 4:
MapleInventoryManipulator.addById(c, item, (short) 1, null, -1, -1);
c.announce(MaplePacketCreator.showCouponRedeemedItem(item));
break;
case 5:
c.getPlayer().getCashShop().gainCash(0, item);
break;
}
c.announce(MaplePacketCreator.showCash(c.getPlayer()));
} else {
//c.announce(MaplePacketCreator.wrongCouponCode());
}
c.announce(MaplePacketCreator.enableCSUse());
}
private int getNXCode(String code, String type) {
int item = -1;
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT `" + type + "` FROM nxcode WHERE code = ?");
ps.setString(1, code);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
item = rs.getInt(type);
}
rs.close();
ps.close();
con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return item;
}
private boolean getNXCodeValid(String code, boolean validcode) {
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT `valid` FROM nxcode WHERE code = ?");
ps.setString(1, code);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
validcode = rs.getInt("valid") != 0;
}
rs.close();
ps.close();
con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return validcode;
}
}

View File

@@ -111,7 +111,7 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
ex.printStackTrace();
}
chr.getCashShop().open(true);// xD
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.MTSWantedListingOver(0, 0));
c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
List<MTSItemInfo> items = new ArrayList<>();

View File

@@ -40,13 +40,13 @@ public final class FaceExpressionHandler extends AbstractMaplePacketHandler {
}
}
if(c.trylockClient()) {
if(c.tryacquireClient()) {
try { // expecting players never intends to wear the emote 0 (default face, that changes back after 5sec timeout)
if (emote != 0 && chr.isLoggedinWorld()) {
chr.changeFaceExpression(emote);
}
} finally {
c.unlockClient();
c.releaseClient();
}
}
}

View File

@@ -60,7 +60,7 @@ public final class ItemRewardHandler extends AbstractMaplePacketHandler {
}
MapleInventoryManipulator.addFromDrop(c, item, false);
} else {
MapleInventoryManipulator.addById(c, reward.itemid, reward.quantity);
MapleInventoryManipulator.addById(c, reward.itemid, reward.quantity, "", -1);
}
MapleInventoryManipulator.removeById(c, MapleInventoryType.USE, itemId, 1, false, false);
if (reward.worldmsg != null) {

View File

@@ -214,7 +214,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
c.getPlayer().gainMeso(-5000, false);
c.announce(MaplePacketCreator.MTSConfirmSell());
c.announce(getMTS(1, 0, 0));
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
}
@@ -240,7 +240,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
}
c.getPlayer().changeTab(tab);
c.getPlayer().changeType(type);
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
} else if (op == 6) { //search
@@ -253,7 +253,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
c.getPlayer().changeTab(tab);
c.getPlayer().changeType(type);
c.getPlayer().changeCI(ci);
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.enableActions());
c.announce(getMTSSearch(tab, type, ci, search, c.getPlayer().getCurrentPage()));
c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
@@ -277,7 +277,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
} catch (SQLException e) {
e.printStackTrace();
}
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(getMTS(c.getPlayer().getCurrentTab(), c.getPlayer().getCurrentType(), c.getPlayer().getCurrentPage()));
c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
@@ -331,7 +331,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
pse.executeUpdate();
}
MapleInventoryManipulator.addFromDrop(c, i, false);
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(getCart(c.getPlayer().getId()));
c.announce(getMTS(c.getPlayer().getCurrentTab(), c.getPlayer().getCurrentType(), c.getPlayer().getCurrentPage()));
c.announce(MaplePacketCreator.MTSConfirmTransfer(i.getQuantity(), i.getPosition()));
@@ -374,7 +374,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
e.printStackTrace();
}
c.announce(getMTS(c.getPlayer().getCurrentTab(), c.getPlayer().getCurrentType(), c.getPlayer().getCurrentPage()));
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.enableActions());
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
@@ -393,7 +393,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
e.printStackTrace();
}
c.announce(getCart(c.getPlayer().getId()));
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
} else if (op == 12) { //put item up for auction
@@ -445,7 +445,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
pse.executeUpdate();
pse.close();
c.getPlayer().getCashShop().gainCash(4, -price);
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(getMTS(c.getPlayer().getCurrentTab(), c.getPlayer().getCurrentType(), c.getPlayer().getCurrentPage()));
c.announce(MaplePacketCreator.MTSConfirmBuy());
c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
@@ -507,7 +507,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
pse.close();
c.getPlayer().getCashShop().gainCash(4, -price);
c.announce(getCart(c.getPlayer().getId()));
c.announce(MaplePacketCreator.enableCSUse());
c.enableCSActions();
c.announce(MaplePacketCreator.MTSConfirmBuy());
c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));

View File

@@ -39,7 +39,7 @@ public final class MagicDamageHandler extends AbstractDealDamageHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
chr.setPetLootCd(currentServerTime());
//chr.setPetLootCd(currentServerTime());
/*long timeElapsed = currentServerTime() - chr.getAutobanManager().getLastSpam(8);
if(timeElapsed < 300) {

View File

@@ -23,6 +23,7 @@ package net.server.channel.handlers;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import client.autoban.AutobanManager;
@@ -65,18 +66,25 @@ public final class PetFoodHandler extends AbstractMaplePacketHandler {
short pos = slea.readShort();
int itemId = slea.readInt();
Item use = chr.getInventory(MapleInventoryType.USE).getItem(pos);
if (use == null || (itemId / 10000) != 212 || use.getItemId() != itemId) {
return;
}
c.lockClient();
try {
pet.gainClosenessFullness(chr, (pet.getFullness() <= 75) ? 1 : 0, 30, 1); // 25+ "emptyness" to get +1 closeness
} finally {
c.unlockClient();
if (c.tryacquireClient()) {
try {
MapleInventory useInv = chr.getInventory(MapleInventoryType.USE);
useInv.lockInventory();
try {
Item use = useInv.getItem(pos);
if (use == null || (itemId / 10000) != 212 || use.getItemId() != itemId || use.getQuantity() < 1) {
return;
}
pet.gainClosenessFullness(chr, (pet.getFullness() <= 75) ? 1 : 0, 30, 1); // 25+ "emptyness" to get +1 closeness
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, pos, (short) 1, false);
} finally {
useInv.unlockInventory();
}
} finally {
c.releaseClient();
}
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, pos, (short) 1, false);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -51,8 +51,8 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
chr.setPetLootCd(currentServerTime());
//chr.setPetLootCd(currentServerTime());
/*long timeElapsed = currentServerTime() - chr.getAutobanManager().getLastSpam(8);
if(timeElapsed < 300) {
AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed);

View File

@@ -273,20 +273,20 @@ public final class RingActionHandler extends AbstractMaplePacketHandler {
}
public static void giveMarriageRings(MapleCharacter player, MapleCharacter partner, int marriageRingId) {
int ringid = MapleRing.createRing(marriageRingId, player, partner);
Pair<Integer, Integer> rings = MapleRing.createRing(marriageRingId, player, partner);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item ringObj = ii.getEquipById(marriageRingId);
Equip ringEqp = (Equip) ringObj;
ringEqp.setRingId(ringid);
player.addMarriageRing(MapleRing.loadFromDb(ringid));
ringEqp.setRingId(rings.getLeft());
player.addMarriageRing(MapleRing.loadFromDb(rings.getLeft()));
MapleInventoryManipulator.addFromDrop(player.getClient(), ringEqp, false, -1);
player.broadcastMarriageMessage();
ringObj = ii.getEquipById(marriageRingId);
ringEqp = (Equip) ringObj;
ringEqp.setRingId(ringid + 1);
partner.addMarriageRing(MapleRing.loadFromDb(ringid + 1));
ringEqp.setRingId(rings.getRight());
partner.addMarriageRing(MapleRing.loadFromDb(rings.getRight()));
MapleInventoryManipulator.addFromDrop(partner.getClient(), ringEqp, false, -1);
partner.broadcastMarriageMessage();
}
@@ -513,6 +513,6 @@ public final class RingActionHandler extends AbstractMaplePacketHandler {
break;
}
c.getSession().write(MaplePacketCreator.enableActions());
c.announce(MaplePacketCreator.enableActions());
}
}

View File

@@ -28,9 +28,10 @@ import tools.data.input.SeekableLittleEndianAccessor;
/**
*
* @author Acrylic (Terry Han)
* @author Terry Han (Acrylic)
*/
public final class TouchingCashShopHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.announce(MaplePacketCreator.showCash(c.getPlayer()));
}

View File

@@ -276,7 +276,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
if (item == null) //hack
{
return;
} else if (((item.getFlag() & ItemConstants.UNTRADEABLE) == ItemConstants.UNTRADEABLE) || (ii.isDropRestricted(item.getItemId()) && !MapleKarmaManipulator.hasKarmaFlag(item))) {
} else if (item.isUntradeable()) {
player.dropMessage(1, "You cannot trade this item.");
c.announce(MaplePacketCreator.enableActions());
return;
@@ -299,7 +299,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
break;
}
remove(c, itemId);
} else if (itemType == 508) { // graduation banner, thanks to tmskdl12
} else if (itemType == 508) { // graduation banner, thanks to tmskdl12. Also, thanks ratency for first pointing lack of Kite handling
MapleKite kite = new MapleKite(player, slea.readMapleAsciiString(), itemId);
if (!GameConstants.isFreeMarketRoom(player.getMapId())) {
@@ -517,7 +517,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
Equip toScroll = (Equip) eitem;
if (toScroll.getUpgradeSlots() < 1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.announce(MaplePacketCreator.getInventoryFull());
return;
}
@@ -527,10 +527,10 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
player.toggleBlockCashShop();
final int curlevel = toScroll.getLevel();
c.getSession().write(MaplePacketCreator.sendVegaScroll(0x40));
c.announce(MaplePacketCreator.sendVegaScroll(0x40));
final Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, uitem.getItemId(), false, itemId, player.isGM());
c.getSession().write(MaplePacketCreator.sendVegaScroll(scrolled.getLevel() > curlevel ? 0x41 : 0x43));
c.announce(MaplePacketCreator.sendVegaScroll(scrolled.getLevel() > curlevel ? 0x41 : 0x43));
//opcodes 0x42, 0x44: "this item cannot be used"; 0x39, 0x45: crashes
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, uSlot, (short) 1, false);
@@ -555,7 +555,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
player.equipChanged();
}
client.getSession().write(MaplePacketCreator.enableActions());
client.announce(MaplePacketCreator.enableActions());
}
}, 1000 * 3);
} else {

View File

@@ -24,7 +24,6 @@ package net.server.channel.handlers;
import client.MapleClient;
import client.inventory.MapleInventoryType;
import net.AbstractMaplePacketHandler;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
public final class UseChairHandler extends AbstractMaplePacketHandler {
@@ -34,8 +33,7 @@ public final class UseChairHandler extends AbstractMaplePacketHandler {
if (c.getPlayer().getInventory(MapleInventoryType.SETUP).findById(itemId) == null) {
return;
}
c.getPlayer().setChair(itemId);
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showChair(c.getPlayer().getId(), itemId), false);
c.announce(MaplePacketCreator.enableActions());
c.getPlayer().sitChair(itemId);
}
}

View File

@@ -25,6 +25,7 @@ import client.MapleClient;
import client.MapleCharacter;
import client.MapleMount;
import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import constants.ExpTable;
import net.AbstractMaplePacketHandler;
@@ -45,29 +46,37 @@ public final class UseMountFoodHandler extends AbstractMaplePacketHandler {
MapleCharacter chr = c.getPlayer();
MapleMount mount = chr.getMount();
Item item = chr.getInventory(MapleInventoryType.USE).getItem(pos);
if (item != null && item.getItemId() == itemid && mount != null) {
c.lockClient();
MapleInventory useInv = chr.getInventory(MapleInventoryType.USE);
if (c.tryacquireClient()) {
try {
int curTiredness = mount.getTiredness();
int healedTiredness = Math.min(curTiredness, 30);
float healedFactor = (float) healedTiredness / 30;
mount.setTiredness(curTiredness - healedTiredness);
if (healedFactor > 0.0f) {
mount.setExp(mount.getExp() + (int) Math.ceil(healedFactor * (2 * mount.getLevel() + 6)));
int level = mount.getLevel();
boolean levelup = mount.getExp() >= ExpTable.getMountExpNeededForLevel(level) && level < 31;
if (levelup) {
mount.setLevel(level + 1);
useInv.lockInventory();
try {
Item item = useInv.getItem(pos);
if (item != null && item.getItemId() == itemid && mount != null) {
int curTiredness = mount.getTiredness();
int healedTiredness = Math.min(curTiredness, 30);
float healedFactor = (float) healedTiredness / 30;
mount.setTiredness(curTiredness - healedTiredness);
if (healedFactor > 0.0f) {
mount.setExp(mount.getExp() + (int) Math.ceil(healedFactor * (2 * mount.getLevel() + 6)));
int level = mount.getLevel();
boolean levelup = mount.getExp() >= ExpTable.getMountExpNeededForLevel(level) && level < 31;
if (levelup) {
mount.setLevel(level + 1);
}
chr.getMap().broadcastMessage(MaplePacketCreator.updateMount(chr.getId(), mount, levelup));
}
MapleInventoryManipulator.removeById(c, MapleInventoryType.USE, itemid, 1, true, false);
}
chr.getMap().broadcastMessage(MaplePacketCreator.updateMount(chr.getId(), mount, levelup));
} finally {
useInv.unlockInventory();
}
MapleInventoryManipulator.removeById(c, MapleInventoryType.USE, itemid, 1, true, false);
} finally {
c.unlockClient();
c.releaseClient();
}
}
}

View File

@@ -49,9 +49,9 @@ public final class WhisperHandler extends AbstractMaplePacketHandler {
String recipient = slea.readMapleAsciiString();
String text = slea.readMapleAsciiString();
MapleCharacter player = c.getChannelServer().getPlayerStorage().getCharacterByName(recipient);
if(c.getPlayer().getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) {
return;
}
if (c.getPlayer().getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) {
return;
}
if (text.length() > Byte.MAX_VALUE && !player.isGM()) {
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with whispers.");
FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length() + "\r\n");
@@ -92,7 +92,7 @@ public final class WhisperHandler extends AbstractMaplePacketHandler {
} else {
c.announce(MaplePacketCreator.getFindReply(victim.getName(), victim.getMap().getId(), 1));
}
} else if (c.getPlayer().gmLevel() > 1) { // not found
} else if (c.getPlayer().isGM()) { // not found
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT gm FROM characters WHERE name = ?");

View File

@@ -37,6 +37,9 @@ import tools.data.input.SeekableLittleEndianAccessor;
import client.MapleClient;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public final class LoginPasswordHandler implements MaplePacketHandler {
@@ -45,6 +48,11 @@ public final class LoginPasswordHandler implements MaplePacketHandler {
return !c.isLoggedIn();
}
private static String hashpwSHA512(String pwd) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest digester = MessageDigest.getInstance("SHA-512");
digester.update(pwd.getBytes("UTF-8"), 0, pwd.length());
return HexTool.toString(digester.digest()).replace(" ", "").toLowerCase();
}
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
@@ -65,7 +73,7 @@ public final class LoginPasswordHandler implements MaplePacketHandler {
con = DatabaseConnection.getConnection();
ps = con.prepareStatement("INSERT INTO accounts (name, password, birthday, tempban) VALUES (?, ?, ?, ?);", Statement.RETURN_GENERATED_KEYS); //Jayd: Added birthday, tempban
ps.setString(1, login);
ps.setString(2, BCrypt.hashpw(pwd, BCrypt.gensalt(12)));
ps.setString(2, ServerConstants.BCRYPT_MIGRATION ? BCrypt.hashpw(pwd, BCrypt.gensalt(12)) : hashpwSHA512(pwd));
ps.setString(3, "2018-06-20"); //Jayd's idea: was added to solve the MySQL 5.7 strict checking (birthday)
ps.setString(4, "2018-06-20"); //Jayd's idea: was added to solve the MySQL 5.7 strict checking (tempban)
ps.executeUpdate();
@@ -74,7 +82,7 @@ public final class LoginPasswordHandler implements MaplePacketHandler {
rs.next();
c.setAccID(rs.getInt(1));
rs.close();
} catch (SQLException e) {
} catch (SQLException | NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
} finally {
disposeSql(con, ps);