diff --git a/.gitignore b/.gitignore index fa129af97..72d70c57c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ serverlogic/src/main/java/com/ljsd/jieling/protocols *.class out build -out \ No newline at end of file +out +tmp/ diff --git a/conf/server/StoreConfig.txt b/conf/server/StoreConfig.txt index aec653b26..ba015eaca 100644 --- a/conf/server/StoreConfig.txt +++ b/conf/server/StoreConfig.txt @@ -4,3 +4,7 @@ int string int int mut,int#int,1 mut,int#int,1 int mut,int#int,2 int int int 2 1000金币 2 1 1#100 14#1000 100 14|0#0#0#100 2 0 0 3 10000金币 3 1 1#100 14#10000 100 14|0#0#0#100 3 0 0 4 55555金币 1 1 1#100 14#5555 100 14|0#0#0#100 4 1 2 +101 100金币 1 2 1#100 14#100 100 14|0#0#0#100 1 0 0 +102 1000金币 2 2 1#100 14#1000 100 14|0#0#0#100 2 0 0 +103 10000金币 3 2 1#100 14#10000 100 14|0#0#0#100 3 0 0 +104 55555金币 1 2 1#100 14#5555 100 14|0#0#0#100 4 1 2 diff --git a/conf/server/StoreTypeConfig.txt b/conf/server/StoreTypeConfig.txt index 7bdafdcc7..a3db1426a 100644 --- a/conf/server/StoreTypeConfig.txt +++ b/conf/server/StoreTypeConfig.txt @@ -1,5 +1,5 @@ -Id RefreshItem RefreshType StoreOpenRule StartTime EndTime -int mut,int#int,2 mut,int#int,1 int sting string -1 14|0#0#0#10000 2#5 1 0 0 -2 14|0#0#0#10000 3#2 1 0 0 -3 14|0#0#0#10000 1#0 2 0 30 +Id Number RefreshItem RefreshType StoreOpenRule StartTime EndTime +int int mut,int#int,2 mut,int#int,1 int string string +1 3 14|0#0#0#10000 2#5 1 0 0 +2 3 14|0#0#0#10000 3#2 1 0 0 +3 3 14|0#0#0#10000 1#0 2 0 30 diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index 24e04f301..ed478cf20 100644 --- a/serverlogic/src/main/java/com/ljsd/GameApplication.java +++ b/serverlogic/src/main/java/com/ljsd/GameApplication.java @@ -31,6 +31,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; +import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; @@ -113,6 +114,7 @@ public class GameApplication { serverConfig = serverConfigTmp; KeyGenUtils.setMachineNum(serverConfiguration.getServerProperties().getNum()); ActivityLogic.getInstance().checkActiviyStatus(); +// ProtocolsManager.ps = new PrintStream("tmp/login.txt"); HeroLogic.getInstance().afterSet(); try { LOGGER.info("main->CoreApplication start..."); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreConfig.java new file mode 100644 index 000000000..15c2eb2d1 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreConfig.java @@ -0,0 +1,106 @@ +package com.ljsd.jieling.config; + +import com.ljsd.jieling.logic.STableManager; +import com.ljsd.jieling.logic.Table; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Table(name ="StoreConfig") +public class SStoreConfig implements BaseConfig { + static Map sStoreConfigMap; + //key: type 商店类型 + static Map> sStoreConfigMapBuyType; + + private int id; + + private String goodsName; + + private int sort; + + private int storeId; + + private int[] openLv; + + private int[] goods; + + private int weight; + + private int[][] cost; + + private int limit; + + private int isDiscount; + + private int discountDegree; + + + @Override + public void init() throws Exception { + sStoreConfigMap = STableManager.getConfig(SStoreConfig.class); + Map> sStoreConfigMapBuyType = new ConcurrentHashMap<>(); + for (Map.Entry entry :sStoreConfigMap.entrySet()){ + SStoreConfig data = entry.getValue(); + if (!sStoreConfigMapBuyType.containsKey(data.getStoreId())) { + sStoreConfigMapBuyType.put((data.getStoreId()), new ArrayList()); + } + sStoreConfigMapBuyType.get(data.getStoreId()).add(data); + } + this.sStoreConfigMapBuyType = sStoreConfigMapBuyType; + } + + public static Map getSstoreConfigMap () { + return sStoreConfigMap; + } + + public static List getSstoreConfigBuyStore (int storeId) { + return sStoreConfigMapBuyType.get(storeId); + } + public int getId() { + return id; + } + + public String getGoodsName() { + return goodsName; + } + + public int getSort() { + return sort; + } + + public int getStoreId() { + return storeId; + } + + public int[] getOpenLv() { + return openLv; + } + + public int[] getGoods() { + return goods; + } + + public int getWeight() { + return weight; + } + + public int[][] getCost() { + return cost; + } + + public int getLimit() { + return limit; + } + + public int getIsDiscount() { + return isDiscount; + } + + public int getDiscountDegree() { + return discountDegree; + } + + +} \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreTypeConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreTypeConfig.java new file mode 100644 index 000000000..5998688c6 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SStoreTypeConfig.java @@ -0,0 +1,60 @@ +package com.ljsd.jieling.config; + +import com.ljsd.jieling.logic.STableManager; +import com.ljsd.jieling.logic.Table; + +import java.util.Map; + +@Table(name ="StoreTypeConfig") +public class SStoreTypeConfig implements BaseConfig { + static Map sStoreTypeConfigMap; + private int id; + private int number; + private int[][] refreshItem; + + private int[] refreshType; + + private int storeOpenRule; + + private String startTime; + + private String endTime; + + + @Override + public void init() throws Exception { + sStoreTypeConfigMap = STableManager.getConfig(SStoreTypeConfig.class); + } + + public static Map getSstoreTypeConfigMap (){ + return sStoreTypeConfigMap; + } + + public int getId() { + return id; + } + + public int[][] getRefreshItem() { + return refreshItem; + } + + public int[] getRefreshType() { + return refreshType; + } + + public int getStoreOpenRule() { + return storeOpenRule; + } + + public String getStartTime() { + return startTime; + } + + public String getEndTime() { + return endTime; + } + + public int getNumber() { + return number; + } +} \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoKey.java b/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoKey.java index 9476550f7..7b8320ba3 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoKey.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoKey.java @@ -31,4 +31,6 @@ public class MongoKey { public final static String arenaManager = "arenaManager"; public final static String secretBoxManager = "secretBoxManager"; + + public final static String storeManager = "storeManager"; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/store/GetAllStoreHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/store/GetAllStoreHandler.java new file mode 100644 index 000000000..124dc44d6 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/store/GetAllStoreHandler.java @@ -0,0 +1,29 @@ +package com.ljsd.jieling.handler.store; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.item.ItemLogic; +import com.ljsd.jieling.logic.store.StoreLogic; +import com.ljsd.jieling.netty.cocdex.PacketNetData; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.protocols.PlayerInfoProto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class GetAllStoreHandler extends BaseHandler { + + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.GET_STARE_INFOS_REQUEST; + } + + @Override + public void process(ISession iSession, PacketNetData netData) throws Exception { + StoreLogic.getAllStoreInfo(iSession); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreInfo.java new file mode 100644 index 000000000..4c050be6d --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreInfo.java @@ -0,0 +1,67 @@ +package com.ljsd.jieling.logic.dao; + +import com.ljsd.common.mogodb.MongoBase; + +import java.util.Map; + +public class StoreInfo extends MongoBase { + private int id ; // 商店id + + private long lastRefreshTime; // 上次刷新时间 + + private int refreshNum; // 刷新次数 + + private long startTime; // 开启时间 + + private long endTime ; // 结束时间 + + private Map itemNumMap; + + public StoreInfo(int id,long startTime,long endTime,Map itemNumMap ){ +// this.setRootCollection(User._COLLECTION_NAME); + this.id = id; + this.lastRefreshTime = System.currentTimeMillis(); + this.refreshNum = 0; + this.startTime = startTime; + this.endTime = endTime; + this.itemNumMap = itemNumMap; + } + + public void setLastRefreshTime(long lastRefreshTime) { + updateString("lastRefreshTime", lastRefreshTime); + this.lastRefreshTime = lastRefreshTime; + } + + public void setRefreshNum(int refreshNum) { + updateString("refreshNum", refreshNum); + this.refreshNum = refreshNum; + } + + public void setItemNumMap(Map itemNumMap) { + this.itemNumMap = itemNumMap; + } + + public int getId() { + return id; + } + + public long getLastRefreshTime() { + return lastRefreshTime; + } + + public int getRefreshNum() { + return refreshNum; + } + + public long getStartTime() { + return startTime; + } + + public long getEndTime() { + return endTime; + } + + public Map getItemNumMap() { + return itemNumMap; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreManager.java new file mode 100644 index 000000000..b382ba4e6 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/StoreManager.java @@ -0,0 +1,42 @@ +package com.ljsd.jieling.logic.dao; + +import com.ljsd.common.mogodb.MongoBase; +import com.ljsd.jieling.logic.dao.root.User; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +public class StoreManager extends MongoBase { + //key :商店id + private Map storeInfoMap = new ConcurrentHashMap<>(); + + public StoreManager() { + this.setRootCollection(User._COLLECTION_NAME); + } + + public Map getStoreInfoMap() { + return storeInfoMap; + } + + public void addStoreInfo(StoreInfo storeInfo) throws Exception { + storeInfo.init(this.getRootId(), getMongoKey() + ".storeInfoMap." + storeInfo.getId()); + updateString("storeInfoMap." + storeInfo.getId(), storeInfo); + storeInfoMap.put(storeInfo.getId(), storeInfo); + } + + public void removeStoreInfo(Integer key) { + StoreInfo storeInfo= storeInfoMap.get(key); + if (storeInfo!=null){ + storeInfoMap.remove(key); + removeString(getMongoKey() + ".storeInfoMap." + key); + } + } + + public StoreInfo newStoreInfo(int id,long startTime,long endTime,Map itemNumMap) throws Exception { + StoreInfo storeInfo = new StoreInfo(id,startTime,endTime,itemNumMap); + addStoreInfo(storeInfo); + return storeInfo; + } + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/User.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/User.java index d7d16b31a..77a7ebe49 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/User.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/User.java @@ -38,7 +38,11 @@ public class User { private ArenaManager arenaManager; +<<<<<<< HEAD private SecretBoxManager secretBoxManager; +======= + private StoreManager storeManager; +>>>>>>> 08935d2c7e00852ea7f3cb4951827c00faac6902 //构造函数必须要声明,否则从mongodb读出来反编译成类不通过 public User(){ @@ -60,6 +64,7 @@ public class User { this.activityManager = new ActivityManager(); this.arenaManager = new ArenaManager(); this.secretBoxManager = new SecretBoxManager(); + this.storeManager = new StoreManager(); //綁定关系 this.playerManager.init(id, MongoKey.playerManager); @@ -76,6 +81,7 @@ public class User { this.activityManager.init(id, MongoKey.activityManager); this.arenaManager.init(id, MongoKey.arenaManager); this.secretBoxManager.init(id, MongoKey.secretBoxManager); + this.storeManager.init(id,MongoKey.storeManager); } public String getId() { @@ -170,7 +176,12 @@ public class User { return arenaManager; } +<<<<<<< HEAD public SecretBoxManager getSecretBoxManager() { return secretBoxManager; +======= + public StoreManager getStoreManager() { + return storeManager; +>>>>>>> 08935d2c7e00852ea7f3cb4951827c00faac6902 } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java new file mode 100644 index 000000000..54eed30e0 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java @@ -0,0 +1,121 @@ +package com.ljsd.jieling.logic.store; + +import ch.qos.logback.core.util.TimeUtil; +import com.ljsd.jieling.config.SStoreConfig; +import com.ljsd.jieling.config.SStoreTypeConfig; +import com.ljsd.jieling.handler.store.GetAllStoreHandler; +import com.ljsd.jieling.logic.dao.StoreInfo; +import com.ljsd.jieling.logic.dao.StoreManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.protocols.PlayerInfoProto; +import com.ljsd.jieling.util.MessageUtil; +import com.ljsd.jieling.util.TimeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class StoreLogic { + + private static final Logger LOGGER = LoggerFactory.getLogger(StoreLogic.class); + + public static void getAllStoreInfo(ISession iSession) throws Exception { + int msgId = MessageTypeProto.MessageType.GET_STARE_INFOS_RESPONSE_VALUE; + int uid = iSession.getUid(); + User user = UserManager.getUser(uid); + StoreManager storeManager = user.getStoreManager(); + if (storeManager.getStoreInfoMap().size() == 0){ + initStoreInfo(storeManager); + } + PlayerInfoProto.GetStoreInfos.Builder builder = PlayerInfoProto.GetStoreInfos.newBuilder(); + Map storeInfoMap = storeManager.getStoreInfoMap(); + List storeInfos = new CopyOnWriteArrayList<>(); + for (Map.Entry entry: storeInfoMap.entrySet()){ + CommonProto.StoreInfo.Builder storeBuilder = CommonProto.StoreInfo.newBuilder(); + StoreInfo storeInfo = entry.getValue(); + storeBuilder.setId(storeInfo.getId()); + storeBuilder.setLastRefreshTime(storeInfo.getLastRefreshTime()); + storeBuilder.setRefreshNum(storeInfo.getRefreshNum()); + storeBuilder.setStartTime(storeInfo.getStartTime()); + storeBuilder.setEndTime(storeInfo.getEndTime()); + Map itemNumMap = storeInfo.getItemNumMap(); + List builderList = new CopyOnWriteArrayList<>(); + for (Map.Entry entry1: itemNumMap.entrySet()){ + int itemId = entry1.getKey(); + int buyNum = entry1.getValue(); + CommonProto.StoreItem.Builder storeItemBuilder = CommonProto.StoreItem.newBuilder(); + storeItemBuilder.setId(itemId); + storeItemBuilder.setBuyNum(buyNum); + builderList.add(storeItemBuilder.build()); + } + storeBuilder.addAllStoreItem(builderList); + storeInfos.add(storeBuilder.build()); + } + builder.addAllStoreInfo(storeInfos); + MessageUtil.sendMessage(iSession, 1,msgId, builder.build(), true); + } + //初始化商店 + private static void initStoreInfo(StoreManager storeManager) throws Exception { + Map sstoreTypeConfigMap = SStoreTypeConfig.getSstoreTypeConfigMap(); + for ( Map.Entry entry :sstoreTypeConfigMap.entrySet()){ + SStoreTypeConfig sStoreTypeConfig = entry.getValue(); + if (sStoreTypeConfig.getStoreOpenRule() == 1){ //固定商店 + Map itemNumMap = getStoreItem(sStoreTypeConfig.getId(),sStoreTypeConfig.getNumber()); + long startTime = 0; + long endTime = 0; + if (!sStoreTypeConfig.getStartTime().equals("0")){ + startTime = TimeUtils.parseTimeToMiles(sStoreTypeConfig.getStartTime(), "YYYYMMdd hhmmss"); + } + if (!sStoreTypeConfig.getEndTime().equals("0")){ + endTime = TimeUtils.parseTimeToMiles(sStoreTypeConfig.getEndTime(), "YYYYMMdd hhmmss"); + } + storeManager.newStoreInfo(sStoreTypeConfig.getId(),startTime,endTime,itemNumMap); + } + } + } + + /** + * 随机获得商店物品 + */ + private static Map getStoreItem(int storeId,int itemNum) { + Map itemNumMap = new ConcurrentHashMap<>(); + for (int i = 1; i <= itemNum; i ++){ + int rewardId = getRewardId(storeId,i); + itemNumMap.put(rewardId, 0); + } + return itemNumMap; + } + + private static int getRewardId(int storeId,int sort) { + List sstoreConfigBuyStore = SStoreConfig.getSstoreConfigBuyStore(storeId); + List randomSstoreConfigList = new CopyOnWriteArrayList<>(); + int totalWeight = 0; + for (SStoreConfig sStoreConfig : sstoreConfigBuyStore) { + if (sort != sStoreConfig.getSort()){ + continue; + } + totalWeight += sStoreConfig.getWeight(); + randomSstoreConfigList.add(sStoreConfig); + } + int weight = 0; + int rewardId = 0; + Random random = new Random(); + int randomWeight = random.nextInt(totalWeight) + 1; + for (SStoreConfig sStoreConfig : randomSstoreConfigList) { + weight += sStoreConfig.getWeight(); + if (weight >= randomWeight) { + rewardId = sStoreConfig.getId(); + break; + } + } + return rewardId; + } +} 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 24ff80347..56704bf46 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 @@ -1,5 +1,6 @@ package com.ljsd.jieling.network.server; +import com.google.gson.Gson; import com.google.protobuf.GeneratedMessage; import com.google.protobuf.InvalidProtocolBufferException; import com.ljsd.GameApplication; @@ -20,6 +21,7 @@ import com.ljsd.jieling.logic.dao.PlayerManager; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.netty.cocdex.PacketNetData; +import com.ljsd.jieling.netty.cocdex.Tea; import com.ljsd.jieling.netty.handler.GameMessageHandler; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocol.ProtocolsAbstract; @@ -31,7 +33,10 @@ import com.ljsd.jieling.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import sun.misc.BASE64Encoder; +import java.io.*; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -45,9 +50,8 @@ import java.util.concurrent.atomic.AtomicInteger; public class ProtocolsManager implements ProtocolsAbstract { private static final Logger LOGGER = LoggerFactory.getLogger(ProtocolsManager.class); - private static ProtocolsManager instance = new ProtocolsManager(); - + public static PrintStream ps= null;// 创建文件输出流 private Map handlers = new HashMap<>(); private ProtocolsManager() { @@ -94,15 +98,18 @@ public class ProtocolsManager implements ProtocolsAbstract { } iSession.setHeartBreatNums(heartBreatNums); } - + Gson gson = new Gson(); @Override - public void processMessage(GameSession gameSession, Object obj) throws InvalidProtocolBufferException { + public void processMessage(GameSession gameSession, Object obj) { + if (!GameApplication.start) { return; } final ISession session = (ISession) gameSession; - PacketNetData packetNetData = new PacketNetData((byte[])obj); - + PacketNetData packetNetData = new PacketNetData((byte[]) obj); +// int msgId = packetNetData.getMsgId(); +// MessageTypeProto.MessageType messageType = MessageTypeProto.MessageType.valueOf(msgId); +// ps.println(messageType + "=" + gson.toJson(obj)); if (packetNetData.getMsgId()==1000){ dealHeartBeat(session); return; diff --git a/test/src/main/java/network/client/NettyTCPClientInitializer.java b/test/src/main/java/network/client/NettyTCPClientInitializer.java index c9849ae75..92912e733 100644 --- a/test/src/main/java/network/client/NettyTCPClientInitializer.java +++ b/test/src/main/java/network/client/NettyTCPClientInitializer.java @@ -2,6 +2,8 @@ package network.client; import com.ljsd.jieling.netty.cocdex.ByteBufDecoder; import com.ljsd.jieling.netty.cocdex.ByteBufEncoder; +import com.ljsd.jieling.netty.cocdex.TeaDecoder; +import com.ljsd.jieling.netty.cocdex.TeaEncoder; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; @@ -17,8 +19,8 @@ public class NettyTCPClientInitializer extends ChannelInitializer protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); - p.addLast(new ByteBufDecoder()); - p.addLast(new ByteBufEncoder()); + p.addLast(new TeaDecoder()); + p.addLast(new TeaEncoder()); p.addLast(new NettyTCPClientHandler()); } }