package org.skfiy.typhon.spi.store; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import javax.inject.Inject; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.domain.CostType; import org.skfiy.typhon.domain.Player; import org.skfiy.typhon.packet.Packet; import org.skfiy.typhon.packet.PacketError; import org.skfiy.typhon.packet.SingleValue; import org.skfiy.typhon.session.BagUtils; import org.skfiy.typhon.session.SessionUtils; import org.skfiy.typhon.spi.ItemProvider; import org.skfiy.typhon.util.ComponentUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class StoreProvider extends AbstractComponent { protected static final Random RANDOM = new Random(); private static final Map<String, Commodity> COMMODITY_MAP = new HashMap<>(); private static final List<Commodity> COMMODITY_A = new ArrayList<>(); private static final List<Commodity> COMMODITY_B = new ArrayList<>(); private static final List<Commodity> COMMODITY_C = new ArrayList<>(); private JSONArray array; private List<Integer> refreshTimes; @Inject protected ItemProvider itemProvider; @Override protected void doInit() { loadDataStore(); } @Override protected void doReload() { } @Override protected void doDestroy() { } public List<Integer> getRefreshTimes() { return refreshTimes; } /** * * @param player */ public void refreshCommodity(Player player) { int level = player.getRole().getLevel(); List<MyCommodity> myCommodities = new ArrayList<>(); randomCommodity(COMMODITY_A, myCommodities, level); randomCommodity(COMMODITY_B, myCommodities, level); for (int i = 0; i < 4; i++) { randomCommodity(COMMODITY_C, myCommodities, level); } player.getNormal().setCommodities(myCommodities); } public void refreshCommodity(SingleValue packet) { Player player = SessionUtils.getPlayer(); int count = player.getNormal().getRefreshCount(); if (count >= array.size()) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Has the most number <refreshStore>"); player.getSession().write(error); return; } int cost = array.getJSONObject(count).getIntValue("cost"); JSONObject object = new JSONObject(); object.put("place", "Store"); object.put("refreshCounts", count); SessionUtils.decrementDiamond(cost, object.toString()); player.getNormal().setRefreshCount(count + 1); refreshCommodity(player); player.getSession().write(Packet.createResult(packet)); } /** * * @param packet */ public void buyCommodities(SingleValue packet) { Player player = SessionUtils.getPlayer(); String cid = (String) packet.getVal(); Commodity commodity = COMMODITY_MAP.get(cid); if (buyCommodities0(player.getNormal().getCommodities(), commodity)) { player.getSession().write(Packet.createResult(packet)); } else { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Without the id" + cid + " on the table OR the id count is more<Store> "); player.getSession().write(error); } } /** * * @param commodities * @param commodity * @return */ protected boolean buyCommodities0(List<MyCommodity> commodities, Commodity commodity) { int cost = (int) Math.ceil(commodity.getCost() * commodity.getDiscount()); for (MyCommodity myComm : commodities) { if (myComm.getId().equals(commodity.getId()) && myComm.getCount() < commodity.getCount()) { if (commodity.getCostType() == CostType.C) { SessionUtils.decrementCopper(cost); } else if (commodity.getCostType() == CostType.D) { JSONObject object = new JSONObject(); object.put("place", "Store"); object.put("buyitems", commodity.getId()); SessionUtils.decrementDiamond(cost, object.toString()); } else if (commodity.getCostType() == CostType.S) { SessionUtils.decrementSocietyMoney(cost); } else if (commodity.getCostType() == CostType.E) { SessionUtils.decrementDargonMoney(cost); } else { SessionUtils.decrementExploit(cost); } BagUtils.intoItem(commodity.getItem(), commodity.getCount()); myComm.setCount(commodity.getCount() + commodity.getCount()); return true; } } return false; } protected void randomCommodity(List<Commodity> allCommodities, List<MyCommodity> myCommodities, int level) { if (allCommodities.size() == 0) { return; } int a = RANDOM.nextInt(allCommodities.size()); Commodity comm; boolean bool = false; for (;;) { if (a >= allCommodities.size()) { a = 0; } comm = allCommodities.get(a++); for (MyCommodity myComm : myCommodities) { bool = myComm.getId().equals(comm.getId()); if (bool) { break; } } if (!bool && (comm.getLevel() - level) <= 5) { myCommodities.add(new MyCommodity(comm.getId())); break; } } } /** * * @param json * @return */ protected Commodity toCommodity(JSONObject json) { Commodity com = JSON.toJavaObject(json, Commodity.class); com.setItem(itemProvider.getItem(json.getString("#item.id"))); return com; } private void loadDataStore() { JSONArray store = JSON.parseArray(ComponentUtils.readDataFile("store_basic.json")); for (int i = 0; i < store.size(); i++) { JSONObject obj = store.getJSONObject(i); Commodity commodity = toCommodity(obj); if (commodity.getPos() == 1) { COMMODITY_A.add(commodity); } else if (commodity.getPos() == 2) { COMMODITY_B.add(commodity); } else { COMMODITY_C.add(commodity); } COMMODITY_MAP.put(commodity.getId(), commodity); } // 打乱顺序 Collections.shuffle(COMMODITY_A); Collections.shuffle(COMMODITY_B); Collections.shuffle(COMMODITY_C); JSONArray arr = JSONArray.parseArray(ComponentUtils.readDataFile("refresh_time.json")); List<Integer> tempRefreshTimes = new ArrayList<>(); Collections.addAll(tempRefreshTimes, arr.toArray(new Integer[] {})); refreshTimes = Collections.unmodifiableList(tempRefreshTimes); array = JSON.parseArray(ComponentUtils.readDataFile("store_refresh.json")); } }