From 6f7577ce51fbf5110a7aa92cffb19508ab9b249d Mon Sep 17 00:00:00 2001 From: Ceikry Date: Mon, 2 Aug 2021 04:00:28 +0000 Subject: [PATCH] Slayer improvements --- .../org/runite/client/AbstractSprite.java | 95 ++++++++ .../main/java/org/runite/client/Class114.java | 2 +- .../java/org/runite/client/HDToolKit.java | 3 + .../java/org/runite/client/PacketParser.java | 38 ++-- .../main/java/org/runite/client/Unsorted.java | 92 -------- Client/src/main/kotlin/org/rs09/CustomVars.kt | 8 +- .../src/main/kotlin/org/rs09/SlayerTracker.kt | 198 +++++++++-------- .../interaction/inter/JewelleryInterface.java | 2 +- .../fletching/items/arrow/ArrowHeadPulse.java | 2 +- .../fletching/items/bolts/BoltPulse.java | 2 +- .../skill/slayer/EnchantedGemDialogue.java | 3 +- .../skill/slayer/SlayerEquipmentFlags.kt | 18 +- .../entity/skill/slayer/SlayerManager.java | 206 ++++++++---------- .../skill/slayer/SlayerRewardPlugin.java | 30 ++- .../entity/player/info/login/PlayerSaver.kt | 20 +- .../node/entity/skill/slayer/SlayerFlags.kt | 152 +++++++++++++ 16 files changed, 509 insertions(+), 362 deletions(-) create mode 100644 Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt diff --git a/Client/src/main/java/org/runite/client/AbstractSprite.java b/Client/src/main/java/org/runite/client/AbstractSprite.java index 4b9071260..482d2dc76 100644 --- a/Client/src/main/java/org/runite/client/AbstractSprite.java +++ b/Client/src/main/java/org/runite/client/AbstractSprite.java @@ -1,6 +1,9 @@ package org.runite.client; import org.rs09.client.Node; +import org.rs09.client.rendering.Toolkit; + +import java.util.Objects; public abstract class AbstractSprite extends Node { @@ -14,6 +17,98 @@ public abstract class AbstractSprite extends Node { public int width; static RSInterface aClass11_3708 = null; + public static AbstractSprite constructItemSprite(int var0, boolean useHDSprite, int itemID, boolean var4, int outlineType, int itemCount, boolean shrinkInSprite) { + try { + ItemDefinition item = ItemDefinition.getItemDefinition(itemID); + if (itemCount > 1 && item.anIntArray804 != null) { + int var9 = -1; + + for (int var10 = 0; var10 < 10; ++var10) { + if (item.anIntArray766[var10] <= itemCount && item.anIntArray766[var10] != 0) { + var9 = item.anIntArray804[var10]; + } + } + + if (var9 != -1) { + item = ItemDefinition.getItemDefinition(var9); + } + } + + Class140_Sub1_Sub2 var21 = item.method1120(); + if (null == var21) { + return null; + } else { + SoftwareSprite var22 = null; + if (item.anInt791 == -1) { + if (item.anInt762 != -1) { + var22 = (SoftwareSprite) constructItemSprite(var0, true, item.anInt795, false, outlineType, itemCount, false); + if (null == var22) { + return null; + } + } + } else { + var22 = (SoftwareSprite) constructItemSprite(0, true, item.noteID, false, 1, 10, true); + if (null == var22) { + return null; + } + } + + int[] var11 = Toolkit.JAVA_TOOLKIT.getBuffer(); + int var12 = Toolkit.JAVA_TOOLKIT.width; + int var13 = Toolkit.JAVA_TOOLKIT.height; + int[] var14 = new int[4]; + Class74.method1325(var14); + SoftwareSprite var15 = new SoftwareSprite(36, 32); + Class74.setBuffer(var15.anIntArray4081, 36, 32); + Class51.method1134(); + Class51.method1145(16, 16); + int var16 = item.anInt810; + Class51.aBoolean843 = false; + if (shrinkInSprite) { + var16 = (int) ((double) var16 * 1.5D); + } else if (outlineType == 2) { + var16 = (int) (1.04D * (double) var16); + } + + int var18 = Class51.anIntArray851[item.anInt786] * var16 >> 16; + int var17 = Class51.anIntArray840[item.anInt786] * var16 >> 16; + var21.method1893(item.anInt799, item.anInt768, item.anInt786, item.anInt792, var17 - (var21.method1871() / 2 + -item.anInt754), item.anInt754 + var18); + if (outlineType >= 1) { + var15.method657(1); + if (outlineType >= 2) { + var15.method657(16777215); + } + + Class74.setBuffer(var15.anIntArray4081, 36, 32); + } + + if (var0 != 0) { + var15.method668(var0); + } + + if (item.anInt791 != -1) { + Objects.requireNonNull(var22).drawAt(0, 0); + } else if (-1 != item.anInt762) { + Class74.setBuffer(Objects.requireNonNull(var22).anIntArray4081, 36, 32); + var15.drawAt(0, 0); + var15 = var22; + } + + if (var4 && (item.stackingType == 1 || itemCount != 1) && itemCount != -1) { + TextureOperation10.aClass3_Sub28_Sub17_Sub1_3440.method681(Class3_Sub7.itemStackColor(1000, itemCount), 0, 9, 16776960, 1); + } + + Class74.setBuffer(var11, var12, var13); + Class74.setClipping(var14); + Class51.method1134(); + Class51.aBoolean843 = true; + return HDToolKit.highDetail && !useHDSprite ? new HDSprite(var15) : var15; + } + } catch (RuntimeException var20) { + throw ClientErrorException.clientError(var20, "na.WA(" + var0 + ',' + useHDSprite + ',' + itemID + ',' + var4 + ',' + outlineType + ',' + itemCount + ',' + shrinkInSprite + ')'); + } + } + abstract void method635(int var1, int var2); abstract void method636(int var1, int var2, int var3, int var4, int var5, int var6); diff --git a/Client/src/main/java/org/runite/client/Class114.java b/Client/src/main/java/org/runite/client/Class114.java index 76f4ff707..6ca131019 100644 --- a/Client/src/main/java/org/runite/client/Class114.java +++ b/Client/src/main/java/org/runite/client/Class114.java @@ -55,7 +55,7 @@ final class Class114 { AbstractSprite var10 = (AbstractSprite) Class67.aReferenceCache_1013.get(var8); if (var10 == null) { Class51.aBoolean837 = false; - var10 = Unsorted.constructItemSprite(var4, false, var1, var2, var0, var3, false); + var10 = AbstractSprite.constructItemSprite(var4, false, var1, var2, var0, var3, false); if (var10 != null && !Class51.aBoolean837) { Class67.aReferenceCache_1013.put(var10, var8); } diff --git a/Client/src/main/java/org/runite/client/HDToolKit.java b/Client/src/main/java/org/runite/client/HDToolKit.java index ef4a17b86..1fa84c8a4 100644 --- a/Client/src/main/java/org/runite/client/HDToolKit.java +++ b/Client/src/main/java/org/runite/client/HDToolKit.java @@ -1,5 +1,6 @@ package org.runite.client; +import org.rs09.SlayerTracker; import org.rs09.client.config.GameConfig; import javax.media.opengl.*; @@ -431,6 +432,7 @@ public final class HDToolKit { Class68.method1273(); highDetail = false; + SlayerTracker.setSprite(); } static void method1843(float var0, float var1) { @@ -627,6 +629,7 @@ public final class HDToolKit { gl = glContext.getGL(); new GLU(); highDetail = true; + SlayerTracker.setSprite(); System.out.println("Setting high detail to " + highDetail); viewWidth = canvas.getSize().width; viewHeight = canvas.getSize().height; diff --git a/Client/src/main/java/org/runite/client/PacketParser.java b/Client/src/main/java/org/runite/client/PacketParser.java index 71ede80a8..5c1ae1418 100644 --- a/Client/src/main/java/org/runite/client/PacketParser.java +++ b/Client/src/main/java/org/runite/client/PacketParser.java @@ -1404,7 +1404,7 @@ public final class PacketParser { Unsorted.incomingOpcode = -1; return true; } else { - RSInterface var25; + RSInterface iface; if (Unsorted.incomingOpcode == 22) { nodeModelId = BufferedDataStream.incomingBuffer.readInt(); var19 = BufferedDataStream.incomingBuffer.readUnsignedShort(); @@ -1413,9 +1413,9 @@ public final class PacketParser { } if (nodeModelId < 0) { - var25 = null; + iface = null; } else { - var25 = Unsorted.getRSInterface(nodeModelId); + iface = Unsorted.getRSInterface(nodeModelId); } for (; Unsorted.incomingPacketLength > BufferedDataStream.incomingBuffer.index; method2277(var6 + -1, counter, var30, var19, (byte) 46)) { @@ -1429,14 +1429,14 @@ public final class PacketParser { } } - if (var25 != null && counter >= 0 && counter < var25.itemAmounts.length) { - var25.itemAmounts[counter] = var6; - var25.itemIds[counter] = var30; + if (iface != null && counter >= 0 && counter < iface.itemAmounts.length) { + iface.itemAmounts[counter] = var6; + iface.itemIds[counter] = var30; } } - if (var25 != null) { - Class20.method909(var25); + if (iface != null) { + Class20.method909(iface); } BufferedDataStream.method819(); @@ -1647,15 +1647,15 @@ public final class PacketParser { } if (0 <= nodeModelId) { - var25 = Unsorted.getRSInterface(nodeModelId); + iface = Unsorted.getRSInterface(nodeModelId); } else { - var25 = null; + iface = null; } - if (var25 != null) { - for (counter = 0; var25.itemAmounts.length > counter; ++counter) { - var25.itemAmounts[counter] = 0; - var25.itemIds[counter] = 0; + if (iface != null) { + for (counter = 0; iface.itemAmounts.length > counter; ++counter) { + iface.itemAmounts[counter] = 0; + iface.itemIds[counter] = 0; } } @@ -1669,16 +1669,16 @@ public final class PacketParser { } chatIcon = BufferedDataStream.incomingBuffer.readUnsignedShort(); - if (null != var25 && var25.itemAmounts.length > var6) { - var25.itemAmounts[var6] = chatIcon; - var25.itemIds[var6] = var30; + if (null != iface && iface.itemAmounts.length > var6) { + iface.itemAmounts[var6] = chatIcon; + iface.itemIds[var6] = var30; } method2277(-1 + chatIcon, var6, var30, var19, (byte) 41); } - if (var25 != null) { - Class20.method909(var25); + if (iface != null) { + Class20.method909(iface); } BufferedDataStream.method819(); diff --git a/Client/src/main/java/org/runite/client/Unsorted.java b/Client/src/main/java/org/runite/client/Unsorted.java index 13ad010e6..81f90befc 100644 --- a/Client/src/main/java/org/runite/client/Unsorted.java +++ b/Client/src/main/java/org/runite/client/Unsorted.java @@ -407,98 +407,6 @@ public class Unsorted { } } - static AbstractSprite constructItemSprite(int var0, boolean useHDSprite, int itemID, boolean var4, int outlineType, int itemCount, boolean shrinkInSprite) { - try { - ItemDefinition item = ItemDefinition.getItemDefinition(itemID); - if (itemCount > 1 && item.anIntArray804 != null) { - int var9 = -1; - - for (int var10 = 0; var10 < 10; ++var10) { - if (item.anIntArray766[var10] <= itemCount && item.anIntArray766[var10] != 0) { - var9 = item.anIntArray804[var10]; - } - } - - if (var9 != -1) { - item = ItemDefinition.getItemDefinition(var9); - } - } - - Class140_Sub1_Sub2 var21 = item.method1120(); - if (null == var21) { - return null; - } else { - SoftwareSprite var22 = null; - if (item.anInt791 == -1) { - if (item.anInt762 != -1) { - var22 = (SoftwareSprite) constructItemSprite(var0, true, item.anInt795, false, outlineType, itemCount, false); - if (null == var22) { - return null; - } - } - } else { - var22 = (SoftwareSprite) constructItemSprite(0, true, item.noteID, false, 1, 10, true); - if (null == var22) { - return null; - } - } - - int[] var11 = Toolkit.JAVA_TOOLKIT.getBuffer(); - int var12 = Toolkit.JAVA_TOOLKIT.width; - int var13 = Toolkit.JAVA_TOOLKIT.height; - int[] var14 = new int[4]; - Class74.method1325(var14); - SoftwareSprite var15 = new SoftwareSprite(36, 32); - Class74.setBuffer(var15.anIntArray4081, 36, 32); - Class51.method1134(); - Class51.method1145(16, 16); - int var16 = item.anInt810; - Class51.aBoolean843 = false; - if (shrinkInSprite) { - var16 = (int) ((double) var16 * 1.5D); - } else if (outlineType == 2) { - var16 = (int) (1.04D * (double) var16); - } - - int var18 = Class51.anIntArray851[item.anInt786] * var16 >> 16; - int var17 = Class51.anIntArray840[item.anInt786] * var16 >> 16; - var21.method1893(item.anInt799, item.anInt768, item.anInt786, item.anInt792, var17 - (var21.method1871() / 2 + -item.anInt754), item.anInt754 + var18); - if (outlineType >= 1) { - var15.method657(1); - if (outlineType >= 2) { - var15.method657(16777215); - } - - Class74.setBuffer(var15.anIntArray4081, 36, 32); - } - - if (var0 != 0) { - var15.method668(var0); - } - - if (item.anInt791 != -1) { - Objects.requireNonNull(var22).drawAt(0, 0); - } else if (-1 != item.anInt762) { - Class74.setBuffer(Objects.requireNonNull(var22).anIntArray4081, 36, 32); - var15.drawAt(0, 0); - var15 = var22; - } - - if (var4 && (item.stackingType == 1 || itemCount != 1) && itemCount != -1) { - TextureOperation10.aClass3_Sub28_Sub17_Sub1_3440.method681(Class3_Sub7.itemStackColor(1000, itemCount), 0, 9, 16776960, 1); - } - - Class74.setBuffer(var11, var12, var13); - Class74.setClipping(var14); - Class51.method1134(); - Class51.aBoolean843 = true; - return HDToolKit.highDetail && !useHDSprite ? new HDSprite(var15) : var15; - } - } catch (RuntimeException var20) { - throw ClientErrorException.clientError(var20, "na.WA(" + var0 + ',' + useHDSprite + ',' + itemID + ',' + var4 + ',' + outlineType + ',' + itemCount + ',' + shrinkInSprite + ')'); - } - } - public static RSString method802(int var0) { try { diff --git a/Client/src/main/kotlin/org/rs09/CustomVars.kt b/Client/src/main/kotlin/org/rs09/CustomVars.kt index 6fcb2513c..a84528bf6 100644 --- a/Client/src/main/kotlin/org/rs09/CustomVars.kt +++ b/Client/src/main/kotlin/org/rs09/CustomVars.kt @@ -17,9 +17,11 @@ object CustomVars { true } 2502 -> { - GameConfig.slayerCountEnabled = (varValue and 1) == 0 - GameConfig.slayerTaskID = (varValue shr 1) and 127 - GameConfig.setSlayerAmount((varValue shr 8) and 511) + GameConfig.slayerCountEnabled = true + GameConfig.slayerTaskID = varValue and 0x7F + GameConfig.setSlayerAmount((varValue shr 7) and 0xFF) + SlayerTracker.setSprite() + SystemLogger.logInfo(varValue.toString()) true } else -> false diff --git a/Client/src/main/kotlin/org/rs09/SlayerTracker.kt b/Client/src/main/kotlin/org/rs09/SlayerTracker.kt index b749135af..2c68cf1a2 100644 --- a/Client/src/main/kotlin/org/rs09/SlayerTracker.kt +++ b/Client/src/main/kotlin/org/rs09/SlayerTracker.kt @@ -3,6 +3,7 @@ package org.rs09 import org.rs09.client.config.GameConfig import org.rs09.client.rendering.RenderingUtils import org.rs09.client.rendering.Toolkit +import org.runite.client.* import java.util.concurrent.TimeUnit object SlayerTracker { @@ -10,10 +11,15 @@ object SlayerTracker { const val posY = 30 const val textX = 7 const val textY = 50 + const val spriteY = 30 + val boxColor = "635a38".toInt(16) @JvmField var lastUpdate = 0L + var curSprite: AbstractSprite? = null + + @JvmStatic fun draw(){ val timeSinceUpdate = System.currentTimeMillis() - lastUpdate @@ -21,12 +27,13 @@ object SlayerTracker { if(GameConfig.slayerTaskAmount == 0) return if(timeSinceUpdate >= TimeUnit.MINUTES.toMillis(5L)) return val tk = Toolkit.getActiveToolkit() - var rectWidth = 9 * getTask().length - var amountPos = textX + (6 * getTask().length) + var rectWidth = 60 + var amountPos = textX + 40 if(rectWidth < 90) rectWidth = 90 if(amountPos < textX + 60) amountPos = textX + 60 - tk.fillRect(posX,posY,rectWidth,30,0,64) - RenderingUtils.drawText(getTask() + ":", textX, textY,-1,2,false) + tk.fillRect(posX,posY,rectWidth,30, boxColor,180) + + curSprite?.drawAt(textX, spriteY) RenderingUtils.drawText(GameConfig.slayerTaskAmount.toString(),amountPos, textY, -1, 2, false) } @@ -38,91 +45,104 @@ object SlayerTracker { lastUpdate = 0 } - fun getTask(): String { - return when(GameConfig.slayerTaskID){ - 0 -> "Abby Spectres" - 1 -> "Abyssal Demons" - 2 -> "Ankou" - 3 -> "Aviansies" - 4 -> "Banshee" - 5 -> "Basilisks" - 6 -> "Bats" - 7 -> "Bears" - 8 -> "Birds" - 9 -> "Black Demons" - 10 -> "Black Dragons" - 11 -> "Bloodvelds" - 12 -> "Blue Dragons" - 13 -> "Brine Rats" - 14 -> "Bronze Dragons" - 15 -> "Catablepons" - 16 -> "Cave Bugs" - 17 -> "Cave Crawlers" - 18 -> "Cave Horrors" - 19 -> "Cave Slimes" - 20 -> "Cockatrices" - 21 -> "Cows" - 22 -> "Crawling Hands" - 23 -> "Crocodiles" - 24 -> "Cyclopes" - 25 -> "Dagannoths" - 26 -> "Dark Beasts" - 27 -> "Desert Lizards" - 28 -> "Dogs" - 29 -> "Dust Devils" - 30 -> "Dwarves" - 31 -> "Earth Warriors" - 32 -> "Fire Giants" - 33 -> "Flesh Crawlers" - 34 -> "Gargoyles" - 35 -> "Ghosts" - 36 -> "Ghouls" - 37 -> "Goblins" - 38 -> "Goraks" - 39 -> "Greater Demons" - 40 -> "Green Dragons" - 41 -> "Harpie Swarms" - 42 -> "Hellhounds" - 43 -> "Hill Giants" - 44 -> "Hobgoblins" - 45 -> "Ice Fiends" - 46 -> "Ice Giants" - 47 -> "Ice Warriors" - 48 -> "Infernal Mages" - 49 -> "Iron Dragons" - 50 -> "Jellies" - 51 -> "Jungle Horrors" - 52 -> "Kalphites" - 53 -> "Kurasks" - 54 -> "Lesser Demons" - 55 -> "Mithril Dragons" - 56 -> "Minotaurs" - 57 -> "Monkeys" - 58 -> "Moss Giants" - 59 -> "Nechryaels" - 60 -> "Ogres" - 61 -> "Otherworldly Beings" - 62 -> "Pyrefiends" - 63 -> "Rats" - 64 -> "Rock Slugs" - 65 -> "Scorpions" - 66 -> "Shades" - 67 -> "Skeletons" - 68 -> "Spiders" - 69 -> "Spiritual Mages" - 70 -> "Spiritual Rangers" - 71 -> "Spiritual Warriors" - 72 -> "Steel Dragons" - 73 -> "Trolls" - 74 -> "Turoths" - 75 -> "Tzhaar" - 76 -> "Vampires" - 77 -> "Waterfiends" - 78 -> "Werewolves" - 79 -> "Wolves" - 80 -> "Zombies" - 89 -> "Skeletal Wyverns" - else -> "Uhh Report Me?" + @JvmStatic + fun setSprite(){ + SystemLogger.logInfo("Getting slayer sprite...") + val itemId: Int = when(GameConfig.slayerTaskID){ + 0 -> 4144 + 1 -> 4149 + 2 -> 560 + 3 -> 10176 + 4 -> 4135 + 5 -> 4139 + 6 -> 14072 + 7 -> 948 + 8 -> 12189 + 9 -> 3098 + 10 -> 1747 + 11 -> 4141 + 12 -> 1751 + 13 -> 11047 + 14 -> 2349 + 15 -> 9008 + 16 -> 4521 + 17 -> 4134 + 18 -> 8900 + 19 -> 4520 + 20 -> 4137 + 21 -> 1739 + 22 -> 7982 + 23 -> 10149 + 24 -> 532 + 25 -> 8141 + 26 -> 6637 + 27 -> 6695 + 28 -> 8132 + 29 -> 4145 + 30 -> 7500 + 31 -> 1422 + 32 -> 1387 + 33 -> 9011 + 34 -> 4147 + 35 -> 552 + 36 -> 6722 + 37 -> 10998 + 38 -> 9016 + 39 -> 2402 + 40 -> 1753 + 41 -> 7050 + 42 -> 8137 + 43 -> 12570 + 44 -> 8133 + 45 -> 4671 + 46 -> 4671 + 47 -> 1159 + 48 -> 4140 + 49 -> 2351 + 50 -> 4142 + 51 -> 7778 + 52 -> 8139 + 53 -> 4146 + 54 -> 2402 + 55 -> 2359 + 56 -> 12079 + 57 -> 12201 + 58 -> 12570 + 59 -> 4148 + 60 -> 4818 + 61 -> 6107 + 62 -> 4138 + 63 -> 14074 + 64 -> 4136 + 65 -> 6297 + 66 -> 10634 + 67 -> 553 + 68 -> 8135 + 69 -> 11732 + 70 -> 10284 + 71 -> 13923 + 72 -> 2353 + 73 -> 8136 + 74 -> 4143 + 75 -> 6528 + 76 -> 10109 + 77 -> 1403 + 78 -> 2952 + 79 -> 958 + 80 -> 7594 + 89 -> 6811 + else -> -1 } + + var sprite = AbstractSprite.constructItemSprite(0, HDToolKit.highDetail, itemId, false, 1, 1, false) + if(HDToolKit.highDetail) { + if (sprite is Class3_Sub28_Sub16_Sub2_Sub1) { + sprite = Class3_Sub28_Sub16_Sub1_Sub1(sprite as SoftwareSprite) + } else { + sprite = HDSprite(sprite as SoftwareSprite) + } + } + + curSprite = sprite } } \ No newline at end of file diff --git a/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java b/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java index 15daafba9..251da81c8 100644 --- a/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java @@ -186,7 +186,7 @@ public final class JewelleryInterface extends ComponentPlugin { }); return true; } - if(!player.getSlayer().getLearned()[1] && data.equals(JewelleryItem.SLAYER_RING)){ + if(!player.getSlayer().flags.isRingUnlocked()){ player.sendMessages("You don't know how to make this. Talk to any Slayer master in order to learn the", "ability that creates Slayer rings."); return true; } diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java b/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java index 17bfe101e..2d3dd0870 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java @@ -43,7 +43,7 @@ public class ArrowHeadPulse extends SkillPulse { @Override public boolean checkRequirements() { if (arrow.unfinished == 4160) { - if (!player.getSlayer().getLearned()[0]) { + if (!player.getSlayer().flags.isBroadsUnlocked()) { player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad arrows."); return false; } diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java index f8581b08c..f8ec05101 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java @@ -60,7 +60,7 @@ public final class BoltPulse extends SkillPulse { @Override public boolean checkRequirements() { if (bolt.getUnfinished().getId() == 13279) { - if (!player.getSlayer().getLearned()[0]) { + if (!player.getSlayer().flags.isBroadsUnlocked()) { player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad bolts."); return false; } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java b/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java index 583a59ab8..f56ed151b 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java @@ -93,8 +93,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin { break; } interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (player.getSlayer().getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + player.getSlayer().getAmount() + " more to go."); - player.varpManager.get(2502).setVarbit(1,player.getSlayer().getTask().ordinal()); - player.varpManager.get(2502).setVarbit(8,player.getSlayer().getAmount()).send(player); + player.varpManager.get(2502).setVarbit(0,player.getSlayer().flags.getTaskFlags() >> 4).send(player); stage = 11; break; case 11: diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt index 23e7e40d7..d925e3d1f 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt @@ -28,47 +28,47 @@ object SlayerEquipmentFlags { if((ContentAPI.getItemFromEquipment(player, EquipmentSlot.AMULET)?.id ?: 0) == Items.WITCHWOOD_ICON_8923) flags = flags or (1 shl 7) if((ContentAPI.getItemFromEquipment(player, EquipmentSlot.SHIELD)?.id ?: 0) == Items.MIRROR_SHIELD_4156) flags = flags or (1 shl 8) - player.slayer.equipmentFlags = flags + player.slayer.flags.equipmentFlags = flags } @JvmStatic fun hasNosePeg(player: Player): Boolean{ - return player.slayer.equipmentFlags and 1 == 1 + return player.slayer.flags.equipmentFlags and 1 == 1 } @JvmStatic fun hasEarmuffs(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 1) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 1) and 1 == 1 } @JvmStatic fun hasFaceMask(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 2) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 2) and 1 == 1 } @JvmStatic fun hasBlackMask(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 3) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 3) and 1 == 1 } @JvmStatic fun hasSpinyHelmet(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 4) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 4) and 1 == 1 } @JvmStatic fun hasWitchwoodIcon(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 7) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 7) and 1 == 1 } @JvmStatic fun hasMirrorShield(player: Player): Boolean { - return (player.slayer.equipmentFlags shr 8) and 1 == 1 + return (player.slayer.flags.equipmentFlags shr 8) and 1 == 1 } @JvmStatic fun getDamAccBonus(player: Player): Double { - val isCape = player.slayer.equipmentFlags == 0x3F + val isCape = player.slayer.flags.equipmentFlags == 0x3F val hasMask = hasBlackMask(player) return if(isCape) 1.075 diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerManager.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerManager.java index bb9f0ad47..669da7a1c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerManager.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerManager.java @@ -8,6 +8,7 @@ import core.game.node.entity.skill.Skills; import core.tools.RandomFunction; import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import rs09.game.node.entity.skill.slayer.SlayerFlags; import java.util.ArrayList; import java.util.Collections; @@ -26,49 +27,9 @@ public final class SlayerManager { private final Player player; /** - * The current slayer master used. + * The player's slayer flags */ - private Master master; - - /** - * The current task. - */ - private Tasks task; - - /** - * The amount of the hunted killed. - */ - private int amount; - - /** - * The slayer points. - */ - private int slayerPoints; - - /** - * The task streak. - */ - private int taskCount; - - /** - * Total tasks completed - */ - private int taskTotal; - - /** - * The learned rewards. - */ - private final boolean[] learned = new boolean[3]; - - /** - * The removed tasks. - */ - private final List removed = new ArrayList<>(4); - - /** - * The equipment flags for the given player - */ - public int equipmentFlags = 0; + public final SlayerFlags flags; /** * Constructs a new {@Code SlayerManager} {@Code Object} @@ -76,39 +37,66 @@ public final class SlayerManager { */ public SlayerManager(Player player) { this.player = player; + this.flags = new SlayerFlags(player); } - /** - * If the player can earn points (taskTotal > 4) - */ - private boolean canEarnPoints = false; - public void parse(JSONObject slayerData){ Object m = slayerData.get("master"); - if(m != null) - this.master = Master.forId(Integer.parseInt(m.toString())); + if(m != null) { + flags.setMaster(Master.forId(Integer.parseInt(m.toString()))); + } Object t = slayerData.get("taskId"); if(t != null) - task = Tasks.values()[Integer.parseInt(t.toString())]; + flags.setTask(Tasks.values()[Integer.parseInt(t.toString())]); Object a = slayerData.get("taskAmount"); if(a != null) - amount = Integer.parseInt(a.toString()); - slayerPoints = Integer.parseInt( slayerData.get("points").toString()); - taskCount = Integer.parseInt( slayerData.get("taskStreak").toString()); - JSONArray learnedArray = (JSONArray) slayerData.get("learned_rewards"); - for(int i = 0; i < learnedArray.size(); i++){ - learned[i] = (boolean) learnedArray.get(i); - } + flags.setTaskAmount(Integer.parseInt(a.toString())); + Object points = slayerData.get("points"); + if(points != null){ + flags.setPoints(Integer.parseInt(points.toString())); + } + Object taskStreak = slayerData.get("taskStreak"); + if(taskStreak != null){ + flags.setTaskStreak(Integer.parseInt(taskStreak.toString())); + } + Object la = slayerData.get("learned_rewards"); + if(la != null) { + JSONArray learnedArray = (JSONArray) slayerData.get("learned_rewards"); + for (int i = 0; i < learnedArray.size(); i++) { + boolean unlocked = (boolean) learnedArray.get(i); + switch(i){ + case 0: + if(unlocked) flags.unlockBroads(); + break; + case 1: + if(unlocked) flags.unlockRing(); + break; + case 2: + if(unlocked) flags.unlockHelm(); + break; + default: + break; + } + } + } JSONArray removedTasks = (JSONArray) slayerData.get("removedTasks"); if(removedTasks != null){ for(int i = 0; i < removedTasks.size(); i++){ - removed.add(Tasks.values()[Integer.parseInt(removedTasks.get(i).toString())]); + flags.getRemoved().add(Tasks.values()[Integer.parseInt(removedTasks.get(i).toString())]); } } - taskTotal = Integer.parseInt( slayerData.get("totalTasks").toString()); - canEarnPoints = (boolean) slayerData.get("canEarnPoints"); + Object completedTasks = slayerData.get("totalTasks").toString(); + if(completedTasks != null) flags.setCompletedTasks(Integer.parseInt(completedTasks.toString())); + if(flags.getCompletedTasks() >= 4) flags.flagCanEarnPoints(); + + //New system parsing if(slayerData.containsKey("equipmentFlags")) - equipmentFlags = Integer.parseInt(slayerData.get("equipmentFlags").toString()); + flags.setEquipmentFlags(Integer.parseInt(slayerData.get("equipmentFlags").toString())); + if(slayerData.containsKey("taskFlags")) + flags.setTaskFlags(Integer.parseInt(slayerData.get("taskFlags").toString())); + if(slayerData.containsKey("rewardFlags")) + flags.setRewardFlags(Integer.parseInt(slayerData.get("rewardFlags").toString())); + } /** @@ -121,25 +109,25 @@ public final class SlayerManager { decrementAmount(1); if (!hasTask()) { clear(); - taskCount++; - taskTotal++; - if ((taskCount > 4 || canEarnPoints ) && master != Master.TURAEL && slayerPoints < 64000) { - int points = master.getTaskPoints()[0]; - if (taskCount % 10 == 0) { - points = master.getTaskPoints()[1]; - } else if (taskCount % 50 == 0) { - points = master.getTaskPoints()[2]; + flags.setTaskStreak(flags.getTaskStreak() + 1); + flags.setCompletedTasks(flags.getCompletedTasks() + 1); + if ((flags.getCompletedTasks() > 4 || flags.canEarnPoints() ) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) { + int points = flags.getMaster().getTaskPoints()[0]; + if (flags.getTaskStreak() % 10 == 0) { + points = flags.getMaster().getTaskPoints()[1]; + } else if (flags.getTaskStreak() % 50 == 0) { + points = flags.getMaster().getTaskPoints()[2]; } - slayerPoints += points; - if (slayerPoints > 64000) { - slayerPoints = 64000; + flags.incrementPoints(points); + if (flags.getPoints() > 64000) { + flags.setPoints(64000); } - player.sendMessages("You've completed " + taskCount + " tasks in a row and received " + points + " points, with a total of " + player.getSlayer().getSlayerPoints(),"You have completed " + taskTotal + " tasks in total. Return to a Slayer master."); - } else if(taskCount == 4){ + player.sendMessages("You've completed " + flags.getTaskStreak() + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(),"You have completed " + flags.getCompletedTasks() + " tasks in total. Return to a Slayer master."); + } else if(flags.getCompletedTasks() == 4){ player.sendMessage("You've completed your task; you will start gaining points on your next task!"); - canEarnPoints = true; + flags.flagCanEarnPoints(); } else { - player.sendMessages("You've completed your task; Complete " + (4 - taskCount) + " more task(s) to start gaining points.", "Return to a Slayer master."); + player.sendMessages("You've completed your task; Complete " + (4 - flags.getCompletedTasks()) + " more task(s) to start gaining points.", "Return to a Slayer master."); } } else { //player.sendMessage("You're assigned to kill " + NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "s; Only " + getAmount() + " more to go."); @@ -160,8 +148,7 @@ public final class SlayerManager { } else if (master == Master.VANNAKA) { player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 14); } - getPlayer().varpManager.get(2502).setVarbit(1,task.ordinal()); - getPlayer().varpManager.get(2502).setVarbit(8,getAmount()).send(player); + getPlayer().varpManager.get(2502).setVarbit(0, flags.getTaskFlags() >> 4).send(player); } /** @@ -185,14 +172,13 @@ public final class SlayerManager { } public boolean canBeAssigned(Tasks task){ - return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !removed.contains(task); + return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !flags.getRemoved().contains(task); } /** * Clears the task. */ public void clear() { - setTask(null); setAmount(0); } @@ -210,14 +196,12 @@ public final class SlayerManager { * @return the name. */ public String getTaskName() { - if (task == null) { - return "null"; - } + Tasks task = flags.getTask(); if (task.getNpcs() == null) { return "no npcs report me"; } if (task.getNpcs().length < 1) { - return "npc length to small report me"; + return "npc length too small report me"; } return NPCDefinition.forId(task.getNpcs()[0]).getName().toLowerCase(); } @@ -227,15 +211,15 @@ public final class SlayerManager { * @return The task. */ public Tasks getTask() { - return task; + return flags.getTask(); } /** * Sets the task. * @param task The task to set. */ - public void setTask(Tasks task) { - this.task = task; + public void setTask(Tasks task){ + flags.setTask(task); } /** @@ -251,7 +235,7 @@ public final class SlayerManager { * @return The master. */ public Master getMaster() { - return master; + return flags.getMaster(); } /** @@ -259,7 +243,7 @@ public final class SlayerManager { * @param master The master to set. */ public void setMaster(Master master) { - this.master = master; + flags.setMaster(master); } /** @@ -267,13 +251,7 @@ public final class SlayerManager { * @return {@code True} if so. */ public boolean hasTask() { - if (task == null) { - return false; - } - if (getAmount() == 0) { - return false; - } - return true; + return getAmount() != 0; } /** @@ -281,7 +259,7 @@ public final class SlayerManager { * @return True if so. */ public boolean isCompleted() { - return amount <= 0; + return flags.getTaskAmount() <= 0; } /** @@ -289,7 +267,7 @@ public final class SlayerManager { * @return The amount. */ public int getAmount() { - return amount; + return flags.getTaskAmount(); } /** @@ -297,7 +275,7 @@ public final class SlayerManager { * @param amount The amount to set. */ public void setAmount(int amount) { - this.amount = amount; + flags.setTaskAmount(amount); } /** @@ -305,10 +283,8 @@ public final class SlayerManager { * @param amount the amount. */ public void decrementAmount(int amount) { - this.amount -= amount; - if(player.varpManager.get(2502).getVarbit(1) == null) player.varpManager.get(2502).setVarbit(1,task.ordinal()); - player.varpManager.get(2502).setVarbit(8,getAmount()); - player.varpManager.get(2502).send(player); + flags.decrementTaskAmount(amount); + player.varpManager.get(2502).setVarbit(0, flags.getTaskFlags() >> 4).send(player); } /** @@ -316,7 +292,7 @@ public final class SlayerManager { * @return {@code True} if so. */ public boolean hasStarted() { - return master != null; + return flags.getCompletedTasks() > 0 || flags.getTaskAmount() > 0; } /** @@ -324,7 +300,7 @@ public final class SlayerManager { * @return the slayerPoints. */ public int getSlayerPoints() { - return slayerPoints; + return flags.getPoints(); } /** @@ -332,7 +308,7 @@ public final class SlayerManager { * @param slayerPoints the slayerPoints to set */ public void setSlayerPoints(int slayerPoints) { - this.slayerPoints = slayerPoints; + flags.setPoints(slayerPoints); } /** @@ -340,7 +316,7 @@ public final class SlayerManager { * @return the taskCount. */ public int getTaskCount() { - return taskCount; + return flags.getTaskStreak(); } /** @@ -348,15 +324,7 @@ public final class SlayerManager { * @param taskCount the taskCount to set */ public void setTaskCount(int taskCount) { - this.taskCount = taskCount; - } - - /** - * Gets the learned. - * @return the learned. - */ - public boolean[] getLearned() { - return learned; + flags.setTaskStreak(taskCount); } /** @@ -364,13 +332,13 @@ public final class SlayerManager { * @return the removed. */ public List getRemoved() { - return removed; + return flags.getRemoved(); } - public int getTotalTasks() {return taskTotal;} + public int getTotalTasks() {return flags.getCompletedTasks();} public boolean isCanEarnPoints(){ - return canEarnPoints; + return flags.canEarnPoints(); } } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java index 6f5488e4a..480ba0f22 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java @@ -132,34 +132,34 @@ public class SlayerRewardPlugin extends ComponentPlugin { break; case 22://Broad arrows case 29: - if (player.getSlayer().getLearned()[0]) { + if (player.getSlayer().flags.isBroadsUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 300)) { - player.getSlayer().getLearned()[0] = true; + player.getSlayer().flags.unlockBroads(); updateInterface(player, component); } break; case 23://Slayer ring case 30: - if (player.getSlayer().getLearned()[1]) { + if (player.getSlayer().flags.isRingUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 300)) { - player.getSlayer().getLearned()[1] = true; + player.getSlayer().flags.unlockRing(); updateInterface(player, component); } break; case 24://Slayer helm case 31: - if (player.getSlayer().getLearned()[2]) { + if (player.getSlayer().flags.isHelmUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 400)) { - player.getSlayer().getLearned()[2] = true; + player.getSlayer().flags.unlockHelm(); updateInterface(player, component); } break; @@ -268,8 +268,20 @@ public class SlayerRewardPlugin extends ComponentPlugin { player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 19); break; case 163://learn - for (int i = 0; i < player.getSlayer().getLearned().length; i++) { - player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().getLearned()[i]); + for (int i = 0; i < 3; i++) { + switch(i){ + case 0: + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isBroadsUnlocked()); + break; + case 1: + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isRingUnlocked()); + break; + case 2: + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isHelmUnlocked()); + break; + default: + break; + } } player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 18); break; @@ -370,7 +382,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { player.sendMessage("You need a Crafting level of at least 55 in order to do this."); return true; } - if (!player.getSlayer().getLearned()[2]) { + if (!player.getSlayer().flags.isHelmUnlocked()) { player.sendMessage("You need to unlock the ability to do that first."); return true; } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt index dddeacd2e..2c8d65e41 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt @@ -700,20 +700,6 @@ class PlayerSaver (val player: Player){ fun saveSlayer(root: JSONObject){ val slayer = JSONObject() val slayerManager = player.slayer - if(slayerManager.hasStarted()){ - slayer.put("master",slayerManager.master.npc.toString()) - } - if(slayerManager.hasTask()){ - slayer.put("taskId",slayerManager.task.ordinal.toString()) - slayer.put("taskAmount",slayerManager.amount.toString()) - } - slayer.put("points",slayerManager.slayerPoints.toString()) - slayer.put("taskStreak",slayerManager.taskCount.toString()) - val learnedRewards = JSONArray() - slayerManager.learned.map { - learnedRewards.add(it) - } - slayer.put("learned_rewards",learnedRewards) if(slayerManager.removed.isNotEmpty()) { val removedTasks = JSONArray() slayerManager.removed.map { @@ -721,9 +707,11 @@ class PlayerSaver (val player: Player){ } slayer.put("removedTasks",removedTasks) } + slayer.put("taskStreak",slayerManager.taskCount.toString()) slayer.put("totalTasks",slayerManager.totalTasks.toString()) - slayer.put("canEarnPoints",slayerManager.isCanEarnPoints) - slayer.put("equipmentFlags",slayerManager.equipmentFlags) + slayer.put("equipmentFlags",slayerManager.flags.equipmentFlags) + slayer.put("taskFlags", slayerManager.flags.taskFlags) + slayer.put("rewardFlags", slayerManager.flags.rewardFlags) root.put("slayer",slayer) } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt new file mode 100644 index 000000000..5619c87c7 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt @@ -0,0 +1,152 @@ +package rs09.game.node.entity.skill.slayer + +import core.game.node.entity.player.Player +import core.game.node.entity.skill.slayer.Master +import core.game.node.entity.skill.slayer.Tasks + +/** + * Bitflag-based system for storing slayer-related data for a player and various helper functions. + * @author Ceikry + */ +class SlayerFlags(val player: Player) { + var taskFlags = 0 + var rewardFlags = 0 + var equipmentFlags = 0 + var completedTasks = 0 + var taskStreak = 0 + + /** + * The removed tasks. + */ + val removed: List = ArrayList(4) + + /** + * Get/set master flags + */ + fun getMaster(): Master { + val ordinal = taskFlags and 0xF + return Master.values()[ordinal] + } + + fun setMaster(master: Master){ + taskFlags = (taskFlags - (taskFlags and 0xF)) or master.ordinal + } + + /** + *============================================== + */ + + + /** + * Get/set task flags + */ + fun getTask(): Tasks { + val ordinal = (taskFlags shr 4) and 0x7F + return Tasks.values()[ordinal] + } + + fun setTask(tasks: Tasks){ + taskFlags = (taskFlags - (getTask().ordinal shl 4)) or (tasks.ordinal shl 4) + } + + /** + *============================================== + */ + + /** + * Get/set/decrement task amount flag + */ + fun getTaskAmount(): Int { + return (taskFlags shr 11) and 0xFF + } + + fun setTaskAmount(amount: Int) { + taskFlags = (taskFlags - (getTaskAmount() shl 11)) or (amount shl 11) + } + + fun decrementTaskAmount(amount: Int){ + setTaskAmount(getTaskAmount() - amount) + } + /** + *============================================== + */ + + /** + * Get/Set canEarnPoints flag + */ + fun canEarnPoints(): Boolean { + return (taskFlags shr 16) and 1 == 1 + } + + fun flagCanEarnPoints() { + taskFlags = taskFlags or (1 shl 16) + } + /** + *============================================== + */ + + /** + * Get/set reward unlock flags + */ + fun isBroadsUnlocked(): Boolean{ + return rewardFlags and 1 == 1 + } + + fun unlockBroads() { + rewardFlags = rewardFlags or 1 + } + + fun isRingUnlocked(): Boolean { + return (rewardFlags shr 1) and 1 == 1 + } + + fun unlockRing() { + rewardFlags = rewardFlags or (1 shl 1) + } + + fun isHelmUnlocked(): Boolean { + return (rewardFlags shr 2) and 1 ==1 + } + + fun unlockHelm() { + rewardFlags = rewardFlags or (1 shl 2) + } + + /** + *============================================== + */ + + /** + * Get/set/increment points flag + */ + fun setPoints(amount: Int) { + rewardFlags = (rewardFlags - (getPoints() shl 15)) or (amount shl 15) + } + + fun getPoints(): Int { + return (rewardFlags shr 15) and 0xFFFF + } + + fun incrementPoints(amount: Int){ + setPoints(getPoints() + amount) + } + /** + *============================================== + */ + + /** + * Reset task and task amount to 0 + */ + fun clearTask() { + setTask(Tasks.values()[0]) + setTaskAmount(0) + } + + /** + * Checks if we have a task + */ + fun hasTask(): Boolean{ + return getTaskAmount() != 0 + } + +} \ No newline at end of file