Fix inconformity of Player Object at TowerManager (#1226)

* Fix inconformity of Player Object at TowerManager

Fix inconformity of Player Object at TowerManager class from GameSession

* fix with a reasonable resolution

* Make sure towerManager'player is online player

* Make sure towerManager'player is online player

* Obsolete storage

* Fix build

* fix build

* fix build

* add @Entity

* set record map

* replace tab with space

* add Entity to TowerData

* make infomater more accurate

* move player register to onLogin
This commit is contained in:
zhaodice
2022-06-10 04:38:53 +08:00
committed by GitHub
parent 2b88487cd2
commit 052e70e488
4 changed files with 76 additions and 58 deletions

View File

@@ -0,0 +1,25 @@
package emu.grasscutter.game.tower;
import java.util.Map;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Transient;
@Entity
public class TowerData{
/**
* the floor players chose
*/
int currentFloorId;
int currentLevel;
@Transient
int currentLevelId;
/**
* floorId - Record
*/
Map<Integer, TowerLevelRecord> recordMap;
@Transient
int entryScene;
}

View File

@@ -1,7 +1,5 @@
package emu.grasscutter.game.tower;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Transient;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.TowerLevelData;
import emu.grasscutter.game.dungeons.DungeonSettleListener;
@@ -13,71 +11,55 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Entity
public class TowerManager {
@Transient private Player player;
private Player player;
private TowerData towerData;
public TowerManager(Player player) {
this.player = player;
setPlayer(player);
}
public void setPlayer(Player player) {
this.player = player;
this.towerData = player.getTowerData();
}
/**
* the floor players chose
*/
private int currentFloorId;
private int currentLevel;
@Transient
private int currentLevelId;
/**
* floorId - Record
*/
private Map<Integer, TowerLevelRecord> recordMap;
@Transient
private int entryScene;
public int getCurrentFloorId() {
return currentFloorId;
return towerData.currentFloorId;
}
public int getCurrentLevelId(){
return this.currentLevelId + currentLevel;
return towerData.currentLevelId + towerData.currentLevel;
}
/**
* form 1-3
*/
public int getCurrentLevel(){
return currentLevel + 1;
return towerData.currentLevel + 1;
}
private static final List<DungeonSettleListener> towerDungeonSettleListener = List.of(new TowerDungeonSettleListener());
public Map<Integer, TowerLevelRecord> getRecordMap() {
if(recordMap == null){
Map<Integer, TowerLevelRecord> recordMap = towerData.recordMap;
if(recordMap == null || recordMap.size()==0){
recordMap = new HashMap<>();
recordMap.put(1001, new TowerLevelRecord(1001));
towerData.recordMap = recordMap;
}
return recordMap;
}
public void teamSelect(int floor, List<List<Long>> towerTeams) {
var floorData = GameData.getTowerFloorDataMap().get(floor);
this.currentFloorId = floorData.getFloorId();
this.currentLevel = 0;
this.currentLevelId = GameData.getTowerLevelDataMap().values().stream()
towerData.currentFloorId = floorData.getFloorId();
towerData.currentLevel = 0;
towerData.currentLevelId = GameData.getTowerLevelDataMap().values().stream()
.filter(x -> x.getLevelGroupId() == floorData.getLevelGroupId() && x.getLevelIndex() == 1)
.findFirst()
.map(TowerLevelData::getId)
.orElse(0);
if (entryScene == 0){
entryScene = player.getSceneId();
if (towerData.entryScene == 0){
towerData.entryScene = player.getSceneId();
}
player.getTeamManager().setupTemporaryTeam(towerTeams);
@@ -96,20 +78,22 @@ public class TowerManager {
towerDungeonSettleListener);
// make sure user can exit dungeon correctly
player.getScene().setPrevScene(entryScene);
player.getScene().setPrevScene(towerData.entryScene);
player.getScene().setPrevScenePoint(enterPointId);
player.getSession().send(new PacketTowerEnterLevelRsp(currentFloorId, getCurrentLevel()));
player.getSession().send(new PacketTowerEnterLevelRsp(towerData.currentFloorId, getCurrentLevel()));
// stop using skill
player.getSession().send(new PacketCanUseSkillNotify(false));
// notify the cond of stars
player.getSession().send(new PacketTowerLevelStarCondNotify(currentFloorId, getCurrentLevel()));
player.getSession().send(new PacketTowerLevelStarCondNotify(towerData.currentFloorId, getCurrentLevel()));
}
public void notifyCurLevelRecordChange(){
player.getSession().send(new PacketTowerCurLevelRecordChangeNotify(currentFloorId, getCurrentLevel()));
player.getSession().send(new PacketTowerCurLevelRecordChangeNotify(towerData.currentFloorId, getCurrentLevel()));
}
public void notifyCurLevelRecordChangeWhenDone(int stars){
Map<Integer, TowerLevelRecord> recordMap = getRecordMap();
int currentFloorId = towerData.currentFloorId;
if(!recordMap.containsKey(currentFloorId)){
recordMap.put(currentFloorId,
new TowerLevelRecord(currentFloorId).setLevelStars(getCurrentLevelId(),stars));
@@ -118,7 +102,7 @@ public class TowerManager {
recordMap.get(currentFloorId).setLevelStars(getCurrentLevelId(),stars));
}
this.currentLevel++;
towerData.currentLevel++;
if(!hasNextLevel()){
// set up the next floor
@@ -129,20 +113,21 @@ public class TowerManager {
}
}
public boolean hasNextLevel(){
return this.currentLevel < 3;
return towerData.currentLevel < 3;
}
public int getNextFloorId() {
return player.getServer().getTowerScheduleManager().getNextFloorId(this.currentFloorId);
return player.getServer().getTowerScheduleManager().getNextFloorId(towerData.currentFloorId);
}
public boolean hasNextFloor(){
return player.getServer().getTowerScheduleManager().getNextFloorId(this.currentFloorId) > 0;
return player.getServer().getTowerScheduleManager().getNextFloorId(towerData.currentFloorId) > 0;
}
public void clearEntry() {
this.entryScene = 0;
towerData.entryScene = 0;
}
public boolean canEnterScheduleFloor(){
Map<Integer, TowerLevelRecord> recordMap = getRecordMap();
if(!recordMap.containsKey(player.getServer().getTowerScheduleManager().getLastEntranceFloor())){
return false;
}