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:
@@ -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");
|
||||
|
||||
@@ -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 -----");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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())));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = ?");
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user