连续礼包优化

back_recharge
duhui 2021-12-02 15:16:02 +08:00
parent c91b204bdc
commit 2717cdefec
9 changed files with 621 additions and 3 deletions

View File

@ -369,4 +369,7 @@ public interface BIReason {
int WEEK_CARD_REWARD =1222;//周卡奖励
int FABAO_SOUL_UP_COST =1223;//法宝之魂升级消耗
int BUY_GOOD_ITEM_COST =1225;//妖晶购买道具消耗
int BUY_GOOD_ITEM_GET =1226;//妖晶购买道具获得
}

View File

@ -0,0 +1,64 @@
package com.ljsd.jieling.handler.goods;
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.activity.event.Poster;
import com.ljsd.jieling.logic.activity.event.SuperBoxEvent;
import com.ljsd.jieling.logic.activity.fourChallenge.FourChallengeLogic;
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.util.ItemUtil;
import com.ljsd.jieling.util.MessageUtil;
import config.SGoodsConfig;
import manager.STableManager;
import rpc.protocols.ActivityProto;
import rpc.protocols.CommonProto;
import rpc.protocols.MessageTypeProto;
import rpc.protocols.PlayerInfoProto;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author hj
*/
public class BuyGoodsToItemHandler extends BaseHandler<ActivityProto.BuyGoodsToItemRequest> {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.BuyGoodsToItemRequest;
}
@Override
public void processWithProto(ISession iSession, ActivityProto.BuyGoodsToItemRequest proto) throws Exception {
User user = UserManager.getUser(iSession.getUid());
// 客户端参数
int goodId = proto.getGoodId();
int goodsNum = proto.getGoodsNum();
if (goodsNum <= 0 || goodsNum > 999){
throw new ErrorCodeException(ErrorCode.HERO_MAX);
}
// 配置表获取数据
Map<Integer, SGoodsConfig> config = STableManager.getConfig(SGoodsConfig.class);
SGoodsConfig goodsConfig = config.get(goodId);
if (goodsConfig == null){
throw new ErrorCodeException(ErrorCode.CFG_NULL);
}
// 消耗道具
boolean cost = ItemUtil.itemCost(user, new int[][]{goodsConfig.getPrice()},goodsNum,BIReason.BUY_GOOD_ITEM_COST,0);
if (!cost){
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH);
}
// 领取奖励
CommonProto.Drop.Builder drop = ItemUtil.drop(user, goodsConfig.getGoods(), goodsNum, BIReason.BUY_GOOD_ITEM_GET);
// 消息发送
Poster.getPoster().dispatchEvent(new SuperBoxEvent(user.getId(),goodId,goodsNum));
// 返回
ActivityProto.BuyGoodsToItemResponse build = ActivityProto.BuyGoodsToItemResponse.newBuilder().setDrop(drop).build();
MessageUtil.sendMessage(iSession,1, MessageTypeProto.MessageType.BuyGoodsToItemResponse_VALUE,build,true);
}
}

View File

