337 lines
9.9 KiB
Java
337 lines
9.9 KiB
Java
/*
|
|
* This file is part of the L2J Mobius project.
|
|
*
|
|
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package com.l2jmobius.gameserver;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import com.l2jmobius.Config;
|
|
import com.l2jmobius.L2DatabaseFactory;
|
|
import com.l2jmobius.gameserver.datatables.ItemTable;
|
|
import com.l2jmobius.gameserver.model.L2ItemInstance;
|
|
import com.l2jmobius.gameserver.model.L2TradeList;
|
|
|
|
import javolution.util.FastList;
|
|
import javolution.util.FastMap;
|
|
|
|
/**
|
|
* This class ...
|
|
* @version $Revision: 1.5.4.13 $ $Date: 2005/04/06 16:13:38 $
|
|
*/
|
|
public class TradeController
|
|
{
|
|
private static Logger _log = Logger.getLogger(TradeController.class.getName());
|
|
private static TradeController _instance;
|
|
|
|
private int _nextListId;
|
|
private final Map<Integer, L2TradeList> _lists;
|
|
|
|
public static TradeController getInstance()
|
|
{
|
|
if (_instance == null)
|
|
{
|
|
_instance = new TradeController();
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
|
|
private TradeController()
|
|
{
|
|
_lists = new FastMap<>();
|
|
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement1 = con.prepareStatement("SELECT shop_id, npc_id FROM merchant_shopids");
|
|
ResultSet rset1 = statement1.executeQuery())
|
|
{
|
|
int itemId, price, count, currentCount, time;
|
|
long saveTime;
|
|
while (rset1.next())
|
|
{
|
|
try (
|
|
PreparedStatement statement = con.prepareStatement("SELECT item_id, price, shop_id, " + L2DatabaseFactory.getInstance().safetyString("order") + ", count, currentCount, time, savetimer FROM merchant_buylists WHERE shop_id=? ORDER BY " + L2DatabaseFactory.getInstance().safetyString("order") + " ASC"))
|
|
{
|
|
statement.setString(1, String.valueOf(rset1.getInt("shop_id")));
|
|
try (ResultSet rset = statement.executeQuery())
|
|
{
|
|
final L2TradeList buy1 = new L2TradeList(rset1.getInt("shop_id"));
|
|
|
|
while (rset.next())
|
|
{
|
|
itemId = rset.getInt("item_id");
|
|
price = rset.getInt("price");
|
|
count = rset.getInt("count");
|
|
currentCount = rset.getInt("currentCount");
|
|
time = rset.getInt("time");
|
|
saveTime = rset.getLong("savetimer");
|
|
|
|
final L2ItemInstance item = ItemTable.getInstance().createDummyItem(itemId);
|
|
if (item == null)
|
|
{
|
|
_log.warning("Skipping itemId: " + itemId + " on buylistId: " + buy1.getListId() + ", missing data for that item.");
|
|
continue;
|
|
}
|
|
|
|
if (price <= -1)
|
|
{
|
|
price = item.getItem().getReferencePrice();
|
|
}
|
|
|
|
if (Config.DEBUG)
|
|
{
|
|
// debug
|
|
final double diff = ((double) (price)) / item.getItem().getReferencePrice();
|
|
if ((diff < 0.8) || (diff > 1.2))
|
|
{
|
|
_log.severe("PRICING DEBUG: TradeListId: " + buy1.getListId() + " - ItemId: " + itemId + " (" + item.getItem().getName() + ") diff: " + diff + " - Price: " + price + " - Reference: " + item.getItem().getReferencePrice());
|
|
}
|
|
}
|
|
|
|
if (count > -1)
|
|
{
|
|
item.setCountDecrease(true);
|
|
}
|
|
|
|
item.setPriceToSell(price);
|
|
item.setInitCount(count);
|
|
|
|
if (currentCount > -1)
|
|
{
|
|
item.setCount(currentCount);
|
|
}
|
|
else
|
|
{
|
|
item.setCount(count);
|
|
}
|
|
|
|
item.setTime(time);
|
|
if (item.getTime() > 0)
|
|
{
|
|
item.setRestoreTime(saveTime);
|
|
}
|
|
|
|
buy1.addItem(item);
|
|
buy1.setNpcId(rset1.getString("npc_id"));
|
|
|
|
_lists.put(new Integer(buy1.getListId()), buy1);
|
|
_nextListId = Math.max(_nextListId, buy1.getListId() + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
_log.config("TradeController: Loaded " + _lists.size() + " Buylists.");
|
|
}
|
|
catch (final Exception e)
|
|
{
|
|
_log.warning("TradeController: Buylists could not be initialized.");
|
|
e.printStackTrace();
|
|
}
|
|
|
|
/*
|
|
* If enabled, initialize the custom buylist
|
|
*/
|
|
if (Config.CUSTOM_MERCHANT_TABLES)
|
|
{
|
|
final int initialSize = _lists.size();
|
|
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement1 = con.prepareStatement("SELECT shop_id, npc_id FROM custom_merchant_shopids");
|
|
ResultSet rset1 = statement1.executeQuery())
|
|
{
|
|
int itemId, price, count, currentCount, time;
|
|
long saveTime;
|
|
while (rset1.next())
|
|
{
|
|
try (
|
|
PreparedStatement statement = con.prepareStatement("SELECT item_id, price, shop_id, " + L2DatabaseFactory.getInstance().safetyString("order") + ", count, currentCount, time, savetimer FROM custom_merchant_buylists WHERE shop_id=? ORDER BY " + L2DatabaseFactory.getInstance().safetyString("order") + " ASC"))
|
|
{
|
|
statement.setString(1, String.valueOf(rset1.getInt("shop_id")));
|
|
try (ResultSet rset = statement.executeQuery())
|
|
{
|
|
final L2TradeList buy1 = new L2TradeList(rset1.getInt("shop_id"));
|
|
|
|
while (rset.next())
|
|
{
|
|
itemId = rset.getInt("item_id");
|
|
price = rset.getInt("price");
|
|
count = rset.getInt("count");
|
|
currentCount = rset.getInt("currentCount");
|
|
time = rset.getInt("time");
|
|
saveTime = rset.getLong("savetimer");
|
|
|
|
final L2ItemInstance item = ItemTable.getInstance().createDummyItem(itemId);
|
|
if (item == null)
|
|
{
|
|
_log.warning("Skipping itemId: " + itemId + " on buylistId: " + buy1.getListId() + ", missing data for that item.");
|
|
continue;
|
|
}
|
|
|
|
if (price <= -1)
|
|
{
|
|
price = item.getItem().getReferencePrice();
|
|
}
|
|
|
|
if (Config.DEBUG)
|
|
{
|
|
// debug
|
|
final double diff = ((double) (price)) / item.getItem().getReferencePrice();
|
|
if ((diff < 0.8) || (diff > 1.2))
|
|
{
|
|
_log.severe("PRICING DEBUG: TradeListId: " + buy1.getListId() + " - ItemId: " + itemId + " (" + item.getItem().getName() + ") diff: " + diff + " - Price: " + price + " - Reference: " + item.getItem().getReferencePrice());
|
|
}
|
|
}
|
|
|
|
if (count > -1)
|
|
{
|
|
item.setCountDecrease(true);
|
|
}
|
|
|
|
item.setPriceToSell(price);
|
|
item.setInitCount(count);
|
|
|
|
if (currentCount > -1)
|
|
{
|
|
item.setCount(currentCount);
|
|
}
|
|
else
|
|
{
|
|
item.setCount(count);
|
|
}
|
|
|
|
item.setTime(time);
|
|
if (item.getTime() > 0)
|
|
{
|
|
item.setRestoreTime(saveTime);
|
|
}
|
|
|
|
buy1.addItem(item);
|
|
buy1.setNpcId(rset1.getString("npc_id"));
|
|
|
|
_lists.put(new Integer(buy1.getListId()), buy1);
|
|
_nextListId = Math.max(_nextListId, buy1.getListId() + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
_log.config("TradeController: Loaded " + (_lists.size() - initialSize) + " Custom Buylists.");
|
|
}
|
|
catch (final Exception e)
|
|
{
|
|
_log.warning("TradeController: Custom Buylists could not be initialized.");
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
// private int parseList(String line)
|
|
// {
|
|
// int itemCreated = 0;
|
|
// StringTokenizer st = new StringTokenizer(line, ";");
|
|
// int listId = Integer.parseInt(st.nextToken());
|
|
// L2TradeList buy1 = new L2TradeList(listId);
|
|
// while (st.hasMoreTokens())
|
|
// {
|
|
// int itemId = Integer.parseInt(st.nextToken());
|
|
// int price = Integer.parseInt(st.nextToken());
|
|
//
|
|
// L2ItemInstance item = ItemTable.getInstance().createDummyItem(itemId);
|
|
// item.setPriceToSell(price);
|
|
// buy1.addItem(item);
|
|
// itemCreated++;
|
|
// }
|
|
// _lists.put(new Integer(buy1.getListId()), buy1);
|
|
// return itemCreated;
|
|
// }
|
|
|
|
public L2TradeList getBuyList(int listId)
|
|
{
|
|
return _lists.get(new Integer(listId));
|
|
}
|
|
|
|
public List<L2TradeList> getBuyListByNpcId(int npcId)
|
|
{
|
|
final List<L2TradeList> lists = new FastList<>();
|
|
|
|
for (final L2TradeList list : _lists.values())
|
|
{
|
|
if (list.getNpcId().startsWith("gm"))
|
|
{
|
|
continue;
|
|
}
|
|
if (npcId == Integer.parseInt(list.getNpcId()))
|
|
{
|
|
lists.add(list);
|
|
}
|
|
}
|
|
return lists;
|
|
}
|
|
|
|
public void dataCountStore()
|
|
{
|
|
int listId;
|
|
|
|
if (_lists == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
|
|
{
|
|
for (final L2TradeList list : _lists.values())
|
|
{
|
|
listId = list.getListId();
|
|
// if (list == null)
|
|
// {
|
|
// continue;
|
|
// }
|
|
|
|
for (final L2ItemInstance Item : list.getItems())
|
|
{
|
|
if (Item.getCount() < Item.getInitCount())
|
|
{
|
|
try (PreparedStatement statement = con.prepareStatement("UPDATE merchant_buylists SET currentCount =? WHERE item_id =? && shop_id = ?"))
|
|
{
|
|
statement.setInt(1, Item.getCount());
|
|
statement.setInt(2, Item.getItemId());
|
|
statement.setInt(3, listId);
|
|
statement.executeUpdate();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (final Exception e)
|
|
{
|
|
_log.log(Level.SEVERE, "TradeController: Could not store Count Item");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return
|
|
*/
|
|
public synchronized int getNextId()
|
|
{
|
|
return _nextListId++;
|
|
}
|
|
} |