From 6fc3b492c110543bcf5aea0d7c64a89409ae4054 Mon Sep 17 00:00:00 2001 From: Devin Date: Tue, 24 Oct 2017 19:41:44 -0700 Subject: [PATCH] Add precise combat level plugin --- .../net/runelite/api/widgets/WidgetID.java | 7 ++ .../net/runelite/api/widgets/WidgetInfo.java | 4 +- .../plugins/combatlevel/CombatLevel.java | 99 +++++++++++++++++++ .../combatlevel/CombatLevelConfig.java | 46 +++++++++ 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevel.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index c3ddc4f573..0aaed08f70 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -42,6 +42,7 @@ class WidgetID static final int PRAYER_GROUP_ID = 541; static final int SHOP_GROUP_ID = 300; static final int SHOP_INVENTORY_GROUP_ID = 301; + static final int COMBAT_GROUP_ID = 593; static class PestControl { @@ -152,4 +153,10 @@ class WidgetID static final int RIGOUR = 30; static final int AUGURY = 31; } + + static class Combat + { + static final int WEAPON_NAME = 1; + static final int LEVEL = 2; + } } diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index e60c93de07..63a525f7f8 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -79,7 +79,9 @@ public enum WidgetInfo RESIZABLE_VIEWPORT_BOTTOM_LINE(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.Viewport.RESIZABLE_VIEWPORT_BOTTOM_LINE), PRAYER_PROTECT_FROM_MAGIC(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MAGIC), - PRAYER_PROTECT_FROM_MISSILES(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MISSILES); + PRAYER_PROTECT_FROM_MISSILES(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MISSILES), + + COMBAT_LEVEL(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.LEVEL); private final int groupId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevel.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevel.java new file mode 100644 index 0000000000..a5605ee60f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevel.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.combatlevel; + +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.api.GameState; +import net.runelite.api.Skill; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.task.Schedule; + +import java.time.temporal.ChronoUnit; + +@PluginDescriptor( + name = "Combat level plugin" +) +public class CombatLevel extends Plugin +{ + private final CombatLevelConfig config = RuneLite.getRunelite().getConfigManager().getConfig(CombatLevelConfig.class); + private final Client client = RuneLite.getClient(); + + @Override + protected void startUp() throws Exception + { + + } + + @Override + protected void shutDown() throws Exception + { + + } + + @Schedule( + period = 600, + unit = ChronoUnit.MILLIS + ) + public void updateCombatLevel() + { + if (client == null || client.getGameState() != GameState.LOGGED_IN) + { + return; + } + + Widget combatLevelWidget = client.getWidget(WidgetInfo.COMBAT_LEVEL); + if (combatLevelWidget == null) + { + return; + } + + if (config.enabled()) + { + double combatLevelPrecise = Experience.getCombatLevelPrecise( + client.getRealSkillLevel(Skill.ATTACK), + client.getRealSkillLevel(Skill.STRENGTH), + client.getRealSkillLevel(Skill.DEFENCE), + client.getRealSkillLevel(Skill.HITPOINTS), + client.getRealSkillLevel(Skill.MAGIC), + client.getRealSkillLevel(Skill.RANGED), + client.getRealSkillLevel(Skill.PRAYER) + ); + combatLevelWidget.setText("Combat Lvl: " + combatLevelPrecise); + } + else + { + String widgetText = combatLevelWidget.getText(); + if (widgetText.contains(".")) + { + combatLevelWidget.setText(widgetText.substring(0, widgetText.indexOf("."))); + } + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java new file mode 100644 index 0000000000..aaf6a9c918 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.combatlevel; + +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup( + keyName = "combatlevel", + name = "Combat Level", + description = "Configuration for the precise combat level plugin" +) +public interface CombatLevelConfig +{ + @ConfigItem( + keyName = "enabled", + name = "Enabled", + description = "Configures whether or not precise combat level is displayed" + ) + default boolean enabled() + { + return true; + } +}