⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapleinventorymanipulator.java

📁 冒险岛私服Java版服务端(Odinms)源代码。学习JAVA开发的朋友
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		} else {
			if (!consume) {
				StringBuilder logMsg = new StringBuilder(c.getPlayer().getName());
				logMsg.append(" removed ");
				logMsg.append(quantity);
				logMsg.append(". ");
				logMsg.append(item.getQuantity());
				logMsg.append(" left.");
				item.log(logMsg.toString(), false);
			}
			c.getSession().write(MaplePacketCreator.updateInventorySlot(type, (Item) item, fromDrop));
		}
	}

	public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
		List<IItem> items = c.getPlayer().getInventory(type).listById(itemId);
		int remremove = quantity;
		for (IItem item : items) {
			if (remremove <= item.getQuantity()) {
				removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume);
				remremove = 0;
				break;
			} else {
				remremove -= item.getQuantity();
				removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
			}
		}
		if (remremove > 0) {
			throw new InventoryException("[h4x] Not enough cheese available (" + itemId + ", " + (quantity - remremove) +
				"/" + quantity + ")");
		}
	}

	public static void move(MapleClient c, MapleInventoryType type, byte src, byte dst) {
		if (src < 0 || dst < 0) 
			return;
		MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
		IItem source = c.getPlayer().getInventory(type).getItem(src);
		IItem initialTarget = c.getPlayer().getInventory(type).getItem(dst);
		if (source == null)
			return;
		short olddstQ = -1;
		if (initialTarget != null)
			olddstQ = initialTarget.getQuantity();
		short oldsrcQ = source.getQuantity();
		short slotMax = ii.getSlotMax(source.getItemId());
		c.getPlayer().getInventory(type).move(src, dst, slotMax);
		if (!type.equals(MapleInventoryType.EQUIP) && initialTarget != null &&
			initialTarget.getItemId() == source.getItemId() && !ii.isThrowingStar(source.getItemId())) {
			if ((olddstQ + oldsrcQ) > slotMax) {
				c.getSession().write(
					MaplePacketCreator.moveAndMergeWithRestInventoryItem(type, src, dst,
						(short) ((olddstQ + oldsrcQ) - slotMax), slotMax));
			} else {
				c.getSession().write(
					MaplePacketCreator.moveAndMergeInventoryItem(type, src, dst, ((Item) c.getPlayer().getInventory(type)
						.getItem(dst)).getQuantity()));
			}
		} else {
			c.getSession().write(MaplePacketCreator.moveInventoryItem(type, src, dst));
		}
	}

	public static void equip(MapleClient c, byte src, byte dst) {
		MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
		Equip source = (Equip)c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
		Equip target = (Equip)c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
		if (source == null)
			return;
		if (dst == -6) {
			// unequip the overall
			IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
			if (top != null && ii.isOverall(top.getItemId())) {
				if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
					c.getSession().write(MaplePacketCreator.getInventoryFull());
					c.getSession().write(MaplePacketCreator.getShowInventoryFull());
					return;
				}
				unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
			}
		} else if (dst == -5) {
			// unequip the bottom and top
			IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
			IItem bottom = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6);
			if (top != null && ii.isOverall(source.getItemId())) {
				if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull(bottom != null && ii.isOverall(source.getItemId()) ? 1 : 0)) {
					c.getSession().write(MaplePacketCreator.getInventoryFull());
					c.getSession().write(MaplePacketCreator.getShowInventoryFull());
					return;
				}
				unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
			}
			if (bottom != null && ii.isOverall(source.getItemId())) {
				if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
					c.getSession().write(MaplePacketCreator.getInventoryFull());
					c.getSession().write(MaplePacketCreator.getShowInventoryFull());
					return;
				}
				unequip(c, (byte) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
			}
		} else if (dst == -10) {
			// check if weapon is two-handed
			IItem weapon = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
			if (weapon != null && ii.isTwoHanded(weapon.getItemId())) {
				if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
					c.getSession().write(MaplePacketCreator.getInventoryFull());
					c.getSession().write(MaplePacketCreator.getShowInventoryFull());
					return;
				}
				unequip(c, (byte) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
			}
		} else if (dst == -11) {
			IItem shield = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10);
			if (shield != null && ii.isTwoHanded(source.getItemId())) {
				if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
					c.getSession().write(MaplePacketCreator.getInventoryFull());
					c.getSession().write(MaplePacketCreator.getShowInventoryFull());
					return;
				}
				unequip(c, (byte) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
			}
		}
		source = (Equip)c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
		target = (Equip)c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
		c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(src);
		if (target != null)
			c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
		source.setPosition(dst);
		c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
		if (target != null) {
			target.setPosition(src);
			c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(target);
		}
		c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte)2));
		c.getPlayer().equipChanged();
	}
	
	public static void unequip(MapleClient c, byte src, byte dst) {
		Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src);
		Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
		if (dst < 0) {
			log.warn("Unequipping to negative slot. ({}: {}->{})", new Object[] { c.getPlayer().getName(), src, dst });
		}
		if (source == null)
			return;
		if (target != null && src <= 0) {
			// do not allow switching with equip
			c.getSession().write(MaplePacketCreator.getInventoryFull());
			return;
		}
		c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(src);
		if (target != null)
			c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(dst);
		source.setPosition(dst);
		c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(source);
		if (target != null) {
			target.setPosition(src);
			c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(target);
		}
		c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1));
		c.getPlayer().equipChanged();
	}

	public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
		MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
		if (src < 0)
			type = MapleInventoryType.EQUIPPED;
		IItem source = c.getPlayer().getInventory(type).getItem(src);
		if (quantity < 0 || source == null || quantity == 0 && !ii.isThrowingStar(source.getItemId())) {
			String message = "Dropping " + quantity + " " + (source == null ? "?" : source.getItemId()) + " (" +
				type.name() + "/" + src + ")";
			//AutobanManager.getInstance().addPoints(c, 1000, 0, message);
			log.info(MapleClient.getLogMessage(c, message));
			c.getSession().close(); // disconnect the client as is inventory is inconsistent with the serverside inventory -> fuck
			return;
		}
		Point dropPos = new Point(c.getPlayer().getPosition());
		//dropPos.y -= 99;
		if (quantity < source.getQuantity() && !ii.isThrowingStar(source.getItemId())) {
			IItem target = source.copy();
			StringBuilder logMsg = new StringBuilder(c.getPlayer().getName());
			logMsg.append(" dropped part of a stack at ");
			logMsg.append(dropPos.toString());
			logMsg.append(" on map ");
			logMsg.append(c.getPlayer().getMapId());
			logMsg.append(". Quantity of this (new) instance is now ");
			logMsg.append(quantity);
			target.setQuantity(quantity);
			target.log(logMsg.toString(),false);
			source.setQuantity((short)(source.getQuantity() - quantity));
			logMsg = new StringBuilder(c.getPlayer().getName());
			logMsg.append(" dropped part of a stack at ");
			logMsg.append(dropPos.toString());
			logMsg.append(" on map ");
			logMsg.append(c.getPlayer().getMapId());
			logMsg.append(". Quantity of this (leftover) instance is now ");
			logMsg.append(source.getQuantity());
			source.log(logMsg.toString(),false);
			c.getSession().write(MaplePacketCreator.dropInventoryItemUpdate(type, source));
			c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true,true);
		} else {
			StringBuilder logMsg = new StringBuilder(c.getPlayer().getName());
			logMsg.append(" dropped this (with full quantity) at ");
			logMsg.append(dropPos.toString());
			logMsg.append(" on map ");
			logMsg.append(c.getPlayer().getMapId());
			source.log(logMsg.toString(),false);
			c.getPlayer().getInventory(type).removeSlot(src);
			c.getSession().write(MaplePacketCreator.dropInventoryItem(
				(src<0?MapleInventoryType.EQUIP:type), src));
			if (src < 0) {
				c.getPlayer().equipChanged();
			}
			c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true,true);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -