mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2026-08-23 03:15:10 -06:00
today i drew:
Constant suffix where it makes sense. Examine texts. Journal overhaul. Bowl spawn.
This commit is contained in:
parent
37b8ff82b9
commit
0734c04745
7 changed files with 149 additions and 134 deletions
|
|
@ -457,7 +457,7 @@
|
|||
},
|
||||
{
|
||||
"item_id": "1923",
|
||||
"loc_data": "{1,3208,3214,0,80}-{1,3140,3452,1,90}-"
|
||||
"loc_data": "{1,3208,3214,0,80}-{1,2816,3351,1,80}-{1,3140,3452,1,90}-"
|
||||
},
|
||||
{
|
||||
"item_id": "1925",
|
||||
|
|
|
|||
|
|
@ -54831,23 +54831,28 @@
|
|||
},
|
||||
{
|
||||
"id": "5053",
|
||||
"name": "Assistant Serf"
|
||||
"name": "Assistant Serf",
|
||||
"examine": "A helpful assistant."
|
||||
},
|
||||
{
|
||||
"id": "5054",
|
||||
"name": "Assistant Brock"
|
||||
"name": "Assistant Brock",
|
||||
"examine": "A helpful assistant."
|
||||
},
|
||||
{
|
||||
"id": "5055",
|
||||
"name": "Assistant Marrow"
|
||||
"name": "Assistant Marrow",
|
||||
"examine": "A helpful assistant."
|
||||
},
|
||||
{
|
||||
"id": "5056",
|
||||
"name": "Assistant Le Smith"
|
||||
"name": "Assistant Le Smith",
|
||||
"examine": "A helpful assistant."
|
||||
},
|
||||
{
|
||||
"id": "5057",
|
||||
"name": "Assistant Stan"
|
||||
"name": "Assistant Stan",
|
||||
"examine": "A helpful assistant."
|
||||
},
|
||||
{
|
||||
"id": "5058",
|
||||
|
|
|
|||
|
|
@ -38,15 +38,15 @@ import org.rs09.consts.Components
|
|||
*/
|
||||
|
||||
object BalloonCrashSites {
|
||||
const val CRASH_SITE_REGION = 7244
|
||||
const val SCENERY_OCEAN_PLANK = 19126
|
||||
const val SCENERY_WOODLAND_DIRT = 19125
|
||||
const val CRASH_SITE_REGION_7244 = 7244
|
||||
const val SCENERY_OCEAN_PLANK_19126 = 19126
|
||||
const val SCENERY_WOODLAND_DIRT_19125 = 19125
|
||||
|
||||
const val NPC_OCEAN_AUGUSTE = 5051
|
||||
const val NPC_WOODLAND_AUGUSTE = 5052
|
||||
const val NPC_OCEAN_AUGUSTE_5051 = 5051
|
||||
const val NPC_WOODLAND_AUGUSTE_5052 = 5052
|
||||
|
||||
private const val SOUND_CRASH = 3244
|
||||
private const val RENDER_ANIMATION_SWIM = 188
|
||||
private const val SOUND_CRASH_3244 = 3244
|
||||
private const val RENDER_ANIMATION_SWIM_188 = 188
|
||||
|
||||
private val OCEAN_CRASH_LANDING = Location.create(1805, 4889, 0)
|
||||
private val OCEAN_CRASH_FACE_LOCATION = Location.create(1804, 4889, 0)
|
||||
|
|
@ -78,7 +78,7 @@ object BalloonCrashSites {
|
|||
}
|
||||
|
||||
fun crashAtOceanSite(player: Player) {
|
||||
playAudio(player, SOUND_CRASH)
|
||||
playAudio(player, SOUND_CRASH_3244)
|
||||
fadeTransition(player) {
|
||||
closeFlightInterface(player)
|
||||
teleport(player, OCEAN_CRASH_LANDING)
|
||||
|
|
@ -100,7 +100,7 @@ object BalloonCrashSites {
|
|||
}
|
||||
|
||||
fun crashAtWoodlandSite(player: Player, exit: WoodlandExit) {
|
||||
playAudio(player, SOUND_CRASH)
|
||||
playAudio(player, SOUND_CRASH_3244)
|
||||
setAttribute(player, ATTRIBUTE_WOODLAND_EXIT, exit.name)
|
||||
fadeTransition(player) {
|
||||
closeFlightInterface(player)
|
||||
|
|
@ -179,7 +179,7 @@ object BalloonCrashSites {
|
|||
}
|
||||
|
||||
private fun oceanSwimmingAnimations(player: Player) {
|
||||
player.appearance.setAnimations(Animation(RENDER_ANIMATION_SWIM))
|
||||
player.appearance.setAnimations(Animation(RENDER_ANIMATION_SWIM_188))
|
||||
player.appearance.sync()
|
||||
}
|
||||
|
||||
|
|
@ -187,22 +187,22 @@ object BalloonCrashSites {
|
|||
|
||||
class BalloonCrashSiteListener : InteractionListener, MapArea {
|
||||
override fun defineListeners() {
|
||||
on(BalloonCrashSites.SCENERY_OCEAN_PLANK, IntType.SCENERY, "use") { player, _ ->
|
||||
on(BalloonCrashSites.SCENERY_OCEAN_PLANK_19126, IntType.SCENERY, "use") { player, _ ->
|
||||
BalloonCrashSites.leaveOceanCrashSite(player)
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(BalloonCrashSites.SCENERY_WOODLAND_DIRT, IntType.SCENERY, "leave") { player, _ ->
|
||||
on(BalloonCrashSites.SCENERY_WOODLAND_DIRT_19125, IntType.SCENERY, "leave") { player, _ ->
|
||||
BalloonCrashSites.leaveWoodlandCrashSite(player)
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(BalloonCrashSites.NPC_OCEAN_AUGUSTE, IntType.NPC, "talk-to") { player, node ->
|
||||
on(BalloonCrashSites.NPC_OCEAN_AUGUSTE_5051, IntType.NPC, "talk-to") { player, node ->
|
||||
DialogueLabeller.open(player, BalloonCrashDialogue(), node.asNpc())
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(BalloonCrashSites.NPC_WOODLAND_AUGUSTE, IntType.NPC, "talk-to") { player, node ->
|
||||
on(BalloonCrashSites.NPC_WOODLAND_AUGUSTE_5052, IntType.NPC, "talk-to") { player, node ->
|
||||
DialogueLabeller.open(player, BalloonCrashDialogue(), node.asNpc())
|
||||
return@on true
|
||||
}
|
||||
|
|
@ -210,7 +210,7 @@ class BalloonCrashSiteListener : InteractionListener, MapArea {
|
|||
}
|
||||
|
||||
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||
return arrayOf(getRegionBorders(BalloonCrashSites.CRASH_SITE_REGION))
|
||||
return arrayOf(getRegionBorders(BalloonCrashSites.CRASH_SITE_REGION_7244))
|
||||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
|
|
@ -220,12 +220,12 @@ class BalloonCrashSiteListener : InteractionListener, MapArea {
|
|||
|
||||
class BalloonCrashDialogue : DialogueLabeller() {
|
||||
override fun addConversation() {
|
||||
assignToIds(BalloonCrashSites.NPC_OCEAN_AUGUSTE)
|
||||
assignToIds(BalloonCrashSites.NPC_OCEAN_AUGUSTE_5051)
|
||||
|
||||
exec { player, npc ->
|
||||
when (npc.id) {
|
||||
BalloonCrashSites.NPC_OCEAN_AUGUSTE -> loadLabel(player, "ocean_crash")
|
||||
BalloonCrashSites.NPC_WOODLAND_AUGUSTE -> loadLabel(player, "woodland_crash")
|
||||
BalloonCrashSites.NPC_OCEAN_AUGUSTE_5051 -> loadLabel(player, "ocean_crash")
|
||||
BalloonCrashSites.NPC_WOODLAND_AUGUSTE_5052 -> loadLabel(player, "woodland_crash")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,8 +51,8 @@ private enum class BalloonCrashLocation {
|
|||
class BalloonFlightInterface : InterfaceListener {
|
||||
|
||||
companion object {
|
||||
private const val BALLOON_FLIGHT_INTERFACE = 470
|
||||
private const val BALLOON_CONTROL_INTERFACE = 471
|
||||
private const val BALLOON_FLIGHT_INTERFACE_470 = 470
|
||||
private const val BALLOON_CONTROL_INTERFACE_471 = 471
|
||||
|
||||
private const val ATTRIBUTE_BALLOON_TOP = "enlightenedjourney_balloon_top"
|
||||
private const val ATTRIBUTE_BALLOON_BOTTOM = "enlightenedjourney_balloon_bottom"
|
||||
|
|
@ -61,17 +61,17 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
private const val ATTRIBUTE_FLIGHT_SCREEN = "enlightenedjourney_balloon_flight_screen"
|
||||
private const val ATTRIBUTE_FLIGHT_DESTINATION = "enlightenedjourney_balloon_flight_destination"
|
||||
|
||||
private const val SOUND_SANDBAG = 3249
|
||||
private const val SOUND_BURN_LOG = 3251
|
||||
private const val SOUND_RELAX = 3247
|
||||
private const val SOUND_ROPE = 3242
|
||||
private const val SOUND_RED_ROPE = 3239
|
||||
private const val SOUND_SANDBAG_3249 = 3249
|
||||
private const val SOUND_BURN_LOG_3251 = 3251
|
||||
private const val SOUND_RELAX_3247 = 3247
|
||||
private const val SOUND_ROPE_3242 = 3242
|
||||
private const val SOUND_RED_ROPE_3239 = 3239
|
||||
// cant find source material for using these two:
|
||||
// zep_construct=3248
|
||||
// zep_hammering_1=3250
|
||||
|
||||
|
||||
private const val MUSIC_FLOATING_FREE = 206
|
||||
private const val MUSIC_FLOATING_FREE_206 = 206
|
||||
|
||||
private val controlMoves = mapOf(
|
||||
BalloonFlightRoutes.BUTTON_SANDBAG to BalloonMove(1, -2),
|
||||
|
|
@ -91,8 +91,8 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
closeInterface(player)
|
||||
hideGameTabs(player)
|
||||
hideMinimap(player)
|
||||
player.musicPlayer.unlock(MUSIC_FLOATING_FREE)
|
||||
openInterface(player, BALLOON_FLIGHT_INTERFACE)
|
||||
player.musicPlayer.unlock(MUSIC_FLOATING_FREE_206)
|
||||
openInterface(player, BALLOON_FLIGHT_INTERFACE_470)
|
||||
}
|
||||
|
||||
/** Post-quest flight from Entrana to a new unlockable destination. */
|
||||
|
|
@ -105,8 +105,8 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
closeInterface(player)
|
||||
hideGameTabs(player)
|
||||
hideMinimap(player)
|
||||
player.musicPlayer.unlock(MUSIC_FLOATING_FREE)
|
||||
openInterface(player, BALLOON_FLIGHT_INTERFACE)
|
||||
player.musicPlayer.unlock(MUSIC_FLOATING_FREE_206)
|
||||
openInterface(player, BALLOON_FLIGHT_INTERFACE_470)
|
||||
}
|
||||
|
||||
private fun getFlightDestination(player: Player): BalloonTravelLocation {
|
||||
|
|
@ -463,11 +463,11 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
|
||||
private fun playControlSound(player: Player, buttonId: Int) {
|
||||
val sound = when (buttonId) {
|
||||
BalloonFlightRoutes.BUTTON_SANDBAG -> SOUND_SANDBAG
|
||||
BalloonFlightRoutes.BUTTON_BURN_LOG -> SOUND_BURN_LOG
|
||||
BalloonFlightRoutes.BUTTON_RELAX -> SOUND_RELAX
|
||||
BalloonFlightRoutes.BUTTON_NORMAL_ROPE -> SOUND_ROPE
|
||||
BalloonFlightRoutes.BUTTON_RED_ROPE -> SOUND_RED_ROPE
|
||||
BalloonFlightRoutes.BUTTON_SANDBAG -> SOUND_SANDBAG_3249
|
||||
BalloonFlightRoutes.BUTTON_BURN_LOG -> SOUND_BURN_LOG_3251
|
||||
BalloonFlightRoutes.BUTTON_RELAX -> SOUND_RELAX_3247
|
||||
BalloonFlightRoutes.BUTTON_NORMAL_ROPE -> SOUND_ROPE_3242
|
||||
BalloonFlightRoutes.BUTTON_RED_ROPE -> SOUND_RED_ROPE_3239
|
||||
else -> return
|
||||
}
|
||||
playAudio(player, sound)
|
||||
|
|
@ -503,12 +503,12 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
}
|
||||
|
||||
override fun defineInterfaceListeners() {
|
||||
onOpen(BALLOON_FLIGHT_INTERFACE) { player, _ ->
|
||||
onOpen(BALLOON_FLIGHT_INTERFACE_470) { player, _ ->
|
||||
val destination = getFlightDestination(player)
|
||||
val screen = getAttribute(player, ATTRIBUTE_FLIGHT_SCREEN, 1)
|
||||
val startPosition = getScreenPosition(destination, screen)
|
||||
player.lock()
|
||||
openSingleTab(player, BALLOON_CONTROL_INTERFACE)
|
||||
openSingleTab(player, BALLOON_CONTROL_INTERFACE_471)
|
||||
BalloonFlightScreens.clear(player)
|
||||
drawFlightScreen(player, destination, screen)
|
||||
BalloonFlightScreens.drawBalloon(player, startPosition.top, startPosition.bottom)
|
||||
|
|
@ -516,7 +516,7 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
true
|
||||
}
|
||||
|
||||
onClose(BALLOON_FLIGHT_INTERFACE) { player, _ ->
|
||||
onClose(BALLOON_FLIGHT_INTERFACE_470) { player, _ ->
|
||||
BalloonFlightScreens.clear(player)
|
||||
clearFlightAttributes(player)
|
||||
closeTabInterface(player)
|
||||
|
|
@ -525,7 +525,7 @@ class BalloonFlightInterface : InterfaceListener {
|
|||
true
|
||||
}
|
||||
|
||||
on(BALLOON_CONTROL_INTERFACE) { player, _, _, buttonId, _, _ ->
|
||||
on(BALLOON_CONTROL_INTERFACE_471) { player, _, _, buttonId, _, _ ->
|
||||
handleRouteButton(player, buttonId)
|
||||
true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,20 +9,20 @@ import core.game.node.entity.player.Player
|
|||
*/
|
||||
|
||||
object BalloonFlightScreens {
|
||||
private const val BALLOON_FLIGHT_INTERFACE = 470
|
||||
private const val BALLOON_FLIGHT_INTERFACE_470 = 470
|
||||
|
||||
private const val MODEL_WHITE_BIRD = 19779
|
||||
private const val MODEL_BROWN_BIRD = 19780
|
||||
private const val ANIMATION_BIRD = 341
|
||||
private const val MODEL_CLOUD_ANOMALY = 19781
|
||||
private const val ANIMATION_CLOUD_ANOMALY = 5141
|
||||
private const val MODEL_BALLOON_TOP = 19517
|
||||
private const val MODEL_BALLOON_BOTTOM = 19518
|
||||
private const val MODEL_WHITE_BIRD_19779 = 19779
|
||||
private const val MODEL_BROWN_BIRD_19780 = 19780
|
||||
private const val ANIMATION_BIRD_341 = 341
|
||||
private const val MODEL_CLOUD_ANOMALY_19781 = 19781
|
||||
private const val ANIMATION_CLOUD_ANOMALY_5141 = 5141
|
||||
private const val MODEL_BALLOON_TOP_19517 = 19517
|
||||
private const val MODEL_BALLOON_BOTTOM_19518 = 19518
|
||||
|
||||
/** Clears all model child slots used by the flight interface. */
|
||||
fun clear(player: Player) {
|
||||
for (child in 78..237) {
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE, child, 0)
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE_470, child, 0)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -40,25 +40,25 @@ object BalloonFlightScreens {
|
|||
|
||||
/** Draws the top and bottom balloon models at the given child slots. */
|
||||
fun drawBalloon(player: Player, topChild: Int, bottomChild: Int) {
|
||||
player.packetDispatch.sendModelOnInterface(MODEL_BALLOON_TOP, BALLOON_FLIGHT_INTERFACE, topChild, 2576)
|
||||
player.packetDispatch.sendModelOnInterface(MODEL_BALLOON_TOP_19517, BALLOON_FLIGHT_INTERFACE_470, topChild, 2576)
|
||||
resetModelAngle(player, topChild)
|
||||
player.packetDispatch.sendModelOnInterface(MODEL_BALLOON_BOTTOM, BALLOON_FLIGHT_INTERFACE, bottomChild, 2576)
|
||||
player.packetDispatch.sendModelOnInterface(MODEL_BALLOON_BOTTOM_19518, BALLOON_FLIGHT_INTERFACE_470, bottomChild, 2576)
|
||||
resetModelAngle(player, bottomChild)
|
||||
}
|
||||
|
||||
/** Clears the top and bottom balloon models at the given child slots. */
|
||||
fun clearBalloon(player: Player, topChild: Int, bottomChild: Int) {
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE, topChild, 0)
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE, bottomChild, 0)
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE_470, topChild, 0)
|
||||
player.packetDispatch.sendModelOnInterface(-1, BALLOON_FLIGHT_INTERFACE_470, bottomChild, 0)
|
||||
}
|
||||
|
||||
private fun resetModelAngle(player: Player, child: Int) {
|
||||
player.packetDispatch.sendAngleOnInterface(BALLOON_FLIGHT_INTERFACE, child, 2576, 0, 0)
|
||||
player.packetDispatch.sendAngleOnInterface(BALLOON_FLIGHT_INTERFACE_470, child, 2576, 0, 0)
|
||||
}
|
||||
|
||||
private fun drawModels(player: Player, model: Int, vararg children: Int) {
|
||||
for (child in children) {
|
||||
player.packetDispatch.sendModelOnInterface(model, BALLOON_FLIGHT_INTERFACE, child, 2576)
|
||||
player.packetDispatch.sendModelOnInterface(model, BALLOON_FLIGHT_INTERFACE_470, child, 2576)
|
||||
resetModelAngle(player, child)
|
||||
}
|
||||
}
|
||||
|
|
@ -73,9 +73,9 @@ object BalloonFlightScreens {
|
|||
vararg children: Int
|
||||
) {
|
||||
for (child in children) {
|
||||
player.packetDispatch.sendModelOnInterface(model, BALLOON_FLIGHT_INTERFACE, child, zoom)
|
||||
player.packetDispatch.sendAngleOnInterface(BALLOON_FLIGHT_INTERFACE, child, zoom, pitch, yaw)
|
||||
sendAnimationOnInterface(player, animation, BALLOON_FLIGHT_INTERFACE, child)
|
||||
player.packetDispatch.sendModelOnInterface(model, BALLOON_FLIGHT_INTERFACE_470, child, zoom)
|
||||
player.packetDispatch.sendAngleOnInterface(BALLOON_FLIGHT_INTERFACE_470, child, zoom, pitch, yaw)
|
||||
sendAnimationOnInterface(player, animation, BALLOON_FLIGHT_INTERFACE_470, child)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -120,10 +120,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19572, 78)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 145, 148, 177, 209)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 145, 148, 177, 209)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 175, 230)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 175, 230)
|
||||
}
|
||||
|
||||
private fun drawTaverleyScreenTwo(player: Player) {
|
||||
|
|
@ -176,7 +176,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 181, 203, 188)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 161, 179, 185, 204, 219)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 161, 179, 185, 204, 219)
|
||||
}
|
||||
|
||||
private fun drawTaverleyScreenThree(player: Player) {
|
||||
|
|
@ -218,10 +218,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 171, 176, 214)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 146, 151, 192, 207, 208, 215)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 146, 151, 192, 207, 208, 215)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 191)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 191)
|
||||
}
|
||||
|
||||
private fun drawCraftingGuildScreen(player: Player, screen: Int) {
|
||||
|
|
@ -272,10 +272,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19631, 91)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 220, 221, 206, 175, 151, 171, 148)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 220, 221, 206, 175, 151, 171, 148)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 183)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 183)
|
||||
|
||||
// Clouds
|
||||
drawModels(player, 19525, 162, 192, 233)
|
||||
|
|
@ -317,10 +317,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19717, 97)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 161, 187, 216, 217, 171)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 161, 187, 216, 217, 171)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 127, 132, 188)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 127, 132, 188)
|
||||
}
|
||||
|
||||
private fun drawCraftingGuildScreenThree(player: Player) {
|
||||
|
|
@ -356,10 +356,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19524, 223, 167, 174, 229, 211)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 199, 120, 163, 209)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 199, 120, 163, 209)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 143, 104)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 143, 104)
|
||||
}
|
||||
|
||||
private fun drawVarrockScreen(player: Player, screen: Int) {
|
||||
|
|
@ -404,8 +404,8 @@ object BalloonFlightScreens {
|
|||
// Birds
|
||||
drawAnimatedModels(
|
||||
player,
|
||||
MODEL_WHITE_BIRD,
|
||||
ANIMATION_BIRD,
|
||||
MODEL_WHITE_BIRD_19779,
|
||||
ANIMATION_BIRD_341,
|
||||
2567,
|
||||
100,
|
||||
300,
|
||||
|
|
@ -428,7 +428,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19741, 55)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 139, 218, 214, 209, 190, 214, 154)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 139, 218, 214, 209, 190, 214, 154)
|
||||
|
||||
// Trees
|
||||
drawModels(player, 19570, 119, 122, 134, 135, 137)
|
||||
|
|
@ -464,7 +464,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19754, 149)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 187, 192, 236)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 187, 192, 236)
|
||||
}
|
||||
|
||||
private fun drawVarrockScreenThree(player: Player) {
|
||||
|
|
@ -482,7 +482,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19519, 81)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD, ANIMATION_BIRD, 2567, 100, 300, 141, 199, 225, 230)
|
||||
drawAnimatedModels(player, MODEL_BROWN_BIRD_19780, ANIMATION_BIRD_341, 2567, 100, 300, 141, 199, 225, 230)
|
||||
|
||||
// Clouds
|
||||
drawModels(player, 19526, 198, 202)
|
||||
|
|
@ -539,7 +539,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 229, 183, 166, 170, 214, 177)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 140, 147, 207, 130, 193, 136)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 140, 147, 207, 130, 193, 136)
|
||||
}
|
||||
|
||||
private fun drawCastleWarsScreenTwo(player: Player) {
|
||||
|
|
@ -585,10 +585,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 142, 159, 181, 191, 205, 217, 231)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 152, 156)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 152, 156)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 118, 197)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 118, 197)
|
||||
}
|
||||
|
||||
private fun drawCastleWarsScreenThree(player: Player) {
|
||||
|
|
@ -626,10 +626,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 172, 186, 199, 211, 217, 223)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 140, 153, 179)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 140, 153, 179)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 138, 147)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 138, 147)
|
||||
}
|
||||
|
||||
private fun drawGrandTreeScreen(player: Player, screen: Int) {
|
||||
|
|
@ -672,10 +672,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 188, 195, 203, 232)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 191, 229, 237, 144, 130)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 191, 229, 237, 144, 130)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 214)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 214)
|
||||
}
|
||||
|
||||
private fun drawGrandTreeScreenTwo(player: Player) {
|
||||
|
|
@ -715,10 +715,10 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 192, 201, 205, 209, 217)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 219, 183, 154, 196, 197, 149, 150)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 219, 183, 154, 196, 197, 149, 150)
|
||||
|
||||
// Cloud anomaly
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY, ANIMATION_CLOUD_ANOMALY, 2567, 0, 300, 181, 220, 224, 228)
|
||||
drawAnimatedModels(player, MODEL_CLOUD_ANOMALY_19781, ANIMATION_CLOUD_ANOMALY_5141, 2567, 0, 300, 181, 220, 224, 228)
|
||||
}
|
||||
|
||||
private fun drawGrandTreeScreenThree(player: Player) {
|
||||
|
|
@ -808,7 +808,7 @@ object BalloonFlightScreens {
|
|||
drawModels(player, 19526, 175, 200, 214)
|
||||
|
||||
// Birds
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD, ANIMATION_BIRD, 2567, 100, 300, 178, 225)
|
||||
drawAnimatedModels(player, MODEL_WHITE_BIRD_19779, ANIMATION_BIRD_341, 2567, 100, 300, 178, 225)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -46,11 +46,11 @@ import org.rs09.consts.NPCs
|
|||
* @author Edith
|
||||
*/
|
||||
|
||||
private const val ASSISTANT_STAN_WRAPPER = 5062
|
||||
private const val ASSISTANT_MARROW_WRAPPER = 5063
|
||||
private const val ASSISTANT_LE_SMITH_WRAPPER = 5064
|
||||
private const val ASSISTANT_BROCK_WRAPPER = 5065
|
||||
private const val ASSISTANT_SERF_WRAPPER = 5066
|
||||
private const val ASSISTANT_STAN_WRAPPER_5062 = 5062
|
||||
private const val ASSISTANT_MARROW_WRAPPER_5063 = 5063
|
||||
private const val ASSISTANT_LE_SMITH_WRAPPER_5064 = 5064
|
||||
private const val ASSISTANT_BROCK_WRAPPER_5065 = 5065
|
||||
private const val ASSISTANT_SERF_WRAPPER_5066 = 5066
|
||||
|
||||
private const val VARROCK_MEDIUM_DIARY = 1
|
||||
|
||||
|
|
@ -77,16 +77,16 @@ private val BALLOON_BASKET_LOCS = intArrayOf(19128, 19129)
|
|||
class BalloonTravelInterface : InterfaceListener, InteractionListener {
|
||||
|
||||
companion object {
|
||||
private const val BALLOON_MAP_INTERFACE = 469
|
||||
private const val BALLOON_MAP_MODEL = 12
|
||||
private const val BALLOON_MAP_INTERFACE_469 = 469
|
||||
private const val BALLOON_MAP_MODEL_12 = 12
|
||||
|
||||
private const val ATTRIBUTE_BALLOON_START = "balloon_travel_start"
|
||||
|
||||
/** Opens the balloon map interface. */
|
||||
fun open(player: Player, start: BalloonTravelLocation) {
|
||||
setAttribute(player, ATTRIBUTE_BALLOON_START, start)
|
||||
openInterface(player, BALLOON_MAP_INTERFACE)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE, start.mapComponent, false)
|
||||
openInterface(player, BALLOON_MAP_INTERFACE_469)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE_469, start.mapComponent, false)
|
||||
}
|
||||
|
||||
/** Checks the saved route unlock state. */
|
||||
|
|
@ -160,9 +160,9 @@ class BalloonTravelInterface : InterfaceListener, InteractionListener {
|
|||
val duration = animationDuration(Animation(animation))
|
||||
|
||||
lock(player, duration)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE, start.mapComponent, true)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE, BALLOON_MAP_MODEL, false)
|
||||
animateInterface(player, BALLOON_MAP_INTERFACE, BALLOON_MAP_MODEL, animation)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE_469, start.mapComponent, true)
|
||||
setComponentVisibility(player, BALLOON_MAP_INTERFACE_469, BALLOON_MAP_MODEL_12, false)
|
||||
animateInterface(player, BALLOON_MAP_INTERFACE_469, BALLOON_MAP_MODEL_12, animation)
|
||||
|
||||
queueScript(player, duration, QueueStrength.SOFT) {
|
||||
closeInterface(player)
|
||||
|
|
@ -199,7 +199,7 @@ class BalloonTravelInterface : InterfaceListener, InteractionListener {
|
|||
}
|
||||
|
||||
override fun defineInterfaceListeners() {
|
||||
on(BALLOON_MAP_INTERFACE) { player, _, _, selectId, _, _ ->
|
||||
on(BALLOON_MAP_INTERFACE_469) { player, _, _, selectId, _, _ ->
|
||||
val destination = BalloonTravelLocation.fromSelectId(selectId) ?: return@on false
|
||||
val start = getAttribute(player, ATTRIBUTE_BALLOON_START, BalloonTravelLocation.ENTRANA)
|
||||
|
||||
|
|
@ -226,6 +226,7 @@ class BalloonTravelInterface : InterfaceListener, InteractionListener {
|
|||
override fun defineListeners() {
|
||||
on(BALLOON_VISIBLE_NPCS, IntType.NPC, "fly") { player, node ->
|
||||
if (!isQuestComplete(player, Quests.ENLIGHTENED_JOURNEY)) {
|
||||
sendMessage(player, "You should speak to Auguste first.")
|
||||
return@on true
|
||||
}
|
||||
|
||||
|
|
@ -281,7 +282,7 @@ enum class BalloonTravelLocation(
|
|||
10,
|
||||
50,
|
||||
EnlightenedJourney.VARBIT_CASTLEWARS_BALLOON_2869,
|
||||
ASSISTANT_MARROW_WRAPPER,
|
||||
ASSISTANT_MARROW_WRAPPER_5063,
|
||||
19137,
|
||||
),
|
||||
GRAND_TREE(
|
||||
|
|
@ -292,7 +293,7 @@ enum class BalloonTravelLocation(
|
|||
3,
|
||||
60,
|
||||
EnlightenedJourney.VARBIT_GRANDTREE_BALLOON_2870,
|
||||
ASSISTANT_LE_SMITH_WRAPPER,
|
||||
ASSISTANT_LE_SMITH_WRAPPER_5064,
|
||||
19139,
|
||||
),
|
||||
CRAFTING_GUILD(
|
||||
|
|
@ -303,7 +304,7 @@ enum class BalloonTravelLocation(
|
|||
10,
|
||||
30,
|
||||
EnlightenedJourney.VARBIT_CRAFTINGGUILD_BALLOON_2871,
|
||||
ASSISTANT_BROCK_WRAPPER,
|
||||
ASSISTANT_BROCK_WRAPPER_5065,
|
||||
19141,
|
||||
),
|
||||
ENTRANA(
|
||||
|
|
@ -325,7 +326,7 @@ enum class BalloonTravelLocation(
|
|||
1,
|
||||
20,
|
||||
EnlightenedJourney.VARBIT_TAVERLEY_BALLOON_2868,
|
||||
ASSISTANT_STAN_WRAPPER,
|
||||
ASSISTANT_STAN_WRAPPER_5062,
|
||||
19135,
|
||||
),
|
||||
VARROCK(
|
||||
|
|
@ -336,7 +337,7 @@ enum class BalloonTravelLocation(
|
|||
10,
|
||||
40,
|
||||
EnlightenedJourney.VARBIT_VARROCK_BALLOON_2872,
|
||||
ASSISTANT_SERF_WRAPPER,
|
||||
ASSISTANT_SERF_WRAPPER_5066,
|
||||
19143,
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -114,57 +114,67 @@ class EnlightenedJourney : Quest(Quests.ENLIGHTENED_JOURNEY, 55, 54, 1, 0,
|
|||
}
|
||||
|
||||
if (stage >= STAGE_QUEST_STARTED) {
|
||||
line(player, "I have agreed to help Auguste build an !!air balloon??.", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line(player, "I have no idea what he's talking about.", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line(player, "Auguste thinks if he pumps hot air into a sack it will rise and", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line(player, "take us along with it.", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line(player, "But we're going to run some tests first. Thank goodness.", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line++
|
||||
line(player, "I have agreed to help Auguste build an !!air balloon??.", line++, stage > STAGE_QUEST_STARTED)
|
||||
line(player, "I have no idea what he's talking about.", line++, stage > STAGE_QUEST_STARTED)
|
||||
line(player, "Auguste thinks if he pumps hot air into a sack it will rise and", line++, stage > STAGE_QUEST_STARTED)
|
||||
line(player, "take us along with it.", line++, stage > STAGE_QUEST_STARTED)
|
||||
line(player, "But we're going to run some tests first. Thank goodness.", line++, stage > STAGE_QUEST_STARTED)
|
||||
}
|
||||
|
||||
if (stage >= STAGE_GATHER_MATERIALS) {
|
||||
if (stage in STAGE_GATHER_MATERIALS until STAGE_ORIGAMI_BALLOON) {
|
||||
line(player, "I need to gather the materials Auguste required:", line++, stage > STAGE_GATHER_MATERIALS)
|
||||
line(player, "three sheets of papyrus", line++, stage > STAGE_GATHER_MATERIALS || inInventory(player, Items.PAPYRUS_970, 3))
|
||||
line(player, "a ball of wool", line++, stage > STAGE_GATHER_MATERIALS || inInventory(player, Items.BALL_OF_WOOL_1759))
|
||||
line(player, "a full sack of potatoes", line++, stage > STAGE_GATHER_MATERIALS || inInventory(player, Items.POTATOES10_5438))
|
||||
line(player, "one unlit candle.", line++, stage > STAGE_GATHER_MATERIALS || inInventory(player, Items.CANDLE_36))
|
||||
line++
|
||||
}
|
||||
|
||||
if (stage >= STAGE_ORIGAMI_BALLOON) {
|
||||
line(player, "I made an !!origami balloon??.", line++, stage > STAGE_ORIGAMI_BALLOON || inInventory(player, Items.ORIGAMI_BALLOON_9934))
|
||||
line(player, "Auguste said I could make these any time I want if", line++, stage > STAGE_ORIGAMI_BALLOON)
|
||||
line(player, "I have the materials.", line++, stage > STAGE_ORIGAMI_BALLOON)
|
||||
line++
|
||||
line(player, "I gathered all the materials Auguste required:", line++, true)
|
||||
line(player, "three sheets of papyrus, a ball of wool,", line++, true)
|
||||
line(player, "a full sack of potatoes and one unlit candle.", line++, true)
|
||||
}
|
||||
|
||||
if (stage in STAGE_ORIGAMI_BALLOON until STAGE_FIRST_EXPERIMENT) {
|
||||
line(player, "I need to make the first test balloon with the ball of wool,", line++)
|
||||
line(player, "a sheet of papyrus and an unlit candle and then give it to", line++)
|
||||
line(player, "Auguste.", line++)
|
||||
}
|
||||
|
||||
if (stage >= STAGE_FIRST_EXPERIMENT) {
|
||||
line(player, "I made an !!origami balloon??.", line++, true)
|
||||
line(player, "Auguste said I could make these any time I want if", line++, true)
|
||||
line(player, "I have the materials.", line++, true)
|
||||
}
|
||||
|
||||
if (stage >= STAGE_FIRST_EXPERIMENT) {
|
||||
line(player, "Auguste conducted the first experiment.", line++, stage > STAGE_FIRST_EXPERIMENT)
|
||||
line(player, "There was an awful lot of fire.", line++, stage > STAGE_FIRST_EXPERIMENT)
|
||||
line++
|
||||
}
|
||||
|
||||
if (stage in STAGE_FIRST_EXPERIMENT until STAGE_SECOND_EXPERIMENT) {
|
||||
line(player, "I need to give Auguste two sheets of papyrus and a full", line++)
|
||||
line(player, "sack of potatoes.", line++)
|
||||
}
|
||||
|
||||
if (stage >= STAGE_SECOND_EXPERIMENT) {
|
||||
line(player, "Auguste conducted the second experiment.", line++, stage > STAGE_SECOND_EXPERIMENT)
|
||||
line(player, "A flash mob appeared. They seem to have a grudge against", line++, stage > STAGE_SECOND_EXPERIMENT)
|
||||
line(player, "science.", line++, stage > STAGE_SECOND_EXPERIMENT)
|
||||
line++
|
||||
}
|
||||
|
||||
if (stage >= STAGE_MAIN_BALLOON) {
|
||||
line(player, "I need to gather the supplies for Auguste's main balloon:", line++, stage > STAGE_MAIN_BALLOON)
|
||||
line(player, "red dye", line++, stage > STAGE_MAIN_BALLOON || inInventory(player, Items.RED_DYE_1763))
|
||||
line(player, "yellow dye", line++, stage > STAGE_MAIN_BALLOON || inInventory(player, Items.YELLOW_DYE_1765))
|
||||
line(player, "ten pieces of silk", line++, stage > STAGE_MAIN_BALLOON || inInventory(player, Items.SILK_950, 10))
|
||||
line(player, "a bowl", line++, stage > STAGE_MAIN_BALLOON || inInventory(player, Items.BOWL_1923))
|
||||
line(player, "eight sandbags", line++, stage > STAGE_MAIN_BALLOON || inInventory(player, Items.SANDBAG_9943, 8))
|
||||
line++
|
||||
if (stage in STAGE_MAIN_BALLOON until STAGE_WILLOW_BASKET) {
|
||||
line(player, "I need to gather the supplies for Auguste's main balloon:", line++)
|
||||
line(player, "red dye", line++, getAttribute(player, ATTRIBUTE_RED_DYE_DELIVERED, false) || inInventory(player, Items.RED_DYE_1763))
|
||||
line(player, "yellow dye", line++, getAttribute(player, ATTRIBUTE_YELLOW_DYE_DELIVERED, false) || inInventory(player, Items.YELLOW_DYE_1765))
|
||||
line(player, "ten pieces of silk", line++, getAttribute(player, ATTRIBUTE_SILK_DELIVERED, false) || inInventory(player, Items.SILK_950, 10))
|
||||
line(player, "a bowl", line++, getAttribute(player, ATTRIBUTE_BOWL_DELIVERED, false) || inInventory(player, Items.BOWL_1923))
|
||||
line(player, "eight sandbags", line++, getAttribute(player, ATTRIBUTE_SANDBAGS_DELIVERED, false) || inInventory(player, Items.SANDBAG_9943, 8))
|
||||
}
|
||||
|
||||
if (stage >= STAGE_WILLOW_BASKET) {
|
||||
line(player, "I need to make the basket for the balloon:", line++, stage > STAGE_WILLOW_BASKET)
|
||||
line(player, "twelve willow branches", line++, stage > STAGE_WILLOW_BASKET || inInventory(player, Items.WILLOW_BRANCH_5933, 12))
|
||||
line++
|
||||
if (stage in STAGE_WILLOW_BASKET until STAGE_FLIGHT) {
|
||||
line(player, "I've given all the materials to Auguste, now I just need to", line++)
|
||||
line(player, "use the 12 willow branches to build the basket.", line++)
|
||||
}
|
||||
|
||||
if (stage >= STAGE_FLIGHT) {
|
||||
|
|
@ -172,7 +182,6 @@ class EnlightenedJourney : Quest(Quests.ENLIGHTENED_JOURNEY, 55, 54, 1, 0,
|
|||
line(player, "balloon.", line++, stage > STAGE_FLIGHT)
|
||||
line(player, "The balloon is all made and looks impressive!", line++, stage > STAGE_FLIGHT)
|
||||
line(player, "Let's hope it doesn't end the way the experiments did.", line++, stage > STAGE_FLIGHT)
|
||||
line++
|
||||
}
|
||||
|
||||
if (stage >= STAGE_CLAIM_REWARD) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue