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 emu.grasscutter.Grasscutter;
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.IntArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter;
import lombok.NoArgsConstructor;
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
// 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
private Map<Integer, Integer> questProgressCountMap;
private Map<String, Integer> questProgressCountMap;
public PlayerProgress() {
this.questProgressCountMap = new Int2IntOpenHashMap();
this.questProgressCountMap = new ConcurrentHashMap<>();
this.completedDungeons = new IntArrayList();
this.itemHistory = new Int2ObjectOpenHashMap<>();
}
@ -70,15 +71,15 @@ public class PlayerProgress {
return itemEntry.addToObtainedCount(count);
}
public int getCurrentProgress(int progressId) {
public int getCurrentProgress(String progressId) {
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);
}
public int resetCurrentProgress(int progressId) {
public int resetCurrentProgress(String progressId) {
return questProgressCountMap.merge(progressId, 0, Integer::min);
}

View File

@ -300,7 +300,7 @@ public final class PlayerProgressManager extends BasePlayerDataManager {
/** Quest progress */
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
.getQuestManager()

View File

@ -51,10 +51,12 @@ public class GameQuest {
this.state = QuestState.QUEST_STATE_UNSTARTED;
this.triggerData = 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() {
this.clearProgress(false);
this.acceptTime = Utils.getCurrentSeconds();
this.startTime = this.acceptTime;
this.startGameDay = getOwner().getWorld().getTotalGameTimeDays();
@ -153,17 +155,30 @@ public class GameQuest {
// TODO improve
var oldState = state;
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()];
}
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.getOwner().getPlayerProgress().resetCurrentProgress(String.valueOf(this.subQuestId));
setState(QuestState.QUEST_STATE_UNSTARTED);
finishTime = 0;
acceptTime = 0;
startTime = 0;
this.getOwner().getPlayerProgress().resetCurrentProgress(this.subQuestId);
if (oldState == QuestState.QUEST_STATE_UNSTARTED) {
return false;
}

View File

@ -14,7 +14,7 @@ public class ContentAddQuestProgress extends BaseContent {
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
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
// condition count from EXEC only needs to be 1

View File

@ -12,6 +12,6 @@ public class ContentLuaNotify extends BaseContent {
@Override
public boolean execute(
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);
for(var player : getSceneScriptManager().getScene().getPlayers()){
player.getPlayerProgress().addToCurrentProgress(var1, 1);
player.getQuestManager().queueEvent(QuestCond.QUEST_COND_LUA_NOTIFY, var1);
player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_LUA_NOTIFY, var1);
}