Skip to content

Commit fbe2b13

Browse files
Fixes for alchemy dude's quest (#2352)
* Add drops for gadgets Gadgets only have drop_id when they are not chests (chest_drop_id). When drop_id is not set (0), handleChestDrop quickly exits * Implement QUEST_COND_ITEM_GIVING_FINISHED Took the oppertunity to Rename ContentFinishGivingItem to ItemGiving * Store accept conditions like fail and finish content are Took the oppertunity to clean up some old code as well conditions are stored in QuestManager * Update src/main/java/emu/grasscutter/game/quest/QuestManager.java Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> * Update ConditionItemGivingFinished.java --------- Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
1 parent 47c96fd commit fbe2b13

File tree

9 files changed

+55
-76
lines changed

9 files changed

+55
-76
lines changed

src/main/java/emu/grasscutter/game/quest/GameMainQuest.java

Lines changed: 2 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -169,23 +169,6 @@ public void finish() {
169169
this.state = ParentQuestState.PARENT_QUEST_STATE_FINISHED;
170170
}
171171

172-
/*
173-
* We also need to check for unfinished childQuests in this MainQuest
174-
* force them to complete and send a packet about this to the user,
175-
* because at some points there are special "invisible" child quests that control
176-
* some situations.
177-
*
178-
* For example, subQuest 35312 is responsible for the event of leaving the territory
179-
* of the island with a statue and automatically returns the character back,
180-
* quest 35311 completes the main quest line 353 and starts 35501 from
181-
* new MainQuest 355 but if 35312 is not completed after the completion
182-
* of the main quest 353 - the character will not be able to leave place
183-
* (return again and again)
184-
*/
185-
// this.getChildQuests().values().stream()
186-
// .filter(p -> p.state != QuestState.QUEST_STATE_FINISHED)
187-
// .forEach(GameQuest::finish);
188-
189172
this.getOwner().getSession().send(new PacketFinishedParentQuestUpdateNotify(this));
190173
this.getOwner().getSession().send(new PacketCodexDataUpdateNotify(this));
191174

@@ -383,46 +366,6 @@ public void checkProgress() {
383366
}
384367
}
385368

