back_recharge
wangyuan 2019-04-22 19:25:03 +08:00
parent 7ba0084c23
commit eaa1767284
16 changed files with 486 additions and 2 deletions

View File

@ -8,6 +8,7 @@ import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.handler.map.MapLogic;
import com.ljsd.jieling.logic.STableManager;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.logic.dao.MailingSystemManager;
import com.ljsd.jieling.logic.fight.CheckFight;
import com.ljsd.jieling.logic.fight.CombatLogic;
@ -105,6 +106,7 @@ public class GameApplication {
serverConfig = serverConfigTmp;
}
KeyGenUtils.setMachineNum(serverConfiguration.getServerProperties().getNum());
ActivityLogic.getInstance().checkActiviyStatus();
try {
LOGGER.info("main->CoreApplication start...");
ISessionFactory sessionFactory = new ISessionFactory();

View File

@ -0,0 +1,67 @@
package com.ljsd.jieling.config;
import com.ljsd.jieling.logic.STableManager;
import com.ljsd.jieling.logic.Table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Table(name ="ActivityRewardConfig")
public class SActivityRewardConfig implements BaseConfig {
private int id;
private int activityId;
private int[][] values;
private int[][] reward;
private static Map<Integer, SActivityRewardConfig> sActivityRewardConfigMap;
private static Map<Integer, List<SActivityRewardConfig>> sActivityRewardConfigListMap;
@Override
public void init() throws Exception {
Map<Integer, SActivityRewardConfig> config = STableManager.getConfig(SActivityRewardConfig.class);
Map<Integer, List<SActivityRewardConfig>> sActivityRewardConfigListMapTmp = new HashMap<>();
for(SActivityRewardConfig sActivityRewardConfig : config.values()){
int activityId = sActivityRewardConfig.getActivityId();
if(!sActivityRewardConfigListMapTmp.containsKey(activityId)){
sActivityRewardConfigListMapTmp.put(activityId,new ArrayList<>());
}
sActivityRewardConfigListMapTmp.get(activityId).add(sActivityRewardConfig);
}
sActivityRewardConfigMap = config;
sActivityRewardConfigListMap = sActivityRewardConfigListMapTmp;
}
public static SActivityRewardConfig getsActivityRewardConfigByMissionId(int missionId) {
return sActivityRewardConfigMap.get(missionId);
}
public static List<SActivityRewardConfig> getsActivityRewardConfigByActivityId(int activityId) {
return sActivityRewardConfigListMap.get(activityId);
}
public int getId() {
return id;
}
public int getActivityId() {
return activityId;
}
public int[][] getValues() {
return values;
}
public int[][] getReward() {
return reward;
}
}

View File

@ -0,0 +1,104 @@
package com.ljsd.jieling.config;
import com.ljsd.GameApplication;
import com.ljsd.jieling.logic.STableManager;
import com.ljsd.jieling.logic.Table;
import com.ljsd.jieling.logic.activity.ActivityType;
import com.ljsd.jieling.logic.player.PlayerLogic;
import com.ljsd.jieling.util.TimeUtils;
import java.text.ParseException;
import java.util.Date;
import java.util.Map;
@Table(name ="GlobalActivity")
public class SGlobalActivity implements BaseConfig {
private int id;
private int type;
private String startTime;
private String endtime;
private int time;
private long startTimeLong;
private long endTimeLong;
private static Map<Integer, SGlobalActivity> sGlobalActivityMap;
@Override
public void init() throws Exception {
Map<Integer, SGlobalActivity> config = STableManager.getConfig(SGlobalActivity.class);
for(SGlobalActivity sGlobalActivity : config.values()){
int time = sGlobalActivity.getTime();
String startTime = sGlobalActivity.getStartTime();
String endtime = sGlobalActivity.getEndtime();
if(time == 1 ){
if("0".equals(endtime)){
continue;
}
setStartTimeLong(TimeUtils.parseTimeToMiles(startTime,"YYYYMMdd hh:mm:ss"));
continue;
}
setStartTimeLong(Long.parseLong(startTime));
setStartTimeLong(Long.parseLong(endtime));
}
sGlobalActivityMap = config;
}
public static Map<Integer, SGlobalActivity> getsGlobalActivityMap() {
return sGlobalActivityMap;
}
public int getId() {
return id;
}
public int getType() {
return type;
}
public String getStartTime() {
return startTime;
}
public String getEndtime() {
return endtime;
}
public int getTime() {
return time;
}
public long getTimeLong(long createUserTime,int type) {
long baseTime = startTimeLong;
if(type == 2){
baseTime = endTimeLong;
}
long startTime=0;
if(time == ActivityType.OPEN_TYPE_TIME){
startTime = baseTime;
}else if(time == ActivityType.OPEN_TYPE_SERVER){
long serverOpenTime = GameApplication.serverConfig.getCacheOpenTime();
startTime = serverOpenTime + baseTime*1000;
}else if(time == ActivityType.OPEN_TYPE_ROLE){
startTime =createUserTime+baseTime*1000;
}
return startTime;
}
public void setStartTimeLong(long startTimeLong) {
this.startTimeLong = startTimeLong;
}
public void setEndTimeLong(long endTimeLong) {
this.endTimeLong = endTimeLong;
}
}

View File

@ -26,4 +26,6 @@ public class MongoKey {
public final static String levelDifficultyManager = "levelDifficultyManager";
public final static String activityManager = "activityManager";
}

View File

@ -0,0 +1,20 @@
package com.ljsd.jieling.handler;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import org.springframework.stereotype.Component;
@Component
public class GetAllActivityInfoHandler extends BaseHandler{
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.GET_ALL_ACTIVITY_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
ActivityLogic.getInstance().getAllActivityInfo(iSession);
}
}

