Fixed incorrect teleporting to house portal on logout

House now kicks guests when owner leaves
More aggressively unload old house regions (experiment)
Added DEBUG log type (currently unused, but shows up in cyan when used and the world is in development mode)
This commit is contained in:
Ceikry
2023-03-30 22:39:42 +00:00
committed by Ryan
parent 757b13544a
commit b1ed4461af
6 changed files with 98 additions and 37 deletions
@@ -64,7 +64,7 @@ public final class HouseManager {
/**
* The house zone.
*/
private final HouseZone zone = new HouseZone(this);
private HouseZone zone = new HouseZone(this);
/**
* The player's house rooms.
@@ -198,10 +198,6 @@ public final class HouseManager {
player.lock(1);
player.sendMessage("House location: " + houseRegion.getBaseLocation() + ", entry: " + getEnterLocation());
player.getProperties().setTeleportLocation(getEnterLocation());
registerLogoutListener(player, "houselogout", (p) -> {
p.setLocation(location.getExitLocation());
return Unit.INSTANCE;
});
openLoadInterface(player);
checkForAndSpawnServant(player);
updateVarbits(player, buildingMode);
@@ -254,7 +250,6 @@ public final class HouseManager {
*/
public static void leave(Player player) {
HouseManager house = player.getAttribute("poh_entry", player.getHouseManager());
clearLogoutListener(player, "houselogout");
if (house.getHouseRegion() == null){
return;
}
@@ -278,8 +273,7 @@ public final class HouseManager {
if (enable) {
expelGuests(player);
}
buildingMode = enable;
reload(player, enable);
enter(player, enable);
player.getPacketDispatch().sendMessage("Building mode is now " + (buildingMode ? "on." : "off."));
}
}
@@ -288,6 +282,7 @@ public final class HouseManager {
* Reloads the house.
* @param player The player.
* @param buildingMode If building mode should be enabled.
* NOTE: I think we should avoid this method, it might be causing some issues. It's actually really suspicious...
*/
public void reload(Player player, boolean buildingMode) {
int diffX = player.getLocation().getLocalX();
@@ -902,4 +897,4 @@ public final class HouseManager {
public HouseZone getZone() {
return zone;
}
}
}
@@ -5,6 +5,11 @@ import core.game.node.entity.Entity;
import core.game.node.entity.player.Player;
import core.game.world.map.zone.MapZone;
import core.game.world.map.zone.ZoneRestriction;
import core.game.world.map.RegionManager;
import core.game.world.map.Region;
import core.game.system.task.Pulse;
import static core.api.ContentAPIKt.*;
/**
* Handles the player owned house zone.
@@ -38,20 +43,36 @@ public final class HouseZone extends MapZone {
@Override
public void configure() {
if (previousRegion != -1) {
unregisterRegion(previousRegion);
}
if (previousDungeon != -1) {
unregisterRegion(previousDungeon);
}
unregisterOldRegions();
registerRegion(house.getHouseRegion().getId());
if (house.getDungeonRegion() != null) {
registerRegion(house.getDungeonRegion().getId());
}
}
private void unregisterOldRegions() {
if (previousRegion != -1) {
unregisterRegion(previousRegion);
}
if (previousDungeon != -1) {
unregisterRegion(previousDungeon);
}
}
@Override
public boolean enter(Entity e) {
if (e instanceof Player) {
Player pl = (Player) e;
if (house == pl.getHouseManager()) {
previousRegion = house.getHouseRegion().getId();
if (house.getDungeonRegion() != null)
previousDungeon = house.getDungeonRegion().getId();
}
registerLogoutListener(pl, "houselogout", (p) -> {
p.setLocation(house.getLocation().getExitLocation());
return kotlin.Unit.INSTANCE;
});
}
return super.enter(e);
}
@@ -66,13 +87,31 @@ public final class HouseZone extends MapZone {
@Override
public boolean leave(Entity e, boolean logout) {
if (logout) {
if (e instanceof Player) {
Player p = (Player) e;
HouseManager.leave(p);
return true;
if (e instanceof Player) {
Player p = (Player) e;
if (house == p.getHouseManager()) {
house.expelGuests(p);
int toRemove = previousRegion;
int dungRemove = previousDungeon;
submitWorldPulse(new Pulse(2) {
public boolean pulse() {
Region r = RegionManager.forId(toRemove);
Region dr = dungRemove != -1 ? RegionManager.forId(dungRemove) : null;
RegionManager.removeRegion(toRemove);
unregisterRegion(toRemove);
r.setActive(false);
if (dungRemove != -1) {
RegionManager.removeRegion(dungRemove);
unregisterRegion(dungRemove);
dr.setActive(false);
}
return true;
}
});
}
clearLogoutListener(p, "houselogout");
return true;
}
return true;
}
}
}