From e234c9fa28b7e12600abc803bad777ed10c7c96a Mon Sep 17 00:00:00 2001 From: ceikry Date: Wed, 15 Dec 2021 20:45:15 -0600 Subject: [PATCH] Implement HCIM rework --- CHANGELOG | 4 ++- .../content/dialogue/HansDialoguePlugin.java | 17 +++++++++- .../java/core/game/node/entity/Entity.java | 7 +++- .../core/game/node/entity/player/Player.java | 33 +++++++++++++++---- .../player/info/login/PlayerSaveParser.kt | 4 +-- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6741f4a75..9aac057a7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -69,4 +69,6 @@ < --- ABOVE Released December 4, 2021 https://gitlab.com/2009scape/2009scape/-/tags/Dec-4-2021 ---- > - Shooting star discovery bonus xp is now gradually disbursed instead of lump-sum. - Spending points to cancel your slayer task no longer sets your task streak to 0. -- Stars now have bots that will spawn and help mine for stars higher than level 5. \ No newline at end of file +- Stars now have bots that will spawn and help mine for stars higher than level 5. +- Implemented HCIM Rework +< --- ABOVE Released December 15, 2021 https://gitlab.com/2009scape/2009scape/-/tags/Dec-15-2021 ---- > \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java index 2b2010c97..a59a25d53 100644 --- a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java +++ b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java @@ -137,7 +137,11 @@ public final class HansDialoguePlugin extends DialoguePlugin { case 12: switch(buttonId){ case 1: - options("1.0x","2.5x","Stay 5.0x"); + if(player.getAttributes().containsKey("permadeath")){ + options("1.0x", "2.5x", "Stay 5.0x", "(HCIM Only) 10x"); + } else { + options("1.0x", "2.5x", "Stay 5.0x"); + } stage++; break; case 2: @@ -169,6 +173,14 @@ public final class HansDialoguePlugin extends DialoguePlugin { playerl(FacialExpression.FRIENDLY, "I'd rather stay 5x, thank you."); stage = END_DIALOGUE; return true; + case 4: + if (player.newPlayer) { + player.getSkills().experienceMutiplier = 10.0; + stage = 14; + } else { + stage = 15; + } + break; } npc("One moment, please..."); break; @@ -325,6 +337,9 @@ public final class HansDialoguePlugin extends DialoguePlugin { interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"I have changed your Iron Man mode to: ","" + (buttonId == 1 ? "Standard" : "Hardcore" + " Ironman mode.")); player.getSettings().toggleAcceptAid(); player.getIronmanManager().setMode(IronmanMode.values()[buttonId]); + if(buttonId == 2) { + player.setAttribute("/save:permadeath",true); + } player.sendMessage("Your Iron Man status has been changed."); stage = 50; break; diff --git a/Server/src/main/java/core/game/node/entity/Entity.java b/Server/src/main/java/core/game/node/entity/Entity.java index b893242ab..95d947e59 100644 --- a/Server/src/main/java/core/game/node/entity/Entity.java +++ b/Server/src/main/java/core/game/node/entity/Entity.java @@ -55,7 +55,7 @@ public abstract class Entity extends Node { /** * The entity's skills. */ - private final Skills skills = new Skills(this); + public Skills skills = new Skills(this); /** * The entity's extension classes. @@ -703,6 +703,11 @@ public abstract class Entity extends Node { return attributes.getAttributes(); } + public void clearAttributes() { + this.attributes.getAttributes().clear(); + this.attributes.getSavedAttributes().clear(); + } + /** * Sets an attribute value. * @param key The attribute name. diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index a217e053c..1f7ed0a44 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -9,6 +9,7 @@ import core.game.container.impl.InventoryListener; import core.game.content.activity.pyramidplunder.PlunderObjectManager; import core.game.content.dialogue.DialogueInterpreter; import core.game.content.quest.miniquest.barcrawl.BarcrawlManager; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; import core.game.content.ttrail.TreasureTrailManager; import core.game.interaction.Interaction; import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager; @@ -79,10 +80,12 @@ import rs09.game.content.ame.RandomEventManager; import rs09.game.ge.PlayerGrandExchange; import rs09.game.node.entity.combat.CombatSwingHandler; import rs09.game.node.entity.combat.equipment.EquipmentDegrader; +import rs09.game.node.entity.player.info.login.PlayerSaver; import rs09.game.node.entity.skill.runecrafting.PouchManager; import rs09.game.node.entity.state.newsys.State; import rs09.game.node.entity.state.newsys.StateRepository; import rs09.game.world.GameWorld; +import rs09.game.world.repository.DisconnectionQueue; import rs09.game.world.repository.Repository; import rs09.game.world.update.MapChunkRenderer; import rs09.game.world.update.NPCRenderer; @@ -201,7 +204,7 @@ public class Player extends Entity { /** * The quest repository. */ - private final QuestRepository questRepository = new QuestRepository(this); + private QuestRepository questRepository = new QuestRepository(this); /** * The prayer manager. @@ -241,7 +244,7 @@ public class Player extends Entity { /** * The saved data. */ - private final SavedData savedData = new SavedData(this); + private SavedData savedData = new SavedData(this); /** * The request manager. @@ -613,11 +616,27 @@ public class Player extends Entity { if (!getZoneMonitor().handleDeath(killer) && (!getProperties().isSafeZone() && getZoneMonitor().getType() != ZoneType.SAFE.getId()) && getDetails().getRights() != Rights.ADMINISTRATOR) { //If player was a Hardcore Ironman, announce that they died if (this.getIronmanManager().getMode().equals(IronmanMode.HARDCORE)){ //if this was checkRestriction, ultimate irons would be moved to HARDCORE_DEAD as well - String gender = this.isMale() ? "Man " : "Woman "; - Repository.sendNews("Hardcore Iron " + gender + " " + this.getUsername() +" has fallen. Total Level: " + this.getSkills().getTotalLevel()); // Not enough room for XP - this.getIronmanManager().setMode(IronmanMode.STANDARD); - asPlayer().getSavedData().getActivityData().setHardcoreDeath(true); - this.sendMessage("You have fallen as a Hardcore Iron Man, your Hardcore status has been revoked."); + String gender = this.isMale() ? "man " : "woman "; + if (getAttributes().containsKey("permadeath")) { + Repository.sendNews("Permadeath Hardcore Iron" + gender + " " + this.getUsername() + " has fallen. Total Level: " + this.getSkills().getTotalLevel()); // Not enough room for XP + TutorialSession.getExtension(this).setStage(0); + equipment.clear(); + inventory.clear(); + bank.clear(); + skills = new Skills(this); + clearAttributes(); + setAttribute("/save:permadeath", true); + savedData = new SavedData(this); + questRepository = new QuestRepository(this); + new PlayerSaver(this).save(); + clear(true); + return; + } else { + Repository.sendNews("Hardcore Iron " + gender + " " + this.getUsername() + " has fallen. Total Level: " + this.getSkills().getTotalLevel()); // Not enough room for XP + this.getIronmanManager().setMode(IronmanMode.STANDARD); + asPlayer().getSavedData().getActivityData().setHardcoreDeath(true); + this.sendMessage("You have fallen as a Hardcore Iron Man, your Hardcore status has been revoked."); + } } GroundItemManager.create(new Item(526), getLocation(), k); final Container[] c = DeathTask.getContainers(this); diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt index be882969a..8d2b3c590 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt @@ -48,6 +48,7 @@ class PlayerSaveParser(val player: Player) { if (read) { launch { parseCore() + parseAttributes() parseSkills() parseSettings() parseSlayer() @@ -80,7 +81,6 @@ class PlayerSaveParser(val player: Player) { parseEmoteManager() parseStatistics() parseBrawlingGloves() - parseAttributes() parseAchievements() parsePouches() } @@ -373,7 +373,7 @@ class PlayerSaveParser(val player: Player) { player.skills.experienceMutiplier = GameWorld.settings?.default_xp_rate!! } val divisor: Double - if(player.skills.experienceMutiplier >= 10){ + if(player.skills.experienceMutiplier >= 10 && !player.attributes.containsKey("permadeath")){ //exclude permadeath HCIMs from XP squish divisor = player.skills.experienceMutiplier / 5.0 player.skills.correct(divisor) }