package server.cashshop;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import provider.MapleData;
import provider.MapleDataDirectoryEntry;
import provider.MapleDataEntry;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import provider.MapleDataTool;
import tools.FileoutputUtil;
public class CashItemFactory {
private static final CashItemFactory instance = new CashItemFactory();
private final Map<Integer, CashItemInfo> itemStats = new HashMap();
private final Map<Integer, Integer> idLookup = new HashMap();
private final Map<Integer, CashItemInfo> oldItemStats = new HashMap();
private final Map<Integer, Integer> oldIdLookup = new HashMap();
private final Map<Integer, List<Integer>> itemPackage = new HashMap();
private final Map<Integer, List<Integer>> openBox = new HashMap();
private final MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/Etc.wz"));
private final MapleData commodities = this.data.getData("Commodity.img");
private final Map<Integer, Boolean> blockCashItemId = new HashMap();
private final Map<Integer, Boolean> blockCashSnId = new HashMap();
private final List<Integer> blockRefundableItemId = new LinkedList();
public static CashItemFactory getInstance() {
return instance;
}
public Map<Integer,CashItemInfo> getItemStats (){
return itemStats;
}
public void initialize(boolean reload) {
if (reload) {
itemStats.clear();
itemPackage.clear();
openBox.clear();
}
if (!itemStats.isEmpty() || !itemPackage.isEmpty() || !openBox.isEmpty()) {
return;
}
this.blockRefundableItemId.clear();
int onSaleSize = 0;
Map fixId = new HashMap();
for (MapleData field : this.commodities.getChildren()) {
int SN = MapleDataTool.getIntConvert("SN", field, 0);
int itemId = MapleDataTool.getIntConvert("ItemId", field, 0);
int count = MapleDataTool.getIntConvert("Count", field, 1);
int price = MapleDataTool.getIntConvert("Price", field, 0);
int originalPrice = MapleDataTool.getIntConvert("originalPrice", field, 0);
int period = MapleDataTool.getIntConvert("Period", field, 0);
int gender = MapleDataTool.getIntConvert("Gender", field, 2);
boolean onSale = (MapleDataTool.getIntConvert("OnSale", field, 0) > 0);
boolean bonus = MapleDataTool.getIntConvert("Bonus", field, 0) >= 0;
boolean refundable = MapleDataTool.getIntConvert("Refundable", field, 0) == 0;
boolean discount = MapleDataTool.getIntConvert("discount", field, 0) >= 0;
if (onSale) {
onSaleSize++;
}
CashItemInfo stats = new CashItemInfo(itemId, count, price, originalPrice, SN, period, gender, onSale, bonus, refundable, discount);
if (SN > 0) {
this.itemStats.put(SN, stats);
if (this.idLookup.containsKey(itemId)) {
fixId.put(SN, itemId);
this.blockRefundableItemId.add(itemId);
}
this.idLookup.put(itemId, SN);
}
}
FileoutputUtil.log("共加载 " + this.itemStats.size() + " 个商城道具,有 " + onSaleSize + " 个道具处于出售状态,");
FileoutputUtil.log("其中有 " + fixId.size() + " 重复价格的道具和 " + this.blockRefundableItemId.size() + " 个禁止换购的道具;");
MapleData packageData = this.data.getData("CashPackage.img");
for (MapleData root : packageData.getChildren()) {
if (root.getChildByPath("SN") == null) {
continue;
}
List packageItems = new ArrayList();
for (MapleData dat : root.getChildByPath("SN").getChildren()) {
packageItems.add(MapleDataTool.getIntConvert(dat));
}
this.itemPackage.put(Integer.parseInt(root.getName()), packageItems);
}
FileoutputUtil.log("共加载 " + this.itemPackage.size() + " 个商城礼包;");
onSaleSize = 0;
MapleDataDirectoryEntry root = this.data.getRoot();
for (MapleDataEntry topData : root.getFiles()) {
if (topData.getName().startsWith("OldCommodity")) {
MapleData Commodity = this.data.getData(topData.getName());
for (MapleData field : Commodity.getChildren()) {
int SN = MapleDataTool.getIntConvert("SN", field, 0);
int itemId = MapleDataTool.getIntConvert("ItemId", field, 0);
int count = MapleDataTool.getIntConvert("Count", field, 1);
int price = MapleDataTool.getIntConvert("Price", field, 0);
int originalPrice = MapleDataTool.getIntConvert("originalPrice", field, 0);
int period = MapleDataTool.getIntConvert("Period", field, 0);
int gender = MapleDataTool.getIntConvert("Gender", field, 2);
boolean onSale = (MapleDataTool.getIntConvert("OnSale", field, 0) > 0);
boolean bonus = MapleDataTool.getIntConvert("Bonus", field, 0) >= 0;
boolean refundable = MapleDataTool.getIntConvert("Refundable", field, 0) == 0;
boolean discount = MapleDataTool.getIntConvert("discount", field, 0) >= 0;
if (onSale) {
onSaleSize++;
}
CashItemInfo stats = new CashItemInfo(itemId, count, price, originalPrice, SN, period, gender, onSale, bonus, refundable, discount);
if (SN > 0) {
this.oldItemStats.put(SN, stats);
this.oldIdLookup.put(itemId, SN);
}
}
}
}
FileoutputUtil.log("共加载 " + this.oldItemStats.size() + " 个老的商城道具,有 " + onSaleSize + " 个道具处于出售状态;");
}
public void loadBlockedCash() {
blockCashItemId.clear();
/*
MapleData root = this.data.getData("BlockCash.img");
for (MapleData dat : root.getChildByPath("ItemId").getChildren()) {
int itemId = Integer.parseInt(dat.getName());
boolean block = MapleDataTool.getIntConvert("Block", dat, 0) >= 0;
if (this.blockCashItemId.containsKey(itemId)) {
FileoutputUtil.log("发现重复禁止道具信息: " + itemId);
continue;
}
this.blockCashItemId.put(itemId, block);
}
FileoutputUtil.log("共加载 " + this.blockCashItemId.size() + " 个商城禁止购买的道具ID信息...");
this.blockCashSnId.clear();
for (MapleData dat : root.getChildByPath("SNId").getChildren()) {
int packageId = Integer.parseInt(dat.getName());
boolean block = MapleDataTool.getIntConvert("Block", dat, 0) >= 0;
if (this.blockCashSnId.containsKey(packageId)) {
FileoutputUtil.log("发现重复禁止SN信息: " + packageId);
continue;
}
this.blockCashSnId.put(packageId, block);
}
FileoutputUtil.log("共加载 " + this.blockCashSnId.size() + " 个商城禁止购买的道具SN信息...");
*/
}
public Map<Integer, Boolean> getBlockedCashItem() {
return this.blockCashItemId;
}
public boolean isBlockedCashItemId(int itemId) {
return this.blockCashItemId.containsKey(itemId);
}
public Map<Integer, Boolean> getBlockCashSn() {
return this.blockCashSnId;
}
public boolean isBlockCashSnId(int itemId) {
return this.blockCashSnId.containsKey(itemId);
}
public CashItemInfo getSimpleItem(int sn) {
return (CashItemInfo) this.itemStats.get(sn);
}
public boolean isBlockRefundableItemId(int itemId) {
return this.blockRefundableItemId.contains(itemId);
}
public CashItemInfo getItem(int sn) {
return getItem(sn, false);
}
public CashItemInfo getItem(int sn, boolean checkSale) {
CashItemInfo stats = (CashItemInfo) this.itemStats.get(Integer.valueOf(sn));
if (stats == null) {
return null;
}
return (checkSale) && (!stats.onSale()) ? null : stats;
}
public List<Integer> getPackageItems(int itemId) {
return (List) this.itemPackage.get(itemId);
}
public Map<Integer, List<Integer>> getRandomItemInfo() {
return this.openBox;
}
public boolean hasRandomItem(int itemId) {
return this.openBox.containsKey(itemId);
}
public List<Integer> getRandomItem(int itemId) {
return (List) this.openBox.get(itemId);
}
public int getLinkItemId(int itemId) {
switch (itemId) {
case 5000029:
case 5000030:
case 5000032:
case 5000033:
case 5000035:
return 5000028;
case 5000048:
case 5000049:
case 5000050:
case 5000051:
case 5000052:
return 5000047;
case 5000031:
case 5000034:
case 5000036:
case 5000037:
case 5000038:
case 5000039:
case 5000040:
case 5000041:
case 5000042:
case 5000043:
case 5000044:
case 5000045:
case 5000046:
case 5000047:
}
return itemId;
}
public int getSnFromId(int itemId) {
if (this.idLookup.containsKey(itemId)) {
return (this.idLookup.get(itemId));
}
return 0;
}
}