package org.skfiy.typhon.spi.sign; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import javax.inject.Singleton; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.dobj.ItemDobj; import org.skfiy.typhon.domain.Normal; 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.ConfigurationLoader; import org.skfiy.typhon.spi.ItemProvider; import org.skfiy.typhon.spi.ServerSettingKeys; import org.skfiy.typhon.util.ComponentUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @Singleton public class SignProvider extends AbstractComponent { @Inject private ItemProvider itemProvider; @Inject private ConfigurationLoader configurationLoader; private JSONArray arrayCount; //Map<Integer(年),Map<Integer(月),Map<Integer(日),Sign>>> public static Map<Integer, Map<Integer, Map<Integer, Sign>>> signies = new HashMap<>(); @Override protected void doDestroy() { } @Override protected void doInit() { JSONObject obj = JSON.parseObject(ComponentUtils.readDataFile("month_sign.json")); for (Entry<String, Object> entry : obj.entrySet()) { JSONObject array = obj.getJSONObject(entry.getKey()); Map<Integer, Map<Integer, Sign>> asign = new HashMap<>(); for (Entry<String, Object> entries : array.entrySet()) { JSONArray arraies = array.getJSONArray(entries.getKey()); Map<Integer, Sign> bsign = new HashMap<>(); for (int i = 0; i < arraies.size(); i++) { Sign sign = new Sign(); sign = JSON.toJavaObject(arraies.getJSONObject(i), Sign.class); bsign.put(i, sign); } asign.put(Integer.valueOf(entries.getKey()), bsign); } signies.put(Integer.valueOf(entry.getKey()), asign); } arrayCount = JSON.parseArray(ComponentUtils.readDataFile("sign_cost.json")); } @Override protected void doReload() { } public void sign(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); //签到次数packet.getval(); int size = normal.getSigns().size(); //领取物品的倍数 &&也代表领取次数 Calendar calendar = Calendar.getInstance(); int count = 1; Map<Integer, Sign> signa = inster(size, calendar, player); if (signa == null) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Time since I can't sign in"); player.getSession().write(error); return; } int day = calendar.get(Calendar.DAY_OF_MONTH); //获取当前签到的Sign Sign sign = signa.get(size); if (sign.getVipLevel() <= normal.getVipLevel()) { count = 2; } ItemDobj item = itemProvider.getItem(sign.getPrize()); BagUtils.intoItem(item, sign.getCount() * count); SignDraw signdraw = new SignDraw(count, day, normal.getVipLevel()); normal.addSigns(signdraw); player.getSession().write(Packet.createResult(packet)); } public void signAgain(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); Calendar calendar = Calendar.getInstance(); int day = calendar.get(Calendar.DAY_OF_MONTH); //领取某天补签第二份奖励 int oneDay = (int) packet.getVal() - 1; Sign sign = new Sign(); int count = 1; Map<Integer, Sign> signa = new HashMap<Integer, Sign>(); //size+1代表签到的数据size signa = inster(oneDay, calendar, player); if (signa == null) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("No data cannot be retroactive and be rewarded Sign"); player.getSession().write(error); return; } if (oneDay + 1 > normal.getSigns().size()) { //获取当前签到的Sign sign = signa.get(oneDay); if (sign.getVipLevel() <= normal.getVipLevel()) { count = 2; } SignDraw signdraw = new SignDraw(count, day, normal.getVipLevel()); normal.addSigns(signdraw); //增加补签次数 int signed = player.getNormal().getSigned(); //扣去补签的钱 int cost = arrayCount.getInteger(signed); JSONObject object = new JSONObject(); object.put("place", "SignAgain"); object.put("signAgainCounts", signed); object.put("signAgainItems", sign.getPrize()); SessionUtils.decrementDiamond(cost, object.toString()); player.getNormal().setSigned(signed + 1); } else { SignDraw signDraw = normal.getSigns().get(oneDay); //size代表list中的数据索引 从0开始 if (signDraw.getDrawTime() != day || signDraw.getCount() == 2 || signDraw.getLastVip() >= normal.getVipLevel()) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("No again signed number"); player.getSession().write(error); return; } else { sign = signa.get(oneDay); signDraw.setCount(count + 1); signDraw.setDrawTime(day); signDraw.setLastVip(normal.getVipLevel()); } } ItemDobj item = itemProvider.getItem(sign.getPrize()); BagUtils.intoItem(item, sign.getCount() * count); player.getSession().write(Packet.createResult(packet)); } private Map<Integer, Sign> inster(int size, Calendar calendar,Player player) { Calendar serverCalendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); serverCalendar.setTimeInMillis(player.getRole().getCreationTime()); //对开服时间进行特殊判断 if (year == serverCalendar.get(Calendar.YEAR) && month == serverCalendar.get(Calendar.MONTH) && size + serverCalendar.get(Calendar.DAY_OF_MONTH) > day) { return null; } else { if (size > day) { return null; } } Map<Integer, Map<Integer, Sign>> signss = signies.get(year); Map<Integer, Sign> map = signss.get(month + 1); return map; } }