mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-04-03 06:22:28 +02:00
Attempt to implement item giving to NPCs (untested)
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
package emu.grasscutter.game.quest;
|
||||
|
||||
import dev.morphia.annotations.Transient;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.binout.MainQuestData;
|
||||
@@ -31,10 +30,13 @@ import static emu.grasscutter.GameConstants.DEBUG;
|
||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||
import static emu.grasscutter.config.Configuration.SERVER;
|
||||
|
||||
public class QuestManager extends BasePlayerManager {
|
||||
public final class QuestManager extends BasePlayerManager {
|
||||
@Getter private final Player player;
|
||||
|
||||
@Getter private final Int2ObjectMap<GameMainQuest> mainQuests;
|
||||
@Transient @Getter private final List<Integer> loggedQuests;
|
||||
@Getter private final List<Integer> loggedQuests;
|
||||
|
||||
@Getter private final List<Integer> activeGivings = new ArrayList<>();
|
||||
|
||||
private long lastHourCheck = 0;
|
||||
private long lastDayCheck = 0;
|
||||
@@ -45,6 +47,7 @@ public class QuestManager extends BasePlayerManager {
|
||||
60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1000),
|
||||
FastThreadLocalThread::new, new ThreadPoolExecutor.AbortPolicy());
|
||||
}
|
||||
|
||||
/*
|
||||
On SetPlayerBornDataReq, the server sends FinishedParentQuestNotify, with this exact
|
||||
parentQuestList. Captured on Game version 2.7
|
||||
|
||||
@@ -34,7 +34,7 @@ public enum QuestContent implements QuestTrigger {
|
||||
QUEST_CONTENT_ADD_QUEST_PROGRESS(24),
|
||||
QUEST_CONTENT_INTERACT_GADGET(25),
|
||||
QUEST_CONTENT_DAILY_TASK_COMP_FINISH(26), // missing, currently unused
|
||||
QUEST_CONTENT_FINISH_ITEM_GIVING(27), // missing, finish
|
||||
QUEST_CONTENT_FINISH_ITEM_GIVING(27),
|
||||
QUEST_CONTENT_SKILL(107),
|
||||
QUEST_CONTENT_CITY_LEVEL_UP(109), // missing, finish
|
||||
QUEST_CONTENT_PATTERN_GROUP_CLEAR_MONSTER(110), // missing, finish, for random quests
|
||||
|
||||
@@ -35,7 +35,7 @@ public enum QuestExec implements QuestTrigger {
|
||||
QUEST_EXEC_CREATE_PATTERN_GROUP(25), // missing, used for random quests
|
||||
QUEST_EXEC_REMOVE_PATTERN_GROUP(26), // missing, used for random quests
|
||||
QUEST_EXEC_REFRESH_GROUP_SUITE_RANDOM(27), // missing
|
||||
QUEST_EXEC_ACTIVE_ITEM_GIVING(28), // missing
|
||||
QUEST_EXEC_ACTIVE_ITEM_GIVING(28),
|
||||
QUEST_EXEC_DEL_ALL_SPECIFIC_PACK_ITEM(29), // missing
|
||||
QUEST_EXEC_ROLLBACK_PARENT_QUEST(30),
|
||||
QUEST_EXEC_LOCK_AVATAR_TEAM(31), // missing
|
||||
@@ -71,7 +71,7 @@ public enum QuestExec implements QuestTrigger {
|
||||
QUEST_EXEC_MODIFY_CLIMATE_AREA(60), // missing
|
||||
QUEST_EXEC_GRANT_TRIAL_AVATAR_AND_LOCK_TEAM(61), // missing
|
||||
QUEST_EXEC_CHANGE_MAP_AREA_STATE(62), // missing
|
||||
QUEST_EXEC_DEACTIVE_ITEM_GIVING(63), // missing
|
||||
QUEST_EXEC_DEACTIVE_ITEM_GIVING(63),
|
||||
QUEST_EXEC_CHANGE_SCENE_LEVEL_TAG(64), // missing
|
||||
QUEST_EXEC_UNLOCK_PLAYER_WORLD_SCENE(65), // missing
|
||||
QUEST_EXEC_LOCK_PLAYER_WORLD_SCENE(66), // missing
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.quest.QuestData.QuestExecParam;
|
||||
import emu.grasscutter.game.quest.*;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_ACTIVE_ITEM_GIVING)
|
||||
public final class ExecActiveItemGiving extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestExecParam condition, String... paramStr) {
|
||||
var questManager = quest.getOwner().getQuestManager();
|
||||
var activeGivings = questManager.getActiveGivings();
|
||||
|
||||
var givingId = Integer.parseInt(condition.getParam()[0]);
|
||||
if (activeGivings.contains(givingId)) {
|
||||
Grasscutter.getLogger().debug("Quest {} attempted to add give action {} twice.",
|
||||
quest.getSubQuestId(), givingId);
|
||||
return false;
|
||||
} else {
|
||||
activeGivings.add(givingId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.quest.QuestData;
|
||||
import emu.grasscutter.game.quest.*;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_DEACTIVE_ITEM_GIVING)
|
||||
public final class ExecDeactivateItemGiving extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
var questManager = quest.getOwner().getQuestManager();
|
||||
var activeGivings = questManager.getActiveGivings();
|
||||
|
||||
var givingId = Integer.parseInt(condition.getParam()[0]);
|
||||
if (!activeGivings.contains(givingId)) {
|
||||
Grasscutter.getLogger().debug("Quest {} attempted to remove give action {} when it isn't active.",
|
||||
quest.getSubQuestId(), givingId);
|
||||
return false;
|
||||
} else {
|
||||
activeGivings.remove(givingId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user