mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-25 17:43:01 +08:00
Major questing improvements
This commit is contained in:
parent
89717f3c15
commit
02a56fcec4
@ -108,6 +108,8 @@ public class GameData {
|
|||||||
@Getter private static final Int2ObjectMap<MusicGameBasicData> musicGameBasicDataMap = new Int2ObjectOpenHashMap<>();
|
@Getter private static final Int2ObjectMap<MusicGameBasicData> musicGameBasicDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
@Getter private static final Int2ObjectMap<PersonalLineData> personalLineDataMap = new Int2ObjectOpenHashMap<>();
|
@Getter private static final Int2ObjectMap<PersonalLineData> personalLineDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
@Getter private static final Int2ObjectMap<ChapterData> chapterDataMap = new Int2ObjectOpenHashMap<>();
|
@Getter private static final Int2ObjectMap<ChapterData> chapterDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
@Getter private static final Int2ObjectMap<TriggerExcelConfigData> triggerExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
@Getter private static final Map<String,ScriptSceneData> scriptSceneDataMap = new HashMap<>();
|
||||||
|
|
||||||
// Cache
|
// Cache
|
||||||
private static Map<Integer, List<Integer>> fetters = new HashMap<>();
|
private static Map<Integer, List<Integer>> fetters = new HashMap<>();
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package emu.grasscutter.data.binout;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
import emu.grasscutter.scripts.data.SceneGroup;
|
||||||
|
import emu.grasscutter.utils.Position;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ScriptSceneData {
|
||||||
|
Map<String,ScriptObject> scriptObjectList;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class ScriptObject {
|
||||||
|
//private SceneGroup groups;
|
||||||
|
@SerializedName("dummy_points")
|
||||||
|
private Map<String, List<Float>> dummyPoints;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package emu.grasscutter.data.excels;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.GameResource;
|
||||||
|
import emu.grasscutter.data.ResourceType;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@ResourceType(name = "TriggerExcelConfigData.json") @Getter
|
||||||
|
public class TriggerExcelConfigData extends GameResource {
|
||||||
|
@Getter private int id;
|
||||||
|
private int sceneId;
|
||||||
|
private int groupId;
|
||||||
|
private String triggerName;
|
||||||
|
}
|
@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
public class EntityRegion extends GameEntity{
|
public class EntityRegion extends GameEntity{
|
||||||
private final Position position;
|
private final Position position;
|
||||||
private boolean hasNewEntities;
|
private boolean hasNewEntities;
|
||||||
|
private boolean entityLeave;
|
||||||
private final Set<Integer> entities; // Ids of entities inside this region
|
private final Set<Integer> entities; // Ids of entities inside this region
|
||||||
private final SceneRegion metaRegion;
|
private final SceneRegion metaRegion;
|
||||||
|
|
||||||
@ -45,10 +46,17 @@ public class EntityRegion extends GameEntity{
|
|||||||
hasNewEntities = false;
|
hasNewEntities = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeEntity(GameEntity entity) {
|
public void removeEntity(int entityId) {
|
||||||
this.getEntities().remove(entity.getId());
|
this.getEntities().remove(entityId);
|
||||||
|
this.entityLeave = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeEntity(GameEntity entity) {
|
||||||
|
this.getEntities().remove(entity.getId());
|
||||||
|
this.entityLeave = true;
|
||||||
|
}
|
||||||
|
public boolean entityLeave() {return this.entityLeave;}
|
||||||
|
public void resetEntityLeave() {this.entityLeave = false;}
|
||||||
@Override
|
@Override
|
||||||
public Int2FloatOpenHashMap getFightProperties() {
|
public Int2FloatOpenHashMap getFightProperties() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -65,8 +65,8 @@ public class QuestSystem extends BaseGameSystem {
|
|||||||
public boolean triggerCondition(GameQuest quest, QuestCondition condition, String paramStr, int... params) {
|
public boolean triggerCondition(GameQuest quest, QuestCondition condition, String paramStr, int... params) {
|
||||||
QuestBaseHandler handler = condHandlers.get(condition.getType().getValue());
|
QuestBaseHandler handler = condHandlers.get(condition.getType().getValue());
|
||||||
|
|
||||||
if (handler == null || quest.getData() == null) {
|
if (handler == null || quest.getQuestData() == null) {
|
||||||
Grasscutter.getLogger().debug("Could not trigger condition {} at {}", condition.getType().getValue(), quest.getData());
|
Grasscutter.getLogger().debug("Could not trigger condition {} at {}", condition.getType().getValue(), quest.getQuestData());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,8 +76,8 @@ public class QuestSystem extends BaseGameSystem {
|
|||||||
public boolean triggerContent(GameQuest quest, QuestCondition condition, String paramStr, int... params) {
|
public boolean triggerContent(GameQuest quest, QuestCondition condition, String paramStr, int... params) {
|
||||||
QuestBaseHandler handler = contHandlers.get(condition.getType().getValue());
|
QuestBaseHandler handler = contHandlers.get(condition.getType().getValue());
|
||||||
|
|
||||||
if (handler == null || quest.getData() == null) {
|
if (handler == null || quest.getQuestData() == null) {
|
||||||
Grasscutter.getLogger().debug("Could not trigger content {} at {}", condition.getType().getValue(), quest.getData());
|
Grasscutter.getLogger().debug("Could not trigger content {} at {}", condition.getType().getValue(), quest.getQuestData());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,8 +87,8 @@ public class QuestSystem extends BaseGameSystem {
|
|||||||
public boolean triggerExec(GameQuest quest, QuestExecParam execParam, String... params) {
|
public boolean triggerExec(GameQuest quest, QuestExecParam execParam, String... params) {
|
||||||
QuestExecHandler handler = execHandlers.get(execParam.getType().getValue());
|
QuestExecHandler handler = execHandlers.get(execParam.getType().getValue());
|
||||||
|
|
||||||
if (handler == null || quest.getData() == null) {
|
if (handler == null || quest.getQuestData() == null) {
|
||||||
Grasscutter.getLogger().debug("Could not trigger exec {} at {}", execParam.getType().getValue(), quest.getData());
|
Grasscutter.getLogger().debug("Could not trigger exec {} at {}", execParam.getType().getValue(), quest.getQuestData());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
src/main/java/emu/grasscutter/game/quest/RewindData.java
Normal file
28
src/main/java/emu/grasscutter/game/quest/RewindData.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package emu.grasscutter.game.quest;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
@Data
|
||||||
|
public class RewindData {
|
||||||
|
AvatarData avatar;
|
||||||
|
List<Npc> npcs;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class AvatarData {
|
||||||
|
@Getter private String pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
private static class Npc {
|
||||||
|
private String script;
|
||||||
|
private int room_id;
|
||||||
|
private int data_index;
|
||||||
|
private int id;
|
||||||
|
private String pos;
|
||||||
|
private int scene_id;
|
||||||
|
private String alias;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.GameData;
|
||||||
|
import emu.grasscutter.data.binout.MainQuestData;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_COMPLETE_TALK)
|
||||||
|
public class ConditionCompleteTalk extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
GameMainQuest checkMainQuest = quest.getOwner().getQuestManager().getMainQuestById(condition.getParam()[0]/100);
|
||||||
|
if (checkMainQuest == null || GameData.getMainQuestDataMap().get(checkMainQuest.getParentQuestId()).getTalks() == null) {
|
||||||
|
Grasscutter.getLogger().debug("Warning: mainQuest {} hasn't been started yet, or has no talks", condition.getParam()[0]/100);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MainQuestData.TalkData talkData = checkMainQuest.getTalks().get(Integer.valueOf(params[0]));
|
||||||
|
return talkData != null || checkMainQuest.getChildQuestById(params[0]) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_GLOBAL_VAR_EQUAL)
|
||||||
|
public class ConditionQuestGlobalVarEqual extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
Integer questGlobalVarValue = quest.getMainQuest().getQuestManager().getQuestGlobalVarValue(Integer.valueOf(params[0]));
|
||||||
|
Grasscutter.getLogger().debug("questGlobarVar {} : {}", params[0],questGlobalVarValue);
|
||||||
|
return questGlobalVarValue.intValue() == params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_GLOBAL_VAR_GREATER)
|
||||||
|
public class ConditionQuestGlobalVarGreater extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
Integer questGlobalVarValue = quest.getMainQuest().getQuestManager().getQuestGlobalVarValue(Integer.valueOf(params[0]));
|
||||||
|
Grasscutter.getLogger().debug("questGlobarVar {} : {}", params[0],questGlobalVarValue);
|
||||||
|
return questGlobalVarValue.intValue() > params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_GLOBAL_VAR_LESS)
|
||||||
|
public class ConditionQuestGlobalVarLess extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
Integer questGlobalVarValue = quest.getMainQuest().getQuestManager().getQuestGlobalVarValue(Integer.valueOf(params[0]));
|
||||||
|
Grasscutter.getLogger().debug("questGlobarVar {} : {}", params[0],questGlobalVarValue);
|
||||||
|
return questGlobalVarValue.intValue() < params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_VAR_EQUAL)
|
||||||
|
public class ConditionQuestVarEqual extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue == params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_VAR_GREATER)
|
||||||
|
public class ConditionQuestVarGreater extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue > params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_QUEST_VAR_LESS)
|
||||||
|
public class ConditionQuestVarLess extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue < params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package emu.grasscutter.game.quest.conditions;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_COND_STATE_NOT_EQUAL)
|
||||||
|
public class ConditionStateNotEqual extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
GameQuest checkQuest = quest.getOwner().getQuestManager().getQuestById(condition.getParam()[0]);
|
||||||
|
if (checkQuest == null) {
|
||||||
|
/*
|
||||||
|
Will spam the console
|
||||||
|
//Grasscutter.getLogger().debug("Warning: quest {} hasn't been started yet!", condition.getParam()[0]);
|
||||||
|
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return checkQuest.getState().getValue() != condition.getParam()[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.binout.MainQuestData;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_COMPLETE_ANY_TALK)
|
||||||
|
public class ContentCompleteAnyTalk extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
GameMainQuest checkMainQuest = quest.getOwner().getQuestManager().getMainQuestById(params[0]/100);
|
||||||
|
if (checkMainQuest == null) {return false;}
|
||||||
|
MainQuestData.TalkData talkData = checkMainQuest.getTalks().get(Integer.valueOf(paramStr));
|
||||||
|
return talkData == null || condition.getParamStr().contains(paramStr) || checkMainQuest.getChildQuestById(params[0]) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData.QuestCondition;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_LEAVE_SCENE)
|
||||||
|
public class ContentLeaveScene extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) {
|
||||||
|
return quest.getOwner().getScene().getPrevScene() == params[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.binout.MainQuestData;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_NOT_FINISH_PLOT)
|
||||||
|
public class ContentNotFinishPlot extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
GameMainQuest checkMainQuest = quest.getOwner().getQuestManager().getMainQuestById(params[0]/100);
|
||||||
|
if (checkMainQuest == null) {return false;}
|
||||||
|
MainQuestData.TalkData talkData = checkMainQuest.getTalks().get(Integer.valueOf(params[0]));
|
||||||
|
return talkData == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_QUEST_STATE_NOT_EQUAL)
|
||||||
|
public class ContentQuestStateNotEqual extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
GameQuest checkQuest = quest.getOwner().getQuestManager().getQuestById(params[0]);
|
||||||
|
|
||||||
|
if (checkQuest != null) {
|
||||||
|
return checkQuest.getState().getValue() != params[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_QUEST_VAR_EQUAL)
|
||||||
|
public class ContentQuestVarEqual extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue == params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_QUEST_VAR_GREATER)
|
||||||
|
public class ContentQuestVarGreater extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue > params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_QUEST_VAR_LESS)
|
||||||
|
public class ContentQuestVarLess extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
|
||||||
|
Grasscutter.getLogger().debug("questVar {} : {}", params[0],questVarValue);
|
||||||
|
return questVarValue < params[1];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package emu.grasscutter.game.quest.content;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.data.GameData;
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.data.excels.TriggerExcelConfigData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE)
|
||||||
|
public class ContentTriggerFire extends QuestBaseHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
if(quest.getTriggers().containsKey(quest.getTriggerNameById(params[0]))) {
|
||||||
|
//We don't want to put a new key here
|
||||||
|
return quest.getTriggers().get(quest.getTriggerNameById(params[0]));
|
||||||
|
} else {
|
||||||
|
Grasscutter.getLogger().error("quest {} doesn't have trigger {}", quest.getSubQuestId(), params[0]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_CONTENT_UNLOCK_TRANS_POINT)
|
||||||
|
public class ContentUnlockTransPoint extends QuestBaseHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -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.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_DEC_QUEST_GLOBAL_VAR)
|
||||||
|
public class ExecDecQuestGlobalVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getOwner().getQuestManager().decQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package emu.grasscutter.game.quest.exec;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_DEC_QUEST_VAR)
|
||||||
|
public class ExecDecQuestVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getMainQuest().decQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package emu.grasscutter.game.quest.exec;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_INC_QUEST_GLOBAL_VAR)
|
||||||
|
public class ExecIncQuestGlobalVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getOwner().getQuestManager().incQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package emu.grasscutter.game.quest.exec;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_INC_QUEST_VAR)
|
||||||
|
public class ExecIncQuestVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getMainQuest().incQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package emu.grasscutter.game.quest.exec;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_SET_QUEST_GLOBAL_VAR)
|
||||||
|
public class ExecSetQuestGlobalVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getOwner().getQuestManager().setQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package emu.grasscutter.game.quest.exec;
|
||||||
|
|
||||||
|
import emu.grasscutter.data.excels.QuestData;
|
||||||
|
import emu.grasscutter.game.quest.GameQuest;
|
||||||
|
import emu.grasscutter.game.quest.QuestValue;
|
||||||
|
import emu.grasscutter.game.quest.enums.QuestTrigger;
|
||||||
|
import emu.grasscutter.game.quest.handlers.QuestExecHandler;
|
||||||
|
|
||||||
|
@QuestValue(QuestTrigger.QUEST_EXEC_SET_QUEST_VAR)
|
||||||
|
public class ExecSetQuestVar extends QuestExecHandler {
|
||||||
|
@Override
|
||||||
|
public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) {
|
||||||
|
quest.getMainQuest().setQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1]));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -630,6 +630,12 @@ public class Scene {
|
|||||||
onLoadGroup(groups);
|
onLoadGroup(groups);
|
||||||
Grasscutter.getLogger().info("Scene {} Block {} loaded.", this.getId(), block.id);
|
Grasscutter.getLogger().info("Scene {} Block {} loaded.", this.getId(), block.id);
|
||||||
}
|
}
|
||||||
|
public void loadTriggerFromGroup(SceneGroup group, String triggerName) {
|
||||||
|
//Load triggers and regions
|
||||||
|
getScriptManager().registerTrigger(group.triggers.values().stream().filter(p -> p.name.contains(triggerName)).toList());
|
||||||
|
group.regions.values().stream().filter(q -> q.config_id == Integer.parseInt(triggerName.substring(13))).map(region -> new EntityRegion(this, region))
|
||||||
|
.forEach(getScriptManager()::registerRegion);
|
||||||
|
}
|
||||||
|
|
||||||
public void onLoadGroup(List<SceneGroup> groups) {
|
public void onLoadGroup(List<SceneGroup> groups) {
|
||||||
if (groups == null || groups.isEmpty()) {
|
if (groups == null || groups.isEmpty()) {
|
||||||
|
@ -11,7 +11,7 @@ public class HandlerPersonalLineAllDataReq extends PacketHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
session.send(new PacketPersonalLineAllDataRsp(session.getPlayer().getQuestManager().getQuests().values()));
|
session.send(new PacketPersonalLineAllDataRsp(session.getPlayer().getQuestManager().getMainQuests().values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package emu.grasscutter.server.packet.recv;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.quest.GameMainQuest;
|
||||||
|
import emu.grasscutter.net.packet.Opcodes;
|
||||||
|
import emu.grasscutter.net.packet.PacketHandler;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.net.proto.PacketHeadOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.PlayerSetPauseReqOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.QuestUpdateQuestVarReqOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.QuestVarOpOuterClass;
|
||||||
|
import emu.grasscutter.server.game.GameSession;
|
||||||
|
import emu.grasscutter.server.packet.send.PacketPlayerSetPauseRsp;
|
||||||
|
import emu.grasscutter.server.packet.send.PacketQuestUpdateQuestVarRsp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Opcodes(PacketOpcodes.QuestUpdateQuestVarReq)
|
||||||
|
public class HandlerQuestUpdateQuestVarReq extends PacketHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
|
//Client sends packets. One with the value, and one with the index and the new value to set/inc/dec
|
||||||
|
var req = QuestUpdateQuestVarReqOuterClass.QuestUpdateQuestVarReq.parseFrom(payload);
|
||||||
|
GameMainQuest mainQuest = session.getPlayer().getQuestManager().getMainQuestById(req.getQuestId()/100);
|
||||||
|
List<QuestVarOpOuterClass.QuestVarOp> questVars = req.getQuestVarOpListList();
|
||||||
|
if (mainQuest.getQuestVarsUpdate().size() == 0) {
|
||||||
|
for (QuestVarOpOuterClass.QuestVarOp questVar : questVars) {
|
||||||
|
mainQuest.getQuestVarsUpdate().add(questVar.getValue());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (QuestVarOpOuterClass.QuestVarOp questVar : questVars) {
|
||||||
|
if (questVar.getIsAdd()) {
|
||||||
|
if (questVar.getValue() >= 0) {
|
||||||
|
mainQuest.incQuestVar(questVar.getIndex(), questVar.getValue());
|
||||||
|
} else {
|
||||||
|
mainQuest.decQuestVar(questVar.getIndex(), questVar.getValue());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mainQuest.setQuestVar(questVar.getIndex(), mainQuest.getQuestVarsUpdate().get(0));
|
||||||
|
}
|
||||||
|
//remove the first element from the update list
|
||||||
|
mainQuest.getQuestVarsUpdate().remove(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
session.send(new PacketQuestUpdateQuestVarRsp(req.getQuestId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -11,7 +11,7 @@ public class PacketQuestProgressUpdateNotify extends BasePacket {
|
|||||||
public PacketQuestProgressUpdateNotify(GameQuest quest) {
|
public PacketQuestProgressUpdateNotify(GameQuest quest) {
|
||||||
super(PacketOpcodes.QuestProgressUpdateNotify);
|
super(PacketOpcodes.QuestProgressUpdateNotify);
|
||||||
|
|
||||||
QuestProgressUpdateNotify.Builder proto = QuestProgressUpdateNotify.newBuilder().setQuestId(quest.getQuestId());
|
QuestProgressUpdateNotify.Builder proto = QuestProgressUpdateNotify.newBuilder().setQuestId(quest.getSubQuestId());
|
||||||
|
|
||||||
if (quest.getFinishProgressList() != null) {
|
if (quest.getFinishProgressList() != null) {
|
||||||
for (int i : quest.getFinishProgressList()) {
|
for (int i : quest.getFinishProgressList()) {
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package emu.grasscutter.server.packet.send;
|
||||||
|
|
||||||
|
import emu.grasscutter.net.packet.BasePacket;
|
||||||
|
import emu.grasscutter.net.packet.Opcodes;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.net.proto.QuestUpdateQuestVarReqOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.QuestUpdateQuestVarRspOuterClass;
|
||||||
|
|
||||||
|
@Opcodes(PacketOpcodes.QuestUpdateQuestVarReq)
|
||||||
|
public class PacketQuestUpdateQuestVarRsp extends BasePacket {
|
||||||
|
|
||||||
|
|
||||||
|
public PacketQuestUpdateQuestVarRsp(int questId) {
|
||||||
|
super(PacketOpcodes.QuestUpdateQuestVarRsp);
|
||||||
|
var rsp = QuestUpdateQuestVarRspOuterClass.QuestUpdateQuestVarRsp.newBuilder()
|
||||||
|
.setQuestId(questId).build();
|
||||||
|
this.setData(rsp);
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,9 @@ import emu.grasscutter.net.packet.BasePacket;
|
|||||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
import emu.grasscutter.net.proto.ServerCondMeetQuestListUpdateNotifyOuterClass.ServerCondMeetQuestListUpdateNotify;
|
import emu.grasscutter.net.proto.ServerCondMeetQuestListUpdateNotifyOuterClass.ServerCondMeetQuestListUpdateNotify;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class PacketServerCondMeetQuestListUpdateNotify extends BasePacket {
|
public class PacketServerCondMeetQuestListUpdateNotify extends BasePacket {
|
||||||
|
|
||||||
public PacketServerCondMeetQuestListUpdateNotify(Player player) {
|
public PacketServerCondMeetQuestListUpdateNotify(Player player) {
|
||||||
@ -24,12 +27,23 @@ public class PacketServerCondMeetQuestListUpdateNotify extends BasePacket {
|
|||||||
this.setData(proto);
|
this.setData(proto);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PacketServerCondMeetQuestListUpdateNotify(GameQuest quest) {
|
public PacketServerCondMeetQuestListUpdateNotify(List<GameQuest> quests) {
|
||||||
super(PacketOpcodes.ServerCondMeetQuestListUpdateNotify);
|
super(PacketOpcodes.ServerCondMeetQuestListUpdateNotify);
|
||||||
|
|
||||||
ServerCondMeetQuestListUpdateNotify proto = ServerCondMeetQuestListUpdateNotify.newBuilder()
|
ServerCondMeetQuestListUpdateNotify.Builder proto = ServerCondMeetQuestListUpdateNotify.newBuilder();
|
||||||
//.addAddQuestIdList(quest.getQuestId())
|
for (GameQuest quest : quests) {
|
||||||
.build();
|
proto.addAddQuestIdList(quest.getSubQuestId());
|
||||||
|
}
|
||||||
|
proto.build();
|
||||||
|
|
||||||
|
this.setData(proto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketServerCondMeetQuestListUpdateNotify() {
|
||||||
|
super(PacketOpcodes.ServerCondMeetQuestListUpdateNotify);
|
||||||
|
|
||||||
|
ServerCondMeetQuestListUpdateNotify.Builder proto = ServerCondMeetQuestListUpdateNotify.newBuilder();
|
||||||
|
proto.build();
|
||||||
|
|
||||||
this.setData(proto);
|
this.setData(proto);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user