Save chr slots to PG
This commit is contained in:
@@ -82,6 +82,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
|
|||||||
public class Client extends ChannelInboundHandlerAdapter {
|
public class Client extends ChannelInboundHandlerAdapter {
|
||||||
private static final Logger log = LoggerFactory.getLogger(Client.class);
|
private static final Logger log = LoggerFactory.getLogger(Client.class);
|
||||||
private static final int MAX_FAILED_LOGIN_ATTEMPTS = 5;
|
private static final int MAX_FAILED_LOGIN_ATTEMPTS = 5;
|
||||||
|
private static final int MAX_CHR_SLOTS = 15;
|
||||||
|
|
||||||
public static final int LOGIN_NOTLOGGEDIN = 0;
|
public static final int LOGIN_NOTLOGGEDIN = 0;
|
||||||
public static final int LOGIN_SERVER_TRANSITION = 1;
|
public static final int LOGIN_SERVER_TRANSITION = 1;
|
||||||
@@ -917,20 +918,12 @@ public class Client extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean canGainCharacterSlot() {
|
public boolean canGainCharacterSlot() {
|
||||||
return characterSlots < 15;
|
return characterSlots < MAX_CHR_SLOTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized boolean gainCharacterSlot() {
|
public boolean gainCharacterSlot() {
|
||||||
if (canGainCharacterSlot()) {
|
if (canGainCharacterSlot()) {
|
||||||
try (Connection con = DatabaseConnection.getConnection();
|
characterSlots++;
|
||||||
PreparedStatement ps = con.prepareStatement("UPDATE accounts SET characterslots = ? WHERE id = ?")) {
|
|
||||||
ps.setInt(1, this.characterSlots += 1);
|
|
||||||
ps.setInt(2, accId);
|
|
||||||
ps.executeUpdate();
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -81,4 +81,17 @@ public class AccountRepository {
|
|||||||
.execute() > 0;
|
.execute() > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean setChrSlots(int accountId, int chrSlots) {
|
||||||
|
String sql = """
|
||||||
|
UPDATE account
|
||||||
|
SET chr_slots = :chrSlots
|
||||||
|
WHERE id = :id""";
|
||||||
|
try (Handle handle = connection.getHandle()) {
|
||||||
|
return handle.createUpdate(sql)
|
||||||
|
.bind("id", accountId)
|
||||||
|
.bind("chrSlots", chrSlots)
|
||||||
|
.execute() > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ public final class PacketProcessor {
|
|||||||
registerHandler(RecvOpcode.TAKE_DAMAGE, new TakeDamageHandler());
|
registerHandler(RecvOpcode.TAKE_DAMAGE, new TakeDamageHandler());
|
||||||
registerHandler(RecvOpcode.MOVE_PLAYER, new MovePlayerHandler());
|
registerHandler(RecvOpcode.MOVE_PLAYER, new MovePlayerHandler());
|
||||||
registerHandler(RecvOpcode.USE_CASH_ITEM, new UseCashItemHandler(channelDeps.noteService(),
|
registerHandler(RecvOpcode.USE_CASH_ITEM, new UseCashItemHandler(channelDeps.noteService(),
|
||||||
channelDeps.shopFactory()));
|
channelDeps.shopFactory(), channelDeps.accountService()));
|
||||||
registerHandler(RecvOpcode.USE_ITEM, new UseItemHandler());
|
registerHandler(RecvOpcode.USE_ITEM, new UseItemHandler());
|
||||||
registerHandler(RecvOpcode.USE_RETURN_SCROLL, new UseItemHandler());
|
registerHandler(RecvOpcode.USE_RETURN_SCROLL, new UseItemHandler());
|
||||||
registerHandler(RecvOpcode.USE_UPGRADE_SCROLL, new ScrollHandler());
|
registerHandler(RecvOpcode.USE_UPGRADE_SCROLL, new ScrollHandler());
|
||||||
@@ -369,7 +369,8 @@ public final class PacketProcessor {
|
|||||||
registerHandler(RecvOpcode.MESSENGER, new MessengerHandler());
|
registerHandler(RecvOpcode.MESSENGER, new MessengerHandler());
|
||||||
registerHandler(RecvOpcode.NPC_ACTION, new NPCAnimationHandler());
|
registerHandler(RecvOpcode.NPC_ACTION, new NPCAnimationHandler());
|
||||||
registerHandler(RecvOpcode.CHECK_CASH, new TouchingCashShopHandler());
|
registerHandler(RecvOpcode.CHECK_CASH, new TouchingCashShopHandler());
|
||||||
registerHandler(RecvOpcode.CASHSHOP_OPERATION, new CashOperationHandler(channelDeps.noteService()));
|
registerHandler(RecvOpcode.CASHSHOP_OPERATION, new CashOperationHandler(channelDeps.noteService(),
|
||||||
|
channelDeps.accountService()));
|
||||||
registerHandler(RecvOpcode.COUPON_CODE, new CouponCodeHandler());
|
registerHandler(RecvOpcode.COUPON_CODE, new CouponCodeHandler());
|
||||||
registerHandler(RecvOpcode.SPAWN_PET, new SpawnPetHandler());
|
registerHandler(RecvOpcode.SPAWN_PET, new SpawnPetHandler());
|
||||||
registerHandler(RecvOpcode.MOVE_PET, new MovePetHandler());
|
registerHandler(RecvOpcode.MOVE_PET, new MovePetHandler());
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import server.CashShop;
|
|||||||
import server.CashShop.CashItem;
|
import server.CashShop.CashItem;
|
||||||
import server.CashShop.CashItemFactory;
|
import server.CashShop.CashItemFactory;
|
||||||
import server.ItemInformationProvider;
|
import server.ItemInformationProvider;
|
||||||
|
import service.AccountService;
|
||||||
import service.NoteService;
|
import service.NoteService;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
import tools.Pair;
|
import tools.Pair;
|
||||||
@@ -56,9 +57,11 @@ public final class CashOperationHandler extends AbstractPacketHandler {
|
|||||||
private static final Logger log = LoggerFactory.getLogger(CashOperationHandler.class);
|
private static final Logger log = LoggerFactory.getLogger(CashOperationHandler.class);
|
||||||
|
|
||||||
private final NoteService noteService;
|
private final NoteService noteService;
|
||||||
|
private final AccountService accountService;
|
||||||
|
|
||||||
public CashOperationHandler(NoteService noteService) {
|
public CashOperationHandler(NoteService noteService, AccountService accountService) {
|
||||||
this.noteService = noteService;
|
this.noteService = noteService;
|
||||||
|
this.accountService = accountService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -257,14 +260,13 @@ public final class CashOperationHandler extends AbstractPacketHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cs.gainCash(cash, cItem, chr.getWorld());
|
cs.gainCash(cash, cItem, chr.getWorld());
|
||||||
if (c.gainCharacterSlot()) {
|
if (!accountService.addChrSlot(c)) {
|
||||||
c.sendPacket(PacketCreator.showBoughtCharacterSlot(c.getCharacterSlots()));
|
|
||||||
c.sendPacket(PacketCreator.showCash(chr));
|
|
||||||
} else {
|
|
||||||
log.warn("Could not add a chr slot to {}'s account", Character.makeMapleReadable(chr.getName()));
|
log.warn("Could not add a chr slot to {}'s account", Character.makeMapleReadable(chr.getName()));
|
||||||
c.enableCSActions();
|
c.enableCSActions();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
c.sendPacket(PacketCreator.showBoughtCharacterSlot(c.getCharacterSlots()));
|
||||||
|
c.sendPacket(PacketCreator.showCash(chr));
|
||||||
} else if (action == 0x0D) { // Take from Cash Inventory
|
} else if (action == 0x0D) { // Take from Cash Inventory
|
||||||
Item item = cs.findByCashId(p.readInt());
|
Item item = cs.findByCashId(p.readInt());
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ import server.maps.MapleTVEffect;
|
|||||||
import server.maps.PlayerShopItem;
|
import server.maps.PlayerShopItem;
|
||||||
import server.shop.Shop;
|
import server.shop.Shop;
|
||||||
import server.shop.ShopFactory;
|
import server.shop.ShopFactory;
|
||||||
|
import service.AccountService;
|
||||||
import service.NoteService;
|
import service.NoteService;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
import tools.Pair;
|
import tools.Pair;
|
||||||
@@ -82,10 +83,12 @@ public final class UseCashItemHandler extends AbstractPacketHandler {
|
|||||||
|
|
||||||
private final NoteService noteService;
|
private final NoteService noteService;
|
||||||
private final ShopFactory shopFactory;
|
private final ShopFactory shopFactory;
|
||||||
|
private final AccountService accountService;
|
||||||
|
|
||||||
public UseCashItemHandler(NoteService noteService, ShopFactory shopFactory) {
|
public UseCashItemHandler(NoteService noteService, ShopFactory shopFactory, AccountService accountService) {
|
||||||
this.noteService = noteService;
|
this.noteService = noteService;
|
||||||
this.shopFactory = shopFactory;
|
this.shopFactory = shopFactory;
|
||||||
|
this.accountService = accountService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -493,7 +496,7 @@ public final class UseCashItemHandler extends AbstractPacketHandler {
|
|||||||
remove(c, position, itemId);
|
remove(c, position, itemId);
|
||||||
c.sendPacket(PacketCreator.enableActions());
|
c.sendPacket(PacketCreator.enableActions());
|
||||||
} else if (itemType == 543) {
|
} else if (itemType == 543) {
|
||||||
if (itemId == ItemId.MAPLE_LIFE_B && !c.gainCharacterSlot()) {
|
if (itemId == ItemId.MAPLE_LIFE_B && !accountService.addChrSlot(c)) {
|
||||||
player.dropMessage(1, "You have already used up all 12 extra character slots.");
|
player.dropMessage(1, "You have already used up all 12 extra character slots.");
|
||||||
c.sendPacket(PacketCreator.enableActions());
|
c.sendPacket(PacketCreator.enableActions());
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package service;
|
package service;
|
||||||
|
|
||||||
|
import client.Client;
|
||||||
import database.account.Account;
|
import database.account.Account;
|
||||||
import database.account.AccountRepository;
|
import database.account.AccountRepository;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -151,4 +152,30 @@ public class AccountService {
|
|||||||
log.error("Failed to set pic - account:{}, pin:{}", accountId, pic, e);
|
log.error("Failed to set pic - account:{}, pin:{}", accountId, pic, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean addChrSlot(Client c) {
|
||||||
|
if (!c.gainCharacterSlot()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int newChrSlots = c.getCharacterSlots() + 1;
|
||||||
|
setChrSlotsMysql(c.getAccID(), newChrSlots);
|
||||||
|
return setChrSlotsPostgres(c.getAccID(), newChrSlots);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setChrSlotsMysql(int accountId, int chrSlots) {
|
||||||
|
try (Connection con = DatabaseConnection.getConnection();
|
||||||
|
PreparedStatement ps = con.prepareStatement("UPDATE accounts SET characterslots = ? WHERE id = ?")) {
|
||||||
|
ps.setInt(1, chrSlots);
|
||||||
|
ps.setInt(2, accountId);
|
||||||
|
ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean setChrSlotsPostgres(int accountId, int chrSlots) {
|
||||||
|
return accountRepository.setChrSlots(accountId, chrSlots);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user