From 238e940beb84a40b8f93a811cbe5fe688448fa0b Mon Sep 17 00:00:00 2001 From: zhangshanxue Date: Sat, 16 May 2020 10:32:50 +0800 Subject: [PATCH] =?UTF-8?q?Task=E3=80=90=E6=96=B0=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E3=80=91=E5=85=AC=E4=BC=9A=E6=8F=B4=E5=8A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clazzStaticCfg/GuildStaticConfig.java | 46 +++++++ .../ljsd/jieling/core/HandlerLogicThread.java | 25 ++-- .../java/com/ljsd/jieling/core/Lockey.java | 98 +++++++++++++++ .../java/com/ljsd/jieling/core/Lockeys.java | 81 ++++++++++++ .../ljsd/jieling/core/SimpleTransaction.java | 112 ++++++++++++++--- .../com/ljsd/jieling/globals/BIReason.java | 4 + .../handler/chat/SendChatInfoHandler.java | 2 +- .../family/GuildGetHelpLogRequestHandler.java | 54 ++++++++ .../family/GuildHelpGetAllRequestHandler.java | 70 +++++++++++ .../GuildHelpHelpOtherRequestHandler.java | 119 ++++++++++++++++++ .../GuildSendHelpMessageRequestHandler.java | 64 ++++++++++ .../family/GuildSendHelpRequestHandler.java | 93 ++++++++++++++ .../GuildTakeHelpBoxRequestHandler.java | 66 ++++++++++ .../GuildTakeHelpRewardRequestHandler.java | 78 ++++++++++++ .../HeroFiveStarGetEventHandler.java | 4 +- .../ljsd/jieling/logic/dao/GuildMyInfo.java | 72 +++++++++++ .../jieling/logic/dao/root/GuildHelpLog.java | 48 +++++++ .../jieling/logic/dao/root/GuildInfo.java | 16 +++ .../ljsd/jieling/logic/family/GuildLogic.java | 57 ++++++++- .../ljsd/jieling/logic/item/ItemLogic.java | 3 + .../ljsd/jieling/thread/task/MinuteTask.java | 38 +++++- .../com/ljsd/jieling/util/CBean2Proto.java | 7 ++ .../com/ljsd/jieling/util/MessageUtil.java | 20 +-- .../main/java/config/SGuildHelpConfig.java | 65 ++++++++++ .../src/main/java/manager/STableManager.java | 7 +- test/src/main/java/ExcelUtils.java | 2 +- 26 files changed, 1195 insertions(+), 56 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/config/clazzStaticCfg/GuildStaticConfig.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/core/Lockey.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/core/Lockeys.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildGetHelpLogRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpGetAllRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpHelpOtherRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpMessageRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildTakeHelpBoxRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildTakeHelpRewardRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildHelpLog.java create mode 100644 tablemanager/src/main/java/config/SGuildHelpConfig.java diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/clazzStaticCfg/GuildStaticConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/clazzStaticCfg/GuildStaticConfig.java new file mode 100644 index 000000000..9fc0d3f38 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/clazzStaticCfg/GuildStaticConfig.java @@ -0,0 +1,46 @@ +package com.ljsd.jieling.config.clazzStaticCfg; + +import config.SDifferDemonsBoxSetting; +import config.SGameSetting; +import config.SGuildHelpConfig; +import manager.AbstractClassStaticConfig; +import manager.STableManager; +import manager.Table; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Description: des + * Author: zsx + * CreateDate: 2020/5/12 16:46 + */ +public class GuildStaticConfig extends AbstractClassStaticConfig { + + private static final Map helpRecourseMap = new HashMap<>(); + + @Override + public void registConfigs(Set registConfigs) { + registConfigs.add(SGameSetting.class.getAnnotation(Table.class).name()); + } + + @Override + public void figureConfigs() { + try { + Map config = STableManager.getConfig(SGuildHelpConfig.class); + SGuildHelpConfig sGuildHelpConfig = config.get(1); + int[][] recourseReward = sGuildHelpConfig.getRecourseReward(); + for (int[] item :recourseReward) { + helpRecourseMap.put(item[1],item[0]); + } + } catch (Exception e) { + LOGGER.error("helpRecourseMap init fail",e); + } + } + + public static Map getHelpRecourseMap() { + return helpRecourseMap; + } +} 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 a7af120c9..14d93c6df 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java @@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class HandlerLogicThread extends Thread{ private static final Logger LOGGER = LoggerFactory.getLogger(HandlerLogicThread.class); private static Set whiteMsg = new HashSet<>(); - private static ThreadLocal threadlocal = new ThreadLocal(); + static { whiteMsg.add(MessageTypeProto.MessageType.MAP_ENTER_REQUEST_VALUE); whiteMsg.add(MessageTypeProto.MessageType.MAP_START_EXPLORE_REQUEST_VALUE); @@ -129,7 +129,7 @@ public class HandlerLogicThread extends Thread{ return; } session.setLastMsgId(msgId); - SimpleTransaction transaction = setTransaction(session); + SimpleTransaction transaction = SimpleTransaction.setTransaction(session); BaseHandler baseHandler = ProtocolsManager.getInstance().getHandler(msgId); if(baseHandler == null){ LOGGER.info("request uid=>{} , msgId=>{}, not find the baseHandler",userId,msgId); @@ -163,11 +163,11 @@ public class HandlerLogicThread extends Thread{ } catch (Exception e){ - SimpleTransaction transaction = current(); + SimpleTransaction transaction = SimpleTransaction.current(); if(null!=transaction){ ISession session = transaction.getSession(); try { - current().callback(); + transaction.callback(); //内部codeErr统一处理 if(e instanceof ErrorCodeException){ int errCode = ErrorUtil.getExceptionErrorCodeValue(e); @@ -278,21 +278,10 @@ public class HandlerLogicThread extends Thread{ ayyncWorkerConcurrentLinkedQueue.offer(ayyncWorker); } - public static SimpleTransaction current() { - return threadlocal.get(); - } + private static void destroyISession() { - threadlocal.set(null); + SimpleTransaction.remove(); } - private static SimpleTransaction setTransaction(ISession session) { - SimpleTransaction var0 = threadlocal.get(); - if (var0 != null && var0.getSession() != null && var0.getSession().getId().equals(session.getId())) { - var0.reset(); - return var0; - } else { - threadlocal.set(new SimpleTransaction(session)); - } - return threadlocal.get(); - } + } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/Lockey.java b/serverlogic/src/main/java/com/ljsd/jieling/core/Lockey.java new file mode 100644 index 000000000..cdbf98a07 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/Lockey.java @@ -0,0 +1,98 @@ +package com.ljsd.jieling.core; + +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * Description: 封装指定类型锁 + * Author: zsx + * CreateDate: 2020/5/12 15:14 + */ +public class Lockey implements Comparable{ + + private final int index; + private final Object key; + private final int hashcode; + + private ReentrantReadWriteLock.ReadLock rlock; + private ReentrantReadWriteLock.WriteLock wlock; + + Lockey(int id, Object key) { + this.index = id; + this.key = key; + this.hashcode = id ^ (id << 16) ^ key.hashCode(); + } + + Lockey alloc() { + ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock(); + rlock = rwlock.readLock(); + wlock = rwlock.writeLock(); + return this; + } + + void rLock() { + rlock.lock(); + } + + void wLock() { + wlock.lock(); + } + + void rUnlock() { + rlock.unlock(); + } + + void wUnlock() { + wlock.unlock(); + } + + boolean rTryLock() { + return rlock.tryLock(); + } + + boolean wTryLock() { + return wlock.tryLock(); + } + + public int getIndex() { + return index; + } + + public Object getKey() { + return key; + } + + public int getHashcode() { + return hashcode; + } + + public ReentrantReadWriteLock.ReadLock getRlock() { + return rlock; + } + + public ReentrantReadWriteLock.WriteLock getWlock() { + return wlock; + } + + @SuppressWarnings("unchecked") + @Override + public int compareTo(Lockey o) { + int x = index - o.index; + return x != 0 ? x : ((Comparable) key).compareTo(o.key); + } + + @Override + public int hashCode() { + return hashcode; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj instanceof Lockey) { + Lockey o = (Lockey) obj; + return this.index == o.index && key.equals(o.key); + } + return false; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/Lockeys.java b/serverlogic/src/main/java/com/ljsd/jieling/core/Lockeys.java new file mode 100644 index 000000000..f3b35ae0b --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/Lockeys.java @@ -0,0 +1,81 @@ +package com.ljsd.jieling.core; + +import java.lang.ref.WeakReference; +import java.util.Set; + +/** + * Description: 扩展服务器锁功能 + * 存储全服的锁 + * 不支持大小锁检测 + * 支持小锁集合添加自动排序 避免死锁 + * 仿ThreadLocalMap WeakReference做存储 避免内存泄漏 + * Author: zsx + * CreateDate: 2020/5/12 14:58 + */ +public class Lockeys { + + private static Lockeys lockeys = new Lockeys(); + + public static Lockeys getLockeys() { + return lockeys; + } + + private Entry[] table = new Entry[1 << 10]; //默认给1024 省去扩容 + + static class Entry extends WeakReference { + private Entry next; + Entry(Lockey k, Entry v) { + super(k); + this.next = v; + } + } + + Lockey getLockey( Object object ,int id) { + return get(new Lockey(id, object)); + } + + public synchronized Lockey get(Lockey lockey) { + SimpleTransaction current = SimpleTransaction.current(); + if (current != null) { + Lockey lockey1 = current.get(lockey); + if (lockey1 != null) + return lockey1; + } + int h = lockey.hashCode(); + Entry e = table[h & (1 << 10-1)]; + if(e==null){ + e = new Entry(null, null); + table[h & (1 << 10-1)]=e;//to fix 漏写了 查半天 + } + + while (e.next != null) { + Lockey _key = e.next.get(); + if (_key == null) + e.next = e.next.next; + else if (_key.equals(lockey)) + return _key; + else + e = e.next; + } + e.next = new Entry(lockey, null); + return lockey.alloc(); + } + + + /** + * 一定要按照加锁规则加 直接实现了写锁 + * 问题1 锁不一致 加锁无效 + * 问题2 锁顺序 死锁 + * + * 暂定表名(功能) + id + */ + public void lock(String key , Set index) { + index.stream().sorted().forEach((var1) -> { + if(SimpleTransaction.current()==null){ + return; + } + SimpleTransaction.current().wAddLockey(Lockeys.getLockeys().getLockey(key, var1)); + }); + } + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java b/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java index c2ffbff9b..b96e07b21 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java @@ -12,7 +12,9 @@ import com.ljsd.jieling.util.MessageUtil; import java.util.*; /** - * 伪事务 + * 伪事务 加解锁关键 谨慎修改此类 + *

+ * 扩展锁功能 */ public class SimpleTransaction { @@ -21,6 +23,44 @@ public class SimpleTransaction { private List tasks = new LinkedList<>(); private Map> sendCacheMap = new HashMap<>(); private static final Map combineMsgId = new HashMap<>(); + private static ThreadLocal threadlocal = new ThreadLocal(); + + private final Map locks = new HashMap<>(); + + public static SimpleTransaction current() { + return threadlocal.get(); + } + + /** + * 解锁关键 var0.reset(); + */ + public static SimpleTransaction setTransaction(ISession session) { + SimpleTransaction var0 = threadlocal.get(); + if (var0 != null && var0.getSession() != null && var0.getSession().getId().equals(session.getId())) { + var0.reset(); + return var0; + } else { + threadlocal.set(new SimpleTransaction(session)); + } + return threadlocal.get(); + } + + + /** + * 解锁关键 var0.reset(); + */ + public static void remove() { + SimpleTransaction var0 = threadlocal.get(); + if (var0 != null) + var0.reset(); + threadlocal.set(null); + } + + Lockey get(Lockey lockey) { + LockeyHolder holder = locks.get(lockey); + return holder != null ? holder.lockey : null; + } + static { //添加合并策略 @@ -44,21 +84,21 @@ public class SimpleTransaction { return combineList; }); - combineMsgId.put(MessageTypeProto.MessageType.ALL_GIFTGOODS_INDICATION_VALUE, (MessageUtil.CombinePolicy< PlayerInfoProto.AllGiftGoodsIndication>) list -> { + combineMsgId.put(MessageTypeProto.MessageType.ALL_GIFTGOODS_INDICATION_VALUE, (MessageUtil.CombinePolicy) list -> { List combineList = new LinkedList<>(); - if(list.size()>0){ - if(list.size()>1){ + if (list.size() > 0) { + if (list.size() > 1) { //修复连续获得多个英雄 前端无法处理问题 HashMap giftId2startTimeMap = new HashMap<>(); list.getFirst().getGiftGoodsInfoList().forEach(giftGoodsInfo -> { - if(giftGoodsInfo.getStartTime()!=0){ - giftId2startTimeMap.put(giftGoodsInfo.getGoodsId(),giftGoodsInfo.getStartTime()); + if (giftGoodsInfo.getStartTime() != 0) { + giftId2startTimeMap.put(giftGoodsInfo.getGoodsId(), giftGoodsInfo.getStartTime()); } }); PlayerInfoProto.AllGiftGoodsIndication.Builder build = PlayerInfoProto.AllGiftGoodsIndication.newBuilder(); list.getLast().getGiftGoodsInfoList().forEach(giftGoodsInfo -> { - if(giftId2startTimeMap.containsKey(giftGoodsInfo.getGoodsId())){ + if (giftId2startTimeMap.containsKey(giftGoodsInfo.getGoodsId())) { CommonProto.GiftGoodsInfo.Builder builder = CommonProto.GiftGoodsInfo.newBuilder(); builder.setStartTime(giftId2startTimeMap.get(giftGoodsInfo.getGoodsId())); builder.setBuyTimes(giftGoodsInfo.getBuyTimes()); @@ -66,13 +106,13 @@ public class SimpleTransaction { builder.setGoodsId(giftGoodsInfo.getGoodsId()); builder.setDynamicBuyTimes(giftGoodsInfo.getDynamicBuyTimes()); build.addGiftGoodsInfo(builder); - }else { + } else { build.addGiftGoodsInfo(giftGoodsInfo); } }); combineList.add(build.build()); - }else { + } else { combineList.add(list.getLast()); } @@ -107,18 +147,18 @@ public class SimpleTransaction { dealWhileCommit(transTask); } - public void beafore() throws Exception{ + public void beafore() throws Exception { MissionEventDistributor.requestStart(); } - public void commit() throws Exception{ + public void commit() throws Exception { doAddSendCache(); for (TransTask transTask : tasks) { if (!transTask.isCallback()) transTask.run(); } //miss - MissionEventDistributor.requestEnd(session,true); + MissionEventDistributor.requestEnd(session, true); //mongo MongoUtil.getInstence().lastUpdate(); } @@ -139,14 +179,14 @@ public class SimpleTransaction { @Override public void run() { - if (null != HandlerLogicThread.current() && null != HandlerLogicThread.current().getSession()) - MessageUtil.sendIndicationMessage(HandlerLogicThread.current().getSession(), 1, getMsgId(), getProto(), true); + if (null != current() && null != current().getSession()) + MessageUtil.sendIndicationMessage(current().getSession(), 1, getMsgId(), getProto(), true); } } - public static class SendResponseTask extends TransTask{ + public static class SendResponseTask extends TransTask { private GeneratedMessage proto; private int msgId; @@ -158,9 +198,10 @@ public class SimpleTransaction { @Override public void run() { - if (null != HandlerLogicThread.current() && null != HandlerLogicThread.current().getSession()) - MessageUtil.sendMessage(HandlerLogicThread.current().getSession(), 1, getMsgId(), getProto()); + if (null != current() && null != current().getSession()) + MessageUtil.sendMessage(current().getSession(), 1, getMsgId(), getProto()); } + public int getMsgId() { return msgId; } @@ -177,6 +218,13 @@ public class SimpleTransaction { void reset() { sendCacheMap.clear(); tasks.clear(); + locks.values().forEach(holder -> { + if (holder.write) + holder.lockey.wUnlock(); + else + holder.lockey.rUnlock(); + }); + locks.clear(); } /** @@ -187,10 +235,38 @@ public class SimpleTransaction { if (sendCacheMap.containsKey(entry.getKey())) { List combineList = entry.getValue().combine(sendCacheMap.get(entry.getKey())); for (GeneratedMessage generatedMessage : combineList) { - tasks.add(0,new SimpleTransaction.SendTask(generatedMessage, entry.getKey())); + tasks.add(0, new SimpleTransaction.SendTask(generatedMessage, entry.getKey())); } } } } + + static class LockeyHolder implements Comparable { + final Lockey lockey; + boolean write; + + LockeyHolder(Lockey lockey, boolean write) { + this.lockey = lockey; + this.write = write; + } + + @Override + public int compareTo(LockeyHolder o) { + return lockey.compareTo(o.lockey); + } + } + + + void wAddLockey(Lockey key) { + LockeyHolder holder = this.locks.get(key); + if (holder == null) { + key.wLock(); + this.locks.put(key, new LockeyHolder(key, true)); + } else if (!holder.write) { + holder.lockey.rUnlock(); + holder.lockey.wLock(); + holder.write = true; + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java index e5730da3c..31a4b2132 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java @@ -134,6 +134,9 @@ public interface BIReason { int DEATH_PAHT_RANDOM_REWARD = 74;//十绝阵翻牌奖励 + int GUILDHELP_REWARD = 75;//公会援助宝盒 + int GUILDHELP_GIVE = 76;//公会援助给与 + int ADVENTURE_UPLEVEL_CONSUME = 1000;//秘境升级 int SECRETBOX_CONSUME = 1001;//秘盒抽卡 int DECOMPOSE_ITEM_CONSUME = 1002;//分解道具消耗 @@ -241,6 +244,7 @@ public interface BIReason { int FETE_CONSUME = 1057;//祭祀消耗 int COMPLEX_JEVEL_EQUIP_CONSUME = 1058; //合成宝器 + int GUILD_HELP_CONSUME = 1059;//公会援助 } \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java index d852bf681..b1adf6a17 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java @@ -26,7 +26,7 @@ public class SendChatInfoHandler extends BaseHandler{ int friendId = sendChatInfoReqest.getFriendId(); if(message.startsWith("0|//")&&GameApplication.serverProperties.isDebug()){ - // GmService.exeCmd(message.substring(4)); + GmService.exeCmd(message.substring(4)); ChatLogic.getInstance().sendChatMessage(iSession,chatType,message+"gm命令",friendId); }else { ChatLogic.getInstance().sendChatMessage(iSession,chatType,message,friendId); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildGetHelpLogRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildGetHelpLogRequestHandler.java new file mode 100644 index 000000000..525ac8f80 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildGetHelpLogRequestHandler.java @@ -0,0 +1,54 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.family.GuildLogic; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; + +import java.util.HashSet; +import java.util.Set; + +/** + * Description: 获取所有公会日志 + * Author: zsx + * CreateDate: 2020/5/13 10:13 + */ +public class GuildGetHelpLogRequestHandler extends BaseHandler { + + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildGetHelpLogRequest proto) throws Exception { + User user = UserManager.getUser(uid); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild",sendUids); + + // 获取所有公会日志 + Family.GuildGetHelpLogResponse.Builder builder = Family.GuildGetHelpLogResponse.newBuilder(); + guildInfo.getGuildHelpLogInfoMap().forEach(log -> builder.addGuildHelpLog(GuildLogic.getLog(log))); + return builder.build(); + + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpGetAllRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpGetAllRequestHandler.java new file mode 100644 index 000000000..0d23ef9b4 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpGetAllRequestHandler.java @@ -0,0 +1,70 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Description: 获取所有公会援助信息 + * Author: zsx + * CreateDate: 2020/5/12 20:53 + */ +public class GuildHelpGetAllRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildHelpGetAllRequest proto) throws Exception { + + User user = UserManager.getUser(uid); + if (user == null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if (guildId == 0) { + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + + //lock all + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild",sendUids); + + Family.GuildHelpGetAllResponse.Builder builder1 = Family.GuildHelpGetAllResponse.newBuilder(); + for (Integer sendUid : sendUids) { + User target = UserManager.getUser(sendUid); + Set> entries = target.getGuildMyInfo().getGuidHelpInfo().entrySet(); + Family.GuildHelpInfoIndication.Builder builder = Family.GuildHelpInfoIndication.newBuilder(); + Map guidHelpHadTakeInfo = target.getGuildMyInfo().getGuidHelpHadTakeInfo(); + if(entries.size()==0){ + continue; + } + for (Map.Entry entry : entries) { + builder.addGuildHelpInfo(CommonProto.GuildHelpInfo.newBuilder().setType(entry.getKey()).setHadtakenum(user.getGuildMyInfo().getGuidHelpHadTakeInfo().getOrDefault(entry.getKey(),0)).setHadtakenum(guidHelpHadTakeInfo.getOrDefault(entry.getKey(),0)).setNum(entry.getValue())); + } + Family.GuildHelpInfoIndication build = builder.setUid(target.getId()).build(); + builder1.addGuildHelpInfoIndication(build); + } + + return builder1.build(); + + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpHelpOtherRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpHelpOtherRequestHandler.java new file mode 100644 index 000000000..b57f99267 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildHelpHelpOtherRequestHandler.java @@ -0,0 +1,119 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.config.clazzStaticCfg.GuildStaticConfig; +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuildMyInfo; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildHelpLog; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.GuildLog; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.family.GuildLogic; +import com.ljsd.jieling.protocols.ChatProto; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.util.CBean2Proto; +import com.ljsd.jieling.util.ItemUtil; +import com.ljsd.jieling.util.MessageUtil; +import config.SGuildHelpConfig; +import config.SItem; +import manager.STableManager; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Description: 援助他人 + * Author: zsx + * CreateDate: 2020/5/11 20:40 + */ +public class GuildHelpHelpOtherRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildHelpHelpOtherRequest proto) throws Exception { + User user = UserManager.getUser(uid); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + + //lock all 会修改公会记录 + + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild",sendUids); + + + SGuildHelpConfig sGuildHelpConfig = STableManager.getConfig(SGuildHelpConfig.class).get(1); + // time check + int guildHelpTime = user.getGuildMyInfo().getGuildHelpTime(); + + if(guildHelpTime+1>sGuildHelpConfig.getHelpTime()[0]+(sGuildHelpConfig.getHelpTime()[1])){ + //check cost + throw new ErrorCodeException("次数用尽"); + } + + if(guildHelpTime+1>sGuildHelpConfig.getHelpTime()[0]){ + //check cost + int[][] cost = new int[1][]; + cost[0]=sGuildHelpConfig.getExpend(); + boolean enough = ItemUtil.itemCost(user, cost, BIReason.GUILD_HELP_CONSUME, 0); + if (!enough) { + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH); + } + } + user.getGuildMyInfo().setGuildHelpTime(guildHelpTime+1); + + + User target = UserManager.getUser(proto.getUid()); + int b = target.getGuildMyInfo().getGuidHelpInfo().getOrDefault(proto.getType(),-2); + if(b==-2||b==sGuildHelpConfig.getRecourseTime()[1]){ + throw new ErrorCodeException("援助失败"); + } + + + //notify all change + target.getGuildMyInfo().getGuidHelpInfo().merge(proto.getType(), 1, Integer::sum); + + int[][] give = new int[1][]; + give[0]=sGuildHelpConfig.getHelpReward(); + //drop item + CommonProto.Drop.Builder drop = ItemUtil.drop(user,give , BIReason.FETE_REWARD); + + Family.GuildHelpInfoIndication.Builder build = Family.GuildHelpInfoIndication.newBuilder(); + for (Map.Entry entry : target.getGuildMyInfo().getGuidHelpInfo().entrySet()) { + build.addGuildHelpInfo(CommonProto.GuildHelpInfo.newBuilder().setType(entry.getKey()).setHadtakenum(user.getGuildMyInfo().getGuidHelpHadTakeInfo().getOrDefault(entry.getKey(),0)).setNum(entry.getValue())); + } + build.setUid(target.getId()); + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(guildId), MessageTypeProto.MessageType.GuildHelpInfoIndication,build.build()); + + + GuildHelpLog guildHelpLog = new GuildHelpLog(uid, target.getId(), user.getPlayerInfoManager().getNickName(), target.getPlayerInfoManager().getNickName(), (int) (System.currentTimeMillis() / 1000), proto.getType()); + guildInfo.addGuildHelpLog(guildHelpLog); + //notify all log + Family.GuildHelpLogIndication build1 = Family.GuildHelpLogIndication.newBuilder() + .setGuildHelpLog(GuildLogic.getLog(guildHelpLog)) + .build(); + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(guildId), MessageTypeProto.MessageType.GuildHelpLogIndication,build1); + + return Family.GuildHelpHelpOtherResponse.newBuilder().setDrop(drop).build(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpMessageRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpMessageRequestHandler.java new file mode 100644 index 000000000..d9bc78b87 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpMessageRequestHandler.java @@ -0,0 +1,64 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuildMyInfo; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; +import config.SGuildHelpConfig; +import manager.STableManager; + +import java.util.Map; + +/** + * Description: 发送公会援助信息 + * Author: zsx + * CreateDate: 2020/5/11 20:40 + */ +public class GuildSendHelpMessageRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildSendHelpMessageRequest proto) throws Exception { + User user = UserManager.getUser(uid); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + + GuildMyInfo guildMyInfo = user.getGuildMyInfo(); + if(guildMyInfo.getGuidHelpInfo().size()==0){ + throw new ErrorCodeException("您还未求援"); + } + + boolean isfinish =true; + SGuildHelpConfig sGuildHelpConfig = STableManager.getConfig(SGuildHelpConfig.class).get(1); + + for (Map.Entry entry:guildMyInfo.getGuidHelpHadTakeInfo().entrySet()) { + if(entry.getValue() 1000 * sGuildHelpConfig.getRecourseCD(); + if(b){ + guildMyInfo.setGuildHelpSendTime(time); + } + return Family.GuildSendHelpMessageResponse.newBuilder().setSendMessage(b).build(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpRequestHandler.java new file mode 100644 index 000000000..35a289404 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildSendHelpRequestHandler.java @@ -0,0 +1,93 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.config.clazzStaticCfg.GuildStaticConfig; +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuildMyInfo; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.family.GuildLogic; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; +import config.SGuildHelpConfig; +import manager.STableManager; + +import java.util.*; + +/** + * Description: 请求公会援助 + * Author: zsx + * CreateDate: 2020/5/11 20:40 + */ +public class GuildSendHelpRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildSendHelpRequest proto) throws Exception { + User user = UserManager.getUser(uid); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + + //lock all + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild",sendUids); + + GuildMyInfo guildMyInfo = user.getGuildMyInfo(); + List typeList = proto.getTypeList(); + SGuildHelpConfig sGuildHelpConfig = STableManager.getConfig(SGuildHelpConfig.class).get(1); + if(typeList.size()+guildMyInfo.getGuidHelpInfo().size()>sGuildHelpConfig.getRecourseTime()[0]){ + throw new ErrorCodeException("求援次数超上限"); + } + + //check fg + Set set = GuildStaticConfig.getHelpRecourseMap().keySet(); + for (int type:typeList) { + if(!set.contains(type)){ + throw new ErrorCodeException("碎片阵营错误:type"+type); + } + } + + if(!Collections.disjoint(typeList,guildMyInfo.getGuidHelpInfo().keySet())){ + throw new ErrorCodeException("求援类型重复: setNow:"+guildMyInfo.getGuidHelpInfo().keySet().toString()); + } + + Family.GuildHelpInfoIndication.Builder builder = Family.GuildHelpInfoIndication.newBuilder(); + for (int type:typeList) { + guildMyInfo.putGuidHelpInfo(type,0); + + } + for (Map.Entry entry : user.getGuildMyInfo().getGuidHelpInfo().entrySet()) { + builder.addGuildHelpInfo(CommonProto.GuildHelpInfo.newBuilder().setHadtakenum(user.getGuildMyInfo().getGuidHelpHadTakeInfo().getOrDefault(entry.getKey(),0)).setType(entry.getKey()).setHadtakenum(0).setNum(0)); + } + + //notify all change + Family.GuildHelpInfoIndication build = builder.setUid(user.getId()).build(); + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(guildId), MessageTypeProto.MessageType.GuildHelpInfoIndication,build); + + + long time =System.currentTimeMillis(); + boolean b = (time - guildMyInfo.getGuildHelpSendTime()) > 1000 * sGuildHelpConfig.getRecourseCD(); + if(proto.getSendMessage()&&b){ + guildMyInfo.setGuildHelpSendTime(time); + } + return Family.GuildSendHelpResponse.newBuilder().setSendMessage(b).build(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildTakeHelpBoxRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildTakeHelpBoxRequestHandler.java new file mode 100644 index 000000000..36011df03 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/GuildTakeHelpBoxRequestHandler.java @@ -0,0 +1,66 @@ +package com.ljsd.jieling.handler.family; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.GuildMyInfo; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.Family; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.util.ItemUtil; +import config.SGuildHelpConfig; +import manager.STableManager; + +import java.util.Map; + +/** + * Description: 领取公会求援宝盒 + * Author: zsx + * CreateDate: 2020/5/11 20:40 + */ +public class GuildTakeHelpBoxRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, Family.GuildTakeHelpBoxRequest proto) throws Exception { + User user = UserManager.getUser(uid); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + //幂等 + GuildMyInfo guildMyInfo = user.getGuildMyInfo(); + if(guildMyInfo.isGuildHelpReward()){ + throw new ErrorCodeException("宝盒奖励已领取"); + } + boolean isfinish =true; + SGuildHelpConfig sGuildHelpConfig = STableManager.getConfig(SGuildHelpConfig.class).get(1); + + if(guildMyInfo.getGuidHelpInfo().size()!=sGuildHelpConfig.getRecourseTime()[0]){ + throw new ErrorCodeException("求援未完成"); + } + for (Map.Entry entry:guildMyInfo.getGuidHelpHadTakeInfo().entrySet()) { + if(entry.getValue() { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + + @Override + public void processWithProto(ISession iSession, Family.GuildTakeHelpRewardRequest proto) throws Exception { + User user = UserManager.getUser(iSession.getUid()); + if(user==null) + throw new ErrorCodeException(ErrorCode.UNKNOWN); + //check guild + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId == 0){ + throw new ErrorCodeException(ErrorCode.FAMILY_NO); + } + GuildMyInfo guildMyInfo = user.getGuildMyInfo(); + + if(!guildMyInfo.getGuidHelpInfo().containsKey(proto.getType())){ + throw new ErrorCodeException("未求援"); + } + int getnum =guildMyInfo.getGuidHelpInfo().get(proto.getType()); + + SGuildHelpConfig sGuildHelpConfig = STableManager.getConfig(SGuildHelpConfig.class).get(1); + if(guildMyInfo.getGuidHelpHadTakeInfo().getOrDefault(proto.getType(),0)>=sGuildHelpConfig.getRecourseTime()[1]){ + throw new ErrorCodeException("求援已完成"); + } + if(guildMyInfo.getGuidHelpHadTakeInfo().getOrDefault(proto.getType(),0)==getnum){ + throw new ErrorCodeException("求援已完成"); + } +// if(guildMyInfo.getGuidHelpInfo().get(proto.getType()) deathMaxDamage = new HashMap<>(); + //公会祭祀 private int fetetype;//祭祀类型 private int feteguild;//祭祀公会id private Set hadTakeReward= new HashSet<>();//已经领取的进度奖励 private Map guildSkill = new HashMap<>(4); + + //公会援助 + private int guildHelpTime;//公会援助次数 + private Map guidHelpInfo = new HashMap<>();//援助类型及次数信息 -5 奖励已领 TODO 更新及公会获取加锁 + private Map guidHelpHadTakeInfo = new HashMap<>(); + private boolean guildHelpReward;//公会奖励 + private long guildHelpSendTime;//公会求助信息时间 5分钟 + + + public void clearOfLevelGuild(){ path.clear(); curPos = STableManager.getFigureConfig(CommonStaticConfig.class).getInitPos(); @@ -184,4 +195,65 @@ public class GuildMyInfo extends MongoBase { updateString("deathMaxDamage",deathMaxDamage); } + + public void setGuildHelpTime(int guildHelpTime) { + this.guildHelpTime = guildHelpTime; + updateString("guildHelpTime",guildHelpTime); + } + + public void setGuidHelpInfo(Map guidHelpInfo) { + this.guidHelpInfo = guidHelpInfo; + updateString("guidHelpInfo",guidHelpInfo); + } + + public void putGuidHelpInfo(Integer type, Integer value) { + if(null == this.guidHelpInfo){ + this.guidHelpInfo= new HashMap<>(); + } + this.guidHelpInfo.put(type, value); + updateString("guidHelpInfo",guidHelpInfo); + } + + public void putGuidHelpHadTakeInfo(Integer type, Integer value) { + if(null == this.guidHelpHadTakeInfo){ + this.guidHelpHadTakeInfo= new HashMap<>(); + } + this.guidHelpHadTakeInfo.put(type, value); + updateString("guidHelpHadTakeInfo",guidHelpHadTakeInfo); + } + + public Map getGuidHelpHadTakeInfo() { + return guidHelpHadTakeInfo; + } + + public void setGuidHelpHadTakeInfo(Map guidHelpHadTakeInfo) { + this.guidHelpHadTakeInfo = guidHelpHadTakeInfo; + updateString("guidHelpHadTakeInfo",guidHelpHadTakeInfo); + } + + public boolean isGuildHelpReward() { + return guildHelpReward; + } + + public void setGuildHelpReward(boolean guildHelpReward) { + this.guildHelpReward = guildHelpReward; + updateString("guildHelpReward",guildHelpReward); + } + + public int getGuildHelpTime() { + return guildHelpTime; + } + + public Map getGuidHelpInfo() { + return guidHelpInfo; + } + + public long getGuildHelpSendTime() { + return guildHelpSendTime; + } + + public void setGuildHelpSendTime(long guildHelpSendTime) { + this.guildHelpSendTime = guildHelpSendTime; + updateString("guildHelpSendTime",guildHelpSendTime); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildHelpLog.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildHelpLog.java new file mode 100644 index 000000000..5a5e87afe --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildHelpLog.java @@ -0,0 +1,48 @@ +package com.ljsd.jieling.logic.dao.root; + +public class GuildHelpLog { + public static final String _COLLECTION_NAME = "guildhelplog"; + private int helpId; + private int targetId; + private String helperName; + private String targetName; + private int logTime; // time + private int type; // 援助类型 + + public GuildHelpLog(int helpId, int targetId, String helperName, String targetName, int logTime, int type) { + this.helpId = helpId; + this.targetId = targetId; + this.helperName = helperName; + this.targetName = targetName; + this.logTime = logTime; + this.type = type; + } + + public static String getCollectionName() { + return _COLLECTION_NAME; + } + + public int getHelpId() { + return helpId; + } + + public int getTargetId() { + return targetId; + } + + public String getHelperName() { + return helperName; + } + + public String getTargetName() { + return targetName; + } + + public int getLogTime() { + return logTime; + } + + public int getType() { + return type; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java index 01dd4658c..b040d7e6c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java @@ -1,6 +1,7 @@ package com.ljsd.jieling.logic.dao.root; import com.ljsd.common.mogodb.MongoBase; +import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.logic.family.GuildLogic; import com.ljsd.jieling.protocols.Family; import com.ljsd.jieling.protocols.MessageTypeProto; @@ -53,6 +54,8 @@ public class GuildInfo extends MongoBase { private Map carFightSb = new HashMap<>(); + public List guildHelpLogInfoMap = new LinkedList<>(); + public GuildInfo() { setRootCollection(_COLLECTION_NAME); } @@ -249,4 +252,17 @@ public class GuildInfo extends MongoBase { public Map getCarFightSb() { return carFightSb; } + + public void addGuildHelpLog(GuildHelpLog guildHelpLog) throws Exception { + guildHelpLogInfoMap.add(guildHelpLog); + updateString("guildHelpLogInfoMap" ,guildHelpLogInfoMap); + } + public void clearGuildHelpLog() throws Exception { + guildHelpLogInfoMap.clear(); + updateString("guildHelpLogInfoMap" ,guildHelpLogInfoMap); + } + + public List getGuildHelpLogInfoMap() { + return guildHelpLogInfoMap; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildLogic.java index fc1c01d40..a30a1046e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildLogic.java @@ -48,7 +48,7 @@ public class GuildLogic { static GuildLogic guildLogicInstance = new GuildLogic(); public static GuildLogic getInstance(){ return guildLogicInstance; - }; + } public void flushEveryDay(User user, PlayerInfoProto.FivePlayerUpdateIndication.Builder fBuilder)throws Exception { int guildId = user.getPlayerInfoManager().getGuildId(); @@ -58,6 +58,7 @@ public class GuildLogic { user.getGuildMyInfo().setFetetype(0); user.getGuildMyInfo().clearHadTakeReward(); + if(null!=fBuilder){ fBuilder.setLastFeteType(user.getGuildMyInfo().getFetetype()); fBuilder.addAllTakeFeteReward(new HashSet<>()); @@ -875,6 +876,10 @@ public class GuildLogic { if(guildInfo.getDefendInfo().containsKey((uid))){ guildInfo.removeDefendInfo(uid); } + + //TODO lock check + OnUserLeveFamily(user); + PlayerInfoCache cache = RedisUtil.getInstence().getMapEntry(RedisKey.PLAYER_INFO_CACHE, "", String.valueOf(uid), PlayerInfoCache.class); cache.setGuildPosition(0); RedisUtil.getInstence().putMapEntry(RedisKey.PLAYER_INFO_CACHE,"",String.valueOf(uid),cache); @@ -1317,4 +1322,54 @@ public class GuildLogic { MessageUtil.sendMessage(session,1,messageType.getNumber(),response,true); } + + public static CommonProto.GuildHelpLog getLog(GuildHelpLog log) { + + return CommonProto.GuildHelpLog.newBuilder() + .setHelperuid(log.getHelpId()).setTargetuid(log.getTargetId()) + .setHelpername(log.getHelperName()) + .setTargetname(log.getTargetName()) + .setTime(log.getLogTime()) + .setType(log.getType()).build(); + + } + + + /** + * 公会id清零之前调用 + * @param user + * @throws Exception + */ + public static void OnUserLeveFamily(User user)throws Exception{ + + //TODO lock all 公会id清零之前调用 + //退公会清除数据 补发奖励 + GuildMyInfo guildMyInfo = user.getGuildMyInfo(); + guildMyInfo.setGuidHelpHadTakeInfo(new HashMap<>(guildMyInfo.getGuidHelpInfo())); + String title = SErrorCodeEerverConfig.getI18NMessage("guildhelp_reward_title"); + String content = SErrorCodeEerverConfig.getI18NMessage("guildhelp_reward_txt"); + + + List list = new LinkedList<>(); + for (Map.Entry entry : user.getGuildMyInfo().getGuidHelpInfo().entrySet()) { + int[][] drop = new int[1][]; + drop[0] = new int[2]; + drop[0][0] = entry.getKey(); + drop[0][1] = entry.getValue()-user.getGuildMyInfo().getGuidHelpHadTakeInfo().getOrDefault(entry.getKey(),0); + list.add(drop); + } + String mailReward = ItemUtil.getMailReward(list); + MailLogic.getInstance().sendMail(user.getId(),title,content,mailReward,(int) (TimeUtils.now()/1000), Global.MAIL_EFFECTIVE_TIME); + + //notify all + Family.GuildHelpInfoIndication.Builder build = Family.GuildHelpInfoIndication.newBuilder(); + for (Map.Entry entry : user.getGuildMyInfo().getGuidHelpInfo().entrySet()) { + //通知前端清除公会成员援助信息 + build.addGuildHelpInfo(CommonProto.GuildHelpInfo.newBuilder().setType(entry.getKey()).setNum(-1)); + } + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(user.getPlayerInfoManager().getGuildId()), MessageTypeProto.MessageType.GuildHelpInfoIndication,build.build()); + + + + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java index 0db379c53..7c4f18c4f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java @@ -520,6 +520,9 @@ public class ItemLogic { return user.getEquipManager().getEquipMap().entrySet().stream().filter(stringEquipEntry -> StringUtil.isEmpty(stringEquipEntry.getValue().getHeroId()) ).filter(stringPropertyItemEntry -> stringPropertyItemEntry.getValue() instanceof Jewel).filter(stringPropertyItemEntry -> { + if(((Jewel)stringPropertyItemEntry.getValue()).getBuildLevel()!=0||stringPropertyItemEntry.getValue().getLevel()!=0){ + return false; + } SJewelConfig config = STableManager.getConfig(SJewelConfig.class).get(stringPropertyItemEntry.getValue().getEquipId()); if (config == null) { return false; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index b3673e317..c8abb8b29 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -5,6 +5,8 @@ import com.ljsd.fight.CheckFight; import com.ljsd.jieling.config.reportData.DataMessageUtils; import com.ljsd.jieling.core.CoreLogic; import com.ljsd.jieling.core.GlobalsDef; +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.core.SimpleTransaction; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; @@ -21,8 +23,11 @@ import com.ljsd.jieling.logic.activity.event.HourTaskEvent; import com.ljsd.jieling.logic.activity.event.MinuteTaskEvent; import com.ljsd.jieling.logic.activity.event.Poster; import com.ljsd.jieling.logic.arena.ArenaLogic; +import com.ljsd.jieling.logic.dao.GuildMyInfo; import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.family.DeathPathLogic; import com.ljsd.jieling.logic.family.GuildFightLogic; import com.ljsd.jieling.logic.fight.CombatLogic; @@ -31,13 +36,14 @@ import com.ljsd.jieling.logic.question.QuestionLogic; import com.ljsd.jieling.logic.store.BuyGoodsLogic; import com.ljsd.jieling.logic.store.StoreLogic; import com.ljsd.jieling.network.server.ProtocolsManager; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.Family; import com.ljsd.jieling.util.MessageUtil; import manager.STableManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Calendar; -import java.util.Map; +import java.util.*; public class MinuteTask extends Thread { private static final Logger LOGGER = LoggerFactory.getLogger(MinuteTask.class); @@ -135,13 +141,37 @@ public class MinuteTask extends Thread { int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); if(hour == 5 && minute ==0){ - LOGGER.info("DailyOfFiveTask start ..."); - GlobalDataManaager.everTask(5); + Map guildInfoMap = GuilidManager.guildInfoMap; for(Map.Entry guildInfoEntry:guildInfoMap.entrySet()){ RedisUtil.getInstence().del(RedisKey.getKey(RedisKey.GUILD_RED_PACKAGE_RANK,String.valueOf(guildInfoEntry.getKey()),false)); guildInfoEntry.getValue().reSetFete(); + + SimpleTransaction transaction = SimpleTransaction.current(); + GuildInfo guildInfo = guildInfoEntry.getValue(); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild",sendUids); + guildInfo.clearGuildHelpLog(); + + for (Integer sendUid : sendUids) { + User target = UserManager.getUser(sendUid); + GuildMyInfo guildMyInfo = target.getGuildMyInfo(); + guildMyInfo.setGuidHelpInfo(new HashMap<>()); + guildMyInfo.setGuidHelpHadTakeInfo(new HashMap<>()); + guildMyInfo.setGuildHelpSendTime(0); + guildMyInfo.setGuildHelpReward(false); + guildMyInfo.setGuildHelpTime(0); + } + + SimpleTransaction.remove(); + //处理公会援助信息 } + + LOGGER.info("DailyOfFiveTask start ..."); + GlobalDataManaager.everTask(5); LOGGER.info("DailyOfFiveTask end ..."); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java index 018ebc5da..e37fe9671 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -433,6 +433,10 @@ public class CBean2Proto { if(!online){ outTime = (int)((System.currentTimeMillis() - user.getPlayerInfoManager().getLoginTime())/1000); } + List helplist= new LinkedList<>(); + for (Map.Entry entry : user.getGuildMyInfo().getGuidHelpInfo().entrySet()) { + helplist.add(CommonProto.GuildHelpInfo.newBuilder().setType(entry.getKey()).setHadtakenum(user.getGuildMyInfo().getGuidHelpHadTakeInfo().getOrDefault(entry.getKey(),0)).setNum(entry.getValue()).build()); + } return Family.FamilyUserInfo.newBuilder().setRoleUid(user.getId()) .setUserName(user.getPlayerInfoManager().getNickName()) .setUserLevel(user.getPlayerInfoManager().getLevel()) @@ -448,6 +452,9 @@ public class CBean2Proto { .setLastFeteType(user.getGuildMyInfo().getFetetype()) .setLastFeteGuildId(user.getGuildMyInfo().getFeteguild()) .addAllTakeFeteReward(user.getGuildMyInfo().getHadTakeReward()) + .setGuildHelpTime(user.getGuildMyInfo().getGuildHelpTime()) + .addAllGuildHelpInfo(helplist) + .setIsTakeGuildHelpReward(user.getGuildMyInfo().isGuildHelpReward()) .build(); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java index 66bd7db62..908a1d741 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java @@ -96,9 +96,9 @@ public class MessageUtil { } public static void sendBagIndication(int sendUid,int type, List sendToFront) { - if(null!= HandlerLogicThread.current()){ + if(null!= SimpleTransaction.current()){ PlayerInfoProto.UpdateBagIndication.Builder build = PlayerInfoProto.UpdateBagIndication.newBuilder().addAllItem(sendToFront).setType(type); - HandlerLogicThread.current().dealWhileCommit(new SimpleTransaction.SendTask(build.build(), MessageTypeProto.MessageType.UPDATE_BAG_INDICATION_VALUE)); + SimpleTransaction.current().dealWhileCommit(new SimpleTransaction.SendTask(build.build(), MessageTypeProto.MessageType.UPDATE_BAG_INDICATION_VALUE)); return; } ISession session = OnlineUserManager.sessionMap.get(sendUid); @@ -110,8 +110,8 @@ public class MessageUtil { public static void sendMessage(ISession session, int result, int msgId, GeneratedMessage generatedMessage, boolean flush) { - if(null!= HandlerLogicThread.current()){ - HandlerLogicThread.current().dealWhileCommit(new SimpleTransaction.SendResponseTask(generatedMessage,msgId)); + if(null!= SimpleTransaction.current()){ + SimpleTransaction.current().dealWhileCommit(new SimpleTransaction.SendResponseTask(generatedMessage,msgId)); return; } @@ -158,17 +158,17 @@ public class MessageUtil { if(null == session){ return; } - if(session.getFiveReady() == 0){ - return; - } - int indicationIndex = session.getIndicationIndex(); int msgId = ProtocolsManager.getProtoIdBySimpleName(generatedMessage.getClass().getSimpleName()); if(msgId==0){ return; } - byte[] byteBuf = wrappedBuffer(session.getUid(), session.getToken(), indicationIndex,1, msgId, generatedMessage); + if(null!= SimpleTransaction.current()){ + SimpleTransaction.current().dealWhileCommit(new SimpleTransaction.SendResponseTask(generatedMessage,msgId)); + return; + } + byte[] byteBuf = wrappedBuffer(session.getUid(), session.getToken(), session.getIndex(), 1, msgId, generatedMessage); session.write(byteBuf,true); - session.putBackIndicationToMap(indicationIndex,byteBuf); + session.putBackMassageToMap(byteBuf); } public static void retrySendIndication( ISession session, byte[] byteBuf){ diff --git a/tablemanager/src/main/java/config/SGuildHelpConfig.java b/tablemanager/src/main/java/config/SGuildHelpConfig.java new file mode 100644 index 000000000..4416449d4 --- /dev/null +++ b/tablemanager/src/main/java/config/SGuildHelpConfig.java @@ -0,0 +1,65 @@ +package config; + +import manager.Table; + + +@Table(name ="GuildHelpConfig") +public class SGuildHelpConfig implements BaseConfig { + + private int id; + + private int[] helpTime; + + private int[] recourseTime; + + private int recourseCD; + + private int[][] recourseReward; + + private int[] expend; + + private int[][] reward; + + private int[] helpReward; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int[] getHelpTime() { + return helpTime; + } + + public int[] getRecourseTime() { + return recourseTime; + } + + public int getRecourseCD() { + return recourseCD; + } + + public int[][] getRecourseReward() { + return recourseReward; + } + + public int[] getExpend() { + return expend; + } + + public int[][] getReward() { + return reward; + } + + public int[] getHelpReward() { + return helpReward; + } + + +} \ No newline at end of file diff --git a/tablemanager/src/main/java/manager/STableManager.java b/tablemanager/src/main/java/manager/STableManager.java index 501b6d650..14fcec135 100644 --- a/tablemanager/src/main/java/manager/STableManager.java +++ b/tablemanager/src/main/java/manager/STableManager.java @@ -226,7 +226,12 @@ public class STableManager { type.addAll(Arrays.asList(prarms)); break; default: - dealParams(clazz, map, key, type, obj, prarms); + try { + dealParams(clazz, map, key, type, obj, prarms); + }catch (Exception e){ + System.out.println("clazz = [" + clazz + "], line = [" + line.substring(0,10) + "]"+prarms.toString() ); + throw e; + } break; } lineNum++; diff --git a/test/src/main/java/ExcelUtils.java b/test/src/main/java/ExcelUtils.java index c064ea888..12328fc82 100644 --- a/test/src/main/java/ExcelUtils.java +++ b/test/src/main/java/ExcelUtils.java @@ -180,7 +180,7 @@ public class ExcelUtils { info = getStringBuilder(row2, info, j, cell1); }else{ //添加默认值 - if (cell.toString().isEmpty()&&(cell1!=null)&&(!cell1.toString().isEmpty())){ + if (cell.toString().isEmpty()&&(cell1!=null)&&(!cell1.toString().isEmpty())&&!cell1.toString().equals("null")){ info = getStringBuilder(row2, info, j, cell1); continue; }