From 358310d762652cbc821850a2ace3b0851be85aa7 Mon Sep 17 00:00:00 2001 From: gaojie Date: Tue, 22 Jan 2019 09:25:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=81=93=E5=85=B7=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/server/ArenaConfig.txt | 10 +++ conf/server/GameSetting.txt | 2 + .../com/ljsd/jieling/config/SArenaConfig.java | 43 ++++++++++ .../java/com/ljsd/jieling/config/SDrop.java | 41 +++++++++ .../com/ljsd/jieling/config/SGameSetting.java | 31 +++++++ .../ljsd/jieling/globals/GlobalItemType.java | 11 +++ .../handler/GameGM/GMRequestHandler.java | 4 +- .../java/com/ljsd/jieling/util/ItemUtil.java | 55 +++++++++++- .../java/com/ljsd/jieling/util/MathUtils.java | 85 +++++++++++++++++++ 9 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 conf/server/ArenaConfig.txt create mode 100644 conf/server/GameSetting.txt create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/config/SArenaConfig.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/config/SDrop.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/config/SGameSetting.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/util/MathUtils.java diff --git a/conf/server/ArenaConfig.txt b/conf/server/ArenaConfig.txt new file mode 100644 index 000000000..70cacf0b8 --- /dev/null +++ b/conf/server/ArenaConfig.txt @@ -0,0 +1,10 @@ +Id Name Position Include +int string mut,float#float,1 mut,float#float,1 +1 北部 null 101#102 +2 西部 null 103#104 +3 0.0 null null +4 0.0 null null +5 0.0 null null +6 0.0 null null +7 0.0 null null +8 0.0 null null diff --git a/conf/server/GameSetting.txt b/conf/server/GameSetting.txt new file mode 100644 index 000000000..26e17d2d2 --- /dev/null +++ b/conf/server/GameSetting.txt @@ -0,0 +1,2 @@ +Id BornItem +int mut,int#int,2 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SArenaConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SArenaConfig.java new file mode 100644 index 000000000..085667648 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SArenaConfig.java @@ -0,0 +1,43 @@ +package com.ljsd.jieling.config; + +import com.ljsd.jieling.logic.STableManager; +import com.ljsd.jieling.logic.Table; + +import java.util.Map; + +@Table(name ="ArenaConfig") +public class SArenaConfig implements BaseConfig { + + private int id; + + private String name; + + private float[] position; + + private float[] include; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public float[] getPosition() { + return position; + } + + public float[] getInclude() { + return include; + } + + +} \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SDrop.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SDrop.java new file mode 100644 index 000000000..f037e73ae --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SDrop.java @@ -0,0 +1,41 @@ +package com.ljsd.jieling.config; + +import com.ljsd.jieling.logic.STableManager; +import com.ljsd.jieling.logic.Table; + +import java.util.Map; + +@Table(name = "drop") +public class SDrop implements BaseConfig { + public static Map sDropMap; + private int id; + private int dropType; // 掉落type + private int[][] item; + private int[] weight; + + @Override + public void init() throws Exception { + sDropMap = STableManager.getConfig(SDrop.class); + } + + + public int getId() { + return id; + } + + public int[][] getItem() { + return item; + } + + public static Map getsDropMap() { + return sDropMap; + } + + public int getDropType() { + return dropType; + } + + public int[] getWeight() { + return weight; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SGameSetting.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SGameSetting.java new file mode 100644 index 000000000..f73f35426 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SGameSetting.java @@ -0,0 +1,31 @@ +package com.ljsd.jieling.config; + +import com.ljsd.jieling.logic.STableManager; +import com.ljsd.jieling.logic.Table; + +import java.util.Map; + +@Table(name ="GameSetting") +public class SGameSetting implements BaseConfig { + + private int id; + + private int[][] bornItem; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int[][] getBornItem() { + return bornItem; + } + + +} \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java new file mode 100644 index 000000000..fabf9ce1a --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java @@ -0,0 +1,11 @@ +package com.ljsd.jieling.globals; + +public interface GlobalItemType { + //掉落物品类型 + int ALL_DROP = 0; //全部掉落 + int WEIGHT_DROP = 1; //随机掉落 + + // 物品类型 + int ITEM = 10; //道具类型 + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java index 2eb6b3716..71f755cf1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java @@ -8,6 +8,7 @@ import com.ljsd.jieling.logic.dao.User; import com.ljsd.jieling.logic.dao.UserManager; 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.GMCommandProto; import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.util.ItemUtil; @@ -49,8 +50,9 @@ public class GMRequestHandler extends BaseHandler{ } private void giveItem(User cUser,int itemId,int itemNum) throws Exception { + CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); Map itemMap = new ConcurrentHashMap<>(); itemMap.put(itemId,itemNum); - ItemUtil.addItem(cUser,itemMap); + ItemUtil.addItem(cUser,itemMap,dropBuilder); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java index 398147177..86b0e3a47 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java @@ -1,6 +1,8 @@ package com.ljsd.jieling.util; +import com.ljsd.jieling.config.SDrop; import com.ljsd.jieling.config.SItem; +import com.ljsd.jieling.globals.GlobalItemType; import com.ljsd.jieling.logic.dao.Item; import com.ljsd.jieling.logic.dao.ItemManager; import com.ljsd.jieling.logic.dao.User; @@ -10,11 +12,56 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; public class ItemUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ItemUtil.class); + //掉落 + public static CommonProto.Drop.Builder drop(User user, int dropId, CommonProto.Drop.Builder drop) throws Exception { + SDrop sDrop = SDrop.getsDropMap().get(dropId); + if (sDrop == null){ + return drop; + } + int dropType = sDrop.getDropType(); + Map itemMap = new HashMap<>(); + selectDrop(sDrop, dropType, itemMap); + + addItem(user,itemMap,drop); + + return drop; + } + + private static void selectDrop(SDrop sDrop, int dropType, Map itemMap) { + int[][] itemIds = sDrop.getItem(); + if (dropType == GlobalItemType.ALL_DROP){ + for (int[] itemId : itemIds) { + getMap(itemId, itemMap); + } + }else{ + int[] weights = sDrop.getWeight(); + int index = MathUtils.randomForStrArray(weights); + getMap(itemIds[index], itemMap); + } + } + + private static void getMap(int[] itemInfo, Map itemMap) { + SItem sItem = SItem.getsItemMap().get(itemInfo[1]); + int itemType = sItem.getItemType(); + switch (itemType) { + case GlobalItemType.ITEM: + putcountMap(itemInfo, itemMap); + break; + default: + break; + } + } + + private static void putcountMap(int[] itemInfo, Map map) { + map.merge(itemInfo[0], itemInfo[1], (a, b) -> b + a); + } /** * 添加道具 @@ -22,7 +69,8 @@ public class ItemUtil { * @param itemMap * @throws Exception */ - public static void addItem(User user, Map itemMap) throws Exception { + public static void addItem(User user, Map itemMap,CommonProto.Drop.Builder dropBuilder) throws Exception { + List itemProtoList = new CopyOnWriteArrayList<>(); ItemManager itemManager = user.getItemManager(); for (Map.Entry entry : itemMap.entrySet()) { SItem sItem = SItem.getsItemMap().get(entry.getKey()); @@ -34,7 +82,12 @@ public class ItemUtil { item.setItemNum(item.getItemNum() + entry.getValue()); } } + if (dropBuilder != null) { + CommonProto.Item itemProto = CommonProto.Item.newBuilder().setItemId(item.getItemId()).setItemNum(item.getItemNum()).build(); + itemProtoList.add(itemProto); + } } + dropBuilder.addAllItemlist(itemProtoList); //todo 为了测试 日后要删掉 UserManager.ljsdMongoTemplate.lastUpdate(); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/MathUtils.java b/serverlogic/src/main/java/com/ljsd/jieling/util/MathUtils.java new file mode 100644 index 000000000..9460b1c4c --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/MathUtils.java @@ -0,0 +1,85 @@ +package com.ljsd.jieling.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ThreadLocalRandom; + + +/** + * Created by admin on 2014/11/14. + * 随机工具类 + */ + +public class MathUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(MathUtils.class); + + /** + * 权重随机 + * @param rateArray + * @return + */ + public static int randomForStrArray(int[] rateArray) { + return randomStrArray(rateArray, -1); + } + public static int randomStrArray(int[] rateArray, int minSum) { + if (null == rateArray) { + throw new IllegalArgumentException( + "The random array must not be null!"); + } + int arrayLength = rateArray.length; + if (arrayLength == 0) { + throw new IllegalArgumentException( + "The random array's length must not be zero!"); + } + // 依次累加的和 + int rateSum = 0; + // 从头开始 依次累加之后的各个元素和 的临时数组 + int[] rateSumArray = new int[arrayLength]; + + for (int i = 0; i < arrayLength; i++) { + + if (rateArray[i] < 0) { + throw new IllegalArgumentException( + "The array's element must not be equal or greater than zero!"); + } + rateSum += rateArray[i]; + rateSumArray[i] = rateSum; + } + if (rateSum <= 0) { + // 所有概率都为零,必然没有选中的元素,返回无效索引:-1 + return -1; + } + //如果有保底分母设置,当所有权值之和小于保底分母时,则启用保底分母 + if(minSum < rateSum) { + minSum = rateSum; + } + int randomInt = MathUtils.random(1, minSum); + if(randomInt > rateSum) { + return -1; + } + int bingoIndex = -1; + for (int i = 0; i < arrayLength; i++) { + if (randomInt <= rateSumArray[i]) { + bingoIndex = i; + break; + } + } + if (bingoIndex == -1) { + throw new IllegalStateException("Cannot find out bingo index!"); + } + return bingoIndex; + } + /** + * 返回>=low, <=hi的整数随机数,均匀分布 + * + * @param low + * @param hi + * @return + */ + public static int random(int low, int hi) { +// return (int) (low + (hi - low + 0.9) * Math.random()); + return low + ThreadLocalRandom.current().nextInt(hi - low + 1); + } + +}