Fix battle in front of glowy stag god (#2188)

* Fix battle in front of glowy stag god

* Don't do a rollback when starting a quest. We're better than that.
This commit is contained in:
Nazrin 2023-06-03 07:54:46 -07:00 committed by GitHub
parent 853a67d48e
commit e28575c80f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 11 deletions

View File

@ -4,10 +4,11 @@ import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Transient; import dev.morphia.annotations.Transient;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.quest.enums.QuestContent; import emu.grasscutter.game.quest.enums.QuestContent;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntArrayList;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@ -29,10 +30,10 @@ public class PlayerProgress {
// keep track of EXEC_ADD_QUEST_PROGRESS count, will be used in CONTENT_ADD_QUEST_PROGRESS // keep track of EXEC_ADD_QUEST_PROGRESS count, will be used in CONTENT_ADD_QUEST_PROGRESS
// not sure where to put this, this should be saved to DB but not to individual quest, since // not sure where to put this, this should be saved to DB but not to individual quest, since
// it will be hard to loop and compare // it will be hard to loop and compare
private Map<Integer, Integer> questProgressCountMap; private Map<String, Integer> questProgressCountMap;
public PlayerProgress() { public PlayerProgress() {
this.questProgressCountMap = new Int2IntOpenHashMap(); this.questProgressCountMap = new ConcurrentHashMap<>();
this.completedDungeons = new IntArrayList(); this.completedDungeons = new IntArrayList();
this.itemHistory = new Int2ObjectOpenHashMap<>(); this.itemHistory = new Int2ObjectOpenHashMap<>();
} }
@ -70,15 +71,15 @@ public class PlayerProgress {
return itemEntry.addToObtainedCount(count); return itemEntry.addToObtainedCount(count);
} }
public int getCurrentProgress(int progressId) { public int getCurrentProgress(String progressId) {
return questProgressCountMap.getOrDefault(progressId, -1); return questProgressCountMap.getOrDefault(progressId, -1);
} }
public int addToCurrentProgress(int progressId, int count) { public int addToCurrentProgress(String progressId, int count) {
return questProgressCountMap.merge(progressId, count, Integer::sum); return questProgressCountMap.merge(progressId, count, Integer::sum);
} }
public int resetCurrentProgress(int progressId) { public int resetCurrentProgress(String progressId) {
return questProgressCountMap.merge(progressId, 0, Integer::min); return questProgressCountMap.merge(progressId, 0, Integer::min);
} }

View File

@ -300,7 +300,7 @@ public final class PlayerProgressManager extends BasePlayerDataManager {
/** Quest progress */ /** Quest progress */
public void addQuestProgress(int id, int count) { public void addQuestProgress(int id, int count) {
var newCount = player.getPlayerProgress().addToCurrentProgress(id, count); var newCount = player.getPlayerProgress().addToCurrentProgress(String.valueOf(id), count);
player.save(); player.save();
player player
.getQuestManager() .getQuestManager()

View File

@ -51,10 +51,12 @@ public class GameQuest {
this.state = QuestState.QUEST_STATE_UNSTARTED; this.state = QuestState.QUEST_STATE_UNSTARTED;
this.triggerData = new HashMap<>(); this.triggerData = new HashMap<>();
this.triggers = new HashMap<>(); this.triggers = new HashMap<>();
this.finishProgressList = new int[questData.getFinishCond().size()];
this.failProgressList = new int[questData.getFailCond().size()];
this.finishTime = 0;
} }
public void start() { public void start() {
this.clearProgress(false);
this.acceptTime = Utils.getCurrentSeconds(); this.acceptTime = Utils.getCurrentSeconds();
this.startTime = this.acceptTime; this.startTime = this.acceptTime;
this.startGameDay = getOwner().getWorld().getTotalGameTimeDays(); this.startGameDay = getOwner().getWorld().getTotalGameTimeDays();
@ -153,17 +155,30 @@ public class GameQuest {
// TODO improve // TODO improve
var oldState = state; var oldState = state;
if (questData.getFinishCond() != null && questData.getFinishCond().size() != 0) { if (questData.getFinishCond() != null && questData.getFinishCond().size() != 0) {
for(var condition : questData.getFinishCond()) {
if(condition.getType() == QuestContent.QUEST_CONTENT_LUA_NOTIFY) {
this.getOwner().getPlayerProgress().resetCurrentProgress(condition.getParamStr());
}
}
this.finishProgressList = new int[questData.getFinishCond().size()]; this.finishProgressList = new int[questData.getFinishCond().size()];
} }
if (questData.getFailCond() != null && questData.getFailCond().size() != 0) { if (questData.getFailCond() != null && questData.getFailCond().size() != 0) {
for(var condition : questData.getFailCond()) {
if(condition.getType() == QuestContent.QUEST_CONTENT_LUA_NOTIFY) {
this.getOwner().getPlayerProgress().resetCurrentProgress(condition.getParamStr());
}
}
this.failProgressList = new int[questData.getFailCond().size()]; this.failProgressList = new int[questData.getFailCond().size()];
} }
this.getOwner().getPlayerProgress().resetCurrentProgress(String.valueOf(this.subQuestId));
setState(QuestState.QUEST_STATE_UNSTARTED); setState(QuestState.QUEST_STATE_UNSTARTED);
finishTime = 0; finishTime = 0;
acceptTime = 0; acceptTime = 0;
startTime = 0; startTime = 0;
this.getOwner().getPlayerProgress().resetCurrentProgress(this.subQuestId);
if (oldState == QuestState.QUEST_STATE_UNSTARTED) { if (oldState == QuestState.QUEST_STATE_UNSTARTED) {
return false; return false;
} }

View File

@ -14,7 +14,7 @@ public class ContentAddQuestProgress extends BaseContent {
public boolean execute( public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) { GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
val progressId = condition.getParam()[0]; val progressId = condition.getParam()[0];
val currentCount = quest.getOwner().getPlayerProgress().getCurrentProgress(progressId); val currentCount = quest.getOwner().getPlayerProgress().getCurrentProgress(String.valueOf(progressId));
// if the condition count is 0 I think it is safe to assume that the // if the condition count is 0 I think it is safe to assume that the
// condition count from EXEC only needs to be 1 // condition count from EXEC only needs to be 1

View File

@ -12,6 +12,6 @@ public class ContentLuaNotify extends BaseContent {
@Override @Override
public boolean execute( public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) { GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
return condition.getParamStr().equals(paramStr); return condition.getParamStr().equals(paramStr) && condition.getCount() <= quest.getOwner().getPlayerProgress().getCurrentProgress(paramStr);
} }
} }

View File

@ -667,6 +667,7 @@ public class ScriptLib {
var1); var1);
for(var player : getSceneScriptManager().getScene().getPlayers()){ for(var player : getSceneScriptManager().getScene().getPlayers()){
player.getPlayerProgress().addToCurrentProgress(var1, 1);
player.getQuestManager().queueEvent(QuestCond.QUEST_COND_LUA_NOTIFY, var1); player.getQuestManager().queueEvent(QuestCond.QUEST_COND_LUA_NOTIFY, var1);
player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_LUA_NOTIFY, var1); player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_LUA_NOTIFY, var1);
} }