Changeset 993
Author: ATracer
(2010/02/08 00:56) About 2 years ago
Warehouse implemented. Thanks kosyachok. Some advanced features of WH will be done later. Update DB with sql query (inventory-rev993.sql).
Author: ATracer
(2010/02/08 00:56) About 2 years ago
Warehouse implemented. Thanks kosyachok. Some advanced features of WH will be done later. Update DB with sql query (inventory-rev993.sql).
import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{private static final Logger log = Logger.getLogger(MySQL5InventoryDAO.class);private static final Logger log = Logger.getLogger(MySQL5InventoryDAO.class);public static final String SELECT_QUERY = "SELECT `itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `isEquiped`, `slot` FROM `inventory` WHERE `itemOwner`=?";public static final String SELECT_QUERY = "SELECT `itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `isEquiped`, `slot` FROM `inventory` WHERE `itemOwner`=? AND `itemLocation`=?";public static final String INSERT_QUERY = "INSERT INTO `inventory` (`itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `itemOwner`, `isEquiped`, `slot`) VALUES(?,?,?,?,?,?,?)";public static final String INSERT_QUERY = "INSERT INTO `inventory` (`itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `itemOwner`, `isEquiped`, `slot`, `itemLocation`) VALUES(?,?,?,?,?,?,?,?)";public static final String UPDATE_QUERY = "UPDATE inventory SET itemCount=?, itemColor=?, itemOwner=?, isEquiped=?, slot=? WHERE itemUniqueId=?";public static final String UPDATE_QUERY = "UPDATE inventory SET itemCount=?, itemColor=?, itemOwner=?, isEquiped=?, slot=?, itemLocation=? WHERE itemUniqueId=?";public static final String DELETE_QUERY = "DELETE FROM inventory WHERE itemUniqueId=?";public static final String DELETE_QUERY = "DELETE FROM inventory WHERE itemUniqueId=?";public static final String SELECT_ACCOUNT_QUERY = "SELECT `account_id` FROM `players` WHERE `id`=?";@Override@Overridepublic Inventory load(Player player)public Storage load(Player player, StorageType storageType){{//TODO load parts - cube, equipment etc.//TODO load parts - cube, equipment etc.final Inventory inventory = new Inventory(player);final Storage inventory = new Storage(player, storageType);final int playerId = player.getObjectId();int playerId = player.getObjectId();final int storage = storageType.getId();DB.select(SELECT_QUERY, new ParamReadStH()if(storageType == StorageType.ACCOUNT_WAREHOUSE){{@OverrideplayerId = getPlayerAccountId(playerId);public void setParams(PreparedStatement stmt) throws SQLException}{stmt.setInt(1, playerId);}@Overridefinal int owner = playerId;public void handleRead(ResultSet rset) throws SQLException{while(rset.next()){int itemUniqueId = rset.getInt("itemUniqueId");int itemId = rset.getInt("itemId");int itemCount = rset.getInt("itemCount");int itemColor = rset.getInt("itemColor");int isEquiped = rset.getInt("isEquiped");int slot = rset.getInt("slot");Item item = new Item(itemUniqueId, itemId, itemCount, itemColor, isEquiped == 1, slot);item.setPersistentState(PersistentState.UPDATED);inventory.onLoadHandler(item);}}});return inventory;}@OverrideDB.select(SELECT_QUERY, new ParamReadStH()public boolean store(Inventory inventory){{int playerId = inventory.getOwner().getObjectId();List<Item> inventoryItems = inventory.getAllItems();boolean resultSuccess = true;for(Item item : inventoryItems){resultSuccess = store(item, playerId);}return resultSuccess;}/*** @param item* @param playerId* @return*/@Overridepublic boolean store(final Item item, final int playerId){boolean result = false;switch(item.getPersistentState()){case NEW:result = insertItem(item, playerId);break;case UPDATE_REQUIRED:result = updateItem(item, playerId);break;case DELETED:result = deleteItem(item);break;}item.setPersistentState(PersistentState.UPDATED);return result;}/*** @param item* @param playerId* @return*/private boolean insertItem(final Item item, final int playerId){return DB.insertUpdate(INSERT_QUERY, new IUStH() {{{{int itemUniqueId = rset.getInt("itemUniqueId");int itemId = rset.getInt("itemId");int itemCount = rset.getInt("itemCount");int itemColor = rset.getInt("itemColor");int isEquiped = rset.getInt("isEquiped");int slot = rset.getInt("slot");{{{{{owner.add(rset.getInt("account_id"));{{{{{{return DB.insertUpdate(INSERT_QUERY, new IUStH() {{{}}/**/*** @param item* @param item* @return* @return*/*/private boolean updateItem(final Item item, final int playerId)private boolean updateItem(final Item item, final int playerId){{return DB.insertUpdate(UPDATE_QUERY, new IUStH() {return DB.insertUpdate(UPDATE_QUERY, new IUStH() {{{stmt.setInt(6, item.getObjectId());stmt.setInt(6, item.getItemLocation());stmt.setInt(7, item.getObjectId());}}/**/***** @param item* @param item*/*/private boolean deleteItem(final Item item)private boolean deleteItem(final Item item){{return DB.insertUpdate(DELETE_QUERY, new IUStH() {return DB.insertUpdate(DELETE_QUERY, new IUStH() {{{}}@Override@Overridepublic int[] getUsedIDs()public int[] getUsedIDs(){{PreparedStatement statement = DB.prepareStatement("SELECT itemUniqueId FROM inventory", ResultSet.TYPE_SCROLL_INSENSITIVE,PreparedStatement statement = DB.prepareStatement("SELECT itemUniqueId FROM inventory", ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSet.CONCUR_READ_ONLY);trytry{{ResultSet rs = statement.executeQuery();ResultSet rs = statement.executeQuery();rs.last();rs.last();int count = rs.getRow();int count = rs.getRow();rs.beforeFirst();rs.beforeFirst();int[] ids = new int[count];int[] ids = new int[count];for(int i = 0; i < count; i++)for(int i = 0; i < count; i++){{rs.next();rs.next();ids[i] = rs.getInt("itemUniqueId");ids[i] = rs.getInt("itemUniqueId");}}return ids;return ids;}}catch(SQLException e)catch(SQLException e){{log.error("Can't get list of id's from inventory table", e);log.error("Can't get list of id's from inventory table", e);}}finallyfinally{{DB.close(statement);DB.close(statement);}}return new int[0];return new int[0];}}/**/*** {@inheritDoc}* {@inheritDoc}*/*/@Override@Overridepublic boolean supports(String s, int i, int i1)public boolean supports(String s, int i, int i1){{return MySQL5DAOUtils.supports(s, i, i1);return MySQL5DAOUtils.supports(s, i, i1);}}import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{{{{{Inventory inventory = admin.getInventory();Storage inventory = admin.getInventory();{{{{{{import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;public abstract Inventory load(Player player);public abstract Storage load(Player player, StorageType storageType);public abstract boolean store(Inventory inventory);public abstract boolean store(Player player);{{{{player.getInventory().removeFromBag(item, true);import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{private Inventory inventory;private Storage inventory;public PlayerAccountData(PlayerCommonData playerCommonData, PlayerAppearance appereance, Inventory inventory)public PlayerAccountData(PlayerCommonData playerCommonData, PlayerAppearance appereance, Storage inventory){{public Inventory getInventory()public Storage getInventory(){{{{private int itemLocation;{{{{*/*/{{sb.append('}');sb.append('}');{{private Inventory inventory;private Storage inventory;private Storage regularWarehouse;private Storage accountWarehouse;private SortedMap<Integer, Item> equipment = Collections.synchronizedSortedMap(new TreeMap<Integer, Item>());public Inventory getInventory()public SortedMap<Integer, Item> getEquipment(){{return inventory;return equipment;{{if (!nearbyQuestList.contains(questId))if (!nearbyQuestList.contains(questId)){{nearbyQuestList.add(questId);nearbyQuestList.add(questId);}}public void setInventory(Inventory inventory)public void setStorage(Storage storage, StorageType storageType){{this.inventory = inventory;if(storageType == StorageType.CUBE)inventory.setOwner(this);{}this.inventory = storage;inventory.setOwner(this);}/**if(storageType == StorageType.REGULAR_WAREHOUSE)* @param CubeUpgrade{* int Sets the cubesizethis.regularWarehouse = storage;*/regularWarehouse.setOwner(this);public void setCubesize(int cubesize)}{this.playerCommonData.setCubesize(cubesize);}/**if(storageType == StorageType.ACCOUNT_WAREHOUSE)* @return the playerSettings{*/this.accountWarehouse = storage;public PlayerSettings getPlayerSettings()accountWarehouse.setOwner(this);{}return playerSettings;}/*** @param playerSettings the playerSettings to set*/public void setPlayerSettings(PlayerSettings playerSettings){this.playerSettings = playerSettings;/**public Storage getStorage(int storageType)* @return the zoneInstance*/public ZoneInstance getZoneInstance(){{return zoneInstance;if(storageType == StorageType.REGULAR_WAREHOUSE.getId())}return regularWarehouse;/**if(storageType == StorageType.ACCOUNT_WAREHOUSE.getId())* @param zoneInstance the zoneInstance to setreturn accountWarehouse;*/public void setZoneInstance(ZoneInstance zoneInstance){this.zoneInstance = zoneInstance;}public TitleList getTitleList()if(storageType == StorageType.CUBE.getId()){return inventory;return titleList;elsereturn null;public void setTitleList(TitleList titleList){this.titleList = titleList;titleList.setOwner(this);}/**public Storage getInventory()* @return the playerGroup*/public PlayerGroup getPlayerGroup(){{return playerGroup;return inventory;* @param playerGroup the playerGroup to set* @param CubeUpgrade* int Sets the cubesizepublic void setPlayerGroup(PlayerGroup playerGroup)public void setCubesize(int cubesize){{this.playerGroup = playerGroup;this.playerCommonData.setCubesize(cubesize);@Override/**public void initializeAi()* @return the playerSettings{*/// TODO Auto-generated method stubpublic PlayerSettings getPlayerSettings()}{return playerSettings;}/*** This method is called when player logs into the game. It's main responsibility is to call all registered* @param playerSettings the playerSettings to set* listeners.<br>*/* <br>public void setPlayerSettings(PlayerSettings playerSettings)*{* <b><font color='red'>NOTICE: </font>this method is supposed to be called only fromthis.playerSettings = playerSettings;* {@link PlayerService#playerLoggedIn(Player)}</b>}*/@Enhancable(callback = PlayerLoggedInListener.class)public void onLoggedIn(){}/*** @return the zoneInstance*/public ZoneInstance getZoneInstance(){return zoneInstance;}/*** This method is called when player leaves the game. It's main responsibility is to call all registered listeners.<br>* @param zoneInstance the zoneInstance to set* <br>*/*public void setZoneInstance(ZoneInstance zoneInstance)* <b><font color='red'>NOTICE: </font>this method is supposed to be called only from{* {@link PlayerService#playerLoggedOut(Player)}</b>this.zoneInstance = zoneInstance;*/}@Enhancable(callback = PlayerLoggedOutListener.class)public void onLoggedOut(){}public TitleList getTitleList(){return titleList;}public void setTitleList(TitleList titleList){this.titleList = titleList;titleList.setOwner(this);}/*** @return the playerGroup*/public PlayerGroup getPlayerGroup(){return playerGroup;}/*** @param playerGroup the playerGroup to set*/public void setPlayerGroup(PlayerGroup playerGroup){this.playerGroup = playerGroup;}@Overridepublic void initializeAi(){// TODO Auto-generated method stub}/*** This method is called when player logs into the game. It's main responsibility is to call all registered* listeners.<br>* <br>** <b><font color='red'>NOTICE: </font>this method is supposed to be called only from* {@link PlayerService#playerLoggedIn(Player)}</b>*/@Enhancable(callback = PlayerLoggedInListener.class)public void onLoggedIn(){}/*** This method is called when player leaves the game. It's main responsibility is to call all registered listeners.<br>* <br>** <b><font color='red'>NOTICE: </font>this method is supposed to be called only from* {@link PlayerService#playerLoggedOut(Player)}</b>*/@Enhancable(callback = PlayerLoggedOutListener.class)public void onLoggedOut(){}import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{{{{{Inventory bag = player.getInventory();Storage bag = player.getInventory();bag.removeFromBag(resultItem, true);{{sendPacket(new SM_DIALOG_WINDOW(targetObjectId, 26));if(MathUtil.isInRange(npc, player, 10)) // voiding exploit with sending fake client dialog_select packet{sendPacket(new SM_DIALOG_WINDOW(targetObjectId, 26));sendPacket(new SM_WAREHOUSE_INFO(player.getStorage(StorageType.REGULAR_WAREHOUSE.getId()).getStorageItems(), StorageType.REGULAR_WAREHOUSE.getId()));sendPacket(new SM_WAREHOUSE_INFO(null, StorageType.REGULAR_WAREHOUSE.getId())); // strange retail way of sending warehouse packetssendPacket(new SM_WAREHOUSE_INFO(player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId()).getUnquippedItems(), StorageType.ACCOUNT_WAREHOUSE.getId()));sendPacket(new SM_WAREHOUSE_INFO(null, StorageType.ACCOUNT_WAREHOUSE.getId()));}{{// if (player.getCommonData().isFlying() == true)// {// {// PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1300696));// return;// }import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;Inventory inventory = player.getInventory();Storage inventory = player.getInventory();{{accountTime.getAccumulatedOnlineHours(),accountTime.getAccumulatedOnlineMinutes(),accountTime.getAccumulatedRestHours(),accountTime.getAccumulatedRestMinutes()));sendPacket(new SM_PLAYER_SPAWN(player));sendPacket(new SM_EMOTION_LIST());sendPacket(new SM_INFLUENCE_RATIO());sendPacket(new SM_PRICES());sendPacket(new SM_PRICES());sendPacket(new SM_PLAYER_ID(player));sendPacket(new SM_PLAYER_ID(player));sendPacket(new SM_ABYSS_RANK());sendPacket(new SM_ABYSS_RANK());sendPacket(new SM_FLY_TIME());sendPacket(new SM_MESSAGE(0, null, "Welcome to " + Config.SERVER_NAME+ " server\nPowered by aion-unique software\ndeveloped by www.aion-unique.org team.\nCopyright 2010", null,ChatType.ANNOUNCEMENTS));playerService.playerLoggedIn(player);ClassChangeService.showClassChangeDialog(player);{{import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;Inventory inventory = activePlayer.getInventory();Storage inventory = activePlayer.getInventory();{{{{{{{{{{{{{{{{sourceItemObjId = readD(); // drag item unique ID. If merging and itemCount becoming null, this item must be deleted.itemAmount = readD(); // Items count to be moved.@SuppressWarnings("unused")byte[] zeros = readB(4); // Nothingbyte[] zeros = readB(5); // NothingsourceStorageType = readC(); // Source storagedestinationItemObjId = readD(); // Destination item unique ID if merging. Null if spliting.zeros = readB(1); // NothingdestinationStorageType = readC();// Destination storageslotNum = readH(); // Destination slot. Not needed right now, Items adding only to next available slot. Not needed at all when merge.{{itemService.splitItem(player, sourceItemObjId, itemAmount, slotNum, sourceStorageType, destinationStorageType);itemService.mergeItems(player, sourceItemObjId, itemAmount, destinationItemObjId, sourceStorageType, destinationStorageType);import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{@SuppressWarnings("unused")@SuppressWarnings("unused")Inventory bag = activePlayer.getInventory();Storage bag = activePlayer.getInventory();{{import com.aionemu.gameserver.model.gameobjects.player.Inventory;import com.aionemu.gameserver.model.gameobjects.player.Storage;{{log.warn("CHECKPOINT: can't show player details for " + targetObjectId);log.warn("CHECKPOINT: can't show player details for " + targetObjectId);Inventory inventory = player.getInventory();Storage inventory = player.getInventory();{{{{protected void writeKinah(ByteBuffer buf, Item item, boolean isInventory){{writeC(buf, 0);if(isInventory)writeC(buf, 0);protected void writeWeaponInfo(ByteBuffer buf, Item item, boolean isInventory){{writeC(buf, 0);//item.isEquipped() ? 1 : 0if(isInventory)writeC(buf, 0);//item.isEquipped() ? 1 : 0{{{{{{{{{{{{{{protected void writeArmorInfo(ByteBuffer buf, Item item, boolean isInventory){{writeC(buf, 1);//item.isEquipped() ? 1 : 0if(isInventory)writeC(buf, 1);//item.isEquipped() ? 1 : 0{{{{writeKinah(buf, item, true);{{writeWeaponInfo(buf, item, true);{{writeArmorInfo(buf,item, true);{{{{{{writeKinah(buf, item, true);{{writeWeaponInfo(buf, item, true);{{writeArmorInfo(buf,item, true);{{{{{{* {@inheritDoc} dc* {@inheritDoc} dc{{{{{{writeKinah(buf, item, true);{{writeWeaponInfo(buf, item, true);{{writeArmorInfo(buf,item, true);{{}{{addPacketOpcode(SM_ABYSS_RANK.class, 0x05, idSet);addPacketOpcode(SM_ABYSS_RANK.class, 0x05, idSet);throw new IllegalArgumentException(String.format("There already exists another packet with id 0x%02X", opcode));throw new IllegalArgumentException(String.format("There already exists another packet with id 0x%02X", opcode));