@@ -0,0 +1,89 @@
|
||||
package net.runelite.client.plugins.bronzeman;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.GameState;
|
||||
import net.runelite.client.game.ItemManager;
|
||||
import net.runelite.client.ui.overlay.Overlay;
|
||||
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||
import javax.inject.Inject;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* @author Seth Davis
|
||||
* @Email <sethdavis321@gmail.com>
|
||||
* @Discord Reminisce#1707
|
||||
*/
|
||||
public class BronzeManOverlay extends Overlay
|
||||
{
|
||||
|
||||
private final Client client;
|
||||
private final BronzemanPlugin plugin;
|
||||
private final List<ItemUnlock> itemUnlockList;
|
||||
private ItemUnlock currentUnlock;
|
||||
@Inject
|
||||
private ItemManager itemManager;
|
||||
|
||||
@Inject
|
||||
public BronzeManOverlay(Client client, BronzemanPlugin plugin)
|
||||
{
|
||||
this.client = client;
|
||||
this.plugin = plugin;
|
||||
this.itemUnlockList = new CopyOnWriteArrayList<>();
|
||||
setPosition(OverlayPosition.TOP_CENTER);
|
||||
}
|
||||
|
||||
void addItemUnlock(int itemId)
|
||||
{
|
||||
itemUnlockList.add(new ItemUnlock(itemId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension render(Graphics2D graphics)
|
||||
{
|
||||
if (client.getGameState() != GameState.LOGGED_IN)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (itemUnlockList.isEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (itemManager == null)
|
||||
{
|
||||
System.out.println("Item-manager is null");
|
||||
return null;
|
||||
}
|
||||
if (currentUnlock == null)
|
||||
{
|
||||
currentUnlock = itemUnlockList.get(0);
|
||||
currentUnlock.display();
|
||||
return null;
|
||||
}
|
||||
|
||||
int drawY = currentUnlock.getLocationY();
|
||||
// Drawing unlock pop-up in a static location because this is how the game-mode is.
|
||||
graphics.drawImage(plugin.getUnlockImage(), -62, drawY, null);
|
||||
graphics.drawImage(getImage(currentUnlock.getItemId()), -50, drawY + 7, null);
|
||||
if (drawY < 10)
|
||||
{
|
||||
currentUnlock.setLocationY(drawY + 1);
|
||||
}
|
||||
if (currentUnlock.displayed())
|
||||
{
|
||||
itemUnlockList.remove(currentUnlock);
|
||||
currentUnlock = null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private BufferedImage getImage(int itemID)
|
||||
{
|
||||
return itemManager.getImage(itemID, 1, false);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,284 @@
|
||||
package net.runelite.client.plugins.bronzeman;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintWriter;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.GameState;
|
||||
import net.runelite.api.Item;
|
||||
import net.runelite.api.ItemID;
|
||||
import net.runelite.api.events.GameStateChanged;
|
||||
import net.runelite.api.events.GameTick;
|
||||
import net.runelite.api.events.ItemContainerChanged;
|
||||
import net.runelite.api.events.WidgetLoaded;
|
||||
import net.runelite.api.widgets.Widget;
|
||||
import net.runelite.api.widgets.WidgetID;
|
||||
import net.runelite.api.widgets.WidgetInfo;
|
||||
import net.runelite.client.RuneLite;
|
||||
import net.runelite.client.eventbus.EventBus;
|
||||
import net.runelite.client.plugins.Plugin;
|
||||
import net.runelite.client.plugins.PluginDescriptor;
|
||||
import net.runelite.client.ui.overlay.OverlayManager;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.inject.Inject;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Seth Davis
|
||||
* @Email <sethdavis321@gmail.com>
|
||||
* @Discord Reminisce#1707
|
||||
*/
|
||||
@PluginDescriptor(
|
||||
name = "Bronze Man Mode",
|
||||
description = "Show boss spawn timer overlays",
|
||||
tags = {"combat", "pve", "overlay", "pvp", "challenge", "bronzeman", "ironman"},
|
||||
enabledByDefault = false
|
||||
)
|
||||
@Slf4j
|
||||
public class BronzemanPlugin extends Plugin
|
||||
{
|
||||
|
||||
@Inject
|
||||
private Client client;
|
||||
|
||||
@Inject
|
||||
private EventBus eventBus;
|
||||
|
||||
@Inject
|
||||
private OverlayManager overlayManager;
|
||||
|
||||
@Inject
|
||||
private BronzeManOverlay bronzemanOverlay;
|
||||
|
||||
private List<Integer> unlockedItems;
|
||||
|
||||
@Getter
|
||||
private BufferedImage unlockImage = null;
|
||||
/**
|
||||
* Loads GrandExchange widgets for further manipulation of the interface
|
||||
**/
|
||||
private Widget grandExchangeWindow;
|
||||
private Widget grandExchangeChatBox;
|
||||
|
||||
@Override
|
||||
protected void startUp() throws Exception
|
||||
{
|
||||
addSubscriptions();
|
||||
loadUnlockImage();
|
||||
unlockedItems = new ArrayList<>();
|
||||
overlayManager.add(bronzemanOverlay);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutDown() throws Exception
|
||||
{
|
||||
eventBus.unregister(this);
|
||||
unlockedItems = null;
|
||||
overlayManager.remove(bronzemanOverlay);
|
||||
}
|
||||
|
||||
private void addSubscriptions()
|
||||
{
|
||||
eventBus.subscribe(ItemContainerChanged.class, this, this::onItemContainerChanged);
|
||||
eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged);
|
||||
eventBus.subscribe(GameTick.class, this, this::onGameTick);
|
||||
eventBus.subscribe(WidgetLoaded.class, this, this::onWidgetLoaded);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads players unlocks on login
|
||||
**/
|
||||
public void onGameStateChanged(GameStateChanged e)
|
||||
{
|
||||
if (e.getGameState() == GameState.LOGGED_IN)
|
||||
{
|
||||
loadPlayerUnlocks();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlocks all new items that are currently not unlocked
|
||||
**/
|
||||
public void onItemContainerChanged(ItemContainerChanged e)
|
||||
{
|
||||
for (Item i : e.getItemContainer().getItems())
|
||||
{
|
||||
if (i == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (i.getId() <= 1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (i.getQuantity() <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!unlockedItems.contains(i.getId()))
|
||||
{
|
||||
queueItemUnlock(i.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onWidgetLoaded(WidgetLoaded e)
|
||||
{
|
||||
switch (e.getGroupId())
|
||||
{
|
||||
case WidgetID.GRAND_EXCHANGE_GROUP_ID:
|
||||
grandExchangeWindow = client.getWidget(WidgetInfo.GRAND_EXCHANGE_OFFER_CONTAINER);
|
||||
break;
|
||||
case WidgetID.CHATBOX_GROUP_ID:
|
||||
grandExchangeWindow = null;
|
||||
grandExchangeChatBox = client.getWidget(WidgetInfo.CHATBOX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles greying out items in the GrandExchange
|
||||
**/
|
||||
public void onGameTick(GameTick e)
|
||||
{
|
||||
if (grandExchangeWindow == null || grandExchangeChatBox == null || grandExchangeWindow.isHidden())
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (client.getWidget(162, 53) == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Widget[] children = client.getWidget(162, 53).getChildren();
|
||||
if (children == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < children.length; i += 3)
|
||||
{
|
||||
if (children[i] == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (i + 2 > children.length - 1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!unlockedItems.contains(children[i + 2].getItemId()))
|
||||
{
|
||||
children[i].setHidden(true);
|
||||
children[i + 1].setOpacity(70);
|
||||
children[i + 2].setOpacity(70);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queues a new unlock to be properly displayed
|
||||
**/
|
||||
public void queueItemUnlock(int itemId)
|
||||
{
|
||||
unlockedItems.add(itemId);
|
||||
bronzemanOverlay.addItemUnlock(itemId);
|
||||
savePlayerUnlocks();// Save after every item to fail-safe logging out
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlocks default items like a bond to a newly made profile
|
||||
**/
|
||||
private void unlockDefaultItems()
|
||||
{
|
||||
queueItemUnlock(ItemID.COINS_995);
|
||||
queueItemUnlock(ItemID.OLD_SCHOOL_BOND);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves players unlocks to a .txt file every time they unlock a new item
|
||||
**/
|
||||
private void savePlayerUnlocks()
|
||||
{
|
||||
try
|
||||
{
|
||||
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
|
||||
File playerFile = new File(playerFolder, "bronzeman-unlocks.txt");
|
||||
PrintWriter w = new PrintWriter(playerFile);
|
||||
for (int itemId : unlockedItems)
|
||||
{
|
||||
w.println(itemId);
|
||||
}
|
||||
w.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a players unlcoks everytime they login
|
||||
**/
|
||||
private void loadPlayerUnlocks()
|
||||
{
|
||||
unlockedItems.clear();
|
||||
try
|
||||
{
|
||||
File playerFolder = new File(RuneLite.PROFILES_DIR, client.getUsername());
|
||||
if (!playerFolder.exists())
|
||||
{
|
||||
playerFolder.mkdirs();
|
||||
}
|
||||
File playerFile = new File(playerFolder, "bronzeman-unlocks.txt");
|
||||
if (!playerFile.exists())
|
||||
{
|
||||
playerFile.createNewFile();
|
||||
unlockDefaultItems();
|
||||
}
|
||||
else
|
||||
{
|
||||
BufferedReader r = new BufferedReader(new FileReader(playerFile));
|
||||
String l;
|
||||
while ((l = r.readLine()) != null)
|
||||
{
|
||||
unlockedItems.add(Integer.parseInt(l));
|
||||
}
|
||||
r.close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads the item-unlock png file to display unlocks
|
||||
**/
|
||||
private void loadUnlockImage()
|
||||
{
|
||||
try
|
||||
{
|
||||
File imageFile = new File(RuneLite.RUNELITE_DIR, "item-unlocked.png");
|
||||
if (!imageFile.exists())
|
||||
{
|
||||
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)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package net.runelite.client.plugins.bronzeman;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* @author Seth Davis
|
||||
* @Email <sethdavis321@gmail.com>
|
||||
* @Discord Reminisce#1707
|
||||
*/
|
||||
public class ItemUnlock
|
||||
{
|
||||
|
||||
@Getter
|
||||
private final int itemId;
|
||||
|
||||
@Getter
|
||||
private long initTime;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private int locationY;
|
||||
|
||||
ItemUnlock(int itemId)
|
||||
{
|
||||
this.itemId = itemId;
|
||||
this.locationY = -20;
|
||||
this.initTime = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the displaying of the item unlock
|
||||
**/
|
||||
public void display()
|
||||
{
|
||||
this.initTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not an items has been displayed as unlocked yet
|
||||
**/
|
||||
public boolean displayed()
|
||||
{
|
||||
return System.currentTimeMillis() > initTime + (5000);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user