mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-14 07:55:57 +01:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user