View File

@ -0,0 +1,24 @@
package com.ljsd.jieling.handler;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import org.springframework.stereotype.Component;
@Component
public class TakeActivityRewardHandler extends BaseHandler{
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.TAKE_ACTIVITY_REWARD_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
byte[] bytes = netData.parseClientProtoNetData();
PlayerInfoProto.TakeActivityRewardRequest takeActivityRewardRequest = PlayerInfoProto.TakeActivityRewardRequest.parseFrom(bytes);
int missionId = takeActivityRewardRequest.getMissionId();
ActivityLogic.getInstance().takeReward(iSession,missionId);
}
}

View File

@ -1,18 +1,158 @@
package com.ljsd.jieling.logic.activity;
import com.ljsd.jieling.config.SActivityRewardConfig;
import com.ljsd.jieling.config.SGlobalActivity;
import com.ljsd.jieling.logic.dao.ActivityManager;
import com.ljsd.jieling.logic.dao.ActivityMission;
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.ItemUtil;
import com.ljsd.jieling.util.MessageUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
public class ActivityLogic {
private static final Logger LOGGER = LoggerFactory.getLogger(ActivityLogic.class);
private ActivityLogic(){}
private Set<Integer> openActivityIds =new HashSet<>();
public static class Instance {
public final static ActivityLogic instance = new ActivityLogic();
}
public void checkActiviyStatus() {
long now = System.currentTimeMillis();
Map<Integer, SGlobalActivity> sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap();
for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){
int time = sGlobalActivity.getTime();
if(time ==3 ){
continue;
}
long startTime = sGlobalActivity.getTimeLong(0,1);
long endTime = sGlobalActivity.getTimeLong(0,2);
if(now<startTime){
continue;
}
if(now>endTime && openActivityIds.contains(sGlobalActivity.getId())){
openActivityIds.remove(sGlobalActivity.getId());
continue;
}
openActivityIds.add(sGlobalActivity.getId());
}
}
public void checkActivityOfUser(User user){
long now = System.currentTimeMillis();
ActivityManager activityManager = user.getActivityManager();
Map<Integer, Integer> activityState = activityManager.getActivityState();
Map<Integer, SGlobalActivity> sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap();
for(Integer openActivityId : openActivityIds){
activityManager.initAllActivityMission(openActivityId);
}
long userCreateTime = user.getPlayerInfoManager().getCreateTime();
for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){
int activityId = sGlobalActivity.getId();
if(!openActivityIds.contains(activityId)){
continue;
}
int time = sGlobalActivity.getTime();
if(time ==3 ){
long startTime = sGlobalActivity.getTimeLong(userCreateTime,1);
long endTime = sGlobalActivity.getTimeLong(userCreateTime,2);
if(now<startTime){
continue;
}
activityManager.initAllActivityMission(activityId);
}else{
activityState.put(activityId,ActivityType.CLOSE_STATE);
}
}
}
public static ActivityLogic getInstance() {
return ActivityLogic.Instance.instance;
}
public void takeReward(ISession session,int missionId) throws Exception {
int uid = session.getUid();
User user = UserManager.getUser(uid);
int rewardResponseValue = MessageTypeProto.MessageType.TAKE_ACTIVITY_REWARD_RESPONSE_VALUE;
SActivityRewardConfig sActivityRewardConfig = SActivityRewardConfig.getsActivityRewardConfigByMissionId(missionId);
if(sActivityRewardConfig == null){
MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"");
return;
}
int activityId = sActivityRewardConfig.getActivityId();
ActivityManager activityManager = user.getActivityManager();
ActivityMission activityMission = activityManager.getActivityMissionMap().get(activityId);
Integer missionState = activityMission.getAllMissionStatus().get(missionId);
if( null == missionState || missionState == ActivityType.HAD_TAKED){
MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"had taked");
return;
}
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(activityId);
int[][] values = sActivityRewardConfig.getValues();
if(sGlobalActivity.getType() == ActivityType.ChapterReward){
/* LevelDifficulty levelDifficulty = user.getLevelDifficultyManager().getLevelDifficultyInfosMap().get(values[0][0]);
if(levelDifficulty == null || levelDifficulty.getState()!= Global.FIGHT_CLEARANCE){
MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"not pass");
return;
}*/
}
int[][] reward = sActivityRewardConfig.getReward();
CommonProto.Drop.Builder drop = ItemUtil.drop(user, reward);
activityMission.updateMissionStatus(missionId,ActivityType.HAD_TAKED);
PlayerInfoProto.TakeActivityRewardResponse build = PlayerInfoProto.TakeActivityRewardResponse.newBuilder().setDrop(drop).build();
MessageUtil.sendMessage(session,1,rewardResponseValue,build,true);
}
public void getAllActivityInfo(ISession session) throws Exception {
int uid = session.getUid();
User user = UserManager.getUser(uid);
long createTime = user.getPlayerInfoManager().getCreateTime();
int rewardResponseValue = MessageTypeProto.MessageType.GET_ALL_ACTIVITY_RESPONSE_VALUE;
checkActivityOfUser(user);
ActivityManager activityManager = user.getActivityManager();
Map<Integer, Integer> activityStateMap = activityManager.getActivityState();
Map<Integer, SGlobalActivity> sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap();
Map<Integer, ActivityMission> activityMissionMap = activityManager.getActivityMissionMap();
List<CommonProto.ActivityInfo> activityInfoList = new ArrayList<>(activityStateMap.size());
for(Map.Entry<Integer,Integer> activityState : activityStateMap.entrySet()){
Integer activityId = activityState.getKey();
Integer activityStatus = activityState.getValue();
if(activityStatus != ActivityType.OPEN_STATE){
continue;
}
SGlobalActivity sGlobalActivity = sGlobalActivityMap.get(activityId);
int startTime = (int)(sGlobalActivity.getTimeLong(createTime, 1)/1000);
int endTime = (int)(sGlobalActivity.getTimeLong(createTime, 2)/1000);
ActivityMission activityMission = activityMissionMap.get(activityId);
Map<Integer, Integer> allMissionProgress = activityMission.getAllMissionProgress();
Map<Integer, Integer> allMissionStatus = activityMission.getAllMissionStatus();
List<CommonProto.ActivityInfo.MissionInfo> missionInfos = new ArrayList<>(allMissionProgress.size());
for( Map.Entry<Integer, Integer> missionProgress : allMissionProgress.entrySet()){
Integer missionId = missionProgress.getKey();
Integer value = missionProgress.getValue();
missionInfos.add(CommonProto.ActivityInfo.MissionInfo.newBuilder().setMissionId(missionId).setProgress(value).setState(allMissionStatus.get(missionId)).build());
}
activityInfoList.add(CommonProto.ActivityInfo.newBuilder().setActivityId(activityId).addAllMission(missionInfos).setStartTime(startTime).setEndTime(endTime).build());
}
PlayerInfoProto.GetAllActivityResponse build = PlayerInfoProto.GetAllActivityResponse.newBuilder().addAllActivityInfo(activityInfoList).build();
MessageUtil.sendMessage(session,1,rewardResponseValue,build,true);
}
}

