diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index 80b5d2ad9..28e46122d 100644 --- a/serverlogic/src/main/java/com/ljsd/GameApplication.java +++ b/serverlogic/src/main/java/com/ljsd/GameApplication.java @@ -10,15 +10,12 @@ import com.ljsd.jieling.core.CoreLogic; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; -import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.handler.map.MapLogic; import com.ljsd.jieling.logic.GlobalDataManaager; -import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.STableManager; import com.ljsd.jieling.logic.activity.ActivityLogic; import com.ljsd.jieling.logic.dao.GuilidManager; import com.ljsd.jieling.logic.dao.MailingSystemManager; -import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.fight.CheckFight; import com.ljsd.jieling.logic.hero.HeroLogic; import com.ljsd.jieling.netty.server.NettyGameServer; @@ -30,7 +27,6 @@ import com.ljsd.jieling.thread.ThreadManager; import com.ljsd.jieling.thread.task.MongoDataHandlerTask; import com.ljsd.jieling.thrift.pool.ThriftPoolUtils; import com.ljsd.jieling.util.KeyGenUtils; -import com.ljsd.jieling.util.SensitiveWordInit; import com.ljsd.jieling.util.SensitivewordFilter; import com.ljsd.jieling.util.TimeUtils; import com.ljsd.jieling.util.http.HttpPool; @@ -43,11 +39,9 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; -import java.io.InputStream; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Map; @Configuration @@ -85,15 +79,10 @@ public class GameApplication { register(configurableApplicationContext); ProtocolsManager protocolsManager = ProtocolsManager.getInstance(); protocolsManager.initCheck(); + // 追加ProtocolsManager消息处理器 注解和非注解 + protocolsManager.initHandler("com.ljsd.jieling.handler",configurableApplicationContext); // protocolsManager.initContext(); - // 追加ProtocolsManager消息处理器 - Map gameHanderMap = configurableApplicationContext.getBeansOfType(BaseHandler.class); - for (BaseHandler handler : gameHanderMap.values()) { - protocolsManager.addHandler(handler); - } - - //http线程池初始化 // HttpPool.init(); //todo 设置开服时间 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java b/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java index 427a1e73e..62d5a7475 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java @@ -304,7 +304,7 @@ public class HandlerLogicThread extends Thread{ int type = sGlobalSystemConfig.getOpenRules()[0]; int condition = sGlobalSystemConfig.getOpenRules()[1]; if (type ==1){ - if (mainLevelManager.getFightId()>condition) { + if (mainLevelManager.getFightId() { @Override public MessageTypeProto.MessageType getMessageCode() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java index bb3f5076d..51f1d17e3 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java @@ -2386,7 +2386,7 @@ public class MapLogic { LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList); LuaValue getOptionData = FightDataUtil.getOptionData(frames); - int[] checkResult = CheckFight.getInstance().checkFight(seed, sFloodConfig.getBattleTime(), getFightData, getOptionData,FightType.MapExploreFight); + int[] checkResult = CheckFight.getInstance().checkFight(seed, sFloodConfig.getBattleTime(), getFightData, getOptionData,FightType.MonterFight); //校验结果码 1:胜利 int resultCode = checkResult[0]; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/monsterAttack/QuickStartMonsterFighter.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/monsterAttack/QuickStartMonsterFighter.java new file mode 100644 index 000000000..64291a44c --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/monsterAttack/QuickStartMonsterFighter.java @@ -0,0 +1,142 @@ +package com.ljsd.jieling.handler.monsterAttack; + +import com.ljsd.jieling.config.SFloodConfig; +import com.ljsd.jieling.db.redis.RedisKey; +import com.ljsd.jieling.db.redis.RedisUtil; +import com.ljsd.jieling.exception.LogicException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.globals.Global; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.handler.map.behavior.BehaviorUtil; +import com.ljsd.jieling.ktbeans.KTGameType; +import com.ljsd.jieling.ktbeans.KtEventUtils; +import com.ljsd.jieling.ktbeans.parmsBean.ParamEventBean; +import com.ljsd.jieling.logic.dao.TeamPosHeroInfo; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.fight.CheckFight; +import com.ljsd.jieling.logic.fight.FightType; +import com.ljsd.jieling.logic.mission.GameEvent; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.FightInfoProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.util.FightDataUtil; +import com.ljsd.jieling.util.ItemUtil; +import com.ljsd.jieling.util.MessageUtil; +import com.ljsd.jieling.util.MonsterUtil; +import org.luaj.vm2.LuaValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description: 兽潮快速战斗 + * Author: zsx + * CreateDate: 2019/10/8 14:05 + */ +@Component +public class QuickStartMonsterFighter extends BaseHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(QuickStartMonsterFighter.class); + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REQUEST; + } + + @Override + public void processWithProto(ISession iSession, FightInfoProto.QuickStartMonsterFightRequest proto) throws Exception { + + int fightId = proto.getFightId(); + int teamId = proto.getTeamId(); + int uid = iSession.getUid(); + User user = UserManager.getUser(uid); + if(user.getMapManager().getLastMonsterAttack()!=fightId){ + LOGGER.info("endFight() uid=>{} fightId=>{} oldfightId=>{} SLevelDifficultyConfig == null", uid, fightId, user.getMapManager().getLastMonsterAttack(),teamId); + MessageUtil.sendErrorResponse(iSession, 0,MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE , "fightId 有误"); + return; + } + SFloodConfig sFloodConfig =SFloodConfig.getsFloodConfigMap().get(fightId); + if (sFloodConfig == null) { + LOGGER.info("endFight() uid=>{} fightId=>{} SLevelDifficultyConfig == null", uid, fightId); + MessageUtil.sendErrorResponse(iSession, 0, MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, ""); + return; + } + int[][] cost = new int[1][]; + int[] temp = new int[2]; + temp[0] = Global.DROP; + temp[1] = 1; + cost[0] = temp; + boolean flag = ItemUtil.fightItemCost(user, cost); + if (!flag) { + MessageUtil.sendErrorResponse(iSession, 0, MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, "道具不足"); + return; + } + List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); + if (teamPosHeroInfos == null || teamPosHeroInfos.size() == 0) { + LOGGER.info("startLevelDifficultyFight==> uid={},fightId={},teamId={}", uid, fightId, teamId); + MessageUtil.sendErrorResponse(iSession, 0, MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, "阵容有误!!"); + return; + } + + + KtEventUtils.onKtEvent(user, ParamEventBean.UserGameType, KTGameType.CHALLENGE_MONSTERATTACK.getIndex(), fightId); + user.getUserMissionManager().onGameEvent(user, GameEvent.MONSTER_ATTACK_PLAY); + + + int groupId = sFloodConfig.getMonster(); + CommonProto.FightTeamInfo fightTeamInfo = BehaviorUtil.getFightTeamInfo(user, teamId, true); + Map> monsterByGroup = MonsterUtil.getMonsterByGroup(groupId); + List monsterTeamList = new ArrayList<>(3); + List monsterGroupList = BehaviorUtil.getFightTeamInfos(groupId, monsterByGroup, Global.MONSTER_1); + monsterTeamList.addAll(monsterGroupList); + List monsterGroupList1 = BehaviorUtil.getFightTeamInfos(groupId, monsterByGroup, Global.MONSTER_2); + monsterTeamList.addAll(monsterGroupList1); + List monsterGroupList2 = BehaviorUtil.getFightTeamInfos(groupId, monsterByGroup, Global.MONSTER_3); + monsterTeamList.addAll(monsterGroupList2); + //设置战斗随机种子 + int seed = (int) (System.currentTimeMillis() / 1000); + LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList); + LuaValue getOptionData = FightDataUtil.getOptionData(""); + int mostTime = sFloodConfig.getBattleTime(); + + int[] checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData, FightType.MonterFight); + + //校验结果码 1:胜利 + int resultCode = checkResult[0]; + if (resultCode == -1) { + ItemUtil.itemCost(user,cost, BIReason.MONSTERATTACK_CONSUME, fightId); + MessageUtil.sendErrorResponse(iSession, 0, MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, "战斗异常!"); + return; + } + + if (resultCode == 0) { + ItemUtil.itemCost(user,cost, BIReason.MONSTERATTACK_CONSUME, fightId); + CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); + FightInfoProto.QuickStartMonsterFightResponse builder = FightInfoProto.QuickStartMonsterFightResponse.newBuilder() + .setResult(resultCode) + .setEnventDrop(dropBuilder) + .build(); + MessageUtil.sendMessage(iSession, 1,MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, builder, true); + return; + + } + //排行榜 + String rankKey = RedisKey.getKey(RedisKey.MONSTER_ATTACK_RANK,"", false); + RedisUtil.getInstence().zsetAddOneOffsetByTime(rankKey, String.valueOf(user.getId()), fightId); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, sFloodConfig.getReward(), BIReason.MONSTERATTACK_REWARD); + + FightInfoProto.QuickStartMonsterFightResponse builder = FightInfoProto.QuickStartMonsterFightResponse.newBuilder() + .setResult(resultCode) + .setEnventDrop(drop) + .build(); + + user.getMapManager().setLastMonsterAttack(fightId + 1); + user.getUserMissionManager().onGameEvent(user,GameEvent.MONSTER_ATTACK_LEVEL); + MessageUtil.sendMessage(iSession, 1, MessageTypeProto.MessageType.QUICK_START_MONSTERFIGHTER_REPONSE_VALUE, builder, true); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightType.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightType.java index 64731931b..7974b6c8d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightType.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightType.java @@ -8,6 +8,7 @@ public enum FightType { AdventureLock(5), // 解锁秘境 GuildFight(6), // 公会站 BloodyFight(7), // 血战 + MonterFight(8), // 兽潮 ; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java index fca30ea1f..88afd1e93 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java @@ -26,12 +26,15 @@ import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocol.ProtocolsAbstract; import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.session.GameSession; +import com.ljsd.jieling.util.ClassLoaderHelper; import com.ljsd.jieling.util.MathUtils; import com.ljsd.jieling.util.MessageUtil; import com.ljsd.jieling.util.StringUtil; import com.ljsd.jieling.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; import java.lang.reflect.Type; import java.util.*; @@ -50,7 +53,7 @@ public class ProtocolsManager implements ProtocolsAbstract { private static ProtocolsManager instance = new ProtocolsManager(); public static Map gameMessageForLogin = new ConcurrentHashMap<>(); private Map handlers = new HashMap<>(); - + private static ClassLoader classLoader = GameApplication.class.getClassLoader(); private static Set forbidLogin = new HashSet<>(); public final int HANDLER_THREAD_NUM = 50; public HandlerLogicThread[] handlerThreads = new HandlerLogicThread[HANDLER_THREAD_NUM]; @@ -493,5 +496,33 @@ public class ProtocolsManager implements ProtocolsAbstract { } forbidLogin = forbidMap.keySet(); } + + public void initHandler(String pck, ConfigurableApplicationContext configurableApplicationContext){ + List> handlers = new LinkedList<>(); + try + { + ClassLoaderHelper.findLocalClass(pck, BaseHandler.class, classLoader, handlers); + handlers.forEach(hand -> + { + BaseHandler baseHandler = null; + try { + baseHandler = (BaseHandler) configurableApplicationContext.getBean(hand); + } catch (NoSuchBeanDefinitionException e1) { + try { + baseHandler = (BaseHandler) hand.newInstance(); + } catch (Exception ex) { + } + } catch (Exception e) { + e.printStackTrace(); + } + if (null != baseHandler) { + addHandler(baseHandler); + } + }); + } + catch(RuntimeException e2) + { + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java new file mode 100644 index 000000000..08fce7c67 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java @@ -0,0 +1,80 @@ +package com.ljsd.jieling.util; + +import java.io.File; +import java.lang.reflect.Modifier; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Description: des + * Author: zsx + * CreateDate: 2019/10/8 17:23 + */ +public class ClassLoaderHelper { + + /** + * 获取指定接口的某个包下的所有实现类(不包括接口和抽象类) + */ + public static void findLocalClass(String packName, Class classinterface, ClassLoader classLoader, List> classes) + { + URI url; + try + { + url = classLoader.getResource(packName.replace(".", "/")).toURI(); + } + catch(URISyntaxException e1) + { + return; + } + File file = new File(url); + file.listFiles((subfile) -> + { + if(subfile.isDirectory()) + { + findLocalClass(packName + "." + subfile.getName(), classinterface,classLoader,classes); + } + if(subfile.getName().endsWith(".class")) + { + Class clazz = null; + try + { + String classname = packName + "." + subfile.getName().replace(".class", ""); + clazz = classLoader.loadClass(classname); + } + catch(ClassNotFoundException e) + { + e.printStackTrace(); + } + if(clazz == null) + { + return false; + } + + if(ClassLoaderHelper.filter(clazz, classinterface)) + { + classes.add(clazz); + return true; + } + } + return false; + }); + } + + /** + * 过滤接口和抽象类 + */ + private static boolean filter(Class clazz, Class filterclass) + { + if(clazz.isInterface()) + { + return false; + } + if(Modifier.isAbstract(clazz.getModifiers())) + { + return false; + } + return filterclass.isAssignableFrom(clazz); + } + +}