mirror of https://github.com/hykilpikonna/AquaDX
[DIVA] Add stage result index to prevent multiple result being sent by client, fix #3
parent
b70ec89902
commit
ce780b2edb
|
@ -70,6 +70,7 @@ public class CardProcedureHandler extends BaseHandler {
|
||||||
LocalDateTime.now(),
|
LocalDateTime.now(),
|
||||||
-1,
|
-1,
|
||||||
-1,
|
-1,
|
||||||
|
-1,
|
||||||
profile.getLevel(),
|
profile.getLevel(),
|
||||||
profile.getLevelExp(),
|
profile.getLevelExp(),
|
||||||
profile.getLevel(),
|
profile.getLevel(),
|
||||||
|
|
|
@ -61,44 +61,50 @@ public class StageResultHandler extends BaseHandler {
|
||||||
int[] pvIds = request.getStg_ply_pv_id();
|
int[] pvIds = request.getStg_ply_pv_id();
|
||||||
int stageIndex = session.getStageIndex();
|
int stageIndex = session.getStageIndex();
|
||||||
|
|
||||||
// Convert to play log object
|
// Only save to database when stage index is larger than stage result index to prevent duplicate request.
|
||||||
PlayLog log = getLog(request, profile, stageIndex);
|
if(stageIndex > session.getStageResultIndex()) {
|
||||||
logger.debug("Stage Result Object: {}", log.toString());
|
|
||||||
|
|
||||||
PlayerPvRecord record = pvRecordRepository.findByPdIdAndPvIdAndEditionAndDifficulty(profile, log.getPvId(), log.getEdition(), log.getDifficulty())
|
// Convert to play log object
|
||||||
.orElseGet(() -> new PlayerPvRecord(profile, log.getPvId(), log.getEdition(), log.getDifficulty()));
|
PlayLog log = getLog(request, profile, stageIndex);
|
||||||
|
logger.debug("Stage Result Object: {}", log.toString());
|
||||||
|
|
||||||
// Update pvRecord field
|
PlayerPvRecord record = pvRecordRepository.findByPdIdAndPvIdAndEditionAndDifficulty(profile, log.getPvId(), log.getEdition(), log.getDifficulty())
|
||||||
record.setMaxScore(Math.max(record.getMaxScore(), log.getScore()));
|
.orElseGet(() -> new PlayerPvRecord(profile, log.getPvId(), log.getEdition(), log.getDifficulty()));
|
||||||
record.setMaxAttain(Math.max(record.getMaxAttain(), log.getAttainPoint()));
|
|
||||||
|
|
||||||
if (record.getResult().getValue() < log.getClearResult().getValue()) {
|
// Update pvRecord field
|
||||||
record.setResult(log.getClearResult());
|
record.setMaxScore(Math.max(record.getMaxScore(), log.getScore()));
|
||||||
}
|
record.setMaxAttain(Math.max(record.getMaxAttain(), log.getAttainPoint()));
|
||||||
|
|
||||||
String[] updateRgo = log.getRhythmGameOptions().split(",");
|
if (record.getResult().getValue() < log.getClearResult().getValue()) {
|
||||||
String[] oldRgo = record.getRgoPlayed().split(",");
|
record.setResult(log.getClearResult());
|
||||||
for (int i = 0; i < updateRgo.length; i++) {
|
|
||||||
if (updateRgo[i].equals("1")) {
|
|
||||||
oldRgo[i] = "1";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String[] updateRgo = log.getRhythmGameOptions().split(",");
|
||||||
|
String[] oldRgo = record.getRgoPlayed().split(",");
|
||||||
|
for (int i = 0; i < updateRgo.length; i++) {
|
||||||
|
if (updateRgo[i].equals("1")) {
|
||||||
|
oldRgo[i] = "1";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
record.setRgoPlayed(StringUtils.join(oldRgo, ","));
|
||||||
|
|
||||||
|
session.setVp(session.getVp() + log.getVp());
|
||||||
|
session.setLastPvId(log.getPvId());
|
||||||
|
session.setLastUpdateTime(LocalDateTime.now());
|
||||||
|
|
||||||
|
LevelInfo levelInfo = divaCalculator.getLevelInfo(profile);
|
||||||
|
session.setOldLevelNumber(session.getLevelNumber());
|
||||||
|
session.setOldLevelExp(session.getLevelExp());
|
||||||
|
session.setLevelNumber(levelInfo.getLevelNumber());
|
||||||
|
session.setLevelExp(levelInfo.getLevelExp());
|
||||||
|
|
||||||
|
session.setStageResultIndex(session.getStageResultIndex() + 1);
|
||||||
|
|
||||||
|
pvRecordRepository.save(record);
|
||||||
|
playLogRepository.save(log);
|
||||||
|
gameSessionRepository.save(session);
|
||||||
|
|
||||||
}
|
}
|
||||||
record.setRgoPlayed(StringUtils.join(oldRgo, ","));
|
|
||||||
|
|
||||||
session.setVp(session.getVp() + log.getVp());
|
|
||||||
session.setLastPvId(log.getPvId());
|
|
||||||
session.setLastUpdateTime(LocalDateTime.now());
|
|
||||||
|
|
||||||
LevelInfo levelInfo = divaCalculator.getLevelInfo(profile);
|
|
||||||
session.setOldLevelNumber(session.getLevelNumber());
|
|
||||||
session.setOldLevelExp(session.getLevelExp());
|
|
||||||
session.setLevelNumber(levelInfo.getLevelNumber());
|
|
||||||
session.setLevelExp(levelInfo.getLevelExp());
|
|
||||||
|
|
||||||
pvRecordRepository.save(record);
|
|
||||||
playLogRepository.save(log);
|
|
||||||
gameSessionRepository.save(session);
|
|
||||||
// profileRepository.save(profile); // Profile save move to session end
|
|
||||||
|
|
||||||
response = new StageResultResponse(
|
response = new StageResultResponse(
|
||||||
request.getCmd(),
|
request.getCmd(),
|
||||||
|
|
|
@ -36,9 +36,12 @@ public class StageStartHandler extends BaseHandler {
|
||||||
PlayerProfile profile = profileRepository.findByPdId(request.getPd_id()).orElseThrow(ProfileNotFoundException::new);
|
PlayerProfile profile = profileRepository.findByPdId(request.getPd_id()).orElseThrow(ProfileNotFoundException::new);
|
||||||
GameSession session = gameSessionRepository.findByPdId(profile).orElseThrow(SessionNotFoundException::new);
|
GameSession session = gameSessionRepository.findByPdId(profile).orElseThrow(SessionNotFoundException::new);
|
||||||
|
|
||||||
session.setStageIndex(session.getStageIndex() + 1);
|
if(session.getStageResultIndex() <= session.getStageIndex()) {
|
||||||
|
session.setStageIndex(session.getStageIndex() + 1);
|
||||||
gameSessionRepository.save(session);
|
gameSessionRepository.save(session);
|
||||||
|
} else {
|
||||||
|
logger.warn("Stage index is greater than stage result index. Maybe due to duplicated request.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseResponse response = new BaseResponse(
|
BaseResponse response = new BaseResponse(
|
||||||
|
|
|
@ -83,6 +83,7 @@ public class PreStartHandler extends BaseHandler {
|
||||||
LocalDateTime.now(),
|
LocalDateTime.now(),
|
||||||
-1,
|
-1,
|
||||||
-1,
|
-1,
|
||||||
|
-1,
|
||||||
profile.getLevel(),
|
profile.getLevel(),
|
||||||
profile.getLevelExp(),
|
profile.getLevelExp(),
|
||||||
profile.getLevel(),
|
profile.getLevel(),
|
||||||
|
|
|
@ -40,6 +40,8 @@ public class GameSession implements Serializable {
|
||||||
|
|
||||||
private Integer stageIndex;
|
private Integer stageIndex;
|
||||||
|
|
||||||
|
private Integer stageResultIndex;
|
||||||
|
|
||||||
private Integer lastPvId;
|
private Integer lastPvId;
|
||||||
|
|
||||||
private Integer levelNumber;
|
private Integer levelNumber;
|
||||||
|
@ -52,13 +54,14 @@ public class GameSession implements Serializable {
|
||||||
|
|
||||||
private Integer vp;
|
private Integer vp;
|
||||||
|
|
||||||
public GameSession(int acceptId, PlayerProfile pdId, StartMode startMode, LocalDateTime startTime, LocalDateTime lastUpdateTime, Integer stageIndex, Integer lastPvId, Integer levelNumber, Integer levelExp, Integer oldLevelNumber, Integer oldLevelExp, Integer vp) {
|
public GameSession(int acceptId, PlayerProfile pdId, StartMode startMode, LocalDateTime startTime, LocalDateTime lastUpdateTime, Integer stageIndex, Integer stageResultIndex, Integer lastPvId, Integer levelNumber, Integer levelExp, Integer oldLevelNumber, Integer oldLevelExp, Integer vp) {
|
||||||
this.acceptId = acceptId;
|
this.acceptId = acceptId;
|
||||||
this.pdId = pdId;
|
this.pdId = pdId;
|
||||||
this.startMode = startMode;
|
this.startMode = startMode;
|
||||||
this.startTime = startTime;
|
this.startTime = startTime;
|
||||||
this.lastUpdateTime = lastUpdateTime;
|
this.lastUpdateTime = lastUpdateTime;
|
||||||
this.stageIndex = stageIndex;
|
this.stageIndex = stageIndex;
|
||||||
|
this.stageResultIndex = stageResultIndex;
|
||||||
this.lastPvId = lastPvId;
|
this.lastPvId = lastPvId;
|
||||||
this.levelNumber = levelNumber;
|
this.levelNumber = levelNumber;
|
||||||
this.levelExp = levelExp;
|
this.levelExp = levelExp;
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
TRUNCATE TABLE `diva_game_session`;
|
||||||
|
|
||||||
|
ALTER TABLE `diva_game_session`
|
||||||
|
ADD `stage_result_index` int(11) DEFAULT NULL;
|
|
@ -0,0 +1,23 @@
|
||||||
|
DROP TABLE diva_game_session;
|
||||||
|
|
||||||
|
CREATE TABLE diva_game_session
|
||||||
|
(
|
||||||
|
id INTEGER,
|
||||||
|
accept_id INTEGER NOT NULL,
|
||||||
|
last_pv_id INTEGER,
|
||||||
|
last_update_time DATETIME,
|
||||||
|
level_exp INTEGER,
|
||||||
|
level_number INTEGER,
|
||||||
|
old_level_exp INTEGER,
|
||||||
|
old_level_number INTEGER,
|
||||||
|
stage_index INTEGER,
|
||||||
|
stage_result_index INTEGER,
|
||||||
|
start_mode VARCHAR(255),
|
||||||
|
start_time DATETIME,
|
||||||
|
vp INTEGER,
|
||||||
|
pd_id BIGINT UNIQUE
|
||||||
|
REFERENCES diva_player_profile (id) ON DELETE CASCADE,
|
||||||
|
PRIMARY KEY (
|
||||||
|
id
|
||||||
|
)
|
||||||
|
);
|
Loading…
Reference in New Issue