View File

@ -0,0 +1,20 @@
package com.ljsd.jieling.logic.activity;
public interface ActivityType {
int CLOSE_STATE = 0;
int OPEN_STATE =1;
int FINISH_STATE =2;
int OPEN_TYPE_TIME = 1; // 活动开启类型:绝对时间
int OPEN_TYPE_SERVER = 2; // 活动开启类型:开服时间
int OPEN_TYPE_ROLE = 3; // 活动开启类型:创角时间
int WILL_TAKE = 0; //未领取
int HAD_TAKED =1; //已领取
int OnlineReward =1; //在线奖励
int SevenLogin = 2; //七日登陆
int ChapterReward = 3; //七日登陆
}

View File

@ -0,0 +1,37 @@
package com.ljsd.jieling.logic.dao;
import com.ljsd.common.mogodb.MongoBase;
import com.ljsd.jieling.logic.activity.ActivityType;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ActivityManager extends MongoBase {
private Map<Integer,Integer> activityState = new ConcurrentHashMap<>(); //活动状态
private Map<Integer,ActivityMission> activityMissionMap = new ConcurrentHashMap<>();
public void updateActivityState(int activityId,int state){
updateString("activityState." + activityId,state);
activityState.put(activityId,state);
}
public void initAllActivityMission(int activityId){
if(activityMissionMap.containsKey(activityId)){
return;
}
ActivityMission activityMission = new ActivityMission();
activityMission.initMissionInfo(activityId);
activityMission.init(getRootId(),getMongoKey()+".activityMissionMap." + activityId);
activityMissionMap.put(activityId,activityMission);
updateString("activityState." + activityId, ActivityType.OPEN_STATE);
updateString("activityMissionMap." + activityId,activityMission);
}
public Map<Integer, Integer> getActivityState() {
return activityState;
}
public Map<Integer, ActivityMission> getActivityMissionMap() {
return activityMissionMap;
}
}

