mirror of
https://github.com/Melledy/LunarCore.git
synced 2026-02-04 15:05:07 +01:00
Implement challenge history
This commit is contained in:
@@ -48,6 +48,10 @@ public class ChallengeData {
|
|||||||
this.setupStage1();
|
this.setupStage1();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getChallengeId() {
|
||||||
|
return this.getExcel().getId();
|
||||||
|
}
|
||||||
|
|
||||||
private void setupStage1() {
|
private void setupStage1() {
|
||||||
this.setupStage(
|
this.setupStage(
|
||||||
excel.getMazeGroupID1(),
|
excel.getMazeGroupID1(),
|
||||||
@@ -120,6 +124,8 @@ public class ChallengeData {
|
|||||||
// Last stage
|
// Last stage
|
||||||
this.status = ChallengeStatus.CHALLENGE_FINISH;
|
this.status = ChallengeStatus.CHALLENGE_FINISH;
|
||||||
this.stars = 9; // TODO calculate the right amount stars
|
this.stars = 9; // TODO calculate the right amount stars
|
||||||
|
// Save history
|
||||||
|
player.getChallengeManager().addHistory(this.getChallengeId(), this.getStars());
|
||||||
// Send challenge result data
|
// Send challenge result data
|
||||||
player.sendPacket(new PacketChallengeSettleNotify(this));
|
player.sendPacket(new PacketChallengeSettleNotify(this));
|
||||||
} else {
|
} else {
|
||||||
@@ -139,7 +145,7 @@ public class ChallengeData {
|
|||||||
this.status = ChallengeStatus.CHALLENGE_FAILED;
|
this.status = ChallengeStatus.CHALLENGE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onUpdate() {
|
public void onUpdate() {
|
||||||
// End challenge if its done
|
// End challenge if its done
|
||||||
if (status != ChallengeStatus.CHALLENGE_DOING) {
|
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.avatar.HeroPath;
|
||||||
import emu.lunarcore.game.battle.Battle;
|
import emu.lunarcore.game.battle.Battle;
|
||||||
import emu.lunarcore.game.challenge.ChallengeData;
|
import emu.lunarcore.game.challenge.ChallengeData;
|
||||||
|
import emu.lunarcore.game.challenge.ChallengeManager;
|
||||||
import emu.lunarcore.game.chat.ChatManager;
|
import emu.lunarcore.game.chat.ChatManager;
|
||||||
import emu.lunarcore.game.chat.ChatMessage;
|
import emu.lunarcore.game.chat.ChatMessage;
|
||||||
import emu.lunarcore.game.enums.PropState;
|
import emu.lunarcore.game.enums.PropState;
|
||||||
@@ -79,6 +80,7 @@ public class Player {
|
|||||||
private transient final AvatarStorage avatars;
|
private transient final AvatarStorage avatars;
|
||||||
private transient final Inventory inventory;
|
private transient final Inventory inventory;
|
||||||
private transient final ChatManager chatManager;
|
private transient final ChatManager chatManager;
|
||||||
|
private transient final ChallengeManager challengeManager;
|
||||||
|
|
||||||
// Database persistent data
|
// Database persistent data
|
||||||
private LineupManager lineupManager;
|
private LineupManager lineupManager;
|
||||||
@@ -98,6 +100,7 @@ public class Player {
|
|||||||
this.avatars = new AvatarStorage(this);
|
this.avatars = new AvatarStorage(this);
|
||||||
this.inventory = new Inventory(this);
|
this.inventory = new Inventory(this);
|
||||||
this.chatManager = new ChatManager(this);
|
this.chatManager = new ChatManager(this);
|
||||||
|
this.challengeManager = new ChallengeManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called when player is created
|
// Called when player is created
|
||||||
@@ -491,6 +494,7 @@ public class Player {
|
|||||||
// Load avatars and inventory first
|
// Load avatars and inventory first
|
||||||
this.getAvatars().loadFromDatabase();
|
this.getAvatars().loadFromDatabase();
|
||||||
this.getInventory().loadFromDatabase();
|
this.getInventory().loadFromDatabase();
|
||||||
|
this.getChallengeManager().loadFromDatabase();
|
||||||
|
|
||||||
// Load Etc
|
// Load Etc
|
||||||
this.getLineupManager().validate(this);
|
this.getLineupManager().validate(this);
|
||||||
|
|||||||
@@ -7,12 +7,10 @@ import java.util.List;
|
|||||||
import emu.lunarcore.Config.GameServerConfig;
|
import emu.lunarcore.Config.GameServerConfig;
|
||||||
import emu.lunarcore.LunarRail;
|
import emu.lunarcore.LunarRail;
|
||||||
import emu.lunarcore.game.battle.BattleService;
|
import emu.lunarcore.game.battle.BattleService;
|
||||||
import emu.lunarcore.game.challenge.ChallengeService;
|
|
||||||
import emu.lunarcore.game.gacha.GachaService;
|
import emu.lunarcore.game.gacha.GachaService;
|
||||||
import emu.lunarcore.game.player.Player;
|
import emu.lunarcore.game.player.Player;
|
||||||
import emu.lunarcore.game.service.InventoryService;
|
import emu.lunarcore.game.service.InventoryService;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import kcp.highway.ChannelConfig;
|
import kcp.highway.ChannelConfig;
|
||||||
import kcp.highway.KcpServer;
|
import kcp.highway.KcpServer;
|
||||||
@@ -31,7 +29,6 @@ public class GameServer extends KcpServer {
|
|||||||
@Getter private final BattleService battleService;
|
@Getter private final BattleService battleService;
|
||||||
@Getter private final InventoryService inventoryService;
|
@Getter private final InventoryService inventoryService;
|
||||||
@Getter private final GachaService gachaService;
|
@Getter private final GachaService gachaService;
|
||||||
@Getter private final ChallengeService challengeService;
|
|
||||||
|
|
||||||
public GameServer(GameServerConfig serverConfig) {
|
public GameServer(GameServerConfig serverConfig) {
|
||||||
// Game Server base
|
// Game Server base
|
||||||
@@ -46,7 +43,6 @@ public class GameServer extends KcpServer {
|
|||||||
this.battleService = new BattleService(this);
|
this.battleService = new BattleService(this);
|
||||||
this.inventoryService = new InventoryService(this);
|
this.inventoryService = new InventoryService(this);
|
||||||
this.gachaService = new GachaService(this);
|
this.gachaService = new GachaService(this);
|
||||||
this.challengeService = new ChallengeService(this);
|
|
||||||
|
|
||||||
// Hook into shutdown event.
|
// Hook into shutdown event.
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown));
|
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 {
|
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||||
var req = StartChallengeCsReq.parseFrom(data);
|
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