Implement challenge history

This commit is contained in:
Melledy
2023-10-08 06:08:07 -07:00
parent 5f92195253
commit 94343d1f77
9 changed files with 185 additions and 46 deletions

View File

@@ -48,6 +48,10 @@ public class ChallengeData {
this.setupStage1();
}
private int getChallengeId() {
return this.getExcel().getId();
}
private void setupStage1() {
this.setupStage(
excel.getMazeGroupID1(),
@@ -120,6 +124,8 @@ public class ChallengeData {
// Last stage
this.status = ChallengeStatus.CHALLENGE_FINISH;
this.stars = 9; // TODO calculate the right amount stars
// Save history
player.getChallengeManager().addHistory(this.getChallengeId(), this.getStars());
// Send challenge result data
player.sendPacket(new PacketChallengeSettleNotify(this));
} else {
@@ -139,7 +145,7 @@ public class ChallengeData {
this.status = ChallengeStatus.CHALLENGE_FAILED;
}
}
public void onUpdate() {
// End challenge if its done
if (status != ChallengeStatus.CHALLENGE_DOING) {

View File

@@ -0,0 +1,48 @@
package emu.lunarcore.game.challenge;
import org.bson.types.ObjectId;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id;
import emu.lunarcore.LunarRail;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.ChallengeOuterClass.Challenge;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
@Entity(value = "challenge", useDiscriminator = false)
public class ChallengeHistory {
@Id
private ObjectId id;
private int ownerUid;
private int challengeId;
private int takenReward;
private int stars;
@Deprecated // Morphia
public ChallengeHistory() {}
public ChallengeHistory(Player player, int challengeId) {
this.ownerUid = player.getUid();
this.challengeId = challengeId;
}
public Challenge toProto() {
var proto = Challenge.newInstance()
.setChallengeId(this.getChallengeId())
.setTakenReward(this.getTakenReward())
.setStars(this.getStars());
return proto;
}
public void delete() {
LunarRail.getGameDatabase().delete(this);
}
public void save() {
LunarRail.getGameDatabase().save(this);
}
}

View File

@@ -0,0 +1,87 @@
package emu.lunarcore.game.challenge;
import java.util.stream.Stream;
import emu.lunarcore.LunarRail;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ChallengeExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.player.BasePlayerManager;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.player.PlayerLineup;
import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType;
import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
@Getter
public class ChallengeManager extends BasePlayerManager {
private Int2ObjectMap<ChallengeHistory> history;
public ChallengeManager(Player player) {
super(player);
this.history = new Int2ObjectOpenHashMap<>();
}
public void startChallenge(int challengeId) {
// Get challenge excel
ChallengeExcel excel = GameData.getChallengeExcelMap().get(challengeId);
if (excel == null) {
getPlayer().sendPacket(new PacketStartChallengeScRsp());
return;
}
// Sanity check lineups
if (excel.getStageNum() >= 1) {
PlayerLineup lineup = getPlayer().getLineupManager().getLineupByIndex(0, ExtraLineupType.LINEUP_CHALLENGE_VALUE);
// Make sure this lineup has avatars set
if (lineup.getAvatars().size() == 0) {
return;
}
// Set technique points
lineup.setMp(5);
}
if (excel.getStageNum() >= 2) {
PlayerLineup lineup = getPlayer().getLineupManager().getLineupByIndex(0, ExtraLineupType.LINEUP_CHALLENGE_2_VALUE);
// Make sure this lineup has avatars set
if (lineup.getAvatars().size() == 0) {
return;
}
// Set technique points
lineup.setMp(5);
}
// Enter scene
boolean success = getPlayer().enterScene(excel.getMapEntranceID(), 0, false);
if (success == false) {
return;
}
// Set challenge data for player
ChallengeData data = new ChallengeData(getPlayer(), excel);
getPlayer().setChallengeData(data);
getPlayer().getLineupManager().setCurrentExtraLineup(data.getCurrentExtraLineup(), false);
// Send packet
getPlayer().sendPacket(new PacketStartChallengeScRsp(getPlayer(), challengeId));
}
public void addHistory(int challengeId, int stars) {
// Get history info
var info = this.getHistory().computeIfAbsent(challengeId, id -> new ChallengeHistory(getPlayer(), id));
// Set
info.setStars(stars);
info.save();
}
public void loadFromDatabase() {
Stream<ChallengeHistory> stream = LunarRail.getGameDatabase().getObjects(ChallengeHistory.class, "ownerUid", this.getPlayer().getUid());
stream.forEach(info -> {
this.getHistory().put(info.getChallengeId(), info);
});
}
}

View File

@@ -1,40 +0,0 @@
package emu.lunarcore.game.challenge;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ChallengeExcel;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.server.game.BaseGameService;
import emu.lunarcore.server.game.GameServer;
import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp;
public class ChallengeService extends BaseGameService {
public ChallengeService(GameServer server) {
super(server);
}
public void startChallenge(Player player, int challengeId) {
ChallengeExcel excel = GameData.getChallengeExcelMap().get(challengeId);
if (excel == null) {
player.sendPacket(new PacketStartChallengeScRsp());
return;
}
// Sanity check lineups TODO
// Enter scene
boolean success = player.enterScene(excel.getMapEntranceID(), 0, false);
if (success == false) {
return;
}
// Set challenge data for player
ChallengeData data = new ChallengeData(player, excel);
player.setChallengeData(data);
player.getLineupManager().setCurrentExtraLineup(data.getCurrentExtraLineup(), false);
// Send packet
player.sendPacket(new PacketStartChallengeScRsp(player, challengeId));
}
}

View File

@@ -21,6 +21,7 @@ import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.avatar.HeroPath;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.challenge.ChallengeData;
import emu.lunarcore.game.challenge.ChallengeManager;
import emu.lunarcore.game.chat.ChatManager;
import emu.lunarcore.game.chat.ChatMessage;
import emu.lunarcore.game.enums.PropState;
@@ -79,6 +80,7 @@ public class Player {
private transient final AvatarStorage avatars;
private transient final Inventory inventory;
private transient final ChatManager chatManager;
private transient final ChallengeManager challengeManager;
// Database persistent data
private LineupManager lineupManager;
@@ -98,6 +100,7 @@ public class Player {
this.avatars = new AvatarStorage(this);
this.inventory = new Inventory(this);
this.chatManager = new ChatManager(this);
this.challengeManager = new ChallengeManager(this);
}
// Called when player is created
@@ -491,6 +494,7 @@ public class Player {
// Load avatars and inventory first
this.getAvatars().loadFromDatabase();
this.getInventory().loadFromDatabase();
this.getChallengeManager().loadFromDatabase();
// Load Etc
this.getLineupManager().validate(this);

View File

@@ -7,12 +7,10 @@ import java.util.List;
import emu.lunarcore.Config.GameServerConfig;
import emu.lunarcore.LunarRail;
import emu.lunarcore.game.battle.BattleService;
import emu.lunarcore.game.challenge.ChallengeService;
import emu.lunarcore.game.gacha.GachaService;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.service.InventoryService;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import kcp.highway.ChannelConfig;
import kcp.highway.KcpServer;
@@ -31,7 +29,6 @@ public class GameServer extends KcpServer {
@Getter private final BattleService battleService;
@Getter private final InventoryService inventoryService;
@Getter private final GachaService gachaService;
@Getter private final ChallengeService challengeService;
public GameServer(GameServerConfig serverConfig) {
// Game Server base
@@ -46,7 +43,6 @@ public class GameServer extends KcpServer {
this.battleService = new BattleService(this);
this.inventoryService = new InventoryService(this);
this.gachaService = new GachaService(this);
this.challengeService = new ChallengeService(this);
// Hook into shutdown event.
Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown));

View File

@@ -0,0 +1,17 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketGetChallengeScRsp;
@Opcodes(CmdId.GetChallengeCsReq)
public class HandlerGetChallengeCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
session.send(new PacketGetChallengeScRsp(session.getPlayer()));
}
}

View File

@@ -13,7 +13,7 @@ public class HandlerStartChallengeCsReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = StartChallengeCsReq.parseFrom(data);
session.getServer().getChallengeService().startChallenge(session.getPlayer(), req.getChallengeId());
session.getPlayer().getChallengeManager().startChallenge(req.getChallengeId());
}
}

View File

@@ -0,0 +1,21 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.GetChallengeScRspOuterClass.GetChallengeScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketGetChallengeScRsp extends BasePacket {
public PacketGetChallengeScRsp(Player player) {
super(CmdId.GetChallengeScRsp);
var data = GetChallengeScRsp.newInstance();
for (var history : player.getChallengeManager().getHistory().values()) {
data.addChallengeList(history.toProto());
}
this.setData(data);
}
}