Bronzemanmode: overhaul (#2157)

Bronzemanmode: overhaul
This commit is contained in:
Owain van Brakel
2020-01-10 11:13:08 +01:00
committed by GitHub
5 changed files with 396 additions and 26 deletions

View File

@@ -0,0 +1,139 @@
package net.runelite.client.plugins.bronzeman;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
import net.runelite.client.config.ConfigSection;
@ConfigGroup("bronzemanmode")
public interface BronzeManConfig extends Config
{
@ConfigSection(
name = "Unlocked Notifications",
description = "",
position = 0,
keyName = "unlockNotifications"
)
default boolean unlockNotifications()
{
return false;
}
@ConfigSection(
name = "Game Mode Options",
description = "",
position = 1,
keyName = "gameModeOptions"
)
default boolean gameModeOptions()
{
return false;
}
@ConfigSection(
name = "Chat Commands",
description = "",
position = 2,
keyName = "chatCommands"
)
default boolean chatCommands()
{
return false;
}
@ConfigItem(
keyName = "notifyImgUnlock",
name = "image unlocked notification",
description = "Configure whether to send the notification image when you unlock a new item.",
position = 0,
section = "unlockNotifications"
)
default boolean notifyImgUnlock()
{
return true;
}
@ConfigItem(
keyName = "notifyChatUnlock",
name = "Chat unlocked notification",
description = "Configure whether to send the chat notification when you unlock a new item.",
position = 1,
section = "unlockNotifications"
)
default boolean notifyChatUnlock()
{
return true;
}
@ConfigItem(
keyName = "resetCommand",
name = "Enable resetunlocks command",
description = "Enables the !resetunlocks command used for wiping your unlocked items.",
position = 0,
section = "chatCommands"
)
default boolean resetCommand()
{
return false;
}
@ConfigItem(
keyName = "countCommand",
name = "Enable countunlocks command",
description = "Enables the !countunlocks command used for counting your unlocked items.",
position = 1,
section = "chatCommands"
)
default boolean countCommand()
{
return true;
}
@ConfigItem(
keyName = "backupCommand",
name = "Enable backupunlocks command",
description = "Enables the !backupunlocks command used for backing up your unlocked items.",
position = 2,
section = "chatCommands"
)
default boolean backupCommand()
{
return true;
}
@ConfigItem(
keyName = "restoreCommand",
name = "Enable restoreunlocks command",
description = "Enables the !restoreunlocks command used for restoring your unlocked items file.",
position = 3,
section = "chatCommands"
)
default boolean restoreCommand()
{
return true;
}
@ConfigItem(
keyName = "deleteCommand",
name = "Enable deleteunlocks command",
description = "Enables the !deleteunlocks command used for deleting your unlocked items file.",
position = 4,
section = "chatCommands"
)
default boolean deleteCommand()
{
return false;
}
@ConfigItem(
keyName = "hideTradeOption",
name = "Hide trade with option",
description = "Hides the trade with option from the player menu",
position = 0,
section = "gameModeOptions"
)
default boolean hideTradeOption()
{
return true;
}
}

View File

@@ -73,7 +73,7 @@ public class BronzeManOverlay extends Overlay
{ {
currentUnlock.setLocationY(drawY + 1); currentUnlock.setLocationY(drawY + 1);
} }
if (currentUnlock.displayed()) if (currentUnlock.displayed(itemUnlockList.size()))
{ {
itemUnlockList.remove(currentUnlock); itemUnlockList.remove(currentUnlock);
currentUnlock = null; currentUnlock = null;

View File

@@ -1,38 +1,53 @@
package net.runelite.client.plugins.bronzeman; package net.runelite.client.plugins.bronzeman;
import com.google.inject.Provides;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.InputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.URL;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.Item; import net.runelite.api.Item;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.MenuEntry;
import net.runelite.api.Player;
import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.ClientTick;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.MenuOpened;
import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WidgetLoaded;
import net.runelite.api.util.Text;
import static net.runelite.api.util.Text.sanitize;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetID;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.chat.ChatColorType;
import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.chat.QueuedMessage;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ConfigChanged;
import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType; import net.runelite.client.plugins.PluginType;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.util.ImageUtil;
/** /**
* @author Seth Davis * @author Seth Davis
@@ -50,31 +65,62 @@ import net.runelite.client.ui.overlay.OverlayManager;
public class BronzemanPlugin extends Plugin public class BronzemanPlugin extends Plugin
{ {
private static final String BACKUP_CHAT_COMMAND = "!backupunlocks";
private static final String COUNT_CHAT_COMMAND = "!countunlocks";
private static final String DELETE_CHAT_COMMAND = "!deleteunlocks";
private static final String RESET_CHAT_COMMAND = "!resetunlocks";
private static final String RESTORE_CHAT_COMMAND = "!restoreunlocks";
private final BufferedImage UNLOCK_IMAGE = ImageUtil.getResourceStreamFromClass(getClass(), "item_unlocked.png");
@Inject
ItemManager itemManager;
@Inject @Inject
private Client client; private Client client;
@Inject @Inject
private OverlayManager overlayManager; private OverlayManager overlayManager;
@Inject
private BronzeManConfig config;
@Inject
private ChatMessageManager chatMessageManager;
@Inject @Inject
private BronzeManOverlay bronzemanOverlay; private BronzeManOverlay bronzemanOverlay;
private List<Integer> unlockedItems; private List<Integer> unlockedItems;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private BufferedImage unlockImage = null; private BufferedImage unlockImage = null;
private boolean notifyImgUnlock;
private boolean notifyChatUnlock;
private boolean resetCommand;
private boolean countCommand;
private boolean backupCommand;
private boolean deleteCommand;
private boolean restoreCommand;
private boolean hideTradeOption;
/** /**
* Loads GrandExchange widgets for further manipulation of the interface * Loads GrandExchange widgets for further manipulation of the interface
**/ **/
private Widget grandExchangeWindow; private Widget grandExchangeWindow;
private Widget grandExchangeChatBox; private Widget grandExchangeChatBox;
@Provides
BronzeManConfig getConfig(ConfigManager configManager)
{
return configManager.getConfig(BronzeManConfig.class);
}
@Override @Override
protected void startUp() protected void startUp()
{ {
loadUnlockImage(); /**
* Downloads the item-unlock png file to display unlocks
**/
unlockImage = UNLOCK_IMAGE;
unlockedItems = new ArrayList<>(); unlockedItems = new ArrayList<>();
overlayManager.add(bronzemanOverlay); overlayManager.add(bronzemanOverlay);
updateConfig();
loadPlayerUnlocks();
} }
@Override @Override
@@ -84,6 +130,21 @@ public class BronzemanPlugin extends Plugin
overlayManager.remove(bronzemanOverlay); overlayManager.remove(bronzemanOverlay);
} }
@Subscribe
private void onConfigChanged(ConfigChanged event)
{
if (!event.getKey().equals("notifyImgUnlock"))
{
overlayManager.remove(bronzemanOverlay);
}
if (!event.getGroup().equals("bronzemanmode"))
{
return;
}
updateConfig();
}
/** /**
* Loads players unlocks on login * Loads players unlocks on login
**/ **/
@@ -142,7 +203,7 @@ public class BronzemanPlugin extends Plugin
* Handles greying out items in the GrandExchange * Handles greying out items in the GrandExchange
**/ **/
@Subscribe @Subscribe
public void onGameTick(GameTick e) public void onClientTick(ClientTick e)
{ {
if (grandExchangeWindow == null || grandExchangeChatBox == null || grandExchangeWindow.isHidden()) if (grandExchangeWindow == null || grandExchangeChatBox == null || grandExchangeWindow.isHidden())
{ {
@@ -182,8 +243,18 @@ public class BronzemanPlugin extends Plugin
private void queueItemUnlock(int itemId) private void queueItemUnlock(int itemId)
{ {
unlockedItems.add(itemId); unlockedItems.add(itemId);
bronzemanOverlay.addItemUnlock(itemId);
savePlayerUnlocks();// Save after every item to fail-safe logging out savePlayerUnlocks();// Save after every item to fail-safe logging out
if (this.notifyChatUnlock)
{
sendMessage("You have successfully unlocked item: " + itemManager.getItemDefinition(itemId).getName());
}
if (!this.notifyImgUnlock)
{
return;
}
bronzemanOverlay.addItemUnlock(itemId);
} }
/** /**
@@ -193,6 +264,7 @@ public class BronzemanPlugin extends Plugin
{ {
queueItemUnlock(ItemID.COINS_995); queueItemUnlock(ItemID.COINS_995);
queueItemUnlock(ItemID.OLD_SCHOOL_BOND); queueItemUnlock(ItemID.OLD_SCHOOL_BOND);
queueItemUnlock(ItemID.PLATINUM_TOKEN);
} }
/** /**
@@ -218,7 +290,7 @@ public class BronzemanPlugin extends Plugin
} }
/** /**
* Loads a players unlcoks everytime they login * Loads a players unlocks everytime they login
**/ **/
private void loadPlayerUnlocks() private void loadPlayerUnlocks()
{ {
@@ -253,25 +325,180 @@ public class BronzemanPlugin extends Plugin
} }
} }
/**
* Downloads the item-unlock png file to display unlocks @Subscribe
**/ public void onChatMessage(ChatMessage chatMessage)
private void loadUnlockImage()
{ {
final String playerName;
if (chatMessage.equals(ChatMessageType.PRIVATECHATOUT))
{
playerName = client.getLocalPlayer().getName();
}
else
{
playerName = sanitize(chatMessage.getName());
}
if (this.countCommand && chatMessage.getMessage().toLowerCase().equals(COUNT_CHAT_COMMAND))
{
sendMessage("You have successfully unlocked " + unlockedItems.size() + " items.");
}
if (this.resetCommand && chatMessage.getMessage().toLowerCase().equals(RESET_CHAT_COMMAND))
{
resetUnlocks();
}
if (this.backupCommand && chatMessage.getMessage().toLowerCase().equals(BACKUP_CHAT_COMMAND))
{
backupUnlocks();
}
if (this.deleteCommand && chatMessage.getMessage().toLowerCase().equals(DELETE_CHAT_COMMAND))
{
deleteUnlocks();
}
if (this.restoreCommand && chatMessage.getMessage().toLowerCase().equals(RESTORE_CHAT_COMMAND))
{
restoreUnlocks();
}
}
private void backupUnlocks()
{
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
if (!playerFolder.exists())
{
return;
}
File playerFile = new File(playerFolder, "bronzeman-unlocks.txt");
if (!playerFile.exists())
{
return;
}
Path originalPath = playerFile.toPath();
try try
{ {
File imageFile = new File(RuneLite.RUNELITE_DIR, "item-unlocked.png"); Files.copy(originalPath, Paths.get(playerFile.getPath().replace(".txt", ".backup")),
if (!imageFile.exists()) StandardCopyOption.REPLACE_EXISTING);
{
InputStream in = new URL("https://i.imgur.com/KWVNlsq.png").openStream();
Files.copy(in, Paths.get(imageFile.getPath()));
}
unlockImage = ImageIO.read(imageFile);
} }
catch (Exception e) catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
return;
} }
sendMessage("Successfully backed up current unlock file!");
}
private void restoreUnlocks()
{
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
if (!playerFolder.exists())
{
return;
}
File playerFile = new File(playerFolder, "bronzeman-unlocks.backup");
if (!playerFile.exists())
{
return;
}
Path originalPath = playerFile.toPath();
try
{
Files.copy(originalPath, Paths.get(playerFile.getPath().replace(".backup", ".txt")),
StandardCopyOption.REPLACE_EXISTING);
}
catch (Exception e)
{
e.printStackTrace();
return;
}
sendMessage("Successfully restored current unlock file!");
}
private void resetUnlocks()
{
try
{
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
File playerFile = new File(playerFolder, "bronzeman-unlocks.txt");
playerFile.delete();
unlockedItems.clear();
savePlayerUnlocks();
unlockDefaultItems();
}
catch (Exception e)
{
e.printStackTrace();
return;
}
sendMessage("Current Unlock file succesfully reset!");
}
private void deleteUnlocks()
{
backupUnlocks();
try
{
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
File playerFile = new File(playerFolder, "bronzeman-unlocks.txt");
playerFile.delete();
}
catch (Exception e)
{
e.printStackTrace();
return;
}
sendMessage("Current Unlock file succesfully deleted!");
}
@Subscribe
private void onMenuOpened(MenuOpened event)
{
Player localPlayer = client.getLocalPlayer();
if (localPlayer == null)
{
return;
}
List<MenuEntry> menu_entries = new ArrayList<>();
for (MenuEntry entry : event.getMenuEntries())
{
String option = Text.removeTags(entry.getOption()).toLowerCase();
if (option.contains("trade with") && this.hideTradeOption)
{
continue;
}
menu_entries.add(entry);
}
event.setMenuEntries(menu_entries.toArray(new MenuEntry[0]));
event.setModified();
}
private void sendMessage(String text)
{
final ChatMessageBuilder message = new ChatMessageBuilder()
.append(ChatColorType.HIGHLIGHT)
.append(text);
chatMessageManager.queue(QueuedMessage.builder()
.type(ChatMessageType.CONSOLE)
.runeLiteFormattedMessage(message.build())
.build());
}
private void updateConfig()
{
this.notifyImgUnlock = config.notifyImgUnlock();
this.resetCommand = config.resetCommand();
this.countCommand = config.countCommand();
this.backupCommand = config.backupCommand();
this.notifyChatUnlock = config.notifyChatUnlock();
this.deleteCommand = config.deleteCommand();
this.restoreCommand = config.restoreCommand();
this.hideTradeOption = config.hideTradeOption();
} }
} }

View File

@@ -40,8 +40,12 @@ public class ItemUnlock
/** /**
* Returns whether or not an items has been displayed as unlocked yet * Returns whether or not an items has been displayed as unlocked yet
**/ **/
public boolean displayed() public boolean displayed(int queue)
{ {
if (queue >= 2)
{
return System.currentTimeMillis() > initTime + (750);
}
return System.currentTimeMillis() > initTime + (5000); return System.currentTimeMillis() > initTime + (5000);
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB