mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-03-27 18:12:46 +01:00
Create files from Grasscutter-Quests
these files are NOT directly compatible with Grasscutter, and require additional modifications to the codebase to work.
This commit is contained in:
11
src/main/java/emu/grasscutter/game/quest/QuestValueCond.java
Normal file
11
src/main/java/emu/grasscutter/game/quest/QuestValueCond.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package emu.grasscutter.game.quest;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface QuestValueCond {
|
||||
QuestCond value();
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package emu.grasscutter.game.quest;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface QuestValueContent {
|
||||
QuestContent value();
|
||||
}
|
||||
11
src/main/java/emu/grasscutter/game/quest/QuestValueExec.java
Normal file
11
src/main/java/emu/grasscutter/game/quest/QuestValueExec.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package emu.grasscutter.game.quest;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface QuestValueExec {
|
||||
QuestExec value();
|
||||
}
|
||||
35
src/main/java/emu/grasscutter/game/quest/TeleportData.java
Normal file
35
src/main/java/emu/grasscutter/game/quest/TeleportData.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package emu.grasscutter.game.quest;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class TeleportData {
|
||||
List<TransmitPoint> transmit_points;
|
||||
List<Npc> npcs;
|
||||
List<Gadget> gadgets;
|
||||
|
||||
@Data
|
||||
public static class TransmitPoint {
|
||||
private int point_id;
|
||||
private int scene_id;
|
||||
private String pos;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Npc {
|
||||
private int data_index;
|
||||
private int room_id;
|
||||
private int scene_id;
|
||||
private int id;
|
||||
private String alias;
|
||||
private String script;
|
||||
private String pos;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Gadget {
|
||||
private int id;
|
||||
private String pos;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import lombok.val;
|
||||
|
||||
public abstract class BaseConditionQuestVar extends BaseCondition {
|
||||
|
||||
protected abstract boolean doCompare(int variable, int cond);
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val index = condition.getParam()[0];
|
||||
val targetValue = condition.getParam()[1];
|
||||
val questVarValue = getQuestVar(owner, questData, index);
|
||||
|
||||
Grasscutter.getLogger().debug("questVar {} : {}", index, questVarValue);
|
||||
|
||||
if (questVarValue < 0) {
|
||||
return false;
|
||||
}
|
||||
return doCompare(questVarValue, targetValue);
|
||||
}
|
||||
|
||||
protected int getQuestVar(Player owner, QuestData questData, int index) {
|
||||
val mainQuest = owner.getQuestManager().getMainQuestById(questData.getMainId());
|
||||
if (mainQuest == null) {
|
||||
Grasscutter.getLogger().debug("mainQuest for quest var not available yet");
|
||||
return -1;
|
||||
}
|
||||
val questVars = mainQuest.getQuestVars();
|
||||
if (index >= questVars.length) {
|
||||
Grasscutter.getLogger().error("questVar out of bounds for {} index {} size {}", questData.getSubId(), index, questVars.length);
|
||||
return -2;
|
||||
}
|
||||
return questVars[index];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_ACTIVITY_COND;
|
||||
|
||||
@QuestValueCond(QUEST_COND_ACTIVITY_COND)
|
||||
public class ConditionActivityCond extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val activityCondId = condition.getParam()[0];
|
||||
val targetState = condition.getParam()[1]; // only 1 for now
|
||||
return owner.getActivityManager().meetsCondition(activityCondId) == (targetState == 1);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_ACTIVITY_END;
|
||||
|
||||
@QuestValueCond(QUEST_COND_ACTIVITY_END)
|
||||
public class ConditionActivityEnd extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val activityId = condition.getParam()[0];
|
||||
return owner.getActivityManager().hasActivityEnded(activityId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_ACTIVITY_OPEN;
|
||||
|
||||
@QuestValueCond(QUEST_COND_ACTIVITY_OPEN)
|
||||
public class ConditionActivityOpen extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val activityId = condition.getParam()[0];
|
||||
return owner.getActivityManager().isActivityActive(activityId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_HISTORY_GOT_ANY_ITEM)
|
||||
public class ConditionHistoryGotAnyItem extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val itemId = condition.getParam()[0];
|
||||
return owner.getPlayerProgress().hasPlayerObtainedItemHistorically(itemId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_IS_DAYTIME)
|
||||
public class ConditionIsDaytime extends BaseCondition{
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val daytime = condition.getParam()[0] == 1;
|
||||
val currentTime = owner.getWorld().getGameTimeHours();
|
||||
// TODO is this the real timeframe?
|
||||
return (currentTime >=6 && currentTime<=18) == daytime;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_ITEM_NUM_LESS_THAN;
|
||||
|
||||
@QuestValueCond(QUEST_COND_ITEM_NUM_LESS_THAN)
|
||||
public class ConditionItemNumLessThan extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val itemId = condition.getParam()[0];
|
||||
val amount = condition.getParam()[1];
|
||||
val checkItem = owner.getInventory().getItemByGuid(itemId);
|
||||
return checkItem == null || checkItem.getCount() < amount;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_NONE)
|
||||
public class ConditionNone extends BaseCondition{
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_OPEN_STATE_EQUAL)
|
||||
public class ConditionOpenStateEqual extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val openStateId = condition.getParam()[0];
|
||||
val requiredState = condition.getParam()[1];
|
||||
return owner.getProgressManager().getOpenState(openStateId) == requiredState;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_PACK_HAVE_ITEM;
|
||||
|
||||
@QuestValueCond(QUEST_COND_PACK_HAVE_ITEM)
|
||||
public class ConditionPackHaveItem extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val itemId = condition.getParam()[0];
|
||||
val targetAmount = condition.getParam()[1];
|
||||
val checkItem = owner.getInventory().getItemByGuid(itemId);
|
||||
return checkItem != null && checkItem.getCount() >= targetAmount;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_PERSONAL_LINE_UNLOCK)
|
||||
public class ConditionPersonalLineUnlock extends BaseCondition {
|
||||
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val personalLineId = condition.getParam()[0];
|
||||
return owner.getPersonalLineList().contains(personalLineId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_TIME_VAR_GT_EQ)
|
||||
public class ConditionTimeVarGreaterOrEqual extends BaseCondition{
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val mainQuestId = condition.getParam()[0];
|
||||
val timeVarIndex = condition.getParam()[1];
|
||||
val minTime = condition.getParam()[2];
|
||||
|
||||
val mainQuest = owner.getQuestManager().getMainQuestById(mainQuestId);
|
||||
|
||||
if(mainQuest == null){
|
||||
return false;
|
||||
}
|
||||
|
||||
return mainQuest.getHoursSinceTimeVar(timeVarIndex) >= minTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package emu.grasscutter.game.quest.conditions;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestValueCond;
|
||||
import emu.grasscutter.game.quest.enums.QuestCond;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueCond(QuestCond.QUEST_COND_TIME_VAR_PASS_DAY)
|
||||
public class ConditionTimeVarPassDay extends BaseCondition{
|
||||
@Override
|
||||
public boolean execute(Player owner, QuestData questData, QuestData.QuestAcceptCondition condition, String paramStr, int... params) {
|
||||
val mainQuestId = condition.getParam()[0];
|
||||
val timeVarIndex = condition.getParam()[1];
|
||||
val minDays = condition.getParam()[2];
|
||||
|
||||
val mainQuest = owner.getQuestManager().getMainQuestById(mainQuestId);
|
||||
|
||||
if(mainQuest == null){
|
||||
return false;
|
||||
}
|
||||
|
||||
val daysSinceTimeVar = mainQuest.getDaysSinceTimeVar(timeVarIndex);
|
||||
if(daysSinceTimeVar == -1){
|
||||
return false;
|
||||
}
|
||||
|
||||
return daysSinceTimeVar >= minDays;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_ANY_MANUAL_TRANSPORT;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_ANY_MANUAL_TRANSPORT)
|
||||
public class ContentAnyManualTransport extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
import lombok.val;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_CLEAR_GROUP_MONSTER;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_CLEAR_GROUP_MONSTER)
|
||||
public class ContentClearGroupMonster extends BaseContent {
|
||||
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
val groupId = condition.getParam()[0];
|
||||
|
||||
return quest.getOwner().getScene().getScriptManager().isClearedGroupMonsters(groupId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_DESTROY_GADGET;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_DESTROY_GADGET)
|
||||
public class ContentDestroyGadget extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_ENTER_MY_WORLD;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_ENTER_MY_WORLD)
|
||||
public class ContentEnterMyWorld extends BaseContent {
|
||||
// params[0] scene ID
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_ENTER_MY_WORLD_SCENE;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_ENTER_MY_WORLD_SCENE)
|
||||
public class ContentEnterMyWorldScene extends BaseContent {
|
||||
// params[0] scene ID
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_ENTER_VEHICLE;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_ENTER_VEHICLE)
|
||||
public class ContentEnterVehicle extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FAIL_DUNGEON;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_FAIL_DUNGEON)
|
||||
public class ContentFailDungeon extends BaseContent {
|
||||
|
||||
// params[0] dungeon ID
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_DUNGEON;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_FINISH_DUNGEON)
|
||||
public class ContentFinishDungeon extends BaseContent {
|
||||
|
||||
// params[0] dungeon ID, params[1] unknown
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_ITEM_LESS_THAN;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_ITEM_LESS_THAN)
|
||||
public class ContentItemLessThan extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0] && condition.getCount() > params[1];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_KILL_MONSTER;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_KILL_MONSTER)
|
||||
public class ContentKillMonster extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_MONSTER_DIE;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_MONSTER_DIE)
|
||||
public class ContentMonsterDie extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_OBTAIN_ITEM;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_OBTAIN_ITEM)
|
||||
public class ContentObtainItem extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
var targetCount = condition.getCount();
|
||||
if (targetCount == 0) {
|
||||
targetCount = 1;
|
||||
}
|
||||
return condition.getParam()[0] == params[0] && targetCount <= params[1];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_PLAYER_LEVEL_UP;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_PLAYER_LEVEL_UP)
|
||||
public class ContentPlayerLevelUp extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return quest.getOwner().getLevel() >= condition.getCount();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueContent(QuestContent.QUEST_CONTENT_TIME_VAR_GT_EQ)
|
||||
public class ContentTimeVarMoreOrEqual extends BaseContent{
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
val mainQuestId = condition.getParam()[0];
|
||||
val timeVarIndex = condition.getParam()[1];
|
||||
val minTime = Integer.parseInt(condition.getParamStr());
|
||||
|
||||
val mainQuest = quest.getOwner().getQuestManager().getMainQuestById(mainQuestId);
|
||||
|
||||
if(mainQuest == null){
|
||||
return false;
|
||||
}
|
||||
|
||||
return mainQuest.getHoursSinceTimeVar(timeVarIndex) >= minTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueContent(QuestContent.QUEST_CONTENT_TIME_VAR_PASS_DAY)
|
||||
public class ContentTimeVarPassDay extends BaseContent{
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
val mainQuestId = condition.getParam()[0];
|
||||
val timeVarIndex = condition.getParam()[1];
|
||||
val minDays = Integer.parseInt(condition.getParamStr());
|
||||
|
||||
val mainQuest = quest.getOwner().getQuestManager().getMainQuestById(mainQuestId);
|
||||
|
||||
if(mainQuest == null){
|
||||
return false;
|
||||
}
|
||||
|
||||
val daysSinceTimeVar = mainQuest.getDaysSinceTimeVar(timeVarIndex);
|
||||
if(daysSinceTimeVar == -1){
|
||||
return false;
|
||||
}
|
||||
|
||||
return daysSinceTimeVar >= minDays;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_UNLOCK_AREA;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_UNLOCK_AREA)
|
||||
public class ContentUnlockArea extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0] || condition.getParam()[1] == params[1];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_USE_ITEM;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_USE_ITEM)
|
||||
public class ContentUseItem extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package emu.grasscutter.game.quest.content;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueContent;
|
||||
|
||||
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_WORKTOP_SELECT;
|
||||
|
||||
@QuestValueContent(QUEST_CONTENT_WORKTOP_SELECT)
|
||||
public class ContentWorktopSelect extends BaseContent {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
|
||||
return condition.getParam()[0] == params[0] || condition.getParam()[1] == params[1];
|
||||
}
|
||||
}
|
||||
121
src/main/java/emu/grasscutter/game/quest/enums/QuestCond.java
Normal file
121
src/main/java/emu/grasscutter/game/quest/enums/QuestCond.java
Normal file
@@ -0,0 +1,121 @@
|
||||
package emu.grasscutter.game.quest.enums;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum QuestCond implements QuestTrigger {
|
||||
QUEST_COND_NONE (0),
|
||||
QUEST_COND_STATE_EQUAL (1),
|
||||
QUEST_COND_STATE_NOT_EQUAL (2),
|
||||
QUEST_COND_PACK_HAVE_ITEM (3),
|
||||
QUEST_COND_AVATAR_ELEMENT_EQUAL (4), // missing, currently unused
|
||||
QUEST_COND_AVATAR_ELEMENT_NOT_EQUAL (5), // missing, only NPC groups
|
||||
QUEST_COND_AVATAR_CAN_CHANGE_ELEMENT (6), // missing, only NPC groups
|
||||
QUEST_COND_CITY_LEVEL_EQUAL_GREATER (7), // missing, currently unused
|
||||
QUEST_COND_ITEM_NUM_LESS_THAN (8),
|
||||
QUEST_COND_DAILY_TASK_START (9), // missing
|
||||
QUEST_COND_OPEN_STATE_EQUAL (10),
|
||||
QUEST_COND_DAILY_TASK_OPEN (11), // missing, only NPC groups
|
||||
QUEST_COND_DAILY_TASK_REWARD_CAN_GET (12), // missing, only NPC groups/talks
|
||||
QUEST_COND_DAILY_TASK_REWARD_RECEIVED (13), // missing, only NPC groups/talks
|
||||
QUEST_COND_PLAYER_LEVEL_REWARD_CAN_GET (14), // missing, only NPC groups/talks
|
||||
QUEST_COND_EXPLORATION_REWARD_CAN_GET (15), // missing, only NPC groups/talks
|
||||
QUEST_COND_IS_WORLD_OWNER (16), // missing, only NPC groups/talks
|
||||
QUEST_COND_PLAYER_LEVEL_EQUAL_GREATER (17),
|
||||
QUEST_COND_SCENE_AREA_UNLOCKED (18), // missing, only NPC groups/talks
|
||||
QUEST_COND_ITEM_GIVING_ACTIVED (19), // missing
|
||||
QUEST_COND_ITEM_GIVING_FINISHED (20), // missing
|
||||
QUEST_COND_IS_DAYTIME (21), // only NPC groups
|
||||
QUEST_COND_CURRENT_AVATAR (22), // missing
|
||||
QUEST_COND_CURRENT_AREA (23), // missing
|
||||
QUEST_COND_QUEST_VAR_EQUAL (24),
|
||||
QUEST_COND_QUEST_VAR_GREATER (25),
|
||||
QUEST_COND_QUEST_VAR_LESS (26),
|
||||
QUEST_COND_FORGE_HAVE_FINISH (27), // missing, only NPC groups
|
||||
QUEST_COND_DAILY_TASK_IN_PROGRESS (28), // missing
|
||||
QUEST_COND_DAILY_TASK_FINISHED (29), // missing, currently unused
|
||||
QUEST_COND_ACTIVITY_COND (30),
|
||||
QUEST_COND_ACTIVITY_OPEN (31),
|
||||
QUEST_COND_DAILY_TASK_VAR_GT (32), // missing
|
||||
QUEST_COND_DAILY_TASK_VAR_EQ (33), // missing
|
||||
QUEST_COND_DAILY_TASK_VAR_LT (34), // missing
|
||||
QUEST_COND_BARGAIN_ITEM_GT (35), // missing, currently unused
|
||||
QUEST_COND_BARGAIN_ITEM_EQ (36), // missing, currently unused
|
||||
QUEST_COND_BARGAIN_ITEM_LT (37), // missing, currently unused
|
||||
QUEST_COND_COMPLETE_TALK (38),
|
||||
QUEST_COND_NOT_HAVE_BLOSSOM_TALK (39), // missing, only NPC groups
|
||||
QUEST_COND_IS_CUR_BLOSSOM_TALK (40), // missing, only Blossom groups
|
||||
QUEST_COND_QUEST_NOT_RECEIVE (41), // missing
|
||||
QUEST_COND_QUEST_SERVER_COND_VALID (42), // missing, only NPC groups
|
||||
QUEST_COND_ACTIVITY_CLIENT_COND (43), // missing, only NPC and Activity groups
|
||||
QUEST_COND_QUEST_GLOBAL_VAR_EQUAL (44),
|
||||
QUEST_COND_QUEST_GLOBAL_VAR_GREATER (45),
|
||||
QUEST_COND_QUEST_GLOBAL_VAR_LESS (46),
|
||||
QUEST_COND_PERSONAL_LINE_UNLOCK (47),
|
||||
QUEST_COND_CITY_REPUTATION_REQUEST (48), // missing
|
||||
QUEST_COND_MAIN_COOP_START (49), // missing
|
||||
QUEST_COND_MAIN_COOP_ENTER_SAVE_POINT (50), // missing
|
||||
QUEST_COND_CITY_REPUTATION_LEVEL (51), // missing, only NPC groups
|
||||
QUEST_COND_CITY_REPUTATION_UNLOCK (52), // missing, currently unused
|
||||
QUEST_COND_LUA_NOTIFY (53),
|
||||
QUEST_COND_CUR_CLIMATE (54),
|
||||
QUEST_COND_ACTIVITY_END (55),
|
||||
QUEST_COND_COOP_POINT_RUNNING (56), // missing, currently unused
|
||||
QUEST_COND_GADGET_TALK_STATE_EQUAL (57), // missing, only Gadget groups
|
||||
QUEST_COND_AVATAR_FETTER_GT (58), // missing, only NPC groups/talks
|
||||
QUEST_COND_AVATAR_FETTER_EQ (59), // missing, only talks
|
||||
QUEST_COND_AVATAR_FETTER_LT (60), // missing, only talks
|
||||
QUEST_COND_NEW_HOMEWORLD_MOUDLE_UNLOCK (61), // missing, only Gadget groups
|
||||
QUEST_COND_NEW_HOMEWORLD_LEVEL_REWARD (62), // missing, only Gadget groups
|
||||
QUEST_COND_NEW_HOMEWORLD_MAKE_FINISH (63), // missing, only Gadget groups
|
||||
QUEST_COND_HOMEWORLD_NPC_EVENT (64), // missing, only NPC groups
|
||||
QUEST_COND_TIME_VAR_GT_EQ (65), // currently unused
|
||||
QUEST_COND_TIME_VAR_PASS_DAY (66),
|
||||
QUEST_COND_HOMEWORLD_NPC_NEW_TALK (67), // missing, only NPC groups
|
||||
QUEST_COND_PLAYER_CHOOSE_MALE (68), // missing, only talks
|
||||
QUEST_COND_HISTORY_GOT_ANY_ITEM (69),
|
||||
QUEST_COND_LEARNED_RECIPE (70), // missing, currently unused
|
||||
QUEST_COND_LUNARITE_REGION_UNLOCKED (71), // missing, only NPC groups
|
||||
QUEST_COND_LUNARITE_HAS_REGION_HINT_COUNT (72), // missing, only NPC groups
|
||||
QUEST_COND_LUNARITE_COLLECT_FINISH (73), // missing, only NPC groups
|
||||
QUEST_COND_LUNARITE_MARK_ALL_FINISH (74), // missing, only NPC groups
|
||||
QUEST_COND_NEW_HOMEWORLD_SHOP_ITEM (75), // missing, only Gadget groups
|
||||
QUEST_COND_SCENE_POINT_UNLOCK (76), // missing, only NPC groups
|
||||
QUEST_COND_SCENE_LEVEL_TAG_EQ (77), // missing
|
||||
QUEST_COND_PLAYER_ENTER_REGION (78), // missing
|
||||
QUEST_COND_UNKNOWN (9999);
|
||||
|
||||
private final int value;
|
||||
|
||||
QuestCond(int id) {
|
||||
this.value = id;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
private static final Int2ObjectMap<QuestCond> contentMap = new Int2ObjectOpenHashMap<>();
|
||||
private static final Map<String, QuestCond> contentStringMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
Stream.of(values())
|
||||
.forEach(e -> {
|
||||
contentMap.put(e.getValue(), e);
|
||||
contentStringMap.put(e.name(), e);
|
||||
});
|
||||
}
|
||||
|
||||
public static QuestCond getContentTriggerByValue(int value) {
|
||||
return contentMap.getOrDefault(value, QUEST_COND_NONE);
|
||||
}
|
||||
|
||||
public static QuestCond getContentTriggerByName(String name) {
|
||||
return contentStringMap.getOrDefault(name, QUEST_COND_NONE);
|
||||
}
|
||||
}
|
||||
117
src/main/java/emu/grasscutter/game/quest/enums/QuestContent.java
Normal file
117
src/main/java/emu/grasscutter/game/quest/enums/QuestContent.java
Normal file
@@ -0,0 +1,117 @@
|
||||
package emu.grasscutter.game.quest.enums;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum QuestContent implements QuestTrigger {
|
||||
QUEST_CONTENT_NONE (0),
|
||||
QUEST_CONTENT_KILL_MONSTER (1), // currently unused
|
||||
QUEST_CONTENT_COMPLETE_TALK (2),
|
||||
QUEST_CONTENT_MONSTER_DIE (3),
|
||||
QUEST_CONTENT_FINISH_PLOT (4),
|
||||
QUEST_CONTENT_OBTAIN_ITEM (5),
|
||||
QUEST_CONTENT_TRIGGER_FIRE (6),
|
||||
QUEST_CONTENT_CLEAR_GROUP_MONSTER (7),
|
||||
QUEST_CONTENT_NOT_FINISH_PLOT (8), // missing triggers, fail
|
||||
QUEST_CONTENT_ENTER_DUNGEON (9),
|
||||
QUEST_CONTENT_ENTER_MY_WORLD (10),
|
||||
QUEST_CONTENT_FINISH_DUNGEON (11),
|
||||
QUEST_CONTENT_DESTROY_GADGET (12),
|
||||
QUEST_CONTENT_OBTAIN_MATERIAL_WITH_SUBTYPE (13), // missing, finish
|
||||
QUEST_CONTENT_NICK_NAME (14), // missing, currently unused
|
||||
QUEST_CONTENT_WORKTOP_SELECT (15), // currently unused
|
||||
QUEST_CONTENT_SEAL_BATTLE_RESULT (16), // missing, currently unused
|
||||
QUEST_CONTENT_ENTER_ROOM (17),
|
||||
QUEST_CONTENT_GAME_TIME_TICK (18),
|
||||
QUEST_CONTENT_FAIL_DUNGEON (19),
|
||||
QUEST_CONTENT_LUA_NOTIFY (20),
|
||||
QUEST_CONTENT_TEAM_DEAD (21), // missing, fail
|
||||
QUEST_CONTENT_COMPLETE_ANY_TALK (22),
|
||||
QUEST_CONTENT_UNLOCK_TRANS_POINT (23),
|
||||
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_SKILL (107),
|
||||
QUEST_CONTENT_CITY_LEVEL_UP (109), // missing, finish
|
||||
QUEST_CONTENT_PATTERN_GROUP_CLEAR_MONSTER (110), // missing, finish, for random quests
|
||||
QUEST_CONTENT_ITEM_LESS_THAN (111),
|
||||
QUEST_CONTENT_PLAYER_LEVEL_UP (112),
|
||||
QUEST_CONTENT_DUNGEON_OPEN_STATUE (113), // missing, currently unused
|
||||
QUEST_CONTENT_UNLOCK_AREA (114), // currently unused
|
||||
QUEST_CONTENT_OPEN_CHEST_WITH_GADGET_ID (115), // missing, currently unused
|
||||
QUEST_CONTENT_UNLOCK_TRANS_POINT_WITH_TYPE (116), // missing, currently unused
|
||||
QUEST_CONTENT_FINISH_DAILY_DUNGEON (117), // missing, currently unused
|
||||
QUEST_CONTENT_FINISH_WEEKLY_DUNGEON (118), // missing, currently unused
|
||||
QUEST_CONTENT_QUEST_VAR_EQUAL (119),
|
||||
QUEST_CONTENT_QUEST_VAR_GREATER (120),
|
||||
QUEST_CONTENT_QUEST_VAR_LESS (121),
|
||||
QUEST_CONTENT_OBTAIN_VARIOUS_ITEM (122), // missing, finish
|
||||
QUEST_CONTENT_FINISH_TOWER_LEVEL (123), // missing, currently unused
|
||||
QUEST_CONTENT_BARGAIN_SUCC (124), // missing, finish
|
||||
QUEST_CONTENT_BARGAIN_FAIL (125),// missing, fail
|
||||
QUEST_CONTENT_ITEM_LESS_THAN_BARGAIN (126),// missing, fail
|
||||
QUEST_CONTENT_ACTIVITY_TRIGGER_FAILED (127),// missing, fail
|
||||
QUEST_CONTENT_MAIN_COOP_ENTER_SAVE_POINT (128),// missing, finish
|
||||
QUEST_CONTENT_ANY_MANUAL_TRANSPORT (129),
|
||||
QUEST_CONTENT_USE_ITEM (130),
|
||||
QUEST_CONTENT_MAIN_COOP_ENTER_ANY_SAVE_POINT (131),// missing, finish and fail
|
||||
QUEST_CONTENT_ENTER_MY_HOME_WORLD (132),// missing, finish and fail
|
||||
QUEST_CONTENT_ENTER_MY_WORLD_SCENE (133),// missing, finish
|
||||
QUEST_CONTENT_TIME_VAR_GT_EQ (134),
|
||||
QUEST_CONTENT_TIME_VAR_PASS_DAY (135),
|
||||
QUEST_CONTENT_QUEST_STATE_EQUAL (136),
|
||||
QUEST_CONTENT_QUEST_STATE_NOT_EQUAL (137),
|
||||
QUEST_CONTENT_UNLOCKED_RECIPE (138),// missing, finish
|
||||
QUEST_CONTENT_NOT_UNLOCKED_RECIPE (139),// missing, finish
|
||||
QUEST_CONTENT_FISHING_SUCC (140),// missing, finish
|
||||
QUEST_CONTENT_ENTER_ROGUE_DUNGEON (141),// missing, finish
|
||||
QUEST_CONTENT_USE_WIDGET (142),// missing, finish, only in unreleased quest
|
||||
QUEST_CONTENT_CAPTURE_SUCC (143),// missing, currently unused
|
||||
QUEST_CONTENT_CAPTURE_USE_CAPTURETAG_LIST (144),// missing, currently unused
|
||||
QUEST_CONTENT_CAPTURE_USE_MATERIAL_LIST (145),// missing, finish
|
||||
QUEST_CONTENT_ENTER_VEHICLE (147),
|
||||
QUEST_CONTENT_SCENE_LEVEL_TAG_EQ (148),// missing, finish
|
||||
QUEST_CONTENT_LEAVE_SCENE (149),
|
||||
QUEST_CONTENT_LEAVE_SCENE_RANGE (150),// missing, fail
|
||||
QUEST_CONTENT_IRODORI_FINISH_FLOWER_COMBINATION (151),// missing, finish
|
||||
QUEST_CONTENT_IRODORI_POETRY_REACH_MIN_PROGRESS (152),// missing, finish
|
||||
QUEST_CONTENT_IRODORI_POETRY_FINISH_FILL_POETRY (153),// missing, finish
|
||||
QUEST_CONTENT_ACTIVITY_TRIGGER_UPDATE(154), // missing
|
||||
QUEST_CONTENT_GADGET_STATE_CHANGE(155), // missing
|
||||
QUEST_CONTENT_UNKNOWN (9999);
|
||||
|
||||
private final int value;
|
||||
|
||||
QuestContent(int id) {
|
||||
this.value = id;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
private static final Int2ObjectMap<QuestContent> contentMap = new Int2ObjectOpenHashMap<>();
|
||||
private static final Map<String, QuestContent> contentStringMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
Stream.of(values())
|
||||
.forEach(e -> {
|
||||
contentMap.put(e.getValue(), e);
|
||||
contentStringMap.put(e.name(), e);
|
||||
});
|
||||
}
|
||||
|
||||
public static QuestContent getContentTriggerByValue(int value) {
|
||||
return contentMap.getOrDefault(value, QUEST_CONTENT_NONE);
|
||||
}
|
||||
|
||||
public static QuestContent getContentTriggerByName(String name) {
|
||||
return contentStringMap.getOrDefault(name, QUEST_CONTENT_NONE);
|
||||
}
|
||||
}
|
||||
112
src/main/java/emu/grasscutter/game/quest/enums/QuestExec.java
Normal file
112
src/main/java/emu/grasscutter/game/quest/enums/QuestExec.java
Normal file
@@ -0,0 +1,112 @@
|
||||
package emu.grasscutter.game.quest.enums;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum QuestExec implements QuestTrigger {
|
||||
QUEST_EXEC_NONE (0),
|
||||
QUEST_EXEC_DEL_PACK_ITEM (1),
|
||||
QUEST_EXEC_UNLOCK_POINT (2),
|
||||
QUEST_EXEC_UNLOCK_AREA (3),
|
||||
QUEST_EXEC_UNLOCK_FORCE (4), // missing, currently unused
|
||||
QUEST_EXEC_LOCK_FORCE (5), // missing, currently unused
|
||||
QUEST_EXEC_CHANGE_AVATAR_ELEMET (6),
|
||||
QUEST_EXEC_REFRESH_GROUP_MONSTER (7),
|
||||
QUEST_EXEC_SET_IS_FLYABLE (8), // missing, maybe gives glider
|
||||
QUEST_EXEC_SET_IS_WEATHER_LOCKED (9), // missing
|
||||
QUEST_EXEC_SET_IS_GAME_TIME_LOCKED (10), // missing
|
||||
QUEST_EXEC_SET_IS_TRANSFERABLE (11), // missing, currently unused
|
||||
QUEST_EXEC_GRANT_TRIAL_AVATAR (12),
|
||||
QUEST_EXEC_OPEN_BORED (13), // missing, currently unused
|
||||
QUEST_EXEC_ROLLBACK_QUEST (14),
|
||||
QUEST_EXEC_NOTIFY_GROUP_LUA (15),
|
||||
QUEST_EXEC_SET_OPEN_STATE (16),
|
||||
QUEST_EXEC_LOCK_POINT (17), // missing
|
||||
QUEST_EXEC_DEL_PACK_ITEM_BATCH (18),
|
||||
QUEST_EXEC_REFRESH_GROUP_SUITE (19),
|
||||
QUEST_EXEC_REMOVE_TRIAL_AVATAR (20),
|
||||
QUEST_EXEC_SET_GAME_TIME (21), // missing
|
||||
QUEST_EXEC_SET_WEATHER_GADGET (22), // missing
|
||||
QUEST_EXEC_ADD_QUEST_PROGRESS (23),
|
||||
QUEST_EXEC_NOTIFY_DAILY_TASK (24), // missing
|
||||
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_DEL_ALL_SPECIFIC_PACK_ITEM (29), // missing
|
||||
QUEST_EXEC_ROLLBACK_PARENT_QUEST (30),
|
||||
QUEST_EXEC_LOCK_AVATAR_TEAM (31), // missing
|
||||
QUEST_EXEC_UNLOCK_AVATAR_TEAM (32), // missing
|
||||
QUEST_EXEC_UPDATE_PARENT_QUEST_REWARD_INDEX (33), // missing
|
||||
QUEST_EXEC_SET_DAILY_TASK_VAR (34), // missing
|
||||
QUEST_EXEC_INC_DAILY_TASK_VAR (35), // missing
|
||||
QUEST_EXEC_DEC_DAILY_TASK_VAR (36), // missing, currently unused
|
||||
QUEST_EXEC_ACTIVE_ACTIVITY_COND_STATE (37), // missing
|
||||
QUEST_EXEC_INACTIVE_ACTIVITY_COND_STATE (38), // missing
|
||||
QUEST_EXEC_ADD_CUR_AVATAR_ENERGY (39),
|
||||
QUEST_EXEC_START_BARGAIN (41), // missing
|
||||
QUEST_EXEC_STOP_BARGAIN (42), // missing
|
||||
QUEST_EXEC_SET_QUEST_GLOBAL_VAR (43),
|
||||
QUEST_EXEC_INC_QUEST_GLOBAL_VAR (44),
|
||||
QUEST_EXEC_DEC_QUEST_GLOBAL_VAR (45),
|
||||
QUEST_EXEC_REGISTER_DYNAMIC_GROUP (46), // test, maybe the dynamic should be saved on a list and when you enter the view range this loads it again
|
||||
QUEST_EXEC_UNREGISTER_DYNAMIC_GROUP (47), // test, same for this
|
||||
QUEST_EXEC_SET_QUEST_VAR (48),
|
||||
QUEST_EXEC_INC_QUEST_VAR (49),
|
||||
QUEST_EXEC_DEC_QUEST_VAR (50),
|
||||
QUEST_EXEC_RANDOM_QUEST_VAR (51), // missing
|
||||
QUEST_EXEC_ACTIVATE_SCANNING_PIC (52), // missing, currently unused
|
||||
QUEST_EXEC_RELOAD_SCENE_TAG (53), // missing
|
||||
QUEST_EXEC_REGISTER_DYNAMIC_GROUP_ONLY (54), // missing
|
||||
QUEST_EXEC_CHANGE_SKILL_DEPOT (55), // missing
|
||||
QUEST_EXEC_ADD_SCENE_TAG (56), // missing
|
||||
QUEST_EXEC_DEL_SCENE_TAG (57), // missing
|
||||
QUEST_EXEC_INIT_TIME_VAR (58),
|
||||
QUEST_EXEC_CLEAR_TIME_VAR (59),
|
||||
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_CHANGE_SCENE_LEVEL_TAG (64), // missing
|
||||
QUEST_EXEC_UNLOCK_PLAYER_WORLD_SCENE (65), // missing
|
||||
QUEST_EXEC_LOCK_PLAYER_WORLD_SCENE (66), // missing
|
||||
QUEST_EXEC_FAIL_MAINCOOP (67), // missing
|
||||
QUEST_EXEC_MODIFY_WEATHER_AREA (68), // missing
|
||||
QUEST_EXEC_MODIFY_ARANARA_COLLECTION_STATE (69), // missing
|
||||
QUEST_EXEC_GRANT_TRIAL_AVATAR_BATCH_AND_LOCK_TEAM (70), // missing
|
||||
QUEST_EXEC_UNKNOWN (9999);
|
||||
|
||||
private final int value;
|
||||
|
||||
QuestExec(int id) {
|
||||
this.value = id;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
private static final Int2ObjectMap<QuestExec> contentMap = new Int2ObjectOpenHashMap<>();
|
||||
private static final Map<String, QuestExec> contentStringMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
Stream.of(values())
|
||||
.filter(e -> e.name().startsWith("QUEST_CONTENT_"))
|
||||
.forEach(e -> {
|
||||
contentMap.put(e.getValue(), e);
|
||||
contentStringMap.put(e.name(), e);
|
||||
});
|
||||
}
|
||||
|
||||
public static QuestExec getContentTriggerByValue(int value) {
|
||||
return contentMap.getOrDefault(value, QUEST_EXEC_NONE);
|
||||
}
|
||||
|
||||
public static QuestExec getContentTriggerByName(String name) {
|
||||
return contentStringMap.getOrDefault(name, QUEST_EXEC_NONE);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_ADD_CUR_AVATAR_ENERGY)
|
||||
public class ExecAddCurAvatarEnergy extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
Grasscutter.getLogger().info("Energy refilled");
|
||||
return quest.getOwner().getEnergyManager().refillEntityAvatarEnergy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.props.ElementType;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import lombok.val;
|
||||
|
||||
/**
|
||||
* Changes the main avatar's element. First parameter is the elementType id
|
||||
*/
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_CHANGE_AVATAR_ELEMET)
|
||||
public class ExecChangeAvatarElemet extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
val targetElement = ElementType.getTypeByValue(Integer.parseInt(paramStr[0]));
|
||||
val owner = quest.getOwner();
|
||||
val mainAvatar = owner.getAvatars().getAvatarById(owner.getMainCharacterId());
|
||||
|
||||
if(mainAvatar == null){
|
||||
Grasscutter.getLogger().error("Failed to get main avatar for use {}", quest.getOwner().getUid());
|
||||
return false;
|
||||
}
|
||||
|
||||
Grasscutter.getLogger().info("Changing avatar element to {} for quest {}", targetElement.name(), quest.getSubQuestId());
|
||||
return mainAvatar.changeElement(targetElement);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_CLEAR_TIME_VAR)
|
||||
public class ExecClearTimeVar extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
val mainQuestId = Integer.parseInt(condition.getParam()[0]);
|
||||
val timeVarId = Integer.parseInt(condition.getParam()[1]);
|
||||
val mainQuest = quest.getOwner().getQuestManager().getMainQuestById(mainQuestId);
|
||||
return mainQuest.clearTimeVar(timeVarId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_DEL_PACK_ITEM)
|
||||
public class ExecDelPackItem extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
int itemId = Integer.parseInt(paramStr[0]);
|
||||
int amount = Integer.parseInt(paramStr[1]);
|
||||
return quest.getOwner().getInventory().removeItem(itemId, amount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_DEL_PACK_ITEM_BATCH)
|
||||
public class ExecDelPackItemBatch extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
// input is like this: "100497:999,100498:999,100499:999"
|
||||
var items = paramStr[0].split(",");
|
||||
boolean success = true;
|
||||
for (var itemString : items){
|
||||
var itemFields = itemString.split(":");
|
||||
var itemId = Integer.parseInt(itemFields[0]);
|
||||
var amount = Integer.parseInt(itemFields[1]);
|
||||
if(!quest.getOwner().getInventory().removeItem(itemId, amount)){
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_GRANT_TRIAL_AVATAR)
|
||||
public class ExecGrantTrialAvatar extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
if (quest.getOwner().addTrialAvatarForQuest(Integer.parseInt(paramStr[0]), quest.getMainQuestId())) {
|
||||
Grasscutter.getLogger().info("Added trial avatar to team for quest {}", quest.getSubQuestId());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_INIT_TIME_VAR)
|
||||
public class ExecInitTimeVar extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
val timeVarId = Integer.parseInt(condition.getParam()[0]);
|
||||
val mainQuest = quest.getMainQuest();
|
||||
return mainQuest.initTimeVar(timeVarId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_REFRESH_GROUP_MONSTER)
|
||||
public class ExecRefreshGroupMonster extends QuestExecHandler {
|
||||
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
var groupId = Integer.parseInt(paramStr[0]);
|
||||
|
||||
return quest.getOwner().getScene().getScriptManager().refreshGroupMonster(groupId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestGroupSuite;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_REGISTER_DYNAMIC_GROUP)
|
||||
public class ExecRegisterDynamicGroup extends QuestExecHandler {
|
||||
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
var sceneId = Integer.parseInt(paramStr[0]);
|
||||
var groupId = Integer.parseInt(paramStr[1]);
|
||||
|
||||
Grasscutter.getLogger().warn("Registering group {}", groupId);
|
||||
|
||||
Scene scene = quest.getOwner().getWorld().getSceneById(sceneId);
|
||||
if(scene == null) return false;
|
||||
|
||||
int suiteId = scene.loadDynamicGroup(groupId);
|
||||
if(suiteId == -1) return false;
|
||||
|
||||
quest.getMainQuest().getQuestGroupSuites().add(QuestGroupSuite.of()
|
||||
.scene(sceneId)
|
||||
.group(groupId)
|
||||
.suite(suiteId)
|
||||
.build());
|
||||
|
||||
Grasscutter.getLogger().warn("Registered group {}, suite {} in scene {}", groupId, suiteId, scene.getId());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_REMOVE_TRIAL_AVATAR)
|
||||
public class ExecRemoveTrialAvatar extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
if (quest.getOwner().removeTrialAvatarForQuest(Integer.parseInt(paramStr[0]))) {
|
||||
Grasscutter.getLogger().info("Removed trial avatar from team for quest {}", quest.getSubQuestId());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_ROLLBACK_PARENT_QUEST)
|
||||
public class ExecRollbackParentQuest extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
var targetPosition = quest.getMainQuest().rewind();
|
||||
if(targetPosition == null){
|
||||
return false;
|
||||
}
|
||||
quest.getOwner().getPosition().set(targetPosition.get(0));
|
||||
quest.getOwner().getRotation().set(targetPosition.get(1));
|
||||
quest.getOwner().sendPacket(new PacketScenePlayerLocationNotify(quest.getOwner().getScene()));
|
||||
// todo proper reset and warp
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_ROLLBACK_QUEST)
|
||||
public class ExecRollbackQuest extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
var targetQuestId = Integer.parseInt(paramStr[0]);
|
||||
var targetQuest = quest.getOwner().getQuestManager().getQuestById(targetQuestId);
|
||||
var targetPosition = targetQuest.getMainQuest().rewindTo(targetQuest, true);
|
||||
if(targetPosition == null){
|
||||
return false;
|
||||
}
|
||||
quest.getOwner().getPosition().set(targetPosition.get(0));
|
||||
quest.getOwner().getRotation().set(targetPosition.get(1));
|
||||
quest.getOwner().sendPacket(new PacketScenePlayerLocationNotify(quest.getOwner().getScene()));
|
||||
// todo proper reset and warp
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import lombok.val;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_SET_OPEN_STATE)
|
||||
public class ExecSetOpenState extends QuestExecHandler {
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
val param = Arrays.stream(paramStr)
|
||||
.filter(i -> !i.isBlank())
|
||||
.mapToInt(Integer::parseInt)
|
||||
.toArray();
|
||||
|
||||
quest.getOwner().getProgressManager().forceSetOpenState(param[0], param[1]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package emu.grasscutter.game.quest.exec;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.excels.QuestData;
|
||||
import emu.grasscutter.game.quest.GameQuest;
|
||||
import emu.grasscutter.game.quest.QuestValueExec;
|
||||
import emu.grasscutter.game.quest.enums.QuestExec;
|
||||
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
import emu.grasscutter.scripts.data.SceneBlock;
|
||||
import emu.grasscutter.scripts.data.SceneGroup;
|
||||
import lombok.val;
|
||||
|
||||
@QuestValueExec(QuestExec.QUEST_EXEC_UNREGISTER_DYNAMIC_GROUP)
|
||||
public class ExecUnregisterDynamicGroup extends QuestExecHandler {
|
||||
|
||||
@Override
|
||||
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||
val groupId = Integer.parseInt(paramStr[0]);
|
||||
val unknownParam = Integer.parseInt(paramStr[1]); //TODO: Goes from 0 to 1, maybe is a boolean. Investigate
|
||||
val scene = quest.getOwner().getScene();
|
||||
|
||||
Grasscutter.getLogger().warn("Unregistering group {}", groupId);
|
||||
|
||||
if(!scene.unregisterDynamicGroup(groupId)){
|
||||
return false;
|
||||
}
|
||||
|
||||
//Remove suites if they are registered
|
||||
quest.getMainQuest().getQuestGroupSuites().removeIf(gs -> gs.getGroup() == groupId && gs.getScene() == scene.getId());
|
||||
|
||||
Grasscutter.getLogger().warn("Unregistered group {} in scene {}", groupId, scene.getId());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user