From 6e52dcdba2a8d2567266aed721f0241444327f98 Mon Sep 17 00:00:00 2001
From: Melledy <121644117+Melledy@users.noreply.github.com>
Date: Wed, 7 Feb 2024 05:01:37 -0800
Subject: [PATCH] Fix challenge rewards not working due to new update behavior
---
.../TakeChallengeRewardCsReqOuterClass.java | 83 +---
.../TakeChallengeRewardScRspOuterClass.java | 219 ++++-------
.../TakenChallengeRewardInfoOuterClass.java | 361 ++++++++++++++++++
.../java/emu/lunarcore/data/GameData.java | 5 -
.../java/emu/lunarcore/data/GameDepot.java | 3 +
.../emu/lunarcore/data/common/ItemParam.java | 7 +
.../data/excel/ChallengeGroupExcel.java | 2 +-
.../data/excel/ChallengeRewardExcel.java | 12 +-
.../game/challenge/ChallengeManager.java | 67 +++-
.../recv/HandlerTakeChallengeRewardCsReq.java | 6 +-
.../send/PacketTakeChallengeRewardScRsp.java | 11 +-
11 files changed, 516 insertions(+), 260 deletions(-)
create mode 100644 src/generated/main/emu/lunarcore/proto/TakenChallengeRewardInfoOuterClass.java
diff --git a/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardCsReqOuterClass.java b/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardCsReqOuterClass.java
index 26ba848..9db80a8 100644
--- a/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardCsReqOuterClass.java
+++ b/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardCsReqOuterClass.java
@@ -23,11 +23,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
*/
private int groupId;
- /**
- * optional uint32 star_count = 10;
- */
- private int starCount;
-
private TakeChallengeRewardCsReq() {
}
@@ -75,50 +70,12 @@ public final class TakeChallengeRewardCsReqOuterClass {
return this;
}
- /**
- * optional uint32 star_count = 10;
- * @return whether the starCount field is set
- */
- public boolean hasStarCount() {
- return (bitField0_ & 0x00000002) != 0;
- }
-
- /**
- * optional uint32 star_count = 10;
- * @return this
- */
- public TakeChallengeRewardCsReq clearStarCount() {
- bitField0_ &= ~0x00000002;
- starCount = 0;
- return this;
- }
-
- /**
- * optional uint32 star_count = 10;
- * @return the starCount
- */
- public int getStarCount() {
- return starCount;
- }
-
- /**
- * optional uint32 star_count = 10;
- * @param value the starCount to set
- * @return this
- */
- public TakeChallengeRewardCsReq setStarCount(final int value) {
- bitField0_ |= 0x00000002;
- starCount = value;
- return this;
- }
-
@Override
public TakeChallengeRewardCsReq copyFrom(final TakeChallengeRewardCsReq other) {
cachedSize = other.cachedSize;
if ((bitField0_ | other.bitField0_) != 0) {
bitField0_ = other.bitField0_;
groupId = other.groupId;
- starCount = other.starCount;
}
return this;
}
@@ -132,9 +89,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
if (other.hasGroupId()) {
setGroupId(other.groupId);
}
- if (other.hasStarCount()) {
- setStarCount(other.starCount);
- }
return this;
}
@@ -146,7 +100,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
cachedSize = -1;
bitField0_ = 0;
groupId = 0;
- starCount = 0;
return this;
}
@@ -170,8 +123,7 @@ public final class TakeChallengeRewardCsReqOuterClass {
}
TakeChallengeRewardCsReq other = (TakeChallengeRewardCsReq) o;
return bitField0_ == other.bitField0_
- && (!hasGroupId() || groupId == other.groupId)
- && (!hasStarCount() || starCount == other.starCount);
+ && (!hasGroupId() || groupId == other.groupId);
}
@Override
@@ -180,10 +132,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
output.writeRawByte((byte) 8);
output.writeUInt32NoTag(groupId);
}
- if ((bitField0_ & 0x00000002) != 0) {
- output.writeRawByte((byte) 80);
- output.writeUInt32NoTag(starCount);
- }
}
@Override
@@ -192,9 +140,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
if ((bitField0_ & 0x00000001) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(groupId);
}
- if ((bitField0_ & 0x00000002) != 0) {
- size += 1 + ProtoSink.computeUInt32SizeNoTag(starCount);
- }
return size;
}
@@ -210,15 +155,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
groupId = input.readUInt32();
bitField0_ |= 0x00000001;
tag = input.readTag();
- if (tag != 80) {
- break;
- }
- }
- case 80: {
- // starCount
- starCount = input.readUInt32();
- bitField0_ |= 0x00000002;
- tag = input.readTag();
if (tag != 0) {
break;
}
@@ -243,9 +179,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
if ((bitField0_ & 0x00000001) != 0) {
output.writeUInt32(FieldNames.groupId, groupId);
}
- if ((bitField0_ & 0x00000002) != 0) {
- output.writeUInt32(FieldNames.starCount, starCount);
- }
output.endObject();
}
@@ -268,18 +201,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
}
break;
}
- case 2121235933:
- case 2124166370: {
- if (input.isAtField(FieldNames.starCount)) {
- if (!input.trySkipNullValue()) {
- starCount = input.readUInt32();
- bitField0_ |= 0x00000002;
- }
- } else {
- input.skipUnknownField();
- }
- break;
- }
default: {
input.skipUnknownField();
break;
@@ -334,8 +255,6 @@ public final class TakeChallengeRewardCsReqOuterClass {
*/
static class FieldNames {
static final FieldName groupId = FieldName.forField("groupId", "group_id");
-
- static final FieldName starCount = FieldName.forField("starCount", "star_count");
}
}
}
diff --git a/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardScRspOuterClass.java b/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardScRspOuterClass.java
index 412b80c..f334c63 100644
--- a/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardScRspOuterClass.java
+++ b/src/generated/main/emu/lunarcore/proto/TakeChallengeRewardScRspOuterClass.java
@@ -10,6 +10,7 @@ import us.hebi.quickbuf.MessageFactory;
import us.hebi.quickbuf.ProtoMessage;
import us.hebi.quickbuf.ProtoSink;
import us.hebi.quickbuf.ProtoSource;
+import us.hebi.quickbuf.RepeatedMessage;
public final class TakeChallengeRewardScRspOuterClass {
/**
@@ -18,11 +19,6 @@ public final class TakeChallengeRewardScRspOuterClass {
public static final class TakeChallengeRewardScRsp extends ProtoMessage implements Cloneable {
private static final long serialVersionUID = 0L;
- /**
- * optional uint32 star_count = 1;
- */
- private int starCount;
-
/**
* optional uint32 group_id = 6;
*/
@@ -34,9 +30,9 @@ public final class TakeChallengeRewardScRspOuterClass {
private int retcode;
/**
- * optional .ItemList reward = 15;
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
*/
- private final ItemListOuterClass.ItemList reward = ItemListOuterClass.ItemList.newInstance();
+ private final RepeatedMessage takenRewardList = RepeatedMessage.newEmptyInstance(TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo.getFactory());
private TakeChallengeRewardScRsp() {
}
@@ -48,49 +44,12 @@ public final class TakeChallengeRewardScRspOuterClass {
return new TakeChallengeRewardScRsp();
}
- /**
- * optional uint32 star_count = 1;
- * @return whether the starCount field is set
- */
- public boolean hasStarCount() {
- return (bitField0_ & 0x00000001) != 0;
- }
-
- /**
- * optional uint32 star_count = 1;
- * @return this
- */
- public TakeChallengeRewardScRsp clearStarCount() {
- bitField0_ &= ~0x00000001;
- starCount = 0;
- return this;
- }
-
- /**
- * optional uint32 star_count = 1;
- * @return the starCount
- */
- public int getStarCount() {
- return starCount;
- }
-
- /**
- * optional uint32 star_count = 1;
- * @param value the starCount to set
- * @return this
- */
- public TakeChallengeRewardScRsp setStarCount(final int value) {
- bitField0_ |= 0x00000001;
- starCount = value;
- return this;
- }
-
/**
* optional uint32 group_id = 6;
* @return whether the groupId field is set
*/
public boolean hasGroupId() {
- return (bitField0_ & 0x00000002) != 0;
+ return (bitField0_ & 0x00000001) != 0;
}
/**
@@ -98,7 +57,7 @@ public final class TakeChallengeRewardScRspOuterClass {
* @return this
*/
public TakeChallengeRewardScRsp clearGroupId() {
- bitField0_ &= ~0x00000002;
+ bitField0_ &= ~0x00000001;
groupId = 0;
return this;
}
@@ -117,7 +76,7 @@ public final class TakeChallengeRewardScRspOuterClass {
* @return this
*/
public TakeChallengeRewardScRsp setGroupId(final int value) {
- bitField0_ |= 0x00000002;
+ bitField0_ |= 0x00000001;
groupId = value;
return this;
}
@@ -127,7 +86,7 @@ public final class TakeChallengeRewardScRspOuterClass {
* @return whether the retcode field is set
*/
public boolean hasRetcode() {
- return (bitField0_ & 0x00000004) != 0;
+ return (bitField0_ & 0x00000002) != 0;
}
/**
@@ -135,7 +94,7 @@ public final class TakeChallengeRewardScRspOuterClass {
* @return this
*/
public TakeChallengeRewardScRsp clearRetcode() {
- bitField0_ &= ~0x00000004;
+ bitField0_ &= ~0x00000002;
retcode = 0;
return this;
}
@@ -154,45 +113,46 @@ public final class TakeChallengeRewardScRspOuterClass {
* @return this
*/
public TakeChallengeRewardScRsp setRetcode(final int value) {
- bitField0_ |= 0x00000004;
+ bitField0_ |= 0x00000002;
retcode = value;
return this;
}
/**
- * optional .ItemList reward = 15;
- * @return whether the reward field is set
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
+ * @return whether the takenRewardList field is set
*/
- public boolean hasReward() {
- return (bitField0_ & 0x00000008) != 0;
+ public boolean hasTakenRewardList() {
+ return (bitField0_ & 0x00000004) != 0;
}
/**
- * optional .ItemList reward = 15;
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
* @return this
*/
- public TakeChallengeRewardScRsp clearReward() {
- bitField0_ &= ~0x00000008;
- reward.clear();
+ public TakeChallengeRewardScRsp clearTakenRewardList() {
+ bitField0_ &= ~0x00000004;
+ takenRewardList.clear();
return this;
}
/**
- * optional .ItemList reward = 15;
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
*
* This method returns the internal storage object without modifying any has state.
* The returned object should not be modified and be treated as read-only.
*
- * Use {@link #getMutableReward()} if you want to modify it.
+ * Use {@link #getMutableTakenRewardList()} if you want to modify it.
*
* @return internal storage object for reading
*/
- public ItemListOuterClass.ItemList getReward() {
- return reward;
+ public RepeatedMessage getTakenRewardList(
+ ) {
+ return takenRewardList;
}
/**
- * optional .ItemList reward = 15;
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
*
* This method returns the internal storage object and sets the corresponding
* has state. The returned object will become part of this message and its
@@ -200,19 +160,33 @@ public final class TakeChallengeRewardScRspOuterClass {
*
* @return internal storage object for modifications
*/
- public ItemListOuterClass.ItemList getMutableReward() {
- bitField0_ |= 0x00000008;
- return reward;
+ public RepeatedMessage getMutableTakenRewardList(
+ ) {
+ bitField0_ |= 0x00000004;
+ return takenRewardList;
}
/**
- * optional .ItemList reward = 15;
- * @param value the reward to set
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
+ * @param value the takenRewardList to add
* @return this
*/
- public TakeChallengeRewardScRsp setReward(final ItemListOuterClass.ItemList value) {
- bitField0_ |= 0x00000008;
- reward.copyFrom(value);
+ public TakeChallengeRewardScRsp addTakenRewardList(
+ final TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo value) {
+ bitField0_ |= 0x00000004;
+ takenRewardList.add(value);
+ return this;
+ }
+
+ /**
+ * repeated .TakenChallengeRewardInfo taken_reward_list = 10;
+ * @param values the takenRewardList to add
+ * @return this
+ */
+ public TakeChallengeRewardScRsp addAllTakenRewardList(
+ final TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo... values) {
+ bitField0_ |= 0x00000004;
+ takenRewardList.addAll(values);
return this;
}
@@ -221,10 +195,9 @@ public final class TakeChallengeRewardScRspOuterClass {
cachedSize = other.cachedSize;
if ((bitField0_ | other.bitField0_) != 0) {
bitField0_ = other.bitField0_;
- starCount = other.starCount;
groupId = other.groupId;
retcode = other.retcode;
- reward.copyFrom(other.reward);
+ takenRewardList.copyFrom(other.takenRewardList);
}
return this;
}
@@ -235,17 +208,14 @@ public final class TakeChallengeRewardScRspOuterClass {
return this;
}
cachedSize = -1;
- if (other.hasStarCount()) {
- setStarCount(other.starCount);
- }
if (other.hasGroupId()) {
setGroupId(other.groupId);
}
if (other.hasRetcode()) {
setRetcode(other.retcode);
}
- if (other.hasReward()) {
- getMutableReward().mergeFrom(other.reward);
+ if (other.hasTakenRewardList()) {
+ getMutableTakenRewardList().addAll(other.takenRewardList);
}
return this;
}
@@ -257,10 +227,9 @@ public final class TakeChallengeRewardScRspOuterClass {
}
cachedSize = -1;
bitField0_ = 0;
- starCount = 0;
groupId = 0;
retcode = 0;
- reward.clear();
+ takenRewardList.clear();
return this;
}
@@ -271,7 +240,7 @@ public final class TakeChallengeRewardScRspOuterClass {
}
cachedSize = -1;
bitField0_ = 0;
- reward.clearQuick();
+ takenRewardList.clearQuick();
return this;
}
@@ -285,29 +254,26 @@ public final class TakeChallengeRewardScRspOuterClass {
}
TakeChallengeRewardScRsp other = (TakeChallengeRewardScRsp) o;
return bitField0_ == other.bitField0_
- && (!hasStarCount() || starCount == other.starCount)
&& (!hasGroupId() || groupId == other.groupId)
&& (!hasRetcode() || retcode == other.retcode)
- && (!hasReward() || reward.equals(other.reward));
+ && (!hasTakenRewardList() || takenRewardList.equals(other.takenRewardList));
}
@Override
public void writeTo(final ProtoSink output) throws IOException {
if ((bitField0_ & 0x00000001) != 0) {
- output.writeRawByte((byte) 8);
- output.writeUInt32NoTag(starCount);
- }
- if ((bitField0_ & 0x00000002) != 0) {
output.writeRawByte((byte) 48);
output.writeUInt32NoTag(groupId);
}
- if ((bitField0_ & 0x00000004) != 0) {
+ if ((bitField0_ & 0x00000002) != 0) {
output.writeRawByte((byte) 112);
output.writeUInt32NoTag(retcode);
}
- if ((bitField0_ & 0x00000008) != 0) {
- output.writeRawByte((byte) 122);
- output.writeMessageNoTag(reward);
+ if ((bitField0_ & 0x00000004) != 0) {
+ for (int i = 0; i < takenRewardList.length(); i++) {
+ output.writeRawByte((byte) 82);
+ output.writeMessageNoTag(takenRewardList.get(i));
+ }
}
}
@@ -315,16 +281,13 @@ public final class TakeChallengeRewardScRspOuterClass {
protected int computeSerializedSize() {
int size = 0;
if ((bitField0_ & 0x00000001) != 0) {
- size += 1 + ProtoSink.computeUInt32SizeNoTag(starCount);
- }
- if ((bitField0_ & 0x00000002) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(groupId);
}
- if ((bitField0_ & 0x00000004) != 0) {
+ if ((bitField0_ & 0x00000002) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(retcode);
}
- if ((bitField0_ & 0x00000008) != 0) {
- size += 1 + ProtoSink.computeMessageSizeNoTag(reward);
+ if ((bitField0_ & 0x00000004) != 0) {
+ size += (1 * takenRewardList.length()) + ProtoSink.computeRepeatedMessageSizeNoTag(takenRewardList);
}
return size;
}
@@ -336,19 +299,10 @@ public final class TakeChallengeRewardScRspOuterClass {
int tag = input.readTag();
while (true) {
switch (tag) {
- case 8: {
- // starCount
- starCount = input.readUInt32();
- bitField0_ |= 0x00000001;
- tag = input.readTag();
- if (tag != 48) {
- break;
- }
- }
case 48: {
// groupId
groupId = input.readUInt32();
- bitField0_ |= 0x00000002;
+ bitField0_ |= 0x00000001;
tag = input.readTag();
if (tag != 112) {
break;
@@ -357,17 +311,16 @@ public final class TakeChallengeRewardScRspOuterClass {
case 112: {
// retcode
retcode = input.readUInt32();
- bitField0_ |= 0x00000004;
+ bitField0_ |= 0x00000002;
tag = input.readTag();
- if (tag != 122) {
+ if (tag != 82) {
break;
}
}
- case 122: {
- // reward
- input.readMessage(reward);
- bitField0_ |= 0x00000008;
- tag = input.readTag();
+ case 82: {
+ // takenRewardList
+ tag = input.readRepeatedMessage(takenRewardList, tag);
+ bitField0_ |= 0x00000004;
if (tag != 0) {
break;
}
@@ -390,16 +343,13 @@ public final class TakeChallengeRewardScRspOuterClass {
public void writeTo(final JsonSink output) throws IOException {
output.beginObject();
if ((bitField0_ & 0x00000001) != 0) {
- output.writeUInt32(FieldNames.starCount, starCount);
- }
- if ((bitField0_ & 0x00000002) != 0) {
output.writeUInt32(FieldNames.groupId, groupId);
}
- if ((bitField0_ & 0x00000004) != 0) {
+ if ((bitField0_ & 0x00000002) != 0) {
output.writeUInt32(FieldNames.retcode, retcode);
}
- if ((bitField0_ & 0x00000008) != 0) {
- output.writeMessage(FieldNames.reward, reward);
+ if ((bitField0_ & 0x00000004) != 0) {
+ output.writeRepeatedMessage(FieldNames.takenRewardList, takenRewardList);
}
output.endObject();
}
@@ -411,24 +361,12 @@ public final class TakeChallengeRewardScRspOuterClass {
}
while (!input.isAtEnd()) {
switch (input.readFieldHash()) {
- case 2121235933:
- case 2124166370: {
- if (input.isAtField(FieldNames.starCount)) {
- if (!input.trySkipNullValue()) {
- starCount = input.readUInt32();
- bitField0_ |= 0x00000001;
- }
- } else {
- input.skipUnknownField();
- }
- break;
- }
case 293428218:
case 506361563: {
if (input.isAtField(FieldNames.groupId)) {
if (!input.trySkipNullValue()) {
groupId = input.readUInt32();
- bitField0_ |= 0x00000002;
+ bitField0_ |= 0x00000001;
}
} else {
input.skipUnknownField();
@@ -439,18 +377,19 @@ public final class TakeChallengeRewardScRspOuterClass {
if (input.isAtField(FieldNames.retcode)) {
if (!input.trySkipNullValue()) {
retcode = input.readUInt32();
- bitField0_ |= 0x00000004;
+ bitField0_ |= 0x00000002;
}
} else {
input.skipUnknownField();
}
break;
}
- case -934326481: {
- if (input.isAtField(FieldNames.reward)) {
+ case -600805228:
+ case 1027082294: {
+ if (input.isAtField(FieldNames.takenRewardList)) {
if (!input.trySkipNullValue()) {
- input.readMessage(reward);
- bitField0_ |= 0x00000008;
+ input.readRepeatedMessage(takenRewardList);
+ bitField0_ |= 0x00000004;
}
} else {
input.skipUnknownField();
@@ -510,13 +449,11 @@ public final class TakeChallengeRewardScRspOuterClass {
* Contains name constants used for serializing JSON
*/
static class FieldNames {
- static final FieldName starCount = FieldName.forField("starCount", "star_count");
-
static final FieldName groupId = FieldName.forField("groupId", "group_id");
static final FieldName retcode = FieldName.forField("retcode");
- static final FieldName reward = FieldName.forField("reward");
+ static final FieldName takenRewardList = FieldName.forField("takenRewardList", "taken_reward_list");
}
}
}
diff --git a/src/generated/main/emu/lunarcore/proto/TakenChallengeRewardInfoOuterClass.java b/src/generated/main/emu/lunarcore/proto/TakenChallengeRewardInfoOuterClass.java
new file mode 100644
index 0000000..dfb530d
--- /dev/null
+++ b/src/generated/main/emu/lunarcore/proto/TakenChallengeRewardInfoOuterClass.java
@@ -0,0 +1,361 @@
+// Code generated by protocol buffer compiler. Do not edit!
+package emu.lunarcore.proto;
+
+import java.io.IOException;
+import us.hebi.quickbuf.FieldName;
+import us.hebi.quickbuf.InvalidProtocolBufferException;
+import us.hebi.quickbuf.JsonSink;
+import us.hebi.quickbuf.JsonSource;
+import us.hebi.quickbuf.MessageFactory;
+import us.hebi.quickbuf.ProtoMessage;
+import us.hebi.quickbuf.ProtoSink;
+import us.hebi.quickbuf.ProtoSource;
+
+public final class TakenChallengeRewardInfoOuterClass {
+ /**
+ * Protobuf type {@code TakenChallengeRewardInfo}
+ */
+ public static final class TakenChallengeRewardInfo extends ProtoMessage implements Cloneable {
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * optional uint32 star_count = 9;
+ */
+ private int starCount;
+
+ /**
+ * optional .ItemList reward = 14;
+ */
+ private final ItemListOuterClass.ItemList reward = ItemListOuterClass.ItemList.newInstance();
+
+ private TakenChallengeRewardInfo() {
+ }
+
+ /**
+ * @return a new empty instance of {@code TakenChallengeRewardInfo}
+ */
+ public static TakenChallengeRewardInfo newInstance() {
+ return new TakenChallengeRewardInfo();
+ }
+
+ /**
+ * optional uint32 star_count = 9;
+ * @return whether the starCount field is set
+ */
+ public boolean hasStarCount() {
+ return (bitField0_ & 0x00000001) != 0;
+ }
+
+ /**
+ * optional uint32 star_count = 9;
+ * @return this
+ */
+ public TakenChallengeRewardInfo clearStarCount() {
+ bitField0_ &= ~0x00000001;
+ starCount = 0;
+ return this;
+ }
+
+ /**
+ * optional uint32 star_count = 9;
+ * @return the starCount
+ */
+ public int getStarCount() {
+ return starCount;
+ }
+
+ /**
+ * optional uint32 star_count = 9;
+ * @param value the starCount to set
+ * @return this
+ */
+ public TakenChallengeRewardInfo setStarCount(final int value) {
+ bitField0_ |= 0x00000001;
+ starCount = value;
+ return this;
+ }
+
+ /**
+ * optional .ItemList reward = 14;
+ * @return whether the reward field is set
+ */
+ public boolean hasReward() {
+ return (bitField0_ & 0x00000002) != 0;
+ }
+
+ /**
+ * optional .ItemList reward = 14;
+ * @return this
+ */
+ public TakenChallengeRewardInfo clearReward() {
+ bitField0_ &= ~0x00000002;
+ reward.clear();
+ return this;
+ }
+
+ /**
+ * optional .ItemList reward = 14;
+ *
+ * This method returns the internal storage object without modifying any has state.
+ * The returned object should not be modified and be treated as read-only.
+ *
+ * Use {@link #getMutableReward()} if you want to modify it.
+ *
+ * @return internal storage object for reading
+ */
+ public ItemListOuterClass.ItemList getReward() {
+ return reward;
+ }
+
+ /**
+ * optional .ItemList reward = 14;
+ *
+ * This method returns the internal storage object and sets the corresponding
+ * has state. The returned object will become part of this message and its
+ * contents may be modified as long as the has state is not cleared.
+ *
+ * @return internal storage object for modifications
+ */
+ public ItemListOuterClass.ItemList getMutableReward() {
+ bitField0_ |= 0x00000002;
+ return reward;
+ }
+
+ /**
+ * optional .ItemList reward = 14;
+ * @param value the reward to set
+ * @return this
+ */
+ public TakenChallengeRewardInfo setReward(final ItemListOuterClass.ItemList value) {
+ bitField0_ |= 0x00000002;
+ reward.copyFrom(value);
+ return this;
+ }
+
+ @Override
+ public TakenChallengeRewardInfo copyFrom(final TakenChallengeRewardInfo other) {
+ cachedSize = other.cachedSize;
+ if ((bitField0_ | other.bitField0_) != 0) {
+ bitField0_ = other.bitField0_;
+ starCount = other.starCount;
+ reward.copyFrom(other.reward);
+ }
+ return this;
+ }
+
+ @Override
+ public TakenChallengeRewardInfo mergeFrom(final TakenChallengeRewardInfo other) {
+ if (other.isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ if (other.hasStarCount()) {
+ setStarCount(other.starCount);
+ }
+ if (other.hasReward()) {
+ getMutableReward().mergeFrom(other.reward);
+ }
+ return this;
+ }
+
+ @Override
+ public TakenChallengeRewardInfo clear() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ starCount = 0;
+ reward.clear();
+ return this;
+ }
+
+ @Override
+ public TakenChallengeRewardInfo clearQuick() {
+ if (isEmpty()) {
+ return this;
+ }
+ cachedSize = -1;
+ bitField0_ = 0;
+ reward.clearQuick();
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof TakenChallengeRewardInfo)) {
+ return false;
+ }
+ TakenChallengeRewardInfo other = (TakenChallengeRewardInfo) o;
+ return bitField0_ == other.bitField0_
+ && (!hasStarCount() || starCount == other.starCount)
+ && (!hasReward() || reward.equals(other.reward));
+ }
+
+ @Override
+ public void writeTo(final ProtoSink output) throws IOException {
+ if ((bitField0_ & 0x00000001) != 0) {
+ output.writeRawByte((byte) 72);
+ output.writeUInt32NoTag(starCount);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ output.writeRawByte((byte) 114);
+ output.writeMessageNoTag(reward);
+ }
+ }
+
+ @Override
+ protected int computeSerializedSize() {
+ int size = 0;
+ if ((bitField0_ & 0x00000001) != 0) {
+ size += 1 + ProtoSink.computeUInt32SizeNoTag(starCount);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ size += 1 + ProtoSink.computeMessageSizeNoTag(reward);
+ }
+ return size;
+ }
+
+ @Override
+ @SuppressWarnings("fallthrough")
+ public TakenChallengeRewardInfo mergeFrom(final ProtoSource input) throws IOException {
+ // Enabled Fall-Through Optimization (QuickBuffers)
+ int tag = input.readTag();
+ while (true) {
+ switch (tag) {
+ case 72: {
+ // starCount
+ starCount = input.readUInt32();
+ bitField0_ |= 0x00000001;
+ tag = input.readTag();
+ if (tag != 114) {
+ break;
+ }
+ }
+ case 114: {
+ // reward
+ input.readMessage(reward);
+ bitField0_ |= 0x00000002;
+ tag = input.readTag();
+ if (tag != 0) {
+ break;
+ }
+ }
+ case 0: {
+ return this;
+ }
+ default: {
+ if (!input.skipField(tag)) {
+ return this;
+ }
+ tag = input.readTag();
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeTo(final JsonSink output) throws IOException {
+ output.beginObject();
+ if ((bitField0_ & 0x00000001) != 0) {
+ output.writeUInt32(FieldNames.starCount, starCount);
+ }
+ if ((bitField0_ & 0x00000002) != 0) {
+ output.writeMessage(FieldNames.reward, reward);
+ }
+ output.endObject();
+ }
+
+ @Override
+ public TakenChallengeRewardInfo mergeFrom(final JsonSource input) throws IOException {
+ if (!input.beginObject()) {
+ return this;
+ }
+ while (!input.isAtEnd()) {
+ switch (input.readFieldHash()) {
+ case 2121235933:
+ case 2124166370: {
+ if (input.isAtField(FieldNames.starCount)) {
+ if (!input.trySkipNullValue()) {
+ starCount = input.readUInt32();
+ bitField0_ |= 0x00000001;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ case -934326481: {
+ if (input.isAtField(FieldNames.reward)) {
+ if (!input.trySkipNullValue()) {
+ input.readMessage(reward);
+ bitField0_ |= 0x00000002;
+ }
+ } else {
+ input.skipUnknownField();
+ }
+ break;
+ }
+ default: {
+ input.skipUnknownField();
+ break;
+ }
+ }
+ }
+ input.endObject();
+ return this;
+ }
+
+ @Override
+ public TakenChallengeRewardInfo clone() {
+ return new TakenChallengeRewardInfo().copyFrom(this);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ((bitField0_) == 0);
+ }
+
+ public static TakenChallengeRewardInfo parseFrom(final byte[] data) throws
+ InvalidProtocolBufferException {
+ return ProtoMessage.mergeFrom(new TakenChallengeRewardInfo(), data).checkInitialized();
+ }
+
+ public static TakenChallengeRewardInfo parseFrom(final ProtoSource input) throws IOException {
+ return ProtoMessage.mergeFrom(new TakenChallengeRewardInfo(), input).checkInitialized();
+ }
+
+ public static TakenChallengeRewardInfo parseFrom(final JsonSource input) throws IOException {
+ return ProtoMessage.mergeFrom(new TakenChallengeRewardInfo(), input).checkInitialized();
+ }
+
+ /**
+ * @return factory for creating TakenChallengeRewardInfo messages
+ */
+ public static MessageFactory getFactory() {
+ return TakenChallengeRewardInfoFactory.INSTANCE;
+ }
+
+ private enum TakenChallengeRewardInfoFactory implements MessageFactory {
+ INSTANCE;
+
+ @Override
+ public TakenChallengeRewardInfo create() {
+ return TakenChallengeRewardInfo.newInstance();
+ }
+ }
+
+ /**
+ * Contains name constants used for serializing JSON
+ */
+ static class FieldNames {
+ static final FieldName starCount = FieldName.forField("starCount", "star_count");
+
+ static final FieldName reward = FieldName.forField("reward");
+ }
+ }
+}
diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java
index 8836946..b526b35 100644
--- a/src/main/java/emu/lunarcore/data/GameData.java
+++ b/src/main/java/emu/lunarcore/data/GameData.java
@@ -46,7 +46,6 @@ public class GameData {
@Getter private static Int2ObjectMap challengeGroupExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap challengeExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap challengeTargetExcelMap = new Int2ObjectOpenHashMap<>();
- private static Int2ObjectMap challengeRewardExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap rogueManagerExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap rogueTalentExcelMap = new Int2ObjectOpenHashMap<>();
@@ -221,10 +220,6 @@ public class GameData {
return monsterDropExcelMap.get((monsterNpcId << 4) + worldLevel);
}
- public static ChallengeRewardExcel getChallengeRewardExcel(int groupId, int starCount) {
- return challengeRewardExcelMap.get((groupId << 16) + starCount);
- }
-
public static RogueMapExcel getRogueMapExcel(int rogueMapId, int siteId) {
return rogueMapExcelMap.get((rogueMapId << 8) + siteId);
}
diff --git a/src/main/java/emu/lunarcore/data/GameDepot.java b/src/main/java/emu/lunarcore/data/GameDepot.java
index 9264c17..7ce3d9c 100644
--- a/src/main/java/emu/lunarcore/data/GameDepot.java
+++ b/src/main/java/emu/lunarcore/data/GameDepot.java
@@ -24,6 +24,9 @@ public class GameDepot {
// Relics
private static Int2ObjectMap> relicMainAffixDepot = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap> relicSubAffixDepot = new Int2ObjectOpenHashMap<>();
+
+ // Challenges
+ @Getter private static Int2ObjectMap> challengeRewardLines = new Int2ObjectOpenHashMap<>();
// Rogue
@Getter private static Int2ObjectMap rogueMapGen = new Int2ObjectOpenHashMap<>();
diff --git a/src/main/java/emu/lunarcore/data/common/ItemParam.java b/src/main/java/emu/lunarcore/data/common/ItemParam.java
index 7f59e19..faecb89 100644
--- a/src/main/java/emu/lunarcore/data/common/ItemParam.java
+++ b/src/main/java/emu/lunarcore/data/common/ItemParam.java
@@ -3,6 +3,7 @@ package emu.lunarcore.data.common;
import com.google.gson.annotations.SerializedName;
import emu.lunarcore.proto.ItemCostOuterClass.ItemCost;
+import emu.lunarcore.proto.ItemOuterClass.Item;
import lombok.Getter;
@Getter
@@ -48,4 +49,10 @@ public class ItemParam {
public static enum ItemParamType {
UNKNOWN, PILE, UNIQUE;
}
+
+ public Item toProto() {
+ return Item.newInstance()
+ .setItemId(this.getId())
+ .setNum(this.getCount());
+ }
}
diff --git a/src/main/java/emu/lunarcore/data/excel/ChallengeGroupExcel.java b/src/main/java/emu/lunarcore/data/excel/ChallengeGroupExcel.java
index 7d4a9c3..3fb1611 100644
--- a/src/main/java/emu/lunarcore/data/excel/ChallengeGroupExcel.java
+++ b/src/main/java/emu/lunarcore/data/excel/ChallengeGroupExcel.java
@@ -5,7 +5,7 @@ import emu.lunarcore.data.ResourceType;
import lombok.Getter;
@Getter
-@ResourceType(name = {"ChallengeGroupConfig.json"})
+@ResourceType(name = {"ChallengeGroupConfig.json", "ChallengeStoryGroupConfig.json"})
public class ChallengeGroupExcel extends GameResource {
private int GroupID;
private int RewardLineGroupID;
diff --git a/src/main/java/emu/lunarcore/data/excel/ChallengeRewardExcel.java b/src/main/java/emu/lunarcore/data/excel/ChallengeRewardExcel.java
index c111fad..a0d5760 100644
--- a/src/main/java/emu/lunarcore/data/excel/ChallengeRewardExcel.java
+++ b/src/main/java/emu/lunarcore/data/excel/ChallengeRewardExcel.java
@@ -1,11 +1,15 @@
package emu.lunarcore.data.excel;
+import java.util.ArrayList;
+
+import emu.lunarcore.data.GameDepot;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
+import emu.lunarcore.data.ResourceType.LoadPriority;
import lombok.Getter;
@Getter
-@ResourceType(name = {"ChallengeMazeRewardLine.json"})
+@ResourceType(name = {"ChallengeMazeRewardLine.json", "ChallengeStoryRewardLine.json"}, loadPriority = LoadPriority.LOW)
public class ChallengeRewardExcel extends GameResource {
private int GroupID;
private int StarCount;
@@ -15,4 +19,10 @@ public class ChallengeRewardExcel extends GameResource {
public int getId() {
return (GroupID << 16) + StarCount;
}
+
+ @Override
+ public void onLoad() {
+ var rewardLine = GameDepot.getChallengeRewardLines().computeIfAbsent(GroupID, id -> new ArrayList<>());
+ rewardLine.add(this);
+ }
}
diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java
index 2635bdd..687a59e 100644
--- a/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java
+++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java
@@ -1,18 +1,21 @@
package emu.lunarcore.game.challenge;
+import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import emu.lunarcore.GameConstants;
import emu.lunarcore.LunarCore;
import emu.lunarcore.data.GameData;
+import emu.lunarcore.data.GameDepot;
+import emu.lunarcore.data.common.ItemParam;
import emu.lunarcore.data.excel.ChallengeExcel;
-import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.player.BasePlayerManager;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.player.lineup.PlayerLineup;
import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType;
import emu.lunarcore.proto.StartChallengeStoryBuffInfoOuterClass.StartChallengeStoryBuffInfo;
+import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
import emu.lunarcore.server.packet.Retcode;
import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
@@ -119,18 +122,15 @@ public class ChallengeManager extends BasePlayerManager {
info.save();
}
- public synchronized List takeRewards(int groupId, int starCount) {
+ public synchronized List takeRewards(int groupId) {
// Get excels
var challengeGroup = GameData.getChallengeGroupExcelMap().get(groupId);
if (challengeGroup == null) return null;
- var challengeReward = GameData.getChallengeRewardExcel(challengeGroup.getRewardLineGroupID(), starCount);
- if (challengeReward == null) return null;
+ var challengeRewardLine = GameDepot.getChallengeRewardLines().get(challengeGroup.getRewardLineGroupID());
+ if (challengeRewardLine == null) return null;
- var rewardExcel = GameData.getRewardExcelMap().get(challengeReward.getRewardID());
- if (rewardExcel == null) return null;
-
- // Validate
+ // Get total stars
int totalStars = 0;
for (ChallengeHistory ch : this.getHistory().values()) {
// Legacy compatibility
@@ -148,22 +148,47 @@ public class ChallengeManager extends BasePlayerManager {
}
}
- // Check if the player has enough stars
- if (totalStars < starCount) {
- return null;
+ // Rewards
+ List rewardInfos = new ArrayList<>();
+ List rewardItems = new ArrayList<>();
+
+ // Get challenge rewards
+ for (var challengeReward : challengeRewardLine) {
+ // Check if we have enough stars to take this reward
+ if (totalStars < challengeReward.getStarCount()) {
+ continue;
+ }
+
+ // Get reward info
+ var reward = this.getTakenRewards().computeIfAbsent(groupId, id -> new ChallengeGroupReward(getPlayer(), groupId));
+
+ // Check if reward has been taken
+ if (reward.hasTakenReward(challengeReward.getStarCount())) {
+ continue;
+ }
+
+ // Set reward as taken
+ reward.setTakenReward(challengeReward.getStarCount());
+
+ // Get reward excel
+ var rewardExcel = GameData.getRewardExcelMap().get(challengeReward.getRewardID());
+ if (rewardExcel == null) continue;
+
+ // Add rewards
+ var proto = TakenChallengeRewardInfo.newInstance()
+ .setStarCount(challengeReward.getStarCount());
+
+ for (ItemParam itemParam : rewardExcel.getRewards()) {
+ proto.getMutableReward().addItemList(itemParam.toProto());
+ rewardItems.add(itemParam);
+ }
+
+ rewardInfos.add(proto);
}
- // Get reward info
- var reward = this.getTakenRewards().computeIfAbsent(groupId, id -> new ChallengeGroupReward(getPlayer(), groupId));
-
- if (reward.hasTakenReward(starCount)) {
- return null;
- }
-
- reward.setTakenReward(starCount);
-
// Add items to inventory
- return getPlayer().getInventory().addItemParams(rewardExcel.getRewards());
+ getPlayer().getInventory().addItemParams(rewardItems);
+ return rewardInfos;
}
public void loadFromDatabase() {
diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeChallengeRewardCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeChallengeRewardCsReq.java
index af2b597..0f07190 100644
--- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeChallengeRewardCsReq.java
+++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeChallengeRewardCsReq.java
@@ -2,8 +2,8 @@ package emu.lunarcore.server.packet.recv;
import java.util.List;
-import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.TakeChallengeRewardCsReqOuterClass.TakeChallengeRewardCsReq;
+import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
@@ -17,8 +17,8 @@ public class HandlerTakeChallengeRewardCsReq extends PacketHandler {
public void handle(GameSession session, byte[] data) throws Exception {
var req = TakeChallengeRewardCsReq.parseFrom(data);
- List rewards = session.getPlayer().getChallengeManager().takeRewards(req.getGroupId(), req.getStarCount());
- session.send(new PacketTakeChallengeRewardScRsp(req.getGroupId(), req.getStarCount(), rewards));
+ List rewardInfos = session.getPlayer().getChallengeManager().takeRewards(req.getGroupId());
+ session.send(new PacketTakeChallengeRewardScRsp(req.getGroupId(), rewardInfos));
}
}
diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketTakeChallengeRewardScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketTakeChallengeRewardScRsp.java
index 6a26604..e8a74fa 100644
--- a/src/main/java/emu/lunarcore/server/packet/send/PacketTakeChallengeRewardScRsp.java
+++ b/src/main/java/emu/lunarcore/server/packet/send/PacketTakeChallengeRewardScRsp.java
@@ -2,24 +2,23 @@ package emu.lunarcore.server.packet.send;
import java.util.Collection;
-import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.TakeChallengeRewardScRspOuterClass.TakeChallengeRewardScRsp;
+import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketTakeChallengeRewardScRsp extends BasePacket {
- public PacketTakeChallengeRewardScRsp(int groupId, int starCount, Collection rewards) {
+ public PacketTakeChallengeRewardScRsp(int groupId, Collection rewards) {
super(CmdId.TakeChallengeRewardScRsp);
var data = TakeChallengeRewardScRsp.newInstance();
if (rewards != null) {
- data.setGroupId(groupId)
- .setStarCount(starCount);
+ data.setGroupId(groupId);
- for (GameItem item : rewards) {
- data.getMutableReward().addItemList(item.toProto());
+ for (var rewardInfo : rewards) {
+ data.getMutableTakenRewardList().add(rewardInfo);
}
} else {
data.setRetcode(1);