From be4a006c664d93702a22d66e64fc26d53a0d524d Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 12 Nov 2025 03:25:23 -0800 Subject: [PATCH] Implement commissions --- src/main/java/emu/nebula/data/GameData.java | 4 + .../emu/nebula/data/resources/AgentDef.java | 84 +++++++++ .../data/resources/CharGemInstanceDef.java | 8 +- .../data/resources/DailyInstanceDef.java | 11 +- .../DailyInstanceRewardGroupDef.java | 8 +- .../data/resources/InfinityTowerLevelDef.java | 6 +- .../data/resources/RegionBossLevelDef.java | 8 +- .../data/resources/SkillInstanceDef.java | 8 +- .../data/resources/WeekBossLevelDef.java | 8 +- .../java/emu/nebula/game/agent/Agent.java | 48 ++++++ .../emu/nebula/game/agent/AgentManager.java | 159 ++++++++++++++++++ .../emu/nebula/game/agent/AgentResult.java | 41 +++++ .../nebula/game/instance/InstanceData.java | 11 +- .../nebula/game/inventory/ItemRewardList.java | 21 +++ .../ItemRewardParam.java} | 6 +- .../java/emu/nebula/game/player/Player.java | 12 +- .../server/handlers/HandlerAgentApplyReq.java | 34 +++- .../handlers/HandlerAgentGiveUpReq.java | 33 ++++ .../HandlerAgentRewardReceiveReq.java | 56 ++++++ 19 files changed, 526 insertions(+), 40 deletions(-) create mode 100644 src/main/java/emu/nebula/data/resources/AgentDef.java create mode 100644 src/main/java/emu/nebula/game/agent/Agent.java create mode 100644 src/main/java/emu/nebula/game/agent/AgentManager.java create mode 100644 src/main/java/emu/nebula/game/agent/AgentResult.java create mode 100644 src/main/java/emu/nebula/game/inventory/ItemRewardList.java rename src/main/java/emu/nebula/game/{instance/InstanceRewardParam.java => inventory/ItemRewardParam.java} (75%) create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerAgentGiveUpReq.java create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerAgentRewardReceiveReq.java diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 100350d..05e3d74 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -43,6 +43,7 @@ public class GameData { @Getter private static DataTable PlayerHeadDataTable = new DataTable<>(); @Getter private static DataTable titleDataTable = new DataTable<>(); + // Shops @Getter private static DataTable MallMonthlyCardDataTable = new DataTable<>(); @Getter private static DataTable MallPackageDataTable = new DataTable<>(); @Getter private static DataTable MallShopDataTable = new DataTable<>(); @@ -51,6 +52,9 @@ public class GameData { @Getter private static DataTable ResidentShopDataTable = new DataTable<>(); @Getter private static DataTable ResidentGoodsDataTable = new DataTable<>(); + // Commissions + @Getter private static DataTable AgentDataTable = new DataTable<>(); + // Dictionary @Getter private static DataTable DictionaryTabDataTable = new DataTable<>(); @Getter private static DataTable DictionaryEntryDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/AgentDef.java b/src/main/java/emu/nebula/data/resources/AgentDef.java new file mode 100644 index 0000000..965cae1 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/AgentDef.java @@ -0,0 +1,84 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import emu.nebula.game.inventory.ItemRewardList; +import emu.nebula.game.inventory.ItemRewardParam; +import emu.nebula.util.JsonUtils; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import lombok.Getter; + +@Getter +@ResourceType(name = "Agent.json") +public class AgentDef extends BaseDef { + private int Id; + private int Level; + private int MemberLimit; + private int[] Tags; + private int[] ExtraTags; + + private int Time1; + private String RewardPreview1; + private String BonusPreview1; + + private int Time2; + private String RewardPreview2; + private String BonusPreview2; + + private int Time3; + private String RewardPreview3; + private String BonusPreview3; + + private int Time4; + private String RewardPreview4; + private String BonusPreview4; + + private transient Int2ObjectMap durations; + + @Override + public int getId() { + return Id; + } + + private void addDuration(AgentDurationDef duration) { + this.durations.put(duration.getTime(), duration); + } + + @Override + public void onLoad() { + this.durations = new Int2ObjectOpenHashMap<>(); + + this.addDuration(new AgentDurationDef(this.Time1, this.RewardPreview1, this.BonusPreview1)); + this.addDuration(new AgentDurationDef(this.Time2, this.RewardPreview2, this.BonusPreview2)); + this.addDuration(new AgentDurationDef(this.Time3, this.RewardPreview3, this.BonusPreview3)); + this.addDuration(new AgentDurationDef(this.Time4, this.RewardPreview4, this.BonusPreview4)); + } + + @Getter + public static class AgentDurationDef { + private int time; + private ItemRewardList rewards; + private ItemRewardList bonus; + + public AgentDurationDef(int time, String rewardPreview, String bonusPreview) { + this.time = time; + this.rewards = new ItemRewardList(); + this.bonus = new ItemRewardList(); + + var rewardArray = JsonUtils.decodeList(rewardPreview, int[].class); + if (rewardArray != null) { + for (int[] award : rewardArray) { + this.rewards.add(new ItemRewardParam(award[0], award[1], award[2])); + } + } + + var bonusArray = JsonUtils.decodeList(bonusPreview, int[].class); + if (bonusArray != null) { + for (int[] award : bonusArray) { + this.bonus.add(new ItemRewardParam(award[0], award[1], award[2])); + } + } + } + } +} diff --git a/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java b/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java index 9e66164..5e5e2e1 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java @@ -6,7 +6,7 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; -import emu.nebula.game.instance.InstanceRewardParam; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -21,8 +21,8 @@ public class CharGemInstanceDef extends BaseDef implements InstanceData { private int EnergyConsume; private String BaseAwardPreview; - private transient List firstRewards; - private transient List rewards; + private transient List firstRewards; + private transient List rewards; @Override public int getId() { @@ -52,7 +52,7 @@ public class CharGemInstanceDef extends BaseDef implements InstanceData { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { this.firstRewards.add(reward); diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java index 2913be3..0c317db 100644 --- a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java @@ -6,8 +6,7 @@ import emu.nebula.data.BaseDef; import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; -import emu.nebula.game.instance.InstanceRewardParam; - +import emu.nebula.game.inventory.ItemRewardParam; import lombok.Getter; @Getter @@ -37,18 +36,18 @@ public class DailyInstanceDef extends BaseDef implements InstanceData { @Override @Deprecated - public List getFirstRewards() { + public List getFirstRewards() { return null; } @Override @Deprecated - public List getRewards() { + public List getRewards() { return null; } @Override - public List getFirstRewards(int rewardType) { + public List getFirstRewards(int rewardType) { var data = this.getRewardGroup(rewardType); if (data != null) { @@ -59,7 +58,7 @@ public class DailyInstanceDef extends BaseDef implements InstanceData { } @Override - public List getRewards(int rewardType) { + public List getRewards(int rewardType) { var data = this.getRewardGroup(rewardType); if (data != null) { diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java index cc3bdf0..0192dca 100644 --- a/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java @@ -5,7 +5,7 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; -import emu.nebula.game.instance.InstanceRewardParam; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -16,8 +16,8 @@ public class DailyInstanceRewardGroupDef extends BaseDef { private int DailyRewardType; private String BaseAwardPreview; - private transient List firstRewards; - private transient List rewards; + private transient List firstRewards; + private transient List rewards; @Override public int getId() { @@ -47,7 +47,7 @@ public class DailyInstanceRewardGroupDef extends BaseDef { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { this.firstRewards.add(reward); diff --git a/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java b/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java index f80de18..b2af36e 100644 --- a/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java +++ b/src/main/java/emu/nebula/data/resources/InfinityTowerLevelDef.java @@ -5,8 +5,8 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; -import emu.nebula.game.instance.InstanceRewardParam; import emu.nebula.game.inventory.ItemParamMap; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -18,7 +18,7 @@ public class InfinityTowerLevelDef extends BaseDef { private int DifficultyId; private String BaseAwardPreview; - private transient List rewards; + private transient List rewards; @Override public int getId() { @@ -61,7 +61,7 @@ public class InfinityTowerLevelDef extends BaseDef { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { diff --git a/src/main/java/emu/nebula/data/resources/RegionBossLevelDef.java b/src/main/java/emu/nebula/data/resources/RegionBossLevelDef.java index af82bfb..dc6997a 100644 --- a/src/main/java/emu/nebula/data/resources/RegionBossLevelDef.java +++ b/src/main/java/emu/nebula/data/resources/RegionBossLevelDef.java @@ -6,7 +6,7 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; -import emu.nebula.game.instance.InstanceRewardParam; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -21,8 +21,8 @@ public class RegionBossLevelDef extends BaseDef implements InstanceData { private int EnergyConsume; private String BaseAwardPreview; - private transient List firstRewards; - private transient List rewards; + private transient List firstRewards; + private transient List rewards; @Override public int getId() { @@ -52,7 +52,7 @@ public class RegionBossLevelDef extends BaseDef implements InstanceData { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { this.firstRewards.add(reward); diff --git a/src/main/java/emu/nebula/data/resources/SkillInstanceDef.java b/src/main/java/emu/nebula/data/resources/SkillInstanceDef.java index e5bcc69..e40af90 100644 --- a/src/main/java/emu/nebula/data/resources/SkillInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/SkillInstanceDef.java @@ -6,7 +6,7 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; -import emu.nebula.game.instance.InstanceRewardParam; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -20,8 +20,8 @@ public class SkillInstanceDef extends BaseDef implements InstanceData { private int EnergyConsume; private String BaseAwardPreview; - private transient List firstRewards; - private transient List rewards; + private transient List firstRewards; + private transient List rewards; @Override public int getId() { @@ -51,7 +51,7 @@ public class SkillInstanceDef extends BaseDef implements InstanceData { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { this.firstRewards.add(reward); diff --git a/src/main/java/emu/nebula/data/resources/WeekBossLevelDef.java b/src/main/java/emu/nebula/data/resources/WeekBossLevelDef.java index 5cc7644..9cc4ff8 100644 --- a/src/main/java/emu/nebula/data/resources/WeekBossLevelDef.java +++ b/src/main/java/emu/nebula/data/resources/WeekBossLevelDef.java @@ -6,7 +6,7 @@ import java.util.List; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; -import emu.nebula.game.instance.InstanceRewardParam; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.util.JsonUtils; import lombok.Getter; @@ -19,8 +19,8 @@ public class WeekBossLevelDef extends BaseDef implements InstanceData { private int NeedWorldClass; private String BaseAwardPreview; - private transient List firstRewards; - private transient List rewards; + private transient List firstRewards; + private transient List rewards; @Override public int getId() { @@ -54,7 +54,7 @@ public class WeekBossLevelDef extends BaseDef implements InstanceData { max = 1; } - var reward = new InstanceRewardParam(itemId, min, max); + var reward = new ItemRewardParam(itemId, min, max); if (isFirst) { this.firstRewards.add(reward); diff --git a/src/main/java/emu/nebula/game/agent/Agent.java b/src/main/java/emu/nebula/game/agent/Agent.java new file mode 100644 index 0000000..564ba32 --- /dev/null +++ b/src/main/java/emu/nebula/game/agent/Agent.java @@ -0,0 +1,48 @@ +package emu.nebula.game.agent; + +import dev.morphia.annotations.Entity; +import emu.nebula.Nebula; +import emu.nebula.data.resources.AgentDef; +import emu.nebula.proto.Public.AgentInfo; +import lombok.Getter; + +@Getter +@Entity(useDiscriminator = false) +public class Agent { + private int id; + private int duration; // Minutes + private long start; // Seconds + private int[] charIds; + + private long end; // Milliseconds + + @Deprecated // Morphia only + public Agent() { + + } + + public Agent(AgentDef data, int duration, int[] charIds) { + this.id = data.getId(); + this.start = Nebula.getCurrentTime(); + this.duration = duration; + this.charIds = charIds; + + this.end = (this.start + (duration * 60)) * 1000; + } + + public boolean isCompleted() { + return System.currentTimeMillis() >= this.getEnd(); + } + + // Proto + + public AgentInfo toProto() { + var proto = AgentInfo.newInstance() + .setId(this.getId()) + .setProcessTime(this.getDuration()) + .setStartTime(this.getStart()) + .addAllCharIds(this.getCharIds()); + + return proto; + } +} diff --git a/src/main/java/emu/nebula/game/agent/AgentManager.java b/src/main/java/emu/nebula/game/agent/AgentManager.java new file mode 100644 index 0000000..b8467fb --- /dev/null +++ b/src/main/java/emu/nebula/game/agent/AgentManager.java @@ -0,0 +1,159 @@ +package emu.nebula.game.agent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import emu.nebula.data.GameData; +import emu.nebula.database.GameDatabaseObject; +import emu.nebula.game.player.Player; +import emu.nebula.game.player.PlayerChangeInfo; +import emu.nebula.game.player.PlayerManager; +import emu.nebula.game.quest.QuestCondType; +import lombok.Getter; +import us.hebi.quickbuf.RepeatedInt; + +@Getter +@Entity(value = "agents", useDiscriminator = false) +public class AgentManager extends PlayerManager implements GameDatabaseObject { + @Id + private int uid; + + private Map agents; + + @Deprecated // Morhpia only + public AgentManager() { + + } + + public AgentManager(Player player) { + super(player); + this.uid = player.getUid(); + this.agents = new HashMap<>(); + + this.save(); + } + + public int getMax() { + return 4; + } + + public Agent apply(int id, int processTime, RepeatedInt charIds) { + // Check if we already have the maximum amount of commissions + if (this.getAgents().size() >= this.getMax()) { + return null; + } + + // Get agent data + var data = GameData.getAgentDataTable().get(id); + if (data == null) { + return null; + } + + // Sanity check char ids + if (charIds.length() <= 0 || charIds.length() > data.getMemberLimit()) { + return null; + } + + // Make sure we own the characters + for (int charId : charIds) { + if (!getPlayer().getCharacters().hasCharacter(charId)) { + return null; + } + } + + // TODO verify char tags for rewards + + // Create agent + var agent = new Agent(data, processTime, charIds.toArray()); + + // Add + this.getAgents().put(agent.getId(), agent); + + // Quest + this.getPlayer().getQuestManager().triggerQuest(QuestCondType.AgentApplyTotal, 1); + + // Success + return agent; + } + + public Agent giveUp(int id) { + var agent = this.getAgents().remove(id); + + if (agent != null) { + this.save(); + } + + return agent; + } + + public PlayerChangeInfo claim(int id) { + // Create list of claimed agents + var list = new ArrayList(); + + if (id > 0) { + var agent = this.getAgents().get(id); + + if (agent != null && agent.isCompleted()) { + list.add(agent); + } + } else { + for (var agent : this.getAgents().values()) { + if (agent != null && agent.isCompleted()) { + list.add(agent); + } + } + } + + // Sanity check + if (list.isEmpty()) { + return null; + } + + // Create results + var change = new PlayerChangeInfo(); + var results = new ArrayList(); + + // Claim + for (var agent : list) { + // Remove agent + this.getAgents().remove(agent.getId()); + + // Get result + var result = new AgentResult(agent); + + // Add to result list + results.add(result); + + // Get agent data + var data = GameData.getAgentDataTable().get(agent.getId()); + if (data == null) { + continue; + } + + // Calculate rewards + var duration = data.getDurations().get(agent.getDuration()); + if (duration == null) { + continue; + } + + // Create rewards + var rewards = duration.getRewards().generateRewards(); + result.setRewards(rewards); + + // Add to inventory + this.getPlayer().getInventory().addItems(rewards, change); + } + + // Set results in change info + change.setExtraData(results); + + // Save to database + this.save(); + + // Success + return change.setSuccess(true); + } +} diff --git a/src/main/java/emu/nebula/game/agent/AgentResult.java b/src/main/java/emu/nebula/game/agent/AgentResult.java new file mode 100644 index 0000000..32a4e49 --- /dev/null +++ b/src/main/java/emu/nebula/game/agent/AgentResult.java @@ -0,0 +1,41 @@ +package emu.nebula.game.agent; + +import emu.nebula.game.inventory.ItemParamMap; + +public class AgentResult { + private Agent agent; + private ItemParamMap rewards; + private ItemParamMap bonus; + + public AgentResult(Agent agent) { + this.agent = agent; + } + + public Agent getAgent() { + return this.agent; + } + + public ItemParamMap getRewards() { + if (this.rewards == null) { + return ItemParamMap.EMPTY; + } + + return this.rewards; + } + + public ItemParamMap getBonus() { + if (this.bonus == null) { + return ItemParamMap.EMPTY; + } + + return this.bonus; + } + + public void setRewards(ItemParamMap rewards) { + this.rewards = rewards; + } + + public void setBonus(ItemParamMap bonus) { + this.bonus = bonus; + } +} diff --git a/src/main/java/emu/nebula/game/instance/InstanceData.java b/src/main/java/emu/nebula/game/instance/InstanceData.java index 704016b..6d1bfb4 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceData.java +++ b/src/main/java/emu/nebula/game/instance/InstanceData.java @@ -3,6 +3,7 @@ package emu.nebula.game.instance; import java.util.List; import emu.nebula.game.inventory.ItemParamMap; +import emu.nebula.game.inventory.ItemRewardParam; import emu.nebula.game.player.Player; public interface InstanceData { @@ -15,9 +16,9 @@ public interface InstanceData { // Handle reward generation - public List getFirstRewards(); + public List getFirstRewards(); - public default List getFirstRewards(int rewardType) { + public default List getFirstRewards(int rewardType) { return getFirstRewards(); } @@ -25,9 +26,9 @@ public interface InstanceData { return this.generateRewards(this.getFirstRewards()); } - public List getRewards(); + public List getRewards(); - public default List getRewards(int rewardType) { + public default List getRewards(int rewardType) { return getRewards(); } @@ -35,7 +36,7 @@ public interface InstanceData { return this.generateRewards(this.getRewards()); } - public default ItemParamMap generateRewards(List params) { + public default ItemParamMap generateRewards(List params) { var map = new ItemParamMap(); for (var param : params) { diff --git a/src/main/java/emu/nebula/game/inventory/ItemRewardList.java b/src/main/java/emu/nebula/game/inventory/ItemRewardList.java new file mode 100644 index 0000000..be28d9f --- /dev/null +++ b/src/main/java/emu/nebula/game/inventory/ItemRewardList.java @@ -0,0 +1,21 @@ +package emu.nebula.game.inventory; + +import java.util.ArrayList; + +public class ItemRewardList extends ArrayList { + private static final long serialVersionUID = -4317949564663392685L; + + public ItemRewardList() { + super(); + } + + public ItemParamMap generateRewards() { + var map = new ItemParamMap(); + + for (var param : this) { + map.add(param.getId(), param.getRandomCount()); + } + + return map; + } +} \ No newline at end of file diff --git a/src/main/java/emu/nebula/game/instance/InstanceRewardParam.java b/src/main/java/emu/nebula/game/inventory/ItemRewardParam.java similarity index 75% rename from src/main/java/emu/nebula/game/instance/InstanceRewardParam.java rename to src/main/java/emu/nebula/game/inventory/ItemRewardParam.java index 51c16f8..47a938b 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceRewardParam.java +++ b/src/main/java/emu/nebula/game/inventory/ItemRewardParam.java @@ -1,15 +1,15 @@ -package emu.nebula.game.instance; +package emu.nebula.game.inventory; import emu.nebula.util.Utils; import lombok.Getter; @Getter -public class InstanceRewardParam { +public class ItemRewardParam { public int id; public int min; public int max; - public InstanceRewardParam(int id, int min, int max) { + public ItemRewardParam(int id, int min, int max) { this.id = id; this.min = min; this.max = max; diff --git a/src/main/java/emu/nebula/game/player/Player.java b/src/main/java/emu/nebula/game/player/Player.java index 50ba829..cce06a0 100644 --- a/src/main/java/emu/nebula/game/player/Player.java +++ b/src/main/java/emu/nebula/game/player/Player.java @@ -11,6 +11,7 @@ import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.database.GameDatabaseObject; import emu.nebula.game.account.Account; +import emu.nebula.game.agent.AgentManager; import emu.nebula.game.character.CharacterStorage; import emu.nebula.game.formation.FormationManager; import emu.nebula.game.gacha.GachaManager; @@ -87,6 +88,7 @@ public class Player implements GameDatabaseObject { private transient PlayerProgress progress; private transient StoryManager storyManager; private transient QuestManager questManager; + private transient AgentManager agentManager; // Next packages private transient Stack nextPackages; @@ -532,6 +534,7 @@ public class Player implements GameDatabaseObject { this.progress = this.loadManagerFromDatabase(PlayerProgress.class); this.storyManager = this.loadManagerFromDatabase(StoryManager.class); this.questManager = this.loadManagerFromDatabase(QuestManager.class); + this.agentManager = this.loadManagerFromDatabase(AgentManager.class); // Database fixes if (this.showChars == null) { @@ -714,9 +717,14 @@ public class Player implements GameDatabaseObject { var phone = proto.getMutablePhone(); phone.setNewMessage(this.getCharacters().getNewPhoneMessageCount()); - // Extra - proto.getMutableAgent(); + // Agent + var agentProto = proto.getMutableAgent(); + for (var agent : getAgentManager().getAgents().values()) { + agentProto.addInfos(agent.toProto()); + } + + // Complete return proto; } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerAgentApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerAgentApplyReq.java index e70851a..fafe43d 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerAgentApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerAgentApplyReq.java @@ -2,6 +2,9 @@ package emu.nebula.server.handlers; import emu.nebula.net.NetHandler; import emu.nebula.net.NetMsgId; +import emu.nebula.proto.AgentApply.AgentApplyReq; +import emu.nebula.proto.AgentApply.AgentApplyResp; +import emu.nebula.proto.AgentApply.AgentRespInfo; import emu.nebula.net.HandlerId; import emu.nebula.net.GameSession; @@ -10,7 +13,36 @@ public class HandlerAgentApplyReq extends NetHandler { @Override public byte[] handle(GameSession session, byte[] message) throws Exception { - return session.encodeMsg(NetMsgId.agent_apply_failed_ack); + // Parse request + var req = AgentApplyReq.parseFrom(message); + + // Build response + var rsp = AgentApplyResp.newInstance(); + + // Apply for commissions + for (var apply : req.getApply()) { + // Apply + var agent = session.getPlayer().getAgentManager().apply( + apply.getId(), + apply.getProcessTime(), + apply.getCharIds() + ); + + // Serialize to proto + var info = AgentRespInfo.newInstance() + .setId(agent.getId()) + .setBeginTime(agent.getStart()); + + rsp.addInfos(info); + } + + // Save + if (rsp.getInfos().length() > 0) { + session.getPlayer().getAgentManager().save(); + } + + // Encode and send + return session.encodeMsg(NetMsgId.agent_apply_succeed_ack, rsp); } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerAgentGiveUpReq.java b/src/main/java/emu/nebula/server/handlers/HandlerAgentGiveUpReq.java new file mode 100644 index 0000000..1302299 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerAgentGiveUpReq.java @@ -0,0 +1,33 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.AgentGiveUp.AgentGiveUpReq; +import emu.nebula.proto.AgentGiveUp.AgentGiveUpResp; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.agent_give_up_req) +public class HandlerAgentGiveUpReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = AgentGiveUpReq.parseFrom(message); + + // Give up + var agent = session.getPlayer().getAgentManager().giveUp(req.getId()); + + if (agent == null) { + return session.encodeMsg(NetMsgId.agent_give_up_failed_ack); + } + + // Build response + var rsp = AgentGiveUpResp.newInstance() + .addAllCharIds(agent.getCharIds()); + + // Encode and send + return session.encodeMsg(NetMsgId.agent_give_up_succeed_ack, rsp); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerAgentRewardReceiveReq.java b/src/main/java/emu/nebula/server/handlers/HandlerAgentRewardReceiveReq.java new file mode 100644 index 0000000..c2e013b --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerAgentRewardReceiveReq.java @@ -0,0 +1,56 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.AgentRewardReceive.AgentRewardReceiveReq; +import emu.nebula.proto.AgentRewardReceive.AgentRewardReceiveResp; +import emu.nebula.proto.AgentRewardReceive.AgentRewardShow; +import emu.nebula.net.HandlerId; + +import java.util.ArrayList; + +import emu.nebula.game.agent.AgentResult; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.agent_reward_receive_req) +public class HandlerAgentRewardReceiveReq extends NetHandler { + + @Override + @SuppressWarnings("unchecked") + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = AgentRewardReceiveReq.parseFrom(message); + + // Claim + var change = session.getPlayer().getAgentManager().claim(req.getId()); + + if (change == null) { + return session.encodeMsg(NetMsgId.agent_reward_receive_failed_ack); + } + + // Build response + var rsp = AgentRewardReceiveResp.newInstance() + .setChange(change.toProto()); + + // Handle results + var results = (ArrayList) change.getExtraData(); + + for (var result : results) { + // Add char ids + rsp.addAllCharIds(result.getAgent().getCharIds()); + + // Agent rewards proto + var show = AgentRewardShow.newInstance() + .setId(result.getAgent().getId()); + + result.getRewards().toItemTemplateStream().forEach(show::addRewards); + result.getBonus().toItemTemplateStream().forEach(show::addBonus); + + rsp.addRewardShows(show); + } + + // Encode and send + return session.encodeMsg(NetMsgId.agent_reward_receive_succeed_ack, rsp); + } + +}