118 lines
3.8 KiB
Java
Raw Normal View History

2022-04-17 05:43:07 -07:00
package emu.grasscutter.game.dungeons;
2022-04-28 08:20:37 -07:00
import emu.grasscutter.GameConstants;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
2022-05-28 04:21:47 -07:00
import emu.grasscutter.data.binout.ScenePointEntry;
import emu.grasscutter.data.excels.DungeonData;
2022-04-28 08:20:37 -07:00
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.SceneType;
2022-05-13 05:33:43 -07:00
import emu.grasscutter.game.quest.enums.QuestTrigger;
import emu.grasscutter.game.world.Scene;
2022-04-28 08:20:37 -07:00
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
2022-04-17 05:43:07 -07:00
import emu.grasscutter.server.game.GameServer;
2022-04-28 08:20:37 -07:00
import emu.grasscutter.server.packet.send.PacketDungeonEntryInfoRsp;
import emu.grasscutter.server.packet.send.PacketPlayerEnterDungeonRsp;
import emu.grasscutter.utils.Position;
2022-04-17 05:43:07 -07:00
import java.util.List;
2022-04-17 05:43:07 -07:00
public class DungeonManager {
private final GameServer server;
private static final BasicDungeonSettleListener basicDungeonSettleObserver = new BasicDungeonSettleListener();
2022-04-17 05:43:07 -07:00
public DungeonManager(GameServer server) {
this.server = server;
}
public GameServer getServer() {
return server;
}
2022-04-28 08:20:37 -07:00
public void getEntryInfo(Player player, int pointId) {
ScenePointEntry entry = GameData.getScenePointEntryById(player.getScene().getId(), pointId);
if (entry == null) {
2022-04-28 08:20:37 -07:00
// Error
player.sendPacket(new PacketDungeonEntryInfoRsp());
return;
}
player.sendPacket(new PacketDungeonEntryInfoRsp(player, entry.getPointData()));
}
public boolean enterDungeon(Player player, int pointId, int dungeonId) {
2022-04-28 08:20:37 -07:00
DungeonData data = GameData.getDungeonDataMap().get(dungeonId);
if (data == null) {
return false;
2022-04-28 08:20:37 -07:00
}
Grasscutter.getLogger().info("{}({}) is trying to enter dungeon {}" ,player.getNickname(),player.getUid(),dungeonId);
2022-04-29 00:49:05 -07:00
2022-04-28 08:20:37 -07:00
int sceneId = data.getSceneId();
player.getScene().setPrevScene(sceneId);
2022-04-28 08:20:37 -07:00
2022-05-13 05:33:43 -07:00
if (player.getWorld().transferPlayerToScene(player, sceneId, data)) {
player.getScene().addDungeonSettleObserver(basicDungeonSettleObserver);
2022-05-13 05:33:43 -07:00
player.getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_ENTER_DUNGEON, data.getId());
}
2022-04-28 08:20:37 -07:00
player.getScene().setPrevScenePoint(pointId);
2022-04-28 08:20:37 -07:00
player.sendPacket(new PacketPlayerEnterDungeonRsp(pointId, dungeonId));
return true;
2022-04-28 08:20:37 -07:00
}
/**
* used in tower dungeons handoff
*/
public boolean handoffDungeon(Player player, int dungeonId, List<DungeonSettleListener> dungeonSettleListeners) {
DungeonData data = GameData.getDungeonDataMap().get(dungeonId);
if (data == null) {
return false;
}
Grasscutter.getLogger().info("{}({}) is trying to enter tower dungeon {}" ,player.getNickname(),player.getUid(),dungeonId);
if(player.getWorld().transferPlayerToScene(player, data.getSceneId(), data)){
dungeonSettleListeners.forEach(player.getScene()::addDungeonSettleObserver);
}
return true;
}
2022-04-28 08:20:37 -07:00
public void exitDungeon(Player player) {
Scene scene = player.getScene();
if (scene==null || scene.getSceneType() != SceneType.SCENE_DUNGEON) {
2022-04-28 08:20:37 -07:00
return;
}
// Get previous scene
int prevScene = scene.getPrevScene() > 0 ? scene.getPrevScene() : 3;
2022-04-28 08:20:37 -07:00
// Get previous position
DungeonData dungeonData = scene.getDungeonData();
2022-04-28 08:20:37 -07:00
Position prevPos = new Position(GameConstants.START_POSITION);
if (dungeonData != null) {
ScenePointEntry entry = GameData.getScenePointEntryById(prevScene, scene.getPrevScenePoint());
2022-04-28 08:20:37 -07:00
if (entry != null) {
prevPos.set(entry.getPointData().getTranPos());
}
}
2022-05-06 14:10:23 +08:00
// clean temp team if it has
player.getTeamManager().cleanTemporaryTeam();
player.getTowerManager().clearEntry();
2022-05-07 00:19:51 +08:00
2022-04-28 08:20:37 -07:00
// Transfer player back to world
player.getWorld().transferPlayerToScene(player, prevScene, prevPos);
player.sendPacket(new BasePacket(PacketOpcodes.PlayerQuitDungeonRsp));
}
public void updateDailyDungeons() {
for (ScenePointEntry entry : GameData.getScenePointEntries().values()) {
entry.getPointData().updateDailyDungeon();
}
}
2022-04-17 05:43:07 -07:00
}