Files
2009scape/Server/src/main/content/global/skill/construction/HouseZone.java
T

158 lines
5.2 KiB
Java

package content.global.skill.construction;
import core.api.Container;
import core.game.world.map.Location;
import org.rs09.consts.Items;
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.RegionManager;
import core.game.world.map.Region;
import core.game.system.task.Pulse;
import core.game.world.map.zone.ZoneType;
import static core.api.ContentAPIKt.*;
/**
* Handles the player owned house zone.
*
* @author Emperor
*/
public final class HouseZone extends MapZone {
/**
* The house manager.
*/
private HouseManager house;
/**
* The previous house region id.
*/
private int previousRegion = -1;
/**
* The previous dungeon region id.
*/
private int previousDungeon = -1;
/**
* Constructs the house zone object.
*/
public HouseZone(HouseManager house) {
super("poh-zone" + house, true);
this.house = house;
}
@Override
public void configure() {
setZoneType(ZoneType.P_O_H.getId());
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);
}
@Override
public boolean death(Entity e, Entity killer) {
if (e instanceof Player) {
Player p = (Player) e;
HouseManager.leave(p);
return true;
}
return super.death(e, killer);
}
@Override
public boolean leave(Entity e, boolean logout) {
if (e instanceof Player) {
Player p = (Player) e;
// if the player is moving between the dungeon and main house, don't trigger the leave sequence
if (house.getDungeonRegion() != null && !logout) {
// current loc
Location dest = p.getProperties().getTeleportLocation();
int currentRegionId = p.getLocation().getRegionId();
int houseId = house.getHouseRegion().getId();
int dungeonId = house.getDungeonRegion().getId();
// check if still in house
boolean currentlyInHouse = (currentRegionId == houseId || currentRegionId == dungeonId);
// check if moving between house regions
int destRegionId = (dest != null) ? dest.getRegionId() : -1;
boolean movingToHouse = (destRegionId == houseId || destRegionId == dungeonId);
// if yes, return true and stop the leave sequence
if (currentlyInHouse || movingToHouse) {
return true;
}
}
remove_items(p);
// The below tears down the house if the owner was the one who left
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.flagInactive();
if (dungRemove != -1) {
RegionManager.removeRegion(dungRemove);
unregisterRegion(dungRemove);
dr.flagInactive();
}
return true;
}
});
}
// Clear logout listener and original-loc (if appropriate)
clearLogoutListener(p, "houselogout");
if (!getAttribute(p, "kidnapped-by-random", false)) {
removeAttribute(p, "/save:original-loc");
}
return true;
}
return true;
}
private void remove_items(Player p) {
for (int item = Items.KETTLE_7688; item <= Items.CHEFS_DELIGHT_7755; item++) {//Removes all PoH versions of tea and beer barrel-related items
removeAll(p, item, Container.INVENTORY);
removeAll(p, item, Container.BoB);
}
}
}