diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java index d27ca539f7..2a627c1b10 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java @@ -43,12 +43,10 @@ import net.runelite.api.Tile; import net.runelite.api.TileItem; import net.runelite.api.TileObject; import net.runelite.api.coords.WorldPoint; -import net.runelite.api.events.BoostedLevelChanged; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.DecorativeObjectChanged; import net.runelite.api.events.DecorativeObjectDespawned; import net.runelite.api.events.DecorativeObjectSpawned; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameObjectChanged; import net.runelite.api.events.GameObjectDespawned; import net.runelite.api.events.GameObjectSpawned; @@ -59,6 +57,7 @@ import net.runelite.api.events.GroundObjectDespawned; import net.runelite.api.events.GroundObjectSpawned; import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.StatChanged; import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectSpawned; @@ -181,9 +180,16 @@ public class AgilityPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - if (event.getSkill() != AGILITY || !config.showLapCount()) + if (statChanged.getSkill() != AGILITY) + { + return; + } + + agilityLevel = statChanged.getBoostedLevel(); + + if (!config.showLapCount()) { return; } @@ -216,17 +222,6 @@ public class AgilityPlugin extends Plugin } } - - @Subscribe - public void onBoostedLevelChanged(BoostedLevelChanged boostedLevelChanged) - { - Skill skill = boostedLevelChanged.getSkill(); - if (skill == AGILITY) - { - agilityLevel = client.getBoostedSkillLevel(skill); - } - } - @Subscribe public void onItemSpawned(ItemSpawned itemSpawned) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java index aa7e46d00e..2b676f9380 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java @@ -36,10 +36,10 @@ import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.Prayer; import net.runelite.api.Skill; -import net.runelite.api.events.BoostedLevelChanged; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.StatChanged; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -177,9 +177,9 @@ public class BoostsPlugin extends Plugin } @Subscribe - public void onBoostedLevelChanged(BoostedLevelChanged boostedLevelChanged) + public void onStatChanged(StatChanged statChanged) { - Skill skill = boostedLevelChanged.getSkill(); + Skill skill = statChanged.getSkill(); if (!BOOSTABLE_COMBAT_SKILLS.contains(skill) && !BOOSTABLE_NON_COMBAT_SKILLS.contains(skill)) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index a6692a0491..0f6a4e0648 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -43,10 +43,9 @@ import net.runelite.api.NPC; import net.runelite.api.Player; import net.runelite.api.Skill; import net.runelite.api.coords.WorldPoint; -import net.runelite.api.events.BoostedLevelChanged; import net.runelite.api.events.CommandExecuted; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.StatChanged; import net.runelite.api.events.VarbitChanged; import net.runelite.api.kit.KitType; import net.runelite.client.config.ConfigManager; @@ -285,9 +284,13 @@ public class DevToolsPlugin extends Plugin client.queueChangedSkill(skill); - ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(skill); - eventBus.post(experienceChanged); + StatChanged statChanged = new StatChanged( + skill, + totalXp, + level, + level + ); + eventBus.post(statChanged); break; } case "setstat": @@ -304,13 +307,13 @@ public class DevToolsPlugin extends Plugin client.queueChangedSkill(skill); - ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(skill); - eventBus.post(experienceChanged); - - BoostedLevelChanged boostedLevelChanged = new BoostedLevelChanged(); - boostedLevelChanged.setSkill(skill); - eventBus.post(boostedLevelChanged); + StatChanged statChanged = new StatChanged( + skill, + xp, + level, + level + ); + eventBus.post(statChanged); break; } case "anim": diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index fb62c2cc8f..ef1686ba29 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -44,8 +44,8 @@ import net.runelite.api.Skill; import net.runelite.api.WorldType; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.StatChanged; import net.runelite.api.events.VarbitChanged; import net.runelite.client.RuneLiteProperties; import net.runelite.client.config.ConfigManager; @@ -181,17 +181,18 @@ public class DiscordPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - final int exp = client.getSkillExperience(event.getSkill()); - final Integer previous = skillExp.put(event.getSkill(), exp); + final Skill skill = statChanged.getSkill(); + final int exp = statChanged.getXp(); + final Integer previous = skillExp.put(skill, exp); if (previous == null || previous >= exp) { return; } - final DiscordGameEventType discordGameEventType = DiscordGameEventType.fromSkill(event.getSkill()); + final DiscordGameEventType discordGameEventType = DiscordGameEventType.fromSkill(skill); if (discordGameEventType != null && config.showSkillingActivity()) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java index aca9477123..57073c8fbc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java @@ -35,8 +35,8 @@ import static net.runelite.api.ScriptID.XPDROP_DISABLED; import net.runelite.api.Skill; import net.runelite.api.SpriteID; import net.runelite.api.Varbits; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.StatChanged; import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -230,10 +230,10 @@ public class XpDropPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - final Skill skill = event.getSkill(); - final int xp = client.getSkillExperience(skill); + final Skill skill = statChanged.getSkill(); + final int xp = statChanged.getXp(); lastSkill = skill; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index ac3e525d24..c60f2901a3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -55,11 +55,11 @@ import static net.runelite.api.Skill.SLAYER; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.StatChanged; import net.runelite.api.vars.SlayerUnlock; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -519,14 +519,14 @@ public class SlayerPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - if (event.getSkill() != SLAYER) + if (statChanged.getSkill() != SLAYER) { return; } - int slayerExp = client.getSkillExperience(SLAYER); + int slayerExp = statChanged.getXp(); if (slayerExp <= cachedXp) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index 757584a9bb..8468d40729 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -30,13 +30,12 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.util.Arrays; import net.runelite.api.Client; -import net.runelite.api.Experience; import net.runelite.api.GameState; -import net.runelite.api.Skill; import net.runelite.api.Quest; import net.runelite.api.QuestState; +import net.runelite.api.Skill; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.StatChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.WidgetID; import net.runelite.client.callback.ClientThread; @@ -168,25 +167,29 @@ public class WorldMapPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - if (event.getSkill() == Skill.AGILITY) + switch (statChanged.getSkill()) { - int newAgilityLevel = Experience.getLevelForXp(client.getSkillExperience(Skill.AGILITY)); - if (newAgilityLevel != agilityLevel) + case AGILITY: { - agilityLevel = newAgilityLevel; - updateAgilityIcons(); + int newAgilityLevel = statChanged.getLevel(); + if (newAgilityLevel != agilityLevel) + { + agilityLevel = newAgilityLevel; + updateAgilityIcons(); + } + break; } - } - - if (event.getSkill() == Skill.WOODCUTTING) - { - int newWoodcutLevel = Experience.getLevelForXp(client.getSkillExperience(Skill.WOODCUTTING)); - if (newWoodcutLevel != woodcuttingLevel) + case WOODCUTTING: { - woodcuttingLevel = newWoodcutLevel; - updateRareTreeIcons(); + int newWoodcutLevel = statChanged.getLevel(); + if (newWoodcutLevel != woodcuttingLevel) + { + woodcuttingLevel = newWoodcutLevel; + updateRareTreeIcons(); + } + break; } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java index ea2aabc2b5..9a19e6a0fd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java @@ -35,8 +35,8 @@ import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.Experience; import net.runelite.api.Skill; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.StatChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -93,11 +93,11 @@ public class XpGlobesPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - Skill skill = event.getSkill(); - int currentXp = client.getSkillExperience(skill); - int currentLevel = Experience.getLevelForXp(currentXp); + Skill skill = statChanged.getSkill(); + int currentXp = statChanged.getXp(); + int currentLevel = statChanged.getLevel(); int skillIdx = skill.ordinal(); XpGlobe cachedGlobe = globeCache[skillIdx]; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index bf939736e5..d4dd39696c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -51,12 +51,12 @@ import net.runelite.api.Player; import net.runelite.api.Skill; import net.runelite.api.VarPlayer; import net.runelite.api.WorldType; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.StatChanged; import net.runelite.api.widgets.WidgetID; import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.client.config.ConfigManager; @@ -341,11 +341,11 @@ public class XpTrackerPlugin extends Plugin } @Subscribe - public void onExperienceChanged(ExperienceChanged event) + public void onStatChanged(StatChanged statChanged) { - final Skill skill = event.getSkill(); - final int currentXp = client.getSkillExperience(skill); - final int currentLevel = Experience.getLevelForXp(currentXp); + final Skill skill = statChanged.getSkill(); + final int currentXp = statChanged.getXp(); + final int currentLevel = statChanged.getLevel(); final VarPlayer startGoal = startGoalVarpForSkill(skill); final VarPlayer endGoal = endGoalVarpForSkill(skill); final int startGoalXp = startGoal != null ? client.getVar(startGoal) : -1; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index fb7e705877..fcf0cef900 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -39,9 +39,9 @@ import net.runelite.api.Player; import net.runelite.api.Skill; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.StatChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; @@ -429,17 +429,24 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - final ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.SLAYER); - - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); - slayerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.SLAYER, + 100, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); slayerPlugin.setTaskName("Dagannoth"); slayerPlugin.setAmount(143); - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(110); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 110, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(142, slayerPlugin.getAmount()); } @@ -451,19 +458,26 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - final ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.SLAYER); - - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); - slayerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.SLAYER, + 100, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); slayerPlugin.setTaskName("Monster"); slayerPlugin.setAmount(98); assert Task.getTask("Monster") == null; - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(110); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 110, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(97, slayerPlugin.getAmount()); } @@ -475,24 +489,36 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - final ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.SLAYER); - - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); - slayerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.SLAYER, + 100, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); slayerPlugin.setTaskName("TzTok-Jad"); slayerPlugin.setAmount(1); // One bat kill - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(110); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 110, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(1, slayerPlugin.getAmount()); // One Jad kill - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(25_360); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 25360, + -1, + -1 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(0, slayerPlugin.getAmount()); } @@ -504,24 +530,36 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - final ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.SLAYER); - - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); - slayerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.SLAYER, + 110, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); slayerPlugin.setTaskName("TzKal-Zuk"); slayerPlugin.setAmount(1); // One bat kill - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(125); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 125, + 2, + 2 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(1, slayerPlugin.getAmount()); // One Zuk kill - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(102_015); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 102_015, + -1, + -1 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(0, slayerPlugin.getAmount()); } @@ -691,17 +729,24 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - final ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.SLAYER); - slayerPlugin.setTaskName("Bears"); slayerPlugin.setAmount(35); - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(0); - slayerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.SLAYER, + 0, + 1, + 1 + ); + slayerPlugin.onStatChanged(statChanged); - when(client.getSkillExperience(Skill.SLAYER)).thenReturn(27); - slayerPlugin.onExperienceChanged(experienceChanged); + statChanged = new StatChanged( + Skill.SLAYER, + 27, + 1, + 1 + ); + slayerPlugin.onStatChanged(statChanged); assertEquals(34, slayerPlugin.getAmount()); } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java index 5c1724b1e5..ca3375bbf4 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java @@ -32,9 +32,9 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Skill; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.StatChanged; import net.runelite.client.game.NPCManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.ClientToolbar; @@ -101,10 +101,13 @@ public class XpTrackerPluginTest xpTrackerPlugin.onGameTick(new GameTick()); // Gain attack xp - when(client.getSkillExperience(Skill.ATTACK)).thenReturn(100); - ExperienceChanged experienceChanged = new ExperienceChanged(); - experienceChanged.setSkill(Skill.ATTACK); - xpTrackerPlugin.onExperienceChanged(experienceChanged); + StatChanged statChanged = new StatChanged( + Skill.ATTACK, + 100, + 2, + 2 + ); + xpTrackerPlugin.onStatChanged(statChanged); // Offline gain when(client.getSkillExperience(Skill.ATTACK)).thenReturn(42000);