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)
}