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

View File

@ -212,19 +212,29 @@ public class World implements Iterable<GenshinPlayer> {
return false; return false;
} }
Integer oldSceneId = null; GenshinScene oldScene = null;
if (player.getScene() != null) { if (player.getScene() != null) {
oldSceneId = player.getScene().getId(); oldScene = player.getScene();
player.getScene().removePlayer(player);
// 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); oldScene.removePlayer(player);
scene.addPlayer(player); }
GenshinScene newScene = this.getSceneById(sceneId);
newScene.addPlayer(player);
player.getPos().set(pos); player.getPos().set(pos);
if (oldScene != null) {
oldScene.setDontDestroyWhenEmpty(false);
}
// Teleport packet // Teleport packet
if (oldSceneId.equals(sceneId)) { if (oldScene == newScene) {
player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterGoto, EnterReason.TransPoint, sceneId, pos)); player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterGoto, EnterReason.TransPoint, sceneId, pos));
} else { } else {
player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterJump, EnterReason.TransPoint, sceneId, pos)); player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterJump, EnterReason.TransPoint, sceneId, pos));