mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-13 05:44:36 +01:00
Implement challenge history
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user