@ -1,5 +1,6 @@
package com.ljsd.jieling.logic.activity;
@SuppressWarnings("ALL")
public interface ActivityType {
int UNOPEN_STATE = -1;
@ -99,6 +100,7 @@ public interface ActivityType {
int SEVEN_WORLD_TREASURE = 83;//七界秘宝
int RIDING_SWARD = 84;//御剑飞行
int CONTINUOUS_GIFT = 85;//连续礼包
int CONTINUOUS_GIFT_NEW = 87;//新连续礼包
int SPECIAL_MONSTER_RANDOM_ACTIVITY = 100;//灵兽宝阁活动
int SPECIAL_MONSTER_GIFT_ACTIVITY = 101;//灵兽礼包

View File

@ -5,6 +5,7 @@ import config.SGlobalActivity;
import java.util.HashMap;
import java.util.function.Function;
@SuppressWarnings("ALL")
public enum ActivityTypeEnum {
ONLINEREWARD(ActivityType.OnlineReward, OnlineRewardActivity::new),
@ -90,6 +91,7 @@ public enum ActivityTypeEnum {
ITEMS_STORE_NEW(ActivityType.ITEMS_STORE_NEW,SuperBoxActivity::new),
TRUMP_GACHA_ACTIVITY(ActivityType.TRUMP_GACHA_ACTIVITY,LimitRandomCardActivity::new),
CONTINUOUS_GIFT(ActivityType.CONTINUOUS_GIFT,SuperBoxActivity::new),//连续礼包
CONTINUOUS_GIFT_NEW(ActivityType.CONTINUOUS_GIFT_NEW,ContinuousGiftActivity::new),//新连续礼包
;
private int type;

View File

@ -0,0 +1,364 @@
package com.ljsd.jieling.logic.activity;
import com.ljsd.GameApplication;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.jbean.ActivityMission;
import com.ljsd.jieling.jbean.ActivityProgressInfo;
import com.ljsd.jieling.logic.OnlineUserManager;
import com.ljsd.jieling.logic.activity.AbstractActivity;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.logic.activity.ActivityType;
import com.ljsd.jieling.logic.activity.event.ActivityStateChangeEvent;
import com.ljsd.jieling.logic.activity.event.IEvent;
import com.ljsd.jieling.logic.activity.event.Poster;
import com.ljsd.jieling.logic.activity.event.SuperBoxEvent;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.store.BuyGoodsNewLogic;
import com.ljsd.jieling.logic.store.newRechargeInfo.bean.AbstractWelfareBag;
import com.ljsd.jieling.logic.store.newRechargeInfo.rechargeHandler.RechargeHandler;
import com.ljsd.jieling.network.session.ISession;
import config.*;
import manager.STableManager;
import rpc.protocols.CommonProto;
import util.TimeUtils;
import java.util.*;
/**
* @author hj
*
*
* :
* 1:
* 2:
* 3:
* 4:
* 5:
* 6:
* 7:
* 8:
*/
@SuppressWarnings("ALL")
public class ContinuousGiftActivity extends AbstractActivity {
ContinuousGiftActivity(int id) {
super(id);
Poster.getPoster().listenEvent(this, SuperBoxEvent.class);
}
@Override
public void initActivity(User user) throws Exception {
ActivityMission mission = new ActivityMission();
// 初始化阶段奖励
ActivityLogic.getInstance().initOtherMission(mission, new ArrayList<>());
user.getActivityManager().getActivityMissionMap().put(id, mission);
}
@Override
public void onEvent(IEvent event) throws Exception {
// 类型验证
if (!(event instanceof SuperBoxEvent)) {
return;
}
// 获取信息
SuperBoxEvent event1 = (SuperBoxEvent) event;
User user = UserManager.getUser(event1.getUserId());
// 礼包处理
giftHandle(user, event1.getGiftId(), event1.getNum());
// 客户端推送
ISession session = OnlineUserManager.getSessionByUid(user.getId());
sendActivityProgress(session, user.getActivityManager().getActivityMissionMap().get(id), null);
}
/**
*
* @param user
* @param giftId
* @param missionMap
*/
private void giftHandle(User user, int giftId, int giftNum){
if (giftId < 0 || giftNum <= 0){
// 非礼包处理
return;
}
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
if (mission == null){
return;
}
Map<Integer, ActivityProgressInfo> missionMap = mission.getActivityMissionMap();
Collection<SThemeActivityShop> themeShops = SThemeActivityShop.themeMap.getOrDefault(id, new HashMap<>(0)).values();
for (SThemeActivityShop theme : themeShops) {
if (theme.getGoodId() == giftId){
// 记录礼包购买次数
ActivityProgressInfo current = missionMap.getOrDefault(theme.getId(),new ActivityProgressInfo());
current.setProgrss(current.getProgrss() + giftNum);
// 当前礼包状态处理
if (checkBuyGiftLimit(user,theme.getId(),current.getProgrss())){
current.setState(8);
missionMap.put(theme.getId(),current);
}
break;
}
}
}
/**
*
* ,Nif
* ,
* @param user
*/
private int getProgress(User user,int missionId){
// 活动信息是否为null
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
int days = mission.getV();
// 库
ActivityProgressInfo progressInfo = Optional.ofNullable(mission.getActivityMissionMap()).map(v->v.get(missionId)).orElse(null);
// 表
SThemeActivityShop theme = Optional.ofNullable(SThemeActivityShop.themeMap.get(id)).map(v -> v.get(missionId)).orElse(null);
// 返回值
int result = 0;
// 极为恶心的循环,包含超多的if-else
if (theme != null){
if (progressInfo != null && progressInfo.getState() == 8){
// 已购买
result = 8;
}else {
// 未购买, 是否解锁
if (days >= theme.getUnlockDay()){
// 已解锁, 可买天数
if (days >= theme.getBuyDay()){
// 可买, 是否购买前置礼包
if (checkBuyAgo(user,theme.getId())){
// 可买
result = 1;
}else {
// 未购买前置
result = 3;
}
}else {
// 不可买
result = 2;
}
}else {
// 未解锁, 是否可见
if (days >= theme.getVisibleDay()){
// 可见, 是否可预览
result = days >= theme.getViewDay()?6:7;
}else {
// 不可见
result = 5;
}
}
}
}
return result;
}
@Override
public List<CommonProto.ActivityInfo.MissionInfo> getAllMissInfo(User user,ActivityMission activityMission, Set<Integer> filter) {
long now = TimeUtils.now();
long start = getSrartTime();
long end = getEndTime();
// 验证活动是否开启
if (now < start || now > end){
return new ArrayList<>();
}
if (activityMission == null){
return new ArrayList<>();
}
// 更新记录天数
activityMission.setV(TimeUtils.getSoFarWentDays(start, now)+1);
// 库里存储的活动档位信息
Map<Integer, ActivityProgressInfo> progressInfoMap = activityMission.getActivityMissionMap();
// 返回对象
List<CommonProto.ActivityInfo.MissionInfo> missionInfos = new ArrayList<>(progressInfoMap.size());
// 策划表的配置
Map<Integer, SThemeActivityShop> themeMap = SThemeActivityShop.themeMap.getOrDefault(id,new HashMap<>());
for (Map.Entry<Integer, SThemeActivityShop> entry : themeMap.entrySet()) {
// 参数初始化
int missionId = entry.getKey();
int progress = getProgress(user,missionId);
if (progress == 0){
continue;
}
int state = progress==8?1:0;
// 封装proto并返回
CommonProto.ActivityInfo.MissionInfo build = CommonProto.ActivityInfo.MissionInfo.newBuilder()
.setMissionId(missionId)
.setProgress(progress)
.setState(state)
.build();
missionInfos.add(build);
}
return missionInfos;
}
/**
*
* @param uid
* @param activityId
* @param activityMission
* @return
*/
@Override
public boolean checkActivityMissionFinishAndTake(int uid, int activityId, ActivityMission activityMission) {
Map<Integer, ActivityProgressInfo> activityProgressInfoMap = activityMission.getActivityMissionMap();
if (activityProgressInfoMap.isEmpty()) {
return false;
}
// 策划表的配置
Map<Integer, SThemeActivityShop> themeMap = SThemeActivityShop.themeMap.getOrDefault(id,new HashMap<>());
for (Map.Entry<Integer, SThemeActivityShop> entry : themeMap.entrySet()) {
ActivityProgressInfo progressInfo = activityProgressInfoMap.get(entry.getKey());
if (progressInfo == null || progressInfo.getState() != 8){
return false;
}
}
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(activityId);
if(sGlobalActivity.getResetGrade()==0){
activityMission.setActivityState(ActivityType.FINISH_STATE);
Poster.getPoster().dispatchEvent(new ActivityStateChangeEvent(uid,activityId,ActivityType.FINISH_STATE));
}
return true;
}
/**
*
* @return
*/
public long getSrartTime(){
long startTime = 0;
SGlobalActivity activity = SGlobalActivity.getsGlobalActivityMap().get(id);
// 绝对时间
if (activity.getTime() == ActivityType.OPEN_TYPE_TIME){
startTime = activity.getStartTimeLong();
}
// 开服时间
else if (activity.getTime() == ActivityType.OPEN_TYPE_SERVER) {
String openTime = GameApplication.serverConfig.getOpenTime();
long timeLong2 = TimeUtils.stringToTimeLong2(openTime);
startTime = timeLong2 + activity.getStartTimeLong() * 1000;
}
return startTime;
}
/**
*
* @return
*/
public long getEndTime(){
long endTime = 0;
SGlobalActivity activity = SGlobalActivity.getsGlobalActivityMap().get(id);
// 绝对时间
if (activity.getTime() == ActivityType.OPEN_TYPE_TIME){
endTime = activity.getEndTimeLong();
}
// 开服时间
else if (activity.getTime() == ActivityType.OPEN_TYPE_SERVER) {
String openTime = GameApplication.serverConfig.getOpenTime();
long timeLong2 = TimeUtils.stringToTimeLong2(openTime);
endTime = timeLong2 + activity.getEndTimeLong() * 1000;
}
return endTime;
}
/**
*
* @param user
* @param boxId
* @return
*/
private boolean checkBuyAgo(User user, int boxId){
// 获取消息
Map<Integer, ActivityProgressInfo> missionMap = user.getActivityManager().getActivityMissionMap().get(id).getActivityMissionMap();
SThemeActivityShop themes = STableManager.getConfig(SThemeActivityShop.class).get(boxId);
// 非空
if (missionMap.isEmpty() || themes == null){
return false;
}
// 0表示没有前置条件
if (themes.getLimitPackFId() == 0){
return true;
}
// 前置礼包状态验证
ActivityProgressInfo info = missionMap.get(themes.getLimitPackFId());
// info为null代表没有前置条件, state==1代表已买过
if (info != null && info.getState() == 8){
return true;
}
return false;
}
/**
*
* @param user
* @param indexId
* @return
*/
private boolean checkBuyGiftLimit(User user, int indexId, int count){
Map<Integer, SThemeActivityShop> themeActivityShopMap = STableManager.getConfig(SThemeActivityShop.class);
SThemeActivityShop shop = themeActivityShopMap.get(indexId);
if (shop != null){
if (shop.getGoodType() == 1){
// 礼包不存在
SRechargeCommodityNewConfig config = SRechargeCommodityNewConfig.getConfigById(shop.getGoodId());
if (config == null){
return true;
}
RechargeHandler rechargeHandler = BuyGoodsNewLogic.getRechargeHandler(config.getOtype());
AbstractWelfareBag bag = rechargeHandler.getRechargeMap(user).get(shop.getGoodId());
// 可继续购买
if (bag != null && bag.checkBuy()){
return false;
}
}else if (shop.getGoodType() == 2){
Map<Integer, SGoodsConfig> goodsConfigMap = STableManager.getConfig(SGoodsConfig.class);
SGoodsConfig goodsConfig = goodsConfigMap.get(shop.getGoodId());
if (goodsConfig == null){
return true;
}
// 可继续购买
if (goodsConfig.getLimit() != 0 && goodsConfig.getLimit() < count){
return false;
}
}
}
return true;
}
/**
*
* @param user
* @return
*/
@Override
public Set<Integer> getCloseGoods(User user){
HashSet<Integer> set = new HashSet<>();
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
if (mission == null){
return set;
}
// 活动页签
Map<Integer, ActivityProgressInfo> map = mission.getActivityMissionMap();
Map<Integer, SThemeActivityShop> themes = SThemeActivityShop.themeMap.get(id);
for (Map.Entry<Integer, SThemeActivityShop> entry : themes.entrySet()) {
int progress = getProgress(user, entry.getKey());
// 不可购买的礼包
if (progress != 1 || progress == 0){
set.add(entry.getValue().getGoodId());
}
}
return set;
}
}

View File

@ -22,11 +22,26 @@ public class SuperBoxEvent implements IEvent {
public static int fund_old_user = -3;
private int userId;
private int giftId = default_id;//礼包id
/**
* id
*/
private int giftId = default_id;
/**
*
*/
private int num;
public SuperBoxEvent(int userId, int giftId) {
this.userId = userId;
this.giftId = giftId;
this.num = 1;
}
public SuperBoxEvent(int userId, int giftId, int num) {
this.userId = userId;
this.giftId = giftId;
this.num = num;
}
public int getUserId() {
@ -45,4 +60,11 @@ public class SuperBoxEvent implements IEvent {
this.giftId = giftId;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}

View File

@ -98,6 +98,23 @@ public class ItemUtil {
return dropBuilder;
}
/**
*
* @param user
* @param itemArr
* @param count
* @param reason
* @return
* @throws Exception
*/
public static CommonProto.Drop.Builder drop(User user, int[][] itemArr, float count, int reason) throws Exception {
CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder();
ItemMap itemObj = new ItemMap();
selectItemArr(itemArr,itemObj,count);
mapToAdd(user,itemObj,dropBuilder,reason);
return dropBuilder;
}
//注此方法只用于会超过int最大值的掉落不会超过最大值的用上面方法
public static CommonProto.Drop.Builder drop(User user, long[][] itemArr,int reason) throws Exception {
@ -198,8 +215,8 @@ public class ItemUtil {
*
* @param user
* @param dropGroupIds
* @param dropRatio
* @param isMapping 1
* @param dropRatio
* @param isMapping 1
* @return
* @throws Exception
*/
@ -367,6 +384,12 @@ public class ItemUtil {
}
}
private static void selectItemArr(int[][] itemArr,ItemMap itemObj,float count) throws ErrorCodeException{
for (int[] items : itemArr){
getMap(items[0],items[1],itemObj,count);
}
}
private static void selectLongItemArr(long[][] itemArr,ItemMap itemObj) throws ErrorCodeException{
for (long[] items : itemArr){
getMap((int)items[0],items[1],itemObj,1);

View File

@ -0,0 +1,43 @@
package config;
import manager.STableManager;
import manager.Table;
import java.util.Map;
@Table(name ="GoodsConfig")
public class SGoodsConfig implements BaseConfig {
private int id;
private int[][] goods;
private int[] price;
private int limit;
@Override
public void init() throws Exception {
}
public int getId() {
return id;
}
public int[][] getGoods() {
return goods;
}
public int[] getPrice() {
return price;
}
public int getLimit() {
return limit;
}
}

View File

@ -0,0 +1,95 @@
package config;
import manager.STableManager;
import manager.Table;
import java.util.HashMap;
import java.util.Map;
@Table(name ="ThemeActivityShop")
public class SThemeActivityShop implements BaseConfig {
private int id;
private int activityId;
private int type;
private int goodType;
private int goodId;
private int unlockDay;
private int visibleDay;
private int viewDay;
private int buyDay;
private int limitPackFId;
private int limitPackBId;
/**
* key: id value: <key: id value>
*/
public static Map<Integer, Map<Integer,SThemeActivityShop>> themeMap = new HashMap<>();
@Override
public void init() throws Exception {
Map<Integer, SThemeActivityShop> config = STableManager.getConfig(SThemeActivityShop.class);
config.values().forEach(v->{
Map<Integer, SThemeActivityShop> themeActivityShopMap = themeMap.getOrDefault(v.getActivityId(), new HashMap<>());
themeActivityShopMap.put(v.getId(),v);
themeMap.put(v.getActivityId(),themeActivityShopMap);
});
}
public int getId() {
return id;
}
public int getActivityId() {
return activityId;
}
public int getType() {
return type;
}
public int getGoodType() {
return goodType;
}
public int getGoodId() {
return goodId;
}
public int getUnlockDay() {
return unlockDay;
}
public int getVisibleDay() {
return visibleDay;
}
public int getViewDay() {
return viewDay;
}
public int getBuyDay() {
return buyDay;
}
public int getLimitPackFId() {
return limitPackFId;
}
public int getLimitPackBId() {
return limitPackBId;
}
}