MapAreas can now reference their associated zones to dynamically add/remove borders
Random Events can no longer spawn in fishing trawler Players can no longer have multiple random events spawned in/active at a time
This commit is contained in:
@@ -149,6 +149,18 @@ public class Region {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void remove(RegionZone zone) {
|
||||||
|
regionZones.remove(zone);
|
||||||
|
for (RegionPlane plane : planes) {
|
||||||
|
for (NPC npc : plane.getNpcs()) {
|
||||||
|
npc.getZoneMonitor().updateLocation(npc.getLocation());
|
||||||
|
}
|
||||||
|
for (Player p : plane.getPlayers()) {
|
||||||
|
p.getZoneMonitor().updateLocation(p.getLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a player to this region.
|
* Adds a player to this region.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import core.game.world.map.Region;
|
|||||||
import core.game.world.map.RegionManager;
|
import core.game.world.map.RegionManager;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a map zone.
|
* Represents a map zone.
|
||||||
@@ -299,6 +300,15 @@ public abstract class MapZone implements Zone {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void unregister(ZoneBorders borders) {
|
||||||
|
for (Integer id : borders.getRegionIds()) {
|
||||||
|
Region r = RegionManager.forId(id);
|
||||||
|
if (r != null) {
|
||||||
|
r.remove(new RegionZone(this, borders));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers this zone in the region for the given id.
|
* Registers this zone in the region for the given id.
|
||||||
* @param regionId The region id.
|
* @param regionId The region id.
|
||||||
@@ -378,7 +388,7 @@ public abstract class MapZone implements Zone {
|
|||||||
* @return The uid.
|
* @return The uid.
|
||||||
*/
|
*/
|
||||||
public int getUid() {
|
public int getUid() {
|
||||||
return uid;
|
return getName().hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -455,4 +465,17 @@ public abstract class MapZone implements Zone {
|
|||||||
this.zoneType = type;
|
this.zoneType = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
MapZone mapZone = (MapZone) o;
|
||||||
|
return getUid() == mapZone.getUid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(uid, name, overlappable, fireRandomEvents, restriction, zoneType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package core.game.world.map.zone;
|
package core.game.world.map.zone;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a zone inside a single region of the world map.
|
* Represents a zone inside a single region of the world map.
|
||||||
* @author Emperor
|
* @author Emperor
|
||||||
@@ -42,4 +44,16 @@ public final class RegionZone {
|
|||||||
return zone;
|
return zone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
RegionZone that = (RegionZone) o;
|
||||||
|
return Objects.equals(zone, that.zone) && Objects.equals(borders, that.borders);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(zone, borders);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import core.tools.RandomFunction;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -268,4 +269,17 @@ public final class ZoneBorders {
|
|||||||
public boolean insideRegion(Node n) {
|
public boolean insideRegion(Node n) {
|
||||||
return insideBorder(n.getLocation().getRegionX(), n.getLocation().getRegionY());
|
return insideBorder(n.getLocation().getRegionX(), n.getLocation().getRegionY());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
ZoneBorders that = (ZoneBorders) o;
|
||||||
|
return southWestX == that.southWestX && southWestY == that.southWestY && northEastX == that.northEastX && northEastY == that.northEastY && plane == that.plane && zeroPlaneCheck == that.zeroPlaneCheck && Objects.equals(exceptions, that.exceptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(southWestX, southWestY, northEastX, northEastY, plane, exceptions, zeroPlaneCheck);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import core.game.node.entity.Entity
|
import core.game.node.entity.Entity
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
|
import core.game.world.map.zone.MapZone
|
||||||
|
import core.game.world.map.zone.RegionZone
|
||||||
import core.game.world.map.zone.ZoneBorders
|
import core.game.world.map.zone.ZoneBorders
|
||||||
import core.game.world.map.zone.ZoneRestriction
|
import core.game.world.map.zone.ZoneRestriction
|
||||||
|
|
||||||
@@ -10,9 +12,21 @@ import core.game.world.map.zone.ZoneRestriction
|
|||||||
* Optionally-overridable methods include [getRestrictions], [areaEnter], [areaLeave] and [entityStep]
|
* Optionally-overridable methods include [getRestrictions], [areaEnter], [areaLeave] and [entityStep]
|
||||||
*/
|
*/
|
||||||
interface MapArea {
|
interface MapArea {
|
||||||
|
var zone: MapZone
|
||||||
|
get(){
|
||||||
|
return zoneMaps[this.javaClass.simpleName + "MapArea"]!!
|
||||||
|
}
|
||||||
|
set(value) {
|
||||||
|
zoneMaps[this.javaClass.simpleName + "MapArea"] = value
|
||||||
|
}
|
||||||
|
|
||||||
fun defineAreaBorders() : Array<ZoneBorders>
|
fun defineAreaBorders() : Array<ZoneBorders>
|
||||||
fun getRestrictions() : Array<ZoneRestriction> {return arrayOf()}
|
fun getRestrictions() : Array<ZoneRestriction> {return arrayOf()}
|
||||||
fun areaEnter(entity: Entity) {}
|
fun areaEnter(entity: Entity) {}
|
||||||
fun areaLeave(entity: Entity, logout: Boolean) {}
|
fun areaLeave(entity: Entity, logout: Boolean) {}
|
||||||
fun entityStep(entity: Entity, location: Location, lastLocation: Location) {}
|
fun entityStep(entity: Entity, location: Location, lastLocation: Location) {}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val zoneMaps = HashMap<String, MapZone>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+28
-1
@@ -1,7 +1,10 @@
|
|||||||
package rs09.game.content.activity.fishingtrawler
|
package rs09.game.content.activity.fishingtrawler
|
||||||
|
|
||||||
import api.LogoutListener
|
import api.LogoutListener
|
||||||
|
import api.MapArea
|
||||||
|
import api.getRegionBorders
|
||||||
import core.game.component.Component
|
import core.game.component.Component
|
||||||
|
import core.game.node.entity.Entity
|
||||||
import core.game.node.scenery.Scenery
|
import core.game.node.scenery.Scenery
|
||||||
import core.game.node.scenery.SceneryBuilder
|
import core.game.node.scenery.SceneryBuilder
|
||||||
import core.game.node.entity.npc.NPC
|
import core.game.node.entity.npc.NPC
|
||||||
@@ -12,6 +15,8 @@ import core.game.system.task.Pulse
|
|||||||
import rs09.game.world.GameWorld
|
import rs09.game.world.GameWorld
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
import core.game.world.map.build.DynamicRegion
|
import core.game.world.map.build.DynamicRegion
|
||||||
|
import core.game.world.map.zone.ZoneBorders
|
||||||
|
import core.game.world.map.zone.ZoneRestriction
|
||||||
import core.game.world.update.flag.context.Animation
|
import core.game.world.update.flag.context.Animation
|
||||||
import core.plugin.Plugin
|
import core.plugin.Plugin
|
||||||
import core.tools.*
|
import core.tools.*
|
||||||
@@ -20,6 +25,7 @@ import org.rs09.consts.Items
|
|||||||
import rs09.game.node.entity.player.info.stats.FISHING_TRAWLER_GAMES_WON
|
import rs09.game.node.entity.player.info.stats.FISHING_TRAWLER_GAMES_WON
|
||||||
import rs09.game.node.entity.player.info.stats.FISHING_TRAWLER_SHIPS_SANK
|
import rs09.game.node.entity.player.info.stats.FISHING_TRAWLER_SHIPS_SANK
|
||||||
import rs09.game.node.entity.player.info.stats.STATS_BASE
|
import rs09.game.node.entity.player.info.stats.STATS_BASE
|
||||||
|
import rs09.game.system.SystemLogger
|
||||||
import rs09.tools.secondsToTicks
|
import rs09.tools.secondsToTicks
|
||||||
import rs09.tools.ticksToSeconds
|
import rs09.tools.ticksToSeconds
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@@ -38,7 +44,7 @@ private const val HOLE_SOUTH_Y = 23
|
|||||||
private const val LEAKING_ID = 2167
|
private const val LEAKING_ID = 2167
|
||||||
private const val PATCHED_ID = 2168
|
private const val PATCHED_ID = 2168
|
||||||
|
|
||||||
class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : LogoutListener {
|
class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : LogoutListener, MapArea {
|
||||||
constructor(region: DynamicRegion, activity: FishingTrawlerActivity) : this(activity) {this.region = region; this.base = region.baseLocation}
|
constructor(region: DynamicRegion, activity: FishingTrawlerActivity) : this(activity) {this.region = region; this.base = region.baseLocation}
|
||||||
var players: ArrayList<Player> = ArrayList()
|
var players: ArrayList<Player> = ArrayList()
|
||||||
var netRipped = false
|
var netRipped = false
|
||||||
@@ -77,6 +83,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : Logo
|
|||||||
player.setAttribute("ft-session",this)
|
player.setAttribute("ft-session",this)
|
||||||
player.stateManager.set(EntityState.TELEBLOCK,timeLeft)
|
player.stateManager.set(EntityState.TELEBLOCK,timeLeft)
|
||||||
}
|
}
|
||||||
|
zone.register(getRegionBorders(region.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun swapBoatType(fromRegion: Int){
|
fun swapBoatType(fromRegion: Int){
|
||||||
@@ -129,6 +136,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : Logo
|
|||||||
session.boatSank = true
|
session.boatSank = true
|
||||||
session.isActive = false
|
session.isActive = false
|
||||||
session.swapBoatType(7755)
|
session.swapBoatType(7755)
|
||||||
|
session.zone.unregister(getRegionBorders(session.region.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RandomFunction.random(100) <= 9){
|
if(RandomFunction.random(100) <= 9){
|
||||||
@@ -142,6 +150,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : Logo
|
|||||||
player.properties.teleportLocation = Location.create(2666, 3162, 0)
|
player.properties.teleportLocation = Location.create(2666, 3162, 0)
|
||||||
player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_GAMES_WON")
|
player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_GAMES_WON")
|
||||||
}
|
}
|
||||||
|
session.zone.unregister(getRegionBorders(session.region.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
for(player in session.players){
|
for(player in session.players){
|
||||||
@@ -275,4 +284,22 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : Logo
|
|||||||
player.location = Location.create(2667, 3161, 0)
|
player.location = Location.create(2667, 3161, 0)
|
||||||
session.players.remove(player)
|
session.players.remove(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||||
|
return arrayOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||||
|
return arrayOf(ZoneRestriction.CANNON, ZoneRestriction.FIRES, ZoneRestriction.RANDOM_EVENTS)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areaEnter(entity: Entity) {
|
||||||
|
super.areaEnter(entity)
|
||||||
|
SystemLogger.logInfo("ENTERED FTZ")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areaLeave(entity: Entity, logout: Boolean) {
|
||||||
|
super.areaLeave(entity, logout)
|
||||||
|
SystemLogger.logInfo("EXITED FTZ")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ class RandomEventManager(val player: Player? = null) : LoginListener, EventHook<
|
|||||||
nextSpawn = GameWorld.ticks + 3000
|
nextSpawn = GameWorld.ticks + 3000
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (getAttribute<RandomEventNPC?>(player, "re-npc", null) != null) return
|
||||||
val currentAction = player.pulseManager.current.toString()
|
val currentAction = player.pulseManager.current.toString()
|
||||||
val ame: RandomEvents = if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
|
val ame: RandomEvents = if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
|
||||||
RandomEvents.TREE_SPIRIT
|
RandomEvents.TREE_SPIRIT
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
|
|
||||||
override fun tick() {
|
override fun tick() {
|
||||||
super.tick()
|
super.tick()
|
||||||
|
if(player.getAttribute<RandomEventNPC?>("re-npc", null) != this){
|
||||||
|
terminate()
|
||||||
|
return
|
||||||
|
}
|
||||||
if (!player.getAttribute("random:pause", false)) {
|
if (!player.getAttribute("random:pause", false)) {
|
||||||
ticksLeft--
|
ticksLeft--
|
||||||
}
|
}
|
||||||
@@ -76,6 +80,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
timerPaused = false
|
timerPaused = false
|
||||||
spawnLocation ?: terminate()
|
spawnLocation ?: terminate()
|
||||||
location = spawnLocation
|
location = spawnLocation
|
||||||
|
player.setAttribute("re-npc", this)
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,5 +105,10 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
player.graphics(SMOKE_GRAPHICS)
|
player.graphics(SMOKE_GRAPHICS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun clear() {
|
||||||
|
super.clear()
|
||||||
|
if(player.getAttribute<RandomEventNPC?>("re-npc", null) == this) player.removeAttribute("re-npc")
|
||||||
|
}
|
||||||
|
|
||||||
abstract fun talkTo(npc: NPC)
|
abstract fun talkTo(npc: NPC)
|
||||||
}
|
}
|
||||||
@@ -112,6 +112,8 @@ object ClassScanner {
|
|||||||
}
|
}
|
||||||
for(border in clazz.defineAreaBorders()) zone.register(border)
|
for(border in clazz.defineAreaBorders()) zone.register(border)
|
||||||
ZoneBuilder.configure(zone)
|
ZoneBuilder.configure(zone)
|
||||||
|
SystemLogger.logInfo("Configured zone: ${clazz.javaClass.simpleName + "MapArea"}")
|
||||||
|
MapArea.zoneMaps[clazz.javaClass.simpleName + "MapArea"] = zone
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
SystemLogger.logErr("Error loading content: ${it.simpleName}, ${e.localizedMessage}")
|
SystemLogger.logErr("Error loading content: ${it.simpleName}, ${e.localizedMessage}")
|
||||||
|
|||||||
Reference in New Issue
Block a user