mirror of
https://github.com/Melledy/Nebula.git
synced 2026-09-19 17:19:58 +02:00
feat: properly handle level completion
This commit is contained in:
@@ -1,25 +1,28 @@
|
|||||||
package emu.nebula.game.activity.type;
|
package emu.nebula.game.activity.type;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import dev.morphia.annotations.Entity;
|
import dev.morphia.annotations.Entity;
|
||||||
|
|
||||||
import emu.nebula.data.GameData;
|
import emu.nebula.data.GameData;
|
||||||
import emu.nebula.data.resources.ActivityDef;
|
import emu.nebula.data.resources.ActivityDef;
|
||||||
import emu.nebula.game.activity.ActivityManager;
|
import emu.nebula.game.activity.ActivityManager;
|
||||||
import emu.nebula.game.activity.GameActivity;
|
import emu.nebula.game.activity.GameActivity;
|
||||||
import emu.nebula.game.player.PlayerChangeInfo;
|
|
||||||
import emu.nebula.proto.ActivityDetail.ActivityMsg;
|
import emu.nebula.proto.ActivityDetail.ActivityMsg;
|
||||||
|
import emu.nebula.proto.Public.ActivityPenguinCardLevel;
|
||||||
import emu.nebula.proto.Public.ActivityQuest;
|
import emu.nebula.proto.Public.ActivityQuest;
|
||||||
import emu.nebula.proto.Public.ActivityTowerDefenseLevel;
|
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Entity
|
@Entity
|
||||||
public class PenguinCardActivity extends GameActivity {
|
public class PenguinCardActivity extends GameActivity {
|
||||||
private Int2IntMap completedStages;
|
private Map<Integer, LevelStats> completedLevels = new Int2ObjectOpenHashMap<>();
|
||||||
private Int2IntMap completedQuests;
|
private Int2IntMap completedQuests = new Int2IntOpenHashMap();
|
||||||
|
|
||||||
@Deprecated // Morphia only
|
@Deprecated // Morphia only
|
||||||
public PenguinCardActivity() {
|
public PenguinCardActivity() {
|
||||||
@@ -28,50 +31,57 @@ public class PenguinCardActivity extends GameActivity {
|
|||||||
|
|
||||||
public PenguinCardActivity(ActivityManager manager, ActivityDef data) {
|
public PenguinCardActivity(ActivityManager manager, ActivityDef data) {
|
||||||
super(manager, data);
|
super(manager, data);
|
||||||
this.completedStages = new Int2IntOpenHashMap();
|
|
||||||
this.completedQuests = new Int2IntOpenHashMap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerChangeInfo claimReward(int level) {
|
|
||||||
// Get rewards
|
|
||||||
var rewards = GameData.getTowerDefenseLevelDataTable().get(level).getRewards();
|
|
||||||
|
|
||||||
// Add rewards
|
|
||||||
return getPlayer().getInventory().addItems(rewards);
|
|
||||||
}
|
|
||||||
|
|
||||||
// public PlayerChangeInfo claimReward(int groupId) {
|
|
||||||
// // Create change info
|
|
||||||
// var change = new PlayerChangeInfo();
|
|
||||||
|
|
||||||
// // Make sure we haven't completed this group yet
|
|
||||||
// if (this.getCompleted().contains(groupId)) {
|
|
||||||
// return change;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Get trial control
|
|
||||||
// var control = GameData.getTrialControlDataTable().get(this.getId());
|
|
||||||
// if (control == null) return change;
|
|
||||||
|
|
||||||
// // Get group
|
|
||||||
// var group = GameData.getTrialGroupDataTable().get(groupId);
|
|
||||||
// if (group == null) return change;
|
|
||||||
|
|
||||||
// // Set as completed
|
|
||||||
// this.getCompleted().add(groupId);
|
|
||||||
|
|
||||||
// // Save to database
|
|
||||||
// this.save();
|
|
||||||
|
|
||||||
// // Add rewards
|
|
||||||
// return getPlayer().getInventory().addItems(group.getRewards(), change);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Proto
|
// Proto
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void encodeActivityMsg(ActivityMsg msg) {
|
public void encodeActivityMsg(ActivityMsg msg) {
|
||||||
msg.getMutablePenguinCard();
|
var proto = msg.getMutablePenguinCard();
|
||||||
|
|
||||||
|
// Add completed levels
|
||||||
|
for (int id : this.completedLevels.keySet()) {
|
||||||
|
// Get level completion data
|
||||||
|
var data = this.completedLevels.get(id);
|
||||||
|
|
||||||
|
// Create proto
|
||||||
|
var level = ActivityPenguinCardLevel.newInstance();
|
||||||
|
|
||||||
|
// Set proto params
|
||||||
|
level.setId(id);
|
||||||
|
level.setScore(data.getScore());
|
||||||
|
level.setStar(data.getStars());
|
||||||
|
|
||||||
|
// Add to final msg proto
|
||||||
|
proto.addLevels(level);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add completed quests
|
||||||
|
for (int id : this.completedQuests.keySet()) {
|
||||||
|
// Create proto
|
||||||
|
var quest = ActivityQuest.newInstance();
|
||||||
|
|
||||||
|
// Set proto params
|
||||||
|
quest.setActivityId(this.getId());
|
||||||
|
quest.setId(id);
|
||||||
|
quest.setStatus(2); // TODO: properly handle event quests
|
||||||
|
|
||||||
|
// Add to final msg proto
|
||||||
|
proto.addQuests(quest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Entity(useDiscriminator = false)
|
||||||
|
public static class LevelStats {
|
||||||
|
private int stars;
|
||||||
|
private int score;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public LevelStats() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ package emu.nebula.server.handlers;
|
|||||||
import emu.nebula.net.NetHandler;
|
import emu.nebula.net.NetHandler;
|
||||||
import emu.nebula.net.NetMsgId;
|
import emu.nebula.net.NetMsgId;
|
||||||
import emu.nebula.proto.ActivityPenguinCardLevelSettle.ActivityPenguinCardSettleReq;
|
import emu.nebula.proto.ActivityPenguinCardLevelSettle.ActivityPenguinCardSettleReq;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
import emu.nebula.net.HandlerId;
|
import emu.nebula.net.HandlerId;
|
||||||
|
import emu.nebula.game.activity.type.PenguinCardActivity;
|
||||||
|
import emu.nebula.game.activity.type.PenguinCardActivity.LevelStats;
|
||||||
import emu.nebula.net.GameSession;
|
import emu.nebula.net.GameSession;
|
||||||
|
|
||||||
@HandlerId(NetMsgId.activity_penguin_card_level_settle_req)
|
@HandlerId(NetMsgId.activity_penguin_card_level_settle_req)
|
||||||
@@ -15,6 +18,13 @@ public class HandlerActivityPenguinCardSettleReq extends NetHandler {
|
|||||||
var req = ActivityPenguinCardSettleReq.parseFrom(message);
|
var req = ActivityPenguinCardSettleReq.parseFrom(message);
|
||||||
|
|
||||||
// Get activity
|
// Get activity
|
||||||
|
var activity = session.getPlayer().getActivityManager().getActivity(PenguinCardActivity.class, 800001);
|
||||||
|
|
||||||
|
// Update completed levels
|
||||||
|
LevelStats data = new LevelStats();
|
||||||
|
data.setScore(req.getScore());
|
||||||
|
data.setStars(req.getStar());
|
||||||
|
activity.getCompletedLevels().put(req.getLevelId(), data);
|
||||||
|
|
||||||
// Encode and send
|
// Encode and send
|
||||||
return session.encodeMsg(NetMsgId.activity_penguin_card_level_settle_succeed_ack);
|
return session.encodeMsg(NetMsgId.activity_penguin_card_level_settle_succeed_ack);
|
||||||
|
|||||||
Reference in New Issue
Block a user