Merge pull request Grasscutter-Quests#53

'Updated with how talks are handle' by `mjolsic`
This commit is contained in:
KingRainbow44
2023-05-02 20:16:55 -04:00
parent 6c654ce0c3
commit fdd6820a8f
107 changed files with 538 additions and 233 deletions

View File

@@ -26,6 +26,7 @@ import emu.grasscutter.game.shop.ShopSystem;
import emu.grasscutter.game.systems.AnnouncementSystem;
import emu.grasscutter.game.systems.InventorySystem;
import emu.grasscutter.game.systems.MultiplayerSystem;
import emu.grasscutter.game.talk.TalkSystem;
import emu.grasscutter.game.tower.TowerSystem;
import emu.grasscutter.game.world.World;
import emu.grasscutter.game.world.WorldDataSystem;
@@ -69,6 +70,7 @@ public final class GameServer extends KcpServer {
private final TowerSystem towerSystem;
private final AnnouncementSystem announcementSystem;
private final QuestSystem questSystem;
private final TalkSystem talkSystem;
// Extra
private final ServerTaskScheduler scheduler;
@@ -123,6 +125,7 @@ public final class GameServer extends KcpServer {
this.battlePassSystem = new BattlePassSystem(this);
this.announcementSystem = new AnnouncementSystem(this);
this.questSystem = new QuestSystem(this);
this.talkSystem = new TalkSystem(this);
// Chata manager
this.chatManager = new ChatSystem(this);

View File

@@ -16,40 +16,9 @@ import emu.grasscutter.server.packet.send.PacketNpcTalkRsp;
public class HandlerNpcTalkReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
NpcTalkReq req = NpcTalkReq.parseFrom(payload);
// Check if mainQuest exists
// remove last 2 digits to get a mainQuestId
int talkId = req.getTalkId();
int mainQuestId = GameData.getQuestTalkMap().getOrDefault(talkId, talkId / 100);
MainQuestData mainQuestData = GameData.getMainQuestDataMap().get(mainQuestId);
if (mainQuestData != null) {
// This talk is associated with a quest. Handle it.
// If the quest has no talk data defined on it, create one.
TalkData talkForQuest = new TalkData(talkId, "");
if (mainQuestData.getTalks() != null) {
var talks = mainQuestData.getTalks().stream().filter(p -> p.getId() == talkId).toList();
if (talks.size() > 0) {
talkForQuest = talks.get(0);
}
}
// Add to the list of done talks for this quest.
var questManager = session.getPlayer().getQuestManager();
var mainQuest = questManager.getMainQuestByTalkId(talkId);
if (mainQuest != null) {
mainQuest.getTalks().put(talkId, talkForQuest);
}
// Fire quest triggers.
questManager.queueEvent(QuestContent.QUEST_CONTENT_COMPLETE_ANY_TALK, talkId, 0, 0);
questManager.queueEvent(QuestContent.QUEST_CONTENT_COMPLETE_TALK, talkId, 0);
questManager.queueEvent(QuestContent.QUEST_CONTENT_FINISH_PLOT, talkId, 0);
questManager.queueEvent(QuestCond.QUEST_COND_COMPLETE_TALK, talkId, 0);
}
var req = NpcTalkReq.parseFrom(payload);
session.getPlayer().getTalkManager().triggerTalkAction(req.getTalkId());
session.send(new PacketNpcTalkRsp(req.getNpcEntityId(), req.getTalkId(), req.getEntityId()));
}
}

View File

@@ -35,27 +35,20 @@ public class HandlerQuestUpdateQuestVarReq extends PacketHandler {
req.getParentQuestId());
return;
}
List<QuestVarOp> questVars = req.getQuestVarOpListList();
var questVarUpdate = mainQuest.getQuestVarsUpdate();
if (questVarUpdate.size() == 0) {
for (var questVar : questVars) {
questVarUpdate.add(questVar.getValue());
}
} else {
for (QuestVarOp questVar : questVars) {
if (questVar.getIsAdd()) {
if (questVar.getValue() >= 0) {
mainQuest.incQuestVar(questVar.getIndex(), questVar.getValue());
} else {
mainQuest.decQuestVar(questVar.getIndex(), questVar.getValue());
}
for (var questVar : req.getQuestVarOpListList()) {
var value = questVar.getValue();
if (questVar.getIsAdd()) {
if (value >= 0) {
mainQuest.incQuestVar(questVar.getIndex(), value);
} else {
mainQuest.setQuestVar(questVar.getIndex(), questVarUpdate.get(0));
mainQuest.decQuestVar(questVar.getIndex(), value);
}
// remove the first element from the update list
questVarUpdate.remove(0);
} else {
mainQuest.setQuestVar(questVar.getIndex(), value);
}
}
session.send(new PacketQuestUpdateQuestVarRsp(req));
}
}

View File

@@ -0,0 +1,23 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.QuestGlobalVarNotifyOuterClass.QuestGlobalVarNotify;
import emu.grasscutter.net.proto.QuestGlobalVarOuterClass.QuestGlobalVar;
public final class PacketQuestGlobalVarNotify extends BasePacket {
public PacketQuestGlobalVarNotify(Player player) {
super(PacketOpcodes.QuestGlobalVarNotify);
this.setData(QuestGlobalVarNotify.newBuilder()
.addAllVarList(player.getQuestGlobalVariables().entrySet().stream()
.map(entry -> QuestGlobalVar.newBuilder()
.setKey(entry.getKey())
.setValue(entry.getValue())
.build())
.toList())
.build());
}
}

View File

@@ -0,0 +1,19 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.QuestUpdateQuestVarNotifyOuterClass.QuestUpdateQuestVarNotify;
import java.util.stream.IntStream;
public class PacketQuestUpdateQuestVarNotify extends BasePacket {
public PacketQuestUpdateQuestVarNotify(int mainQuestId, int... questVars) {
super(PacketOpcodes.QuestUpdateQuestVarNotify);
this.setData(QuestUpdateQuestVarNotify.newBuilder()
.setParentQuestId(mainQuestId)
.addAllQuestVar(IntStream.of(questVars)
.boxed().toList())
.build());
}
}