package org.skfiy.typhon.spi.caravan; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import javax.inject.Inject; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.Typhons; import org.skfiy.typhon.domain.Bag; import org.skfiy.typhon.domain.Normal; import org.skfiy.typhon.domain.Player; import org.skfiy.typhon.domain.item.HeroItem; import org.skfiy.typhon.packet.CaravanPacket; 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.spi.RoleProvider; import org.skfiy.typhon.spi.Vip; import org.skfiy.typhon.spi.store.Commoditied; import org.skfiy.typhon.util.ComponentUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class CaravanProvider extends AbstractComponent { protected static final Random RANDOM = new Random(); private final Map<String, CaravanType> caravanTypes = new HashMap<>(); private final List<CaravanRace> caravanRaces = new ArrayList<>(); // 商队CD时间 private int caravanCDTime; // 钻石通道 private int caravanDiamond; // 金币通道 private int caravanCopper; // 金币倍率 private double copperFactor; // 钻石倍率 private double diamondFactor; // 职业倍率 private double raceFactor; // 召回物品倍率 private double backFactor; // 召回N分钟算一钻 private int backTimeDiamond; // 刷新商队信息钻石消费 private int refreshCost; @Inject private ItemProvider itemProvider; @Inject private RoleProvider roleProvider; @Override protected void doInit() { JSONArray array; array = JSON.parseArray(ComponentUtils.readDataFile("caravan_sorts.json")); CaravanType caravanType = null; for (int i = 0; i < array.size(); i++) { caravanType = array.getObject(i, CaravanType.class); caravanTypes.put(caravanType.getType(), caravanType); } caravanRaces.addAll(JSON.parseArray(ComponentUtils.readDataFile("caravan_race.json"), CaravanRace.class)); caravanCDTime = Typhons.getInteger("typhon.spi.caravan.timeCD"); caravanCopper = Typhons.getInteger("typhon.spi.caravan.copper"); caravanDiamond = Typhons.getInteger("typhon.spi.caravan.diamond"); copperFactor = Typhons.getDouble("typhon.spi.caravan.copper.factor"); copperFactor = Typhons.getDouble("typhon.spi.caravan.copper.factor"); diamondFactor = Typhons.getDouble("typhon.spi.caravan.diamond.factor"); raceFactor = Typhons.getDouble("typhon.spi.caravan.race.factor"); backFactor = Typhons.getDouble("typhon.spi.caravan.back.factor"); backTimeDiamond = Typhons.getInteger("typhon.spi.caravan.back.timeDiamond"); refreshCost = Typhons.getInteger("typhon.spi.caravan.refreshCost"); } @Override protected void doDestroy() {} @Override protected void doReload() {} public void refresh(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); resetCaravan(normal); JSONObject object = new JSONObject(); object.put("place", "CaravanRefresh"); SessionUtils.decrementDiamond(refreshCost, object.toString()); player.getSession().write(Packet.createResult(packet)); } public void wayGoing(CaravanPacket packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); if (packet.getHeroes().size() < 3) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Heroes is not enough "); player.getSession().write(error); return; } double costFactor = 0; int count = 0; Vip vip = roleProvider.getVip(normal.getVipLevel()); if (normal.getCaravans().size() >= vip.privileged.explore_count) { PacketError error = PacketError.createResult(packet, PacketError.Condition.size_limit); error.setText("Don't hava CaravanCounts"); player.getSession().write(error); return; } if (packet.getCostType() == null) { costFactor = copperFactor; SessionUtils.decrementCopper(caravanCopper); } else { costFactor = diamondFactor; JSONObject object = new JSONObject(); object.put("place", "CaravanDiamond"); SessionUtils.decrementDiamond(caravanDiamond, object.toString()); } Bag bag = player.getHeroBag(); for (String str : packet.getHeroes()) { HeroItem heroItem = bag.findNode(str).getItem(); for (CaravanInformation caravans : normal.getCaravans()) { if (caravans.getTroops().contains(str)) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Heroes is not enough "); player.getSession().write(error); return; } } if (heroItem.getRace().toString().equals(normal.getCaravan().getRace())) { count++; } } int level = 0; List<CaravanReward> caravanRewards = caravanTypes.get(normal.getCaravan().getMonger()).getGrade(); CaravanReward obj = null; for (int i = 0; i < caravanRewards.size(); i++) { obj = caravanRewards.get(i); if (normal.getLevel() < obj.getLevel() && i > 0) { level = caravanRewards.get(i - 1).getLevel(); break; } if (i == caravanRewards.size() - 1) { level = caravanRewards.get(i).getLevel(); break; } } Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, caravanCDTime); normal.addCaravans(new CaravanInformation(normal.getCaravan().getMonger(), calendar .getTimeInMillis(), level, packet.getHeroes(), costFactor, (1 + count * raceFactor))); resetCaravan(normal); int counts = normal.getDailyTask().getTaskCaravan(); if (counts >= 0) { normal.getDailyTask().setTaskCaravan(counts + 1); } player.getSession().write(Packet.createResult(packet)); } public void recallCaravan(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); if (normal.getCaravan() == null) { resetCaravan(normal); } if (packet.getVal() == null) { player.getSession().write(Packet.createResult(packet)); return; } List<Integer> indexs = (List<Integer>) packet.getVal(); List<Commoditied> commoditieds = new ArrayList<>(); Commoditied commod = null; boolean bool = false; double number = 0; int cost = 0; for (int index : indexs) { CaravanInformation caravan = normal.getCaravans().get(index); // 判断时间 bool = caravan.getTime() <= System.currentTimeMillis(); if (!bool) { // time/1000按分钟算*100取小数点后两位/cdTime/ double a = (caravan.getTime() - System.currentTimeMillis()) / 1000; cost = (int) Math.ceil(a / 60 / backTimeDiamond); number = 1 - (a / 60 / (caravanCDTime * 60)); } JSONObject object = new JSONObject(); object.put("place", "CaravanRecall"); SessionUtils.decrementDiamond(cost, object.toString()); for (CaravanReward caravanReward : caravanTypes.get(caravan.getId()).getGrade()) { // 判断等级 if (caravan.getLevel() == caravanReward.getLevel()) { // 获取奖品 for (Commoditied obj : caravanReward.getReward()) { commod = new Commoditied(); int resultCount = (int) Math.ceil(obj.getCount() * caravan.getRaceFactor()); if (bool) { commod.setCount((int) (resultCount * caravan.getCostFactor())); } else { commod.setCount((int) Math.ceil((resultCount * number * backFactor) * caravan.getCostFactor())); } commod.setId(obj.getId()); BagUtils.intoItem(itemProvider.getItem(obj.getId()), commod.getCount()); commoditieds.add(commod); } } } } for (int i = indexs.size() - 1; i >= 0; i--) { normal.deleteCaravans(indexs.get(i)); } SingleValue result = new SingleValue(); Packet.assignResult(packet, result); result.setVal(commoditieds); player.getSession().write(result); } private void resetCaravan(Normal normal) { int random = RANDOM.nextInt(caravanTypes.size()); int index = 0; String type = null; for (Entry<String, CaravanType> emery : caravanTypes.entrySet()) { if (index == random) { type = emery.getKey(); break; } index++; } random = RANDOM.nextInt(caravanRaces.size()); String race = caravanRaces.get(random).getRace(); int otherRandom = RANDOM.nextInt(caravanRaces.get(random).getValue().length); String txtId = caravanRaces.get(random).getValue()[otherRandom]; normal.setCaravan(new Caravan(type, race, txtId)); } }