PoC for the glitch: https://www.youtube.com/watch?v=EoVGQtMkJOA&ab_channel=ThirtyOneFifty
165 lines
8.8 KiB
Java
165 lines
8.8 KiB
Java
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
package net.server.channel.handlers;
|
|
|
|
|
|
import client.Character;
|
|
import client.Client;
|
|
import client.inventory.Inventory;
|
|
import client.inventory.InventoryType;
|
|
import client.inventory.Item;
|
|
import client.inventory.manipulator.InventoryManipulator;
|
|
import client.inventory.manipulator.KarmaManipulator;
|
|
import config.YamlConfig;
|
|
import constants.inventory.ItemConstants;
|
|
import net.AbstractPacketHandler;
|
|
import net.packet.InPacket;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import server.Marriage;
|
|
import tools.PacketCreator;
|
|
import tools.packets.WeddingPackets;
|
|
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* @author Drago (Dragohe4rt)
|
|
*/
|
|
public final class WeddingHandler extends AbstractPacketHandler {
|
|
private static final Logger log = LoggerFactory.getLogger(WeddingHandler.class);
|
|
|
|
@Override
|
|
public void handlePacket(InPacket p, Client c) {
|
|
|
|
if (c.tryacquireClient()) {
|
|
try {
|
|
Character chr = c.getPlayer();
|
|
final byte mode = p.readByte();
|
|
|
|
if (mode == 6) { //additem
|
|
short slot = p.readShort();
|
|
int itemid = p.readInt();
|
|
short quantity = p.readShort();
|
|
|
|
Marriage marriage = c.getPlayer().getMarriageInstance();
|
|
if (marriage != null) {
|
|
try {
|
|
boolean groomWishlist = marriage.giftItemToSpouse(chr.getId());
|
|
String groomWishlistProp = "giftedItem" + (groomWishlist ? "G" : "B") + chr.getId();
|
|
|
|
int giftCount = marriage.getIntProperty(groomWishlistProp);
|
|
if (giftCount < YamlConfig.config.server.WEDDING_GIFT_LIMIT) {
|
|
int cid = marriage.getIntProperty(groomWishlist ? "groomId" : "brideId");
|
|
if (chr.getId() != cid) { // cannot gift yourself
|
|
Character spouse = marriage.getPlayerById(cid);
|
|
if (spouse != null) {
|
|
InventoryType type = ItemConstants.getInventoryType(itemid);
|
|
Inventory chrInv = chr.getInventory(type);
|
|
|
|
Item newItem = null;
|
|
chrInv.lockInventory();
|
|
try {
|
|
Item item = chrInv.getItem((byte) slot);
|
|
if (item != null) {
|
|
if (!item.isUntradeable()) {
|
|
if (itemid == item.getItemId() && quantity <= item.getQuantity()) {
|
|
newItem = item.copy();
|
|
newItem.setQuantity(quantity);
|
|
marriage.addGiftItem(groomWishlist, newItem);
|
|
InventoryManipulator.removeFromSlot(c, type, slot, quantity, false, false);
|
|
|
|
KarmaManipulator.toggleKarmaFlagToUntradeable(newItem);
|
|
marriage.setIntProperty(groomWishlistProp, giftCount + 1);
|
|
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xB, marriage.getWishlistItems(groomWishlist), Collections.singletonList(newItem)));
|
|
}
|
|
} else {
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, marriage.getWishlistItems(groomWishlist), null));
|
|
}
|
|
}
|
|
} finally {
|
|
chrInv.unlockInventory();
|
|
}
|
|
|
|
if (newItem != null) {
|
|
if (YamlConfig.config.server.USE_ENFORCE_MERCHANT_SAVE) {
|
|
chr.saveCharToDB(false);
|
|
}
|
|
marriage.saveGiftItemsToDb(c, groomWishlist, cid);
|
|
}
|
|
} else {
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, marriage.getWishlistItems(groomWishlist), null));
|
|
}
|
|
} else {
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, marriage.getWishlistItems(groomWishlist), null));
|
|
}
|
|
} else {
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xC, marriage.getWishlistItems(groomWishlist), null));
|
|
}
|
|
} catch (NumberFormatException nfe) {
|
|
}
|
|
} else {
|
|
c.sendPacket(PacketCreator.enableActions());
|
|
}
|
|
} else if (mode == 7) { // take items
|
|
p.readByte(); // invType
|
|
int itemPos = p.readByte();
|
|
|
|
Marriage marriage = chr.getMarriageInstance();
|
|
if (marriage != null) {
|
|
Boolean groomWishlist = marriage.isMarriageGroom(chr);
|
|
if (groomWishlist != null) {
|
|
Item item = marriage.getGiftItem(c, groomWishlist, itemPos);
|
|
if (item != null) {
|
|
if (Inventory.checkSpot(chr, item)) {
|
|
marriage.removeGiftItem(groomWishlist, item);
|
|
marriage.saveGiftItemsToDb(c, groomWishlist, chr.getId());
|
|
|
|
InventoryManipulator.addFromDrop(c, item, true);
|
|
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xF, marriage.getWishlistItems(groomWishlist), marriage.getGiftItems(c, groomWishlist)));
|
|
} else {
|
|
c.getPlayer().dropMessage(1, "Free a slot on your inventory before collecting this item.");
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, marriage.getWishlistItems(groomWishlist), marriage.getGiftItems(c, groomWishlist)));
|
|
}
|
|
} else {
|
|
c.getPlayer().dropMessage(1, "You have already collected this item.");
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, marriage.getWishlistItems(groomWishlist), marriage.getGiftItems(c, groomWishlist)));
|
|
}
|
|
}
|
|
} else {
|
|
List<Item> items = c.getAbstractPlayerInteraction().getUnclaimedMarriageGifts();
|
|
try {
|
|
Item item = items.get(itemPos);
|
|
if (Inventory.checkSpot(chr, item)) {
|
|
items.remove(itemPos);
|
|
Marriage.saveGiftItemsToDb(c, items, chr.getId());
|
|
|
|
InventoryManipulator.addFromDrop(c, item, true);
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xF, Collections.singletonList(""), items));
|
|
} else {
|
|
c.getPlayer().dropMessage(1, "Free a slot on your inventory before collecting this item.");
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, Collections.singletonList(""), items));
|
|
}
|
|
} catch (Exception e) {
|
|
c.getPlayer().dropMessage(1, "You have already collected this item.");
|
|
c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xE, Collections.singletonList(""), items));
|
|
}
|
|
}
|
|
} else if (mode == 8) { // out of Wedding Registry
|
|
c.sendPacket(PacketCreator.enableActions());
|
|
} else {
|
|
log.warn("Unhandled wedding mode: {}", mode);
|
|
}
|
|
} finally {
|
|
c.releaseClient();
|
|
}
|
|
}
|
|
}
|
|
}
|