Fix daily dungeon flow (#2398)

* Fix dungeon entry, daily changes, replay flow; fix Mond's weapon mats domain unlock

* add note to DungeonEntryToBeExploreNotify
This commit is contained in:
longfruit
2023-10-16 22:41:04 -07:00
committed by GitHub
parent 6745d1126e
commit 770cd62370
17 changed files with 278 additions and 38 deletions

View File

@@ -7,10 +7,14 @@ import emu.grasscutter.data.excels.dungeon.*;
import emu.grasscutter.game.dungeons.handlers.DungeonBaseHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.game.props.EnterReason;
import emu.grasscutter.game.world.*;
import emu.grasscutter.net.packet.*;
import emu.grasscutter.server.game.*;
import emu.grasscutter.server.packet.send.PacketDungeonEntryInfoRsp;
import emu.grasscutter.game.world.data.TeleportProperties;
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
import it.unimi.dsi.fastutil.ints.*;
import java.util.List;
import lombok.val;
@@ -173,4 +177,25 @@ public final class DungeonSystem extends BaseGameSystem {
player.getWorld().transferPlayerToScene(player, prevScene, prevPos);
player.sendPacket(new BasePacket(PacketOpcodes.PlayerQuitDungeonRsp));
}
public void restartDungeon(Player player) {
var scene = player.getScene();
var dungeonManager = scene.getDungeonManager();
var dungeonData = dungeonManager.getDungeonData();
var sceneId = dungeonData.getSceneId();
// Forward over previous scene and scene point
var prevScene = scene.getPrevScene();
var pointId = scene.getPrevScenePoint();
// Destroy then create scene again to reinitialize script state
scene.getPlayers().forEach(scene::removePlayer);
if (player.getWorld().transferPlayerToScene(player, sceneId, dungeonData)) {
scene = player.getScene();
scene.setPrevScene(prevScene);
scene.setPrevScenePoint(pointId);
scene.setDungeonManager(new DungeonManager(scene, dungeonData));
scene.addDungeonSettleObserver(basicDungeonSettleObserver);
}
}
}

View File

@@ -0,0 +1,7 @@
package emu.grasscutter.game.dungeons.enums;
public enum DungeonEntryCondCombType {
DUNGEON_ENTRY_COND_COMB_NONE,
DUNGEON_ENTRY_COND_COMB_LOGIC_OR,
DUNGEON_ENTRY_COND_COMB_LOGIC_AND
}

View File

@@ -1,6 +1,6 @@
package emu.grasscutter.game.entity.gadget;
import emu.grasscutter.game.dungeons.challenge.DungeonChallenge;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
@@ -18,7 +18,7 @@ public final class GadgetRewardStatue extends GadgetContent {
public boolean onInteract(Player player, GadgetInteractReq req) {
var dungeonManager = player.getScene().getDungeonManager();
if (player.getScene().getChallenge() instanceof DungeonChallenge) {
if (player.getScene().getChallenge() instanceof WorldChallenge) {
var useCondensed =
req.getResinCostType() == ResinCostTypeOuterClass.ResinCostType.RESIN_COST_TYPE_CONDENSE;
dungeonManager.getStatueDrops(player, useCondensed, getGadget().getGroupId());

View File

@@ -1530,6 +1530,31 @@ public class Player implements PlayerHook, FieldFetch {
getServer().getPlayers().values().removeIf(player1 -> player1 == this);
}
public void unfreezeUnlockedScenePoints(int sceneId) {
// Unfreeze previously unlocked scene points. For example,
// the first weapon mats domain needs some script interaction
// to unlock. It needs to be unfrozen when GetScenePointReq
// comes in to be interactable again.
GameData.getScenePointEntryMap().values().stream()
.filter(scenePointEntry ->
// Note: Only DungeonEntry scene points need to be unfrozen
scenePointEntry.getPointData().getType().equals("DungeonEntry")
// groupLimit says this scene point needs to be unfrozen
&& scenePointEntry.getPointData().isGroupLimit())
.forEach(scenePointEntry -> {
// If this is a previously unlocked scene point,
// send unfreeze packet.
val pointId = scenePointEntry.getPointData().getId();
if (unlockedScenePoints.get(sceneId).contains(pointId)) {
this.sendPacket(new PacketUnfreezeGroupLimitNotify(pointId, sceneId));
}
});
}
public void unfreezeUnlockedScenePoints() {
unlockedScenePoints.keySet().forEach(sceneId -> unfreezeUnlockedScenePoints(sceneId));
}
public int getLegendaryKey() {
return this.getProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY);
}

View File

@@ -158,7 +158,7 @@ public class Scene {
return entity;
}
public GameEntity getEntityByConfigId(int configId) {
public GameEntity getFirstEntityByConfigId(int configId) {
return this.entities.values().stream()
.filter(x -> x.getConfigId() == configId)
.findFirst()