View File

@ -0,0 +1,35 @@
package com.ljsd.jieling.logic.dao;
import com.ljsd.common.mogodb.MongoBase;
import com.ljsd.jieling.config.SActivityRewardConfig;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ActivityMission extends MongoBase {
private Map<Integer,Integer> allMissionProgress = new ConcurrentHashMap<>();
private Map<Integer,Integer> allMissionStatus = new ConcurrentHashMap<>();
public void updateMissionStatus(int missionId,int status){
updateString("allMissionStatus."+missionId,status);
allMissionStatus.put(missionId,status);
}
public void initMissionInfo(int activityId){
List<SActivityRewardConfig> sActivityRewardConfigs = SActivityRewardConfig.getsActivityRewardConfigByActivityId(activityId);
for(SActivityRewardConfig sActivityRewardConfig : sActivityRewardConfigs){
allMissionStatus.put(sActivityRewardConfig.getId(), 0);
allMissionProgress.put(sActivityRewardConfig.getId(), 0);
}
}
public Map<Integer, Integer> getAllMissionProgress() {
return allMissionProgress;
}
public Map<Integer, Integer> getAllMissionStatus() {
return allMissionStatus;
}
}

View File

@ -45,7 +45,7 @@ public class HeroManager extends MongoBase {
public void removeHero(String heroId) {
if (heroMap.containsKey(heroId)){
removeString("heroMap." + heroId);
removeString(getMongoKey()+".heroMap." + heroId);
heroMap.remove(heroId);
}
}

View File

@ -34,6 +34,8 @@ public class User {
private LevelDifficultyManager levelDifficultyManager; // 关卡信息
private ActivityManager activityManager;
//构造函数必须要声明否则从mongodb读出来反编译成类不通过
public User(){
}
@ -51,6 +53,7 @@ public class User {
this.pokemonManager = new PokemonManager();
this.workShopController = new WorkShopController();
this.levelDifficultyManager = new LevelDifficultyManager();
this.activityManager = new ActivityManager();
//綁定关系
this.playerManager.init(id, MongoKey.playerManager);
@ -64,6 +67,7 @@ public class User {
this.pokemonManager.init(id, MongoKey.pokemonManager);
this.workShopController.init(id, MongoKey.workShopController);
this.levelDifficultyManager.init(id, MongoKey.levelDifficultyManager);
this.activityManager.init(id, MongoKey.activityManager);
}
public String getId() {
@ -149,4 +153,8 @@ public class User {
public void setLevelDifficultyManager(LevelDifficultyManager levelDifficultyManager) {
this.levelDifficultyManager = levelDifficultyManager;
}
public ActivityManager getActivityManager() {
return activityManager;
}
}

View File

@ -848,7 +848,7 @@ public class HeroLogic {
hero.updateMutliEquipPositionMap(equipInfoTmp);
LOGGER.info("the heroTid={},the force={}",hero.getTemplateId(),calHeoForce(user,hero));
// LOGGER.info("the heroTid={},the force={}",hero.getTemplateId(),calHeoForce(user,hero));
//发送成功消息
MessageUtil.sendMessage(session,1,MessageTypeProto.MessageType.EQUIP_WEAR_RESPONSE_VALUE,null,true);

View File

@ -1,5 +1,6 @@
package com.ljsd.jieling.thread;
import com.ljsd.jieling.thread.task.MinuteTask;
import com.ljsd.jieling.thread.task.PlatConfigureTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -63,6 +64,7 @@ public class ThreadManager {
// testTask 已秒为单位 延迟10s, 间隔30s为周期执行
scheduledExecutor.scheduleAtFixedRate(platConfigureTask, 10, PlatConfigureTask.SLEEP_INTEVAL_TIME, TimeUnit.SECONDS);
scheduledExecutor.scheduleAtFixedRate(new MinuteTask(), 10, 60, TimeUnit.SECONDS);
}
public ScheduledThreadPoolExecutor getScheduledExecutor() {

View File

@ -0,0 +1,18 @@
package com.ljsd.jieling.thread.task;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MinuteTask extends Thread {
private static final Logger LOGGER = LoggerFactory.getLogger(MinuteTask.class);
public MinuteTask(){
this.setName("MinuteTask");
}
@Override
public void run() {
ActivityLogic.getInstance().checkActiviyStatus();
}
}

View File

@ -1143,4 +1143,9 @@ public class TimeUtils {
}
}
public static long parseTimeToMiles(String date, String datePattern) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
return simpleDateFormat.parse(date).getTime();
}
}