mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-21 11:24:47 +01:00
Merge pull request Grasscutter-Quests#53
'Updated with how talks are handle' by `mjolsic`
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user