Dont deregister scenes if the player is going to tp back into them

This commit is contained in:
Melledy 2022-04-25 02:16:01 -07:00
parent 3b414cda38
commit b0322fa3e5
2 changed files with 26 additions and 7 deletions

View File

@ -47,6 +47,7 @@ public class GenshinScene {
private final Set<SpawnDataEntry> spawnedEntities;
private final Set<SpawnDataEntry> deadSpawnedEntities;
private boolean dontDestroyWhenEmpty;
private int time;
private ClimateType climate;
@ -121,6 +122,14 @@ public class GenshinScene {
this.weather = weather;
}
public boolean dontDestroyWhenEmpty() {
return dontDestroyWhenEmpty;
}
public void setDontDestroyWhenEmpty(boolean dontDestroyWhenEmpty) {
this.dontDestroyWhenEmpty = dontDestroyWhenEmpty;
}
public Set<SpawnDataEntry> getSpawnedEntities() {
return spawnedEntities;
}
@ -166,7 +175,7 @@ public class GenshinScene {
}
// Deregister scene if not in use
if (this.getEntities().size() <= 0) {
if (this.getEntities().size() <= 0 && !this.dontDestroyWhenEmpty()) {
this.getWorld().deregisterScene(this);
}
}

View File

@ -212,19 +212,29 @@ public class World implements Iterable<GenshinPlayer> {
return false;
}
Integer oldSceneId = null;
GenshinScene oldScene = null;
if (player.getScene() != null) {
oldSceneId = player.getScene().getId();
player.getScene().removePlayer(player);
oldScene = player.getScene();
// Dont deregister scenes if the player is going to tp back into them
if (oldScene.getId() == sceneId) {
oldScene.setDontDestroyWhenEmpty(true);
}
GenshinScene scene = this.getSceneById(sceneId);
scene.addPlayer(player);
oldScene.removePlayer(player);
}
GenshinScene newScene = this.getSceneById(sceneId);
newScene.addPlayer(player);
player.getPos().set(pos);
if (oldScene != null) {
oldScene.setDontDestroyWhenEmpty(false);
}
// Teleport packet
if (oldSceneId.equals(sceneId)) {
if (oldScene == newScene) {
player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterGoto, EnterReason.TransPoint, sceneId, pos));
} else {
player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterJump, EnterReason.TransPoint, sceneId, pos));