Implemented spade pickup in the Rimmington mine
Rewrote the permadeath code to more thoroughly wipe HCIM when they die HCIM permadeath code destroys items dropped on death Cleaned up redundant blast furnace player save code
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
package content.region.asgarnia.rimmington.handler
|
||||||
|
|
||||||
|
import core.api.*
|
||||||
|
import core.game.interaction.IntType
|
||||||
|
import core.game.interaction.InteractionListener
|
||||||
|
import core.game.node.item.Item
|
||||||
|
import core.game.node.scenery.Scenery
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
import org.rs09.consts.Sounds
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Player Name
|
||||||
|
*/
|
||||||
|
|
||||||
|
class RimmingtonListeners : InteractionListener {
|
||||||
|
override fun defineListeners() {
|
||||||
|
on(9662, IntType.SCENERY, "take") { player, node ->
|
||||||
|
if (!hasSpaceFor(player, Item(Items.SPADE_952))) {
|
||||||
|
sendMessage(player, "You don't have enough inventory space to hold that item.")
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
animate(player, 535)
|
||||||
|
playAudio(player, Sounds.PICK2_2582)
|
||||||
|
addItem(player, Items.SPADE_952)
|
||||||
|
replaceScenery(node as Scenery, 0, 50)
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,32 +1,72 @@
|
|||||||
package core.api.utils.Permadeath
|
package core.api.utils
|
||||||
|
|
||||||
import core.api.*
|
import content.global.skill.construction.HouseLocation
|
||||||
|
import content.minigame.blastfurnace.BFPlayerState
|
||||||
|
import content.minigame.blastfurnace.BlastFurnace
|
||||||
|
import core.api.isUsingSecondaryBankAccount
|
||||||
|
import core.api.teleport
|
||||||
|
import core.api.toggleBankAccount
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
import core.game.node.entity.player.VarpManager
|
import core.game.node.entity.player.VarpManager
|
||||||
import core.game.node.entity.player.info.login.PlayerSaver
|
import core.game.node.entity.player.info.login.PlayerSaver
|
||||||
import core.game.node.entity.player.link.IronmanMode
|
import core.game.node.entity.player.link.IronmanMode
|
||||||
import core.game.node.entity.player.link.SavedData
|
import core.game.node.entity.player.link.SavedData
|
||||||
|
import core.game.node.entity.player.link.SpellBookManager
|
||||||
import core.game.node.entity.player.link.diary.DiaryType
|
import core.game.node.entity.player.link.diary.DiaryType
|
||||||
import core.game.node.entity.player.link.quest.QuestRepository
|
import core.game.node.entity.player.link.quest.QuestRepository
|
||||||
import core.game.node.entity.skill.Skills
|
import core.game.node.entity.skill.Skills
|
||||||
|
import core.game.node.item.GroundItem
|
||||||
|
import core.game.node.item.GroundItemManager
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
fun permadeath(target: Player) {
|
fun permadeath(target: Player) {
|
||||||
teleport(target, Location.create(3094, 3107, 0))
|
teleport(target, Location.create(3094, 3107, 0))
|
||||||
target.equipment.clear()
|
|
||||||
|
// Core
|
||||||
target.inventory.clear()
|
target.inventory.clear()
|
||||||
|
target.bank.clear()
|
||||||
|
target.bankSecondary.clear()
|
||||||
|
for (i in target.bankPrimary.tabStartSlot.indices) {
|
||||||
|
target.bankPrimary.tabStartSlot[i] = 0
|
||||||
|
}
|
||||||
|
for (i in target.bankSecondary.tabStartSlot.indices) {
|
||||||
|
target.bankSecondary.tabStartSlot[i] = 0
|
||||||
|
}
|
||||||
if (isUsingSecondaryBankAccount(target)) {
|
if (isUsingSecondaryBankAccount(target)) {
|
||||||
toggleBankAccount(target)
|
toggleBankAccount(target)
|
||||||
}
|
}
|
||||||
target.bank.clear()
|
target.equipment.clear()
|
||||||
target.bankSecondary.clear()
|
|
||||||
target.skills = Skills(target)
|
|
||||||
target.clearAttributes()
|
|
||||||
target.savedData = SavedData(target)
|
|
||||||
target.questRepository = QuestRepository(target)
|
|
||||||
target.varpManager = VarpManager(target)
|
target.varpManager = VarpManager(target)
|
||||||
target.varpMap.clear()
|
target.varpMap.clear()
|
||||||
target.saveVarp.clear()
|
target.saveVarp.clear()
|
||||||
|
target.timers.clearTimers()
|
||||||
|
|
||||||
|
// Skills
|
||||||
|
target.skills = Skills(target)
|
||||||
|
|
||||||
|
// Settings can be kept
|
||||||
|
|
||||||
|
// Quests
|
||||||
|
target.questRepository = QuestRepository(target)
|
||||||
|
|
||||||
|
// Appearance doesn't matter because you're going to tutorial island anyway
|
||||||
|
|
||||||
|
// Spellbook
|
||||||
|
target.spellBookManager.setSpellBook(SpellBookManager.SpellBook.MODERN)
|
||||||
|
|
||||||
|
// Saved data
|
||||||
|
target.savedData = SavedData(target)
|
||||||
|
|
||||||
|
// Autocast
|
||||||
|
target.properties.autocastSpell = null
|
||||||
|
|
||||||
|
// Player monitor is a no-op
|
||||||
|
|
||||||
|
// Music player
|
||||||
|
target.musicPlayer.clearUnlocked()
|
||||||
|
|
||||||
|
// Familiar manager
|
||||||
if (target.familiarManager.hasFamiliar()) {
|
if (target.familiarManager.hasFamiliar()) {
|
||||||
target.familiarManager.dismiss()
|
target.familiarManager.dismiss()
|
||||||
}
|
}
|
||||||
@@ -34,6 +74,14 @@ fun permadeath(target: Player) {
|
|||||||
for (key in petKeys) {
|
for (key in petKeys) {
|
||||||
target.familiarManager.removeDetails(key)
|
target.familiarManager.removeDetails(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bank pin data
|
||||||
|
target.bankPinManager.doCancelPin()
|
||||||
|
|
||||||
|
// House data
|
||||||
|
target.houseManager.createNewHouseAt(HouseLocation.NOWHERE)
|
||||||
|
|
||||||
|
// Achievements
|
||||||
for (type in DiaryType.values()) {
|
for (type in DiaryType.values()) {
|
||||||
val diary = target.achievementDiaryManager.getDiary(type)
|
val diary = target.achievementDiaryManager.getDiary(type)
|
||||||
for (level in 0 until diary.levelStarted.size) {
|
for (level in 0 until diary.levelStarted.size) {
|
||||||
@@ -42,8 +90,42 @@ fun permadeath(target: Player) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
target.musicPlayer.clearUnlocked()
|
|
||||||
|
// Ironman data
|
||||||
target.ironmanManager.mode = IronmanMode.NONE
|
target.ironmanManager.mode = IronmanMode.NONE
|
||||||
|
|
||||||
|
// Emote data
|
||||||
|
target.emoteManager.emotes.clear()
|
||||||
|
|
||||||
|
// Stat manager is a no-op
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
target.clearAttributes()
|
||||||
|
|
||||||
|
// Pouches
|
||||||
|
for (pouch in target.pouchManager.pouches.values) {
|
||||||
|
pouch.container.clear()
|
||||||
|
pouch.currentCap = pouch.capacity
|
||||||
|
pouch.charges = pouch.maxCharges
|
||||||
|
pouch.remakeContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroy any dropped items to prevent droptrading to yourself after death
|
||||||
|
val droppedItems = ArrayList<GroundItem>();
|
||||||
|
for (item in GroundItemManager.getItems()) {
|
||||||
|
if (item.dropperUid == target.details.uid) {
|
||||||
|
droppedItems.add(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (item in droppedItems) {
|
||||||
|
GroundItemManager.destroy(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
// grep -R savePlayer: jobs, treasure trails, brawling gloves, slayer manager, barcrawl, ge history will simply not get saved if we don't run the hooks
|
||||||
|
// Only the Blast Furnace needs to be reset explicitly
|
||||||
|
BlastFurnace.playerStates[target.details.uid] = BFPlayerState(target)
|
||||||
|
|
||||||
|
// Sayonara
|
||||||
PlayerSaver(target).save()
|
PlayerSaver(target).save()
|
||||||
target.clear()
|
target.clear()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ import java.util.*;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static core.api.ContentAPIKt.*;
|
import static core.api.ContentAPIKt.*;
|
||||||
import static core.api.utils.Permadeath.PermadeathKt.permadeath;
|
import static core.api.utils.PermadeathKt.permadeath;
|
||||||
import static core.game.system.command.sets.StatAttributeKeysKt.STATS_BASE;
|
import static core.game.system.command.sets.StatAttributeKeysKt.STATS_BASE;
|
||||||
import static core.game.system.command.sets.StatAttributeKeysKt.STATS_DEATHS;
|
import static core.game.system.command.sets.StatAttributeKeysKt.STATS_DEATHS;
|
||||||
import static core.tools.GlobalsKt.colorize;
|
import static core.tools.GlobalsKt.colorize;
|
||||||
@@ -155,21 +155,6 @@ public class Player extends Entity {
|
|||||||
*/
|
*/
|
||||||
public boolean useSecondaryBank = false;
|
public boolean useSecondaryBank = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* The Blast Furnace Coal Container.
|
|
||||||
*/
|
|
||||||
public final Container blastCoal = new Container(225, ContainerType.NEVER_STACK);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Blast Furnace Ore Container.
|
|
||||||
*/
|
|
||||||
public final Container blastOre = new Container(28, ContainerType.NEVER_STACK);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Blast Furnace Bars Container.
|
|
||||||
*/
|
|
||||||
public final Container blastBars = new Container(28, ContainerType.NEVER_STACK);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The packet dispatcher.
|
* The packet dispatcher.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -327,9 +327,6 @@ class PlayerSaveParser(val player: Player) {
|
|||||||
player.bankPrimary.parse(bank)
|
player.bankPrimary.parse(bank)
|
||||||
player.bankSecondary.parse(bankSecondary)
|
player.bankSecondary.parse(bankSecondary)
|
||||||
player.equipment.parse(equipment)
|
player.equipment.parse(equipment)
|
||||||
bBars?.let{player.blastBars.parse(it)}
|
|
||||||
bOre?.let{player.blastOre.parse(bOre)}
|
|
||||||
bCoal?.let{player.blastCoal.parse(bCoal)}
|
|
||||||
player.location = JSONUtils.parseLocation(location)
|
player.location = JSONUtils.parseLocation(location)
|
||||||
|
|
||||||
if (varpData != null) {
|
if (varpData != null) {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.json.simple.JSONObject
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileWriter
|
import java.io.FileWriter
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.lang.Math.ceil
|
|
||||||
import javax.script.ScriptEngineManager
|
import javax.script.ScriptEngineManager
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -613,15 +612,6 @@ class PlayerSaver (val player: Player){
|
|||||||
val bankSecondary = saveContainer(player.bankSecondary)
|
val bankSecondary = saveContainer(player.bankSecondary)
|
||||||
coreData.put("bankSecondary",bankSecondary)
|
coreData.put("bankSecondary",bankSecondary)
|
||||||
|
|
||||||
val bBars = saveContainer(player.blastBars)
|
|
||||||
coreData.put("blastBars",bBars)
|
|
||||||
|
|
||||||
val bOre = saveContainer(player.blastOre)
|
|
||||||
coreData.put("blastOre",bOre)
|
|
||||||
|
|
||||||
val bCoal = saveContainer(player.blastCoal)
|
|
||||||
coreData.put("blastCoal",bCoal)
|
|
||||||
|
|
||||||
val bankTabs = JSONArray()
|
val bankTabs = JSONArray()
|
||||||
for(i in player.bankPrimary.tabStartSlot.indices){
|
for(i in player.bankPrimary.tabStartSlot.indices){
|
||||||
val tab = JSONObject()
|
val tab = JSONObject()
|
||||||
|
|||||||
@@ -470,17 +470,25 @@ public class BankPinManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancels the pin.
|
* Cancels the pin and shows the correct interface.
|
||||||
*/
|
*/
|
||||||
public void cancelPin(String... messages) {
|
public void cancelPin(String... messages) {
|
||||||
|
doCancelPin();
|
||||||
|
playAudio(player, Sounds.PIN_CANCEL_1042);
|
||||||
|
openSettings(messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actually cancels the pin.
|
||||||
|
*/
|
||||||
|
public void doCancelPin() {
|
||||||
status = PinStatus.NO_PIN;
|
status = PinStatus.NO_PIN;
|
||||||
pendingDelay = -1;
|
pendingDelay = -1;
|
||||||
pin = null;
|
pin = null;
|
||||||
unlocked = false;
|
unlocked = false;
|
||||||
playAudio(player, Sounds.PIN_CANCEL_1042);
|
|
||||||
openSettings(messages);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the pin is an easy guess.
|
* Checks if the pin is an easy guess.
|
||||||
* @return {@code True} if so.
|
* @return {@code True} if so.
|
||||||
|
|||||||
@@ -202,9 +202,13 @@ public class GroundItem extends Item {
|
|||||||
this.removed = removed;
|
this.removed = removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the dropper uid.
|
||||||
|
*/
|
||||||
public int getDropperUid() {
|
public int getDropperUid() {
|
||||||
return dropperUid;
|
return dropperUid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "GroundItem [dropper=" + (dropper != null ? dropper.getUsername() : dropper) + ", ticks=" + ticks + ", decayTime=" + decayTime + ", remainPrivate=" + remainPrivate + ", removed=" + removed + "]";
|
return "GroundItem [dropper=" + (dropper != null ? dropper.getUsername() : dropper) + ", ticks=" + ticks + ", decayTime=" + decayTime + ", remainPrivate=" + remainPrivate + ", removed=" + removed + "]";
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import content.minigame.fishingtrawler.TrawlerLoot
|
|||||||
import content.region.misthalin.draynor.quest.anma.AnmaCutscene
|
import content.region.misthalin.draynor.quest.anma.AnmaCutscene
|
||||||
import core.ServerConstants
|
import core.ServerConstants
|
||||||
import core.api.*
|
import core.api.*
|
||||||
import core.api.utils.Permadeath.permadeath
|
import core.api.utils.permadeath
|
||||||
import core.cache.def.impl.NPCDefinition
|
import core.cache.def.impl.NPCDefinition
|
||||||
import core.cache.def.impl.SceneryDefinition
|
import core.cache.def.impl.SceneryDefinition
|
||||||
import core.cache.def.impl.VarbitDefinition
|
import core.cache.def.impl.VarbitDefinition
|
||||||
|
|||||||
Reference in New Issue
Block a user