386-
public void tryAcceptSubQuests(QuestCond condType, String paramStr, int... params) {
387-
try {
388-
List<GameQuest> subQuestsWithCond =
389-
getChildQuests().values().stream()
390-
.filter(
391-
p ->
392-
p.getState() == QuestState.QUEST_STATE_UNSTARTED
393-
|| p.getState() == QuestState.UNFINISHED)
394-
.filter(
395-
p ->
396-
p.getQuestData().getAcceptCond().stream()
397-
.anyMatch(
398-
q ->
399-
condType == QuestCond.QUEST_COND_NONE || q.getType() == condType))
400-
.toList();
401-
var questSystem = owner.getServer().getQuestSystem();
402-
403-
for (GameQuest subQuestWithCond : subQuestsWithCond) {
404-
var acceptCond = subQuestWithCond.getQuestData().getAcceptCond();
405-
int[] accept = new int[acceptCond.size()];
406-
407-
for (int i = 0; i < subQuestWithCond.getQuestData().getAcceptCond().size(); i++) {
408-
var condition = acceptCond.get(i);
409-
boolean result =
410-
questSystem.triggerCondition(
411-
getOwner(), subQuestWithCond.getQuestData(), condition, paramStr, params);
412-
accept[i] = result ? 1 : 0;
413-
}
414-
415-
boolean shouldAccept =
416-
LogicType.calculate(subQuestWithCond.getQuestData().getAcceptCondComb(), accept);
417-
418-
if (shouldAccept) subQuestWithCond.start();
419-
}
420-
this.save();
421-
} catch (Exception e) {
422-
Grasscutter.getLogger().error("An error occurred while trying to accept quest.", e);
423-
}
424-
}
425-
426369
public void tryFailSubQuests(QuestContent condType, String paramStr, int... params) {
427370
try {
428371
List<GameQuest> subQuestsWithCond =
@@ -437,15 +380,15 @@ public void tryFailSubQuests(QuestContent condType, String paramStr, int... para
437380
for (GameQuest subQuestWithCond : subQuestsWithCond) {
438381
val failCond = subQuestWithCond.getQuestData().getFailCond();
439382

440-
for (int i = 0; i < subQuestWithCond.getQuestData().getFailCond().size(); i++) {
383+
for (int i = 0; i < failCond.size(); i++) {
441384
val condition = failCond.get(i);
442385
if (condition.getType() == condType) {
443386
boolean result =
444387
this.getOwner()
445388
.getServer()
446389
.getQuestSystem()
447390
.triggerContent(subQuestWithCond, condition, paramStr, params);
448-
subQuestWithCond.getFailProgressList()[i] = result ? 1 : 0;
391+
subQuestWithCond.setFailProgress(i, result ? 1 : 0);
449392
if (result) {
450393
getOwner().getSession().send(new PacketQuestProgressUpdateNotify(subQuestWithCond));
451394
}

src/main/java/emu/grasscutter/game/quest/GameQuest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ public void setFailProgress(int index, int value) {
158158
public boolean clearProgress(boolean notifyDelete) {
159159
// TODO improve
160160
var oldState = state;
161+
if (questData.getAcceptCond() != null && questData.getAcceptCond().size() != 0) {
162+
this.getMainQuest().getQuestManager().getAcceptProgressLists().put(this.getSubQuestId(), new int[questData.getAcceptCond().size()]);
163+
}
164+
161165
if (questData.getFinishCond() != null && questData.getFinishCond().size() != 0) {
162166
for (var condition : questData.getFinishCond()) {
163167
if (condition.getType() == QuestContent.QUEST_CONTENT_LUA_NOTIFY) {

src/main/java/emu/grasscutter/game/quest/QuestManager.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public final class QuestManager extends BasePlayerManager {
2626
@Getter private final Player player;
2727

2828
@Getter private final Int2ObjectMap<GameMainQuest> mainQuests;
29+
@Getter private Int2ObjectMap<int[]> acceptProgressLists;
2930
@Getter private final List<Integer> loggedQuests;
3031

3132
private long lastHourCheck = 0;
@@ -52,6 +53,7 @@ public QuestManager(Player player) {
5253
this.player = player;
5354
this.mainQuests = new Int2ObjectOpenHashMap<>();
5455
this.loggedQuests = new ArrayList<>();
56+
this.acceptProgressLists = new Int2ObjectOpenHashMap<>();
5557

5658
if (DEBUG) {
5759
this.loggedQuests.addAll(
@@ -484,8 +486,6 @@ public void queueEvent(QuestCond condType, String paramStr, int... params) {
484486
eventExecutor.submit(() -> triggerEvent(condType, paramStr, params));
485487
}
486488

487-
// QUEST_EXEC are handled directly by each subQuest
488-
489489
public void triggerEvent(QuestCond condType, String paramStr, int... params) {
490490
Grasscutter.getLogger().trace("Trigger Event {}, {}, {}", condType, paramStr, params);
491491
var potentialQuests = GameData.getQuestDataByConditions(condType, params[0], paramStr);
@@ -502,15 +502,17 @@ public void triggerEvent(QuestCond condType, String paramStr, int... params) {
502502
return;
503503
}
504504
val acceptCond = questData.getAcceptCond();
505-
int[] accept = new int[acceptCond.size()];
505+
acceptProgressLists.putIfAbsent(questData.getId(), new int[acceptCond.size()]);
506506
for (int i = 0; i < acceptCond.size(); i++) {
507507
val condition = acceptCond.get(i);
508-
boolean result =
509-
questSystem.triggerCondition(owner, questData, condition, paramStr, params);
510-
accept[i] = result ? 1 : 0;
508+
if (condition.getType() == condType) {
509+
boolean result =
510+
questSystem.triggerCondition(owner, questData, condition, paramStr, params);
511+
acceptProgressLists.get(questData.getId())[i] = result ? 1 : 0;
512+
}
511513
}
512514

513-
boolean shouldAccept = LogicType.calculate(questData.getAcceptCondComb(), accept);
515+
boolean shouldAccept = LogicType.calculate(questData.getAcceptCondComb(), acceptProgressLists.get(questData.getId()));
514516
if (this.loggedQuests.contains(questData.getId())) {
515517
Grasscutter.getLogger()
516518
.debug(
@@ -522,7 +524,7 @@ public void triggerEvent(QuestCond condType, String paramStr, int... params) {
522524
Arrays.stream(params)
523525
.mapToObj(String::valueOf)
524526
.collect(Collectors.joining(", ")));
525-
for (var i = 0; i < accept.length; i++) {
527+
for (var i = 0; i < acceptCond.size(); i++) {
526528
var condition = acceptCond.get(i);
527529
Grasscutter.getLogger()
528530
.debug(
@@ -532,14 +534,14 @@ public void triggerEvent(QuestCond condType, String paramStr, int... params) {
532534
.filter(value -> value > 0)
533535
.mapToObj(String::valueOf)
534536
.collect(Collectors.joining(", ")),
535-
accept[i] == 1 ? "success" : "failure");
537+
acceptProgressLists.get(questData.getId())[i] == 1 ? "success" : "failure");
536538
}
537539
}
538540

539541
if (shouldAccept) {
540542
GameQuest quest = owner.getQuestManager().addQuest(questData);
541543
Grasscutter.getLogger()
542-
.debug("Added quest {} result {}", questData.getSubId(), quest != null);
544+
.debug("Added quest {}", questData.getSubId());
543545
}
544546
});
545547
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package emu.grasscutter.game.quest.conditions;
2+
3+
import emu.grasscutter.data.excels.quest.QuestData;
4+
import emu.grasscutter.game.player.Player;
5+
import emu.grasscutter.game.quest.QuestValueCond;
6+
import emu.grasscutter.game.quest.enums.QuestCond;
7+
8+
@QuestValueCond(QuestCond.QUEST_COND_ITEM_GIVING_FINISHED)
9+
public class ConditionItemGivingFinished extends BaseCondition {
10+
11+
@Override
12+
public boolean execute(
13+
Player owner,
14+
QuestData questData,
15+
QuestData.QuestAcceptCondition condition,
16+
String paramStr,
17+
int... params) {
18+
return condition.getParam()[0] == params[0] && (condition.getParam()[1] == 0 || condition.getParam()[1] == params[1]);
19+
}
20+
}

src/main/java/emu/grasscutter/game/quest/content/ContentFinishGivingItem.java renamed to src/main/java/emu/grasscutter/game/quest/content/ContentFinishItemGiving.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import emu.grasscutter.game.quest.enums.QuestContent;
66

77
@QuestValueContent(QuestContent.QUEST_CONTENT_FINISH_ITEM_GIVING)
8-
public final class ContentFinishGivingItem extends BaseContent {
8+
public final class ContentFinishItemGiving extends BaseContent {
99
@Override
1010
public boolean execute(
1111
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
12-
return condition.getParam()[0] == params[0] && condition.getParam()[1] == params[1];
12+
return condition.getParam()[0] == params[0] && (condition.getParam()[1] == 0 || condition.getParam()[1] == params[1]);
1313
}
1414
}

src/main/java/emu/grasscutter/game/quest/enums/QuestCond.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public enum QuestCond implements QuestTrigger {
2525
QUEST_COND_PLAYER_LEVEL_EQUAL_GREATER(17),
2626
QUEST_COND_SCENE_AREA_UNLOCKED(18), // missing, only NPC groups/talks
2727
QUEST_COND_ITEM_GIVING_ACTIVED(19), // missing
28-
QUEST_COND_ITEM_GIVING_FINISHED(20), // missing
28+
QUEST_COND_ITEM_GIVING_FINISHED(20),
2929
QUEST_COND_IS_DAYTIME(21), // only NPC groups
3030
QUEST_COND_CURRENT_AVATAR(22), // missing
3131
QUEST_COND_CURRENT_AREA(23), // missing

src/main/java/emu/grasscutter/game/world/Scene.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,13 @@ public void killEntity(GameEntity target, int attackerId) {
535535
"Can not solve monster drop: drop_id = {}, drop_tag = {}. Falling back to legacy drop system.",
536536
monster.getMetaMonster().drop_id,
537537
monster.getMetaMonster().drop_tag);
538-
getWorld().getServer().getDropSystemLegacy().callDrop(monster);
538+
world.getServer().getDropSystemLegacy().callDrop(monster);
539+
}
540+
}
541+
542+
if (target instanceof EntityGadget gadget) {
543+
if (gadget.getMetaGadget() != null) {
544+
world.getServer().getDropSystem().handleChestDrop(gadget.getMetaGadget().drop_id, gadget.getMetaGadget().drop_count, gadget);
539545
}
540546
}
541547

src/main/java/emu/grasscutter/scripts/data/SceneGadget.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
public class SceneGadget extends SceneObject {
88
public int gadget_id;
99
public int chest_drop_id;
10+
public int drop_id;
1011
public int drop_count;
1112
public String drop_tag;
1213
boolean showcutscene;

src/main/java/emu/grasscutter/server/packet/recv/HandlerItemGivingReq.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import emu.grasscutter.Grasscutter;
44
import emu.grasscutter.data.GameData;
5+
import emu.grasscutter.game.quest.enums.QuestCond;
56
import emu.grasscutter.game.quest.enums.QuestContent;
67
import emu.grasscutter.net.packet.*;
78
import emu.grasscutter.net.proto.ItemGivingReqOuterClass.ItemGivingReq;
@@ -50,8 +51,9 @@ public void handle(GameSession session, byte[] header, byte[] payload) throws Ex
5051
player.sendPacket(new PacketItemGivingRsp(giveId, Mode.EXACT_SUCCESS));
5152
// Remove the action from the active givings.
5253
questManager.removeGivingItemAction(giveId);
53-
// Queue the content action.
54+
// Queue the content and condition actions.
5455
questManager.queueEvent(QuestContent.QUEST_CONTENT_FINISH_ITEM_GIVING, giveId, 0);
56+
questManager.queueEvent(QuestCond.QUEST_COND_ITEM_GIVING_FINISHED, giveId, 0);
5557
}
5658
case GIVING_METHOD_VAGUE_GROUP -> {
5759
var matchedGroups = new ArrayList<Integer>();
@@ -96,8 +98,9 @@ public void handle(GameSession session, byte[] header, byte[] payload) throws Ex
9698
player.sendPacket(new PacketItemGivingRsp(matchedGroups.get(0), Mode.GROUP_SUCCESS));
9799
// Mark the giving action as completed.
98100
questManager.markCompleted(giveId);
99-
// Queue the content action.
100-
questManager.queueEvent(QuestContent.QUEST_CONTENT_FINISH_ITEM_GIVING, giveId, 0);
101+
// Queue the content and condition actions.
102+
questManager.queueEvent(QuestContent.QUEST_CONTENT_FINISH_ITEM_GIVING, giveId, matchedGroups.get(0));
103+
questManager.queueEvent(QuestCond.QUEST_COND_ITEM_GIVING_FINISHED, giveId, matchedGroups.get(0));
101104
}
102105
}
103106
}

0 commit comments

Comments
 (0)