JustRain 4 Опубликовано 26 ноября, 2012 (изменено) Вообщем появилась идея сделать покупку кх не за адену, а за гб, к примеру. Сборка: l2jfrozen. Рылся в файле head-src\com\l2jfrozen\gameserver\model\entity\Auction.java При пустом квх, пишет, мол нету Adena Gold (9848): ("You do not have enough Adena Gold") Но если на складе есть Адена - то взымает именно её. Лазил где изменить id адены (57), но результат безуспешен. Помогите, кто знает.. Вот код: /** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2, or (at your option)* any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA* 02111-1307, USA.** http://www.gnu.org/copyleft/gpl.html*/package com.l2jfrozen.gameserver.model.entity;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Calendar;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import javolution.util.FastMap;import com.l2jfrozen.Config;import com.l2jfrozen.gameserver.datatables.sql.ClanTable;import com.l2jfrozen.gameserver.idfactory.IdFactory;import com.l2jfrozen.gameserver.managers.AuctionManager;import com.l2jfrozen.gameserver.managers.ClanHallManager;import com.l2jfrozen.gameserver.model.L2Clan;import com.l2jfrozen.gameserver.model.L2World;import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;import com.l2jfrozen.gameserver.thread.ThreadPoolManager;import com.l2jfrozen.util.CloseUtil;import com.l2jfrozen.util.database.L2DatabaseFactory;public class Auction{protected static final Logger _log = Logger.getLogger(Auction.class.getName());private int _id = 0;private int _adenaId = 9848;private long _endDate;private int _highestBidderId = 9848;private String _highestBidderName = "";private int _highestBidderMaxBid = 0;private int _itemId = 9848;private String _itemName = "Adena Gold";private int _itemObjectId = 0;private int _itemQuantity = 0;private String _itemType = "";private int _sellerId = 0;private String _sellerClanName = "";private String _sellerName = "";private int _currentBid = 0;private int _startingBid = 0;public static final long MAX_ADENA = 99900000000L;private Map<Integer, Bidder> _bidders = new FastMap<Integer, Bidder>();private static final String[] ItemTypeName ={"ClanHall"};public static enum ItemTypeEnum{ClanHall}public class Bidder{private String _name;private String _clanName;private int _bid;private Calendar _timeBid;public Bidder(String name, String clanName, int bid, long timeBid){_name = name;_clanName = clanName;_bid = bid;_timeBid = Calendar.getInstance();_timeBid.setTimeInMillis(timeBid);}public String getName(){return _name;}public String getClanName(){return _clanName;}public int getBid(){return _bid;}public Calendar getTimeBid(){return _timeBid;}public void setTimeBid(long timeBid){_timeBid.setTimeInMillis(timeBid);}public void setBid(int bid){_bid = bid;}}/** Task Sheduler for endAuction */public class AutoEndTask implements Runnable{public AutoEndTask(){}@Overridepublic void run(){try{endAuction();}catch(Throwable t){if(Config.ENABLE_ALL_EXCEPTIONS) t.printStackTrace();}}}/** Constructor */public Auction(int auctionId){_id = auctionId;load();startAutoTask();}public Auction(int itemId, L2Clan Clan, long delay, int bid, String name){_id = itemId;_endDate = System.currentTimeMillis() + delay;_itemId = itemId;_itemName = name;_itemType = "ClanHall";_sellerId = Clan.getLeaderId();_sellerName = Clan.getLeaderName();_sellerClanName = Clan.getName();_startingBid = bid;}/** Load auctions */private void load(){Connection con = null;try{PreparedStatement statement;ResultSet rs;con = L2DatabaseFactory.getInstance().getConnection(false);statement = con.prepareStatement("Select * from auction where id = ?");statement.setInt(1, getId());rs = statement.executeQuery();while(rs.next()){_currentBid = rs.getInt("currentBid");_endDate = rs.getLong("endDate");_itemId = rs.getInt("itemId");_itemName = rs.getString("itemName");_itemObjectId = rs.getInt("itemObjectId");_itemType = rs.getString("itemType");_sellerId = rs.getInt("sellerId");_sellerClanName = rs.getString("sellerClanName");_sellerName = rs.getString("sellerName");_startingBid = rs.getInt("startingBid");}rs.close();statement.close();loadBid();statement = null;rs = null;}catch(Exception e){e.printStackTrace();}finally{CloseUtil.close(con);con = null;}}/** Load bidders **/private void loadBid(){_highestBidderId = 0;_highestBidderName = "";_highestBidderMaxBid = 0;Connection con = null;try{PreparedStatement statement;ResultSet rs;con = L2DatabaseFactory.getInstance().getConnection(false);statement = con.prepareStatement("SELECT bidderId, bidderName, maxBid, clan_name, time_bid FROM auction_bid WHERE auctionId = ? ORDER BY maxBid DESC");statement.setInt(1, getId());rs = statement.executeQuery();while(rs.next()){if(rs.isFirst()){ _highestBidderId = rs.getInt("bidderId"); _highestBidderName = rs.getString("bidderName"); _highestBidderMaxBid = rs.getInt("maxBid");}_bidders.put(rs.getInt("bidderId"), new Bidder(rs.getString("bidderName"), rs.getString("clan_name"), rs.getInt("maxBid"), rs.getLong("time_bid")));}rs.close();statement.close();statement = null;rs = null;}catch(Exception e){e.printStackTrace();}finally{CloseUtil.close(con);con = null;}}/** Task Manage */private void startAutoTask(){long currentTime = System.currentTimeMillis();long taskDelay = 0;if(_endDate <= currentTime){_endDate = currentTime + 7 * 24 * 60 * 60 * 1000;saveAuctionDate();}else{taskDelay = _endDate - currentTime;}ThreadPoolManager.getInstance().scheduleGeneral(new AutoEndTask(), taskDelay);}public static String getItemTypeName(ItemTypeEnum value){return ItemTypeName[value.ordinal()];}/** Save Auction Data End */private void saveAuctionDate(){Connection con = null;try{con = L2DatabaseFactory.getInstance().getConnection(false);PreparedStatement statement = con.prepareStatement("Update auction set endDate = ? where id = ?");statement.setLong(1, _endDate);statement.setInt(2, _id);statement.execute();statement.close();statement = null;}catch(Exception e){if(Config.ENABLE_ALL_EXCEPTIONS)e.printStackTrace();_log.log(Level.SEVERE, "Exception: saveAuctionDate(): " + e.getMessage(), e);}finally{CloseUtil.close(con);con = null;}}/** Set a bid */public synchronized void setBid(L2PcInstance bidder, int bid){int requiredAdena = bid;if(getHighestBidderName().equals(bidder.getClan().getLeaderName())){requiredAdena = bid - getHighestBidderMaxBid();}if ((getHighestBidderId() > 0 && bid > getHighestBidderMaxBid()) || (getHighestBidderId() == 0 && bid >= getStartingBid())){if (takeItem(bidder, requiredAdena)){updateInDB(bidder, bid);bidder.getClan().setAuctionBiddedAt(_id, true);return;}}if ((bid < getStartingBid()) || (bid <= getHighestBidderMaxBid()))bidder.sendMessage("Bid Price must be higher");}/** Return Item in WHC */private void returnItem(String Clan, int quantity, boolean penalty){if(penalty){quantity *= 0.9; //take 10% tax fee if needed}// avoid overflow on returnfinal long limit = MAX_ADENA - ClanTable.getInstance().getClanByName(Clan).getWarehouse().getAdena();quantity = (int) Math.min(quantity, limit);ClanTable.getInstance().getClanByName(Clan).getWarehouse().addItem("Outbidded", _adenaId, quantity, null, null);}/** Take Item in WHC */private boolean takeItem(L2PcInstance bidder, int quantity){if(bidder.getClan() != null && bidder.getClan().getWarehouse().getAdena() >= quantity){bidder.getClan().getWarehouse().destroyItemByItemId("Buy", _adenaId, quantity, bidder, bidder);return true;}bidder.sendMessage("You do not have enough Adena Gold");return false;}/** Update auction in DB */private void updateInDB(L2PcInstance bidder, int bid){Connection con = null;try{con = L2DatabaseFactory.getInstance().getConnection(false);PreparedStatement statement;if(getBidders().get(bidder.getClanId()) != null){statement = con.prepareStatement("UPDATE auction_bid SET bidderId=?, bidderName=?, maxBid=?, time_bid=? WHERE auctionId=? AND bidderId=?");statement.setInt(1, bidder.getClanId());statement.setString(2, bidder.getClan().getLeaderName());statement.setInt(3, bid);statement.setLong(4, System.currentTimeMillis());statement.setInt(5, getId());statement.setInt(6, bidder.getClanId());statement.execute();statement.close();statement = null;}else{statement = con.prepareStatement("INSERT INTO auction_bid (id, auctionId, bidderId, bidderName, maxBid, clan_name, time_bid) VALUES (?, ?, ?, ?, ?, ?, ?)");statement.setInt(1, IdFactory.getInstance().getNextId());statement.setInt(2, getId());statement.setInt(3, bidder.getClanId());statement.setString(4, bidder.getName());statement.setInt(5, bid);statement.setString(6, bidder.getClan().getName());statement.setLong(7, System.currentTimeMillis());statement.execute();statement.close();statement = null;if(L2World.getInstance().getPlayer(_highestBidderName) != null){ L2World.getInstance().getPlayer(_highestBidderName).sendMessage("You have been out bidded");}}_highestBidderId = bidder.getClanId();_highestBidderMaxBid = bid;_highestBidderName = bidder.getClan().getLeaderName();if(_bidders.get(_highestBidderId) == null){_bidders.put(_highestBidderId, new Bidder(_highestBidderName, bidder.getClan().getName(), bid, Calendar.getInstance().getTimeInMillis()));}else{_bidders.get(_highestBidderId).setBid(bid);_bidders.get(_highestBidderId).setTimeBid(Calendar.getInstance().getTimeInMillis());}bidder.sendMessage("You have bidded successfully");}catch(Exception e){_log.log(Level.SEVERE, "Exception: Auction.updateInDB(L2PcInstance bidder, int bid): " + e.getMessage());e.printStackTrace();}finally{CloseUtil.close(con);con = null;}}/** Remove bids */private void removeBids(){Connection con = null;try{con = L2DatabaseFactory.getInstance().getConnection(false);PreparedStatement statement;statement = con.prepareStatement("DELETE FROM auction_bid WHERE auctionId=?");statement.setInt(1, getId());statement.execute();statement.close();statement = null;}catch(Exception e){if(Config.ENABLE_ALL_EXCEPTIONS)e.printStackTrace();_log.log(Level.SEVERE, "Exception: Auction.deleteFromDB(): " + e.getMessage(), e);}finally{CloseUtil.close(con);con = null;}for(Bidder b : _bidders.values()){if (ClanTable.getInstance().getClanByName(b.getClanName()).getHasHideout() == 0)returnItem(b.getClanName(), b.getBid(), true); // 10 % taxelse{if(L2World.getInstance().getPlayer(b.getName()) != null){ L2World.getInstance().getPlayer(b.getName()).sendMessage("Congratulation you have won ClanHall!");}}ClanTable.getInstance().getClanByName(b.getClanName()).setAuctionBiddedAt(0, true);}_bidders.clear();}/** Remove auctions */public void deleteAuctionFromDB(){AuctionManager.getInstance().getAuctions().remove(this);Connection con = null;try{con = L2DatabaseFactory.getInstance().getConnection(false);PreparedStatement statement;statement = con.prepareStatement("DELETE FROM auction WHERE itemId=?");statement.setInt(1, _itemId);statement.execute();statement.close();statement = null;}catch(Exception e){if(Config.ENABLE_ALL_EXCEPTIONS)e.printStackTrace();_log.log(Level.SEVERE, "Exception: Auction.deleteFromDB(): " + e.getMessage(), e);}finally{CloseUtil.close(con);con = null;}}/** End of auction */public void endAuction(){ClanHallManager.getInstance();if (ClanHallManager.loaded()){if(_highestBidderId == 0 && _sellerId == 0){startAutoTask();return;}if(_highestBidderId == 0 && _sellerId > 0){/** * If seller haven't sell ClanHall, auction removed, THIS MUST BE CONFIRMED */int aucId = AuctionManager.getInstance().getAuctionIndex(_id);AuctionManager.getInstance().getAuctions().remove(aucId);return;}if(_sellerId > 0){returnItem(_sellerClanName, _highestBidderMaxBid, true);returnItem(_sellerClanName, ClanHallManager.getInstance().getClanHallById(_itemId).getLease(), false);}deleteAuctionFromDB();L2Clan Clan = ClanTable.getInstance().getClanByName(_bidders.get(_highestBidderId).getClanName());_bidders.remove(_highestBidderId);Clan.setAuctionBiddedAt(0, true);removeBids();ClanHallManager.getInstance().setOwner(_itemId, Clan);Clan = null;}else{/** Task waiting ClanHallManager is loaded every 3s */ThreadPoolManager.getInstance().scheduleGeneral(new AutoEndTask(), 3000);}}/** Cancel bid */public synchronized void cancelBid(int bidder){Connection con = null;try{con = L2DatabaseFactory.getInstance().getConnection(false);PreparedStatement statement;statement = con.prepareStatement("DELETE FROM auction_bid WHERE auctionId=? AND bidderId=?");statement.setInt(1, getId());statement.setInt(2, bidder);statement.execute();statement.close();statement = null;}catch(Exception e){if(Config.ENABLE_ALL_EXCEPTIONS)e.printStackTrace();_log.log(Level.SEVERE, "Exception: Auction.cancelBid(String bidder): " + e.getMessage(), e);}finally{CloseUtil.close(con);con = null;}returnItem(_bidders.get(bidder).getClanName(), _bidders.get(bidder).getBid(), true);ClanTable.getInstance().getClanByName(_bidders.get(bidder).getClanName()).setAuctionBiddedAt(0, true);_bidders.clear();loadBid();}/** Cancel auction */public void cancelAuction(){deleteAuctionFromDB();removeBids();}/** Confirm an auction */public void confirmAuction(){AuctionManager.getInstance().getAuctions().add(this);Connection con = null;try{PreparedStatement statement;con = L2DatabaseFactory.getInstance().getConnection(false);statement = con.prepareStatement("INSERT INTO auction (id, sellerId, sellerName, sellerClanName, itemType, itemId, itemObjectId, itemName, itemQuantity, startingBid, currentBid, endDate) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");statement.setInt(1, getId());statement.setInt(2, _sellerId);statement.setString(3, _sellerName);statement.setString(4, _sellerClanName);statement.setString(5, _itemType);statement.setInt(6, _itemId);statement.setInt(7, _itemObjectId);statement.setString(8, _itemName);statement.setInt(9, _itemQuantity);statement.setInt(10, _startingBid);statement.setInt(11, _currentBid);statement.setLong(12, _endDate);statement.execute();statement.close();loadBid();statement = null;}catch(Exception e){if(Config.ENABLE_ALL_EXCEPTIONS)e.printStackTrace();_log.log(Level.SEVERE, "Exception: Auction.load(): " + e.getMessage(), e);}finally{CloseUtil.close(con);con = null;}}/** Get var auction */public final int getId(){return _id;}public final int getCurrentBid(){return _currentBid;}public final long getEndDate(){return _endDate;}public final int getHighestBidderId(){return _highestBidderId;}public final String getHighestBidderName(){return _highestBidderName;}public final int getHighestBidderMaxBid(){return _highestBidderMaxBid;}public final int getItemId(){return _itemId;}public final String getItemName(){return _itemName;}public final int getItemObjectId(){return _itemObjectId;}public final int getItemQuantity(){return _itemQuantity;}public final String getItemType(){return _itemType;}public final int getSellerId(){return _sellerId;}public final String getSellerName(){return _sellerName;}public final String getSellerClanName(){return _sellerClanName;}public final int getStartingBid(){return _startingBid;}public final Map<Integer, Bidder> getBidders(){return _bidders;}} Изменено 26 ноября, 2012 пользователем JustRain Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
~SNEG~ 54 Опубликовано 26 ноября, 2012 (изменено) if(bidder.getClan() != null && bidder.getClan().getWarehouse().getAdena() >= quantity) Думаю Вы сами дальше поймете. Смотрите класс L2PcInstance и метод getAdena Изменено 26 ноября, 2012 пользователем ~SNEG~ 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JustRain 4 Опубликовано 26 ноября, 2012 (изменено) if(bidder.getClan() != null && bidder.getClan().getWarehouse().getAdena() >= quantity) Думаю Вы сами дальше поймете. Смотрите класс L2PcInstance и метод getAdena То есть в L2PCinstance может дублировать метод getAdena и назвать к примеру getGoldAdena, или можно проще сделать? Как я понял, в коде идёт запрос на покупку вот так: bidder.getClan().getWarehouse().destroyItemByItemId("Buy", _adenaId, quantity, bidder, bidder); _adenaid - выстовлен id Gold Adena: private int _adenaId = 9848; В L2PcInstance нашел: /** * Return the Adena amount of the L2PcInstance.<BR> * <BR> */ public int getAdena() { return _inventory.getAdena(); } И добавил. /** * Return the Gold Adena amount of the L2PcInstance.<BR> * <BR> */ public int getAdenaGold() { return _inventory.getAdenaGold(); } Но ID адены в методе .getAdena не понял где обозначается. Изменено 26 ноября, 2012 пользователем JustRain Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
~SNEG~ 54 Опубликовано 26 ноября, 2012 Желательно продублировать, просто изменив метод getAdena - Вы нарушите работу других систем, где это используется. Впринципе можно сделать проверку, для чего getAdena используется и выдавать допустим при тайпе аукциона непосредственно голды, но так будет для вас более затруднительно. Поэтому просто создайте похожий метод. Можно даже назвать getAdena2, на работу это не повлияет (если конечно данный метод уже не задействован в L2JFrozen). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JustRain 4 Опубликовано 26 ноября, 2012 (изменено) Желательно продублировать, просто изменив метод getAdena - Вы нарушите работу других систем, где это используется. Впринципе можно сделать проверку, для чего getAdena используется и выдавать допустим при тайпе аукциона непосредственно голды, но так будет для вас более затруднительно. Поэтому просто создайте похожий метод. Можно даже назвать getAdena2, на работу это не повлияет (если конечно данный метод уже не задействован в L2JFrozen). А если сделать вместо if(bidder.getClan() != null && bidder.getClan().getWarehouse().getAdena() >= quantity) Вот так: if(bidder.getClan() != null && bidder.getClan().getWarehouse().getItemId() == 9848 >= quantity) Будет ли работать код? или исправьте, если допустил ошибку в правильности. Изменено 26 ноября, 2012 пользователем JustRain Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
~SNEG~ 54 Опубликовано 26 ноября, 2012 PcInventory класс если не ошибаюсь. Смотри как у тебя задается _inventory. (В начале класса ему дается значение) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JustRain 4 Опубликовано 26 ноября, 2012 (изменено) PcInventory класс если не ошибаюсь. Смотри как у тебя задается _inventory. (В начале класса ему дается значение) В PcInventory нашел код: public class PcInventory extends Inventory { public static final int ADENA_ID = 57; public static final int ANCIENT_ADENA_ID = 5575; Это оно и есть? Добавить к примеру (тут не полный класс выписал, с закрытым добавлю) public class PcInventory extends InventoryGold { public static final int ADENA_ID = 9848; public static final int ANCIENT_ADENA_ID = 5575; да? Или создать допустим PcInventory2, добавить в импорт PcInstance , и прописать метод _inventory2 Изменено 26 ноября, 2012 пользователем JustRain Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JustRain 4 Опубликовано 26 ноября, 2012 Разобрался. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты