Add Wintertodt Plugin
This commit is contained in:
@@ -144,6 +144,7 @@ public final class AnimationID
|
|||||||
public static final int COW_HOME_TELEPORT_4 = 1699;
|
public static final int COW_HOME_TELEPORT_4 = 1699;
|
||||||
public static final int COW_HOME_TELEPORT_5 = 1700;
|
public static final int COW_HOME_TELEPORT_5 = 1700;
|
||||||
public static final int COW_HOME_TELEPORT_6 = 1701;
|
public static final int COW_HOME_TELEPORT_6 = 1701;
|
||||||
|
public static final int CONSTRUCTION = 3676;
|
||||||
|
|
||||||
// NPC animations
|
// NPC animations
|
||||||
public static final int TZTOK_JAD_MAGIC_ATTACK = 2656;
|
public static final int TZTOK_JAD_MAGIC_ATTACK = 2656;
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
enum WintertodtActivity
|
||||||
|
{
|
||||||
|
IDLE("IDLE"),
|
||||||
|
WOODCUTTING("Woodcutting"),
|
||||||
|
FLETCHING("Fletching"),
|
||||||
|
FEEDING_BRAZIER("Feeding"),
|
||||||
|
FIXING_BRAZIER("Fixing"),
|
||||||
|
LIGHTING_BRAZIER("Lighting");
|
||||||
|
|
||||||
|
private final String actionString;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import net.runelite.client.config.Config;
|
||||||
|
import net.runelite.client.config.ConfigGroup;
|
||||||
|
import net.runelite.client.config.ConfigItem;
|
||||||
|
import net.runelite.client.plugins.wintertodt.config.WintertodtNotifyMode;
|
||||||
|
|
||||||
|
@ConfigGroup("wintertodt")
|
||||||
|
public interface WintertodtConfig extends Config
|
||||||
|
{
|
||||||
|
@ConfigItem(
|
||||||
|
position = 1,
|
||||||
|
keyName = "notifyCondition",
|
||||||
|
name = "Notify When",
|
||||||
|
description = "Configures when to send notifications"
|
||||||
|
)
|
||||||
|
default WintertodtNotifyMode notifyCondition()
|
||||||
|
{
|
||||||
|
return WintertodtNotifyMode.ONLY_WHEN_INTERRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 2,
|
||||||
|
keyName = "damageNotificationColor",
|
||||||
|
name = "Damage Notification Color",
|
||||||
|
description = "Color of damage notification text in chat"
|
||||||
|
)
|
||||||
|
default Color damageNotificationColor()
|
||||||
|
{
|
||||||
|
return Color.CYAN;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
enum WintertodtInterruptType
|
||||||
|
{
|
||||||
|
COLD("Damaged by Wintertodt Cold"),
|
||||||
|
SNOWFALL("Damaged by Wintertodt Snowfall"),
|
||||||
|
BRAZIER("Brazier Shattered"),
|
||||||
|
INVENTORY_FULL("Inventory full of Bruma Roots"),
|
||||||
|
OUT_OF_ROOTS("Out of Bruma Roots"),
|
||||||
|
FIXED_BRAZIER("Fixed Brazier"),
|
||||||
|
LIT_BRAZIER("Lit Brazier"),
|
||||||
|
BRAZIER_WENT_OUT("Brazier went out");
|
||||||
|
|
||||||
|
private final String interruptSourceString;
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import net.runelite.client.ui.overlay.Overlay;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||||
|
import net.runelite.client.ui.overlay.components.LineComponent;
|
||||||
|
import net.runelite.client.ui.overlay.components.PanelComponent;
|
||||||
|
import net.runelite.client.ui.overlay.components.TitleComponent;
|
||||||
|
|
||||||
|
class WintertodtOverlay extends Overlay
|
||||||
|
{
|
||||||
|
private final WintertodtPlugin plugin;
|
||||||
|
private final PanelComponent panelComponent = new PanelComponent();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private WintertodtOverlay(WintertodtPlugin plugin)
|
||||||
|
{
|
||||||
|
this.plugin = plugin;
|
||||||
|
setPosition(OverlayPosition.BOTTOM_LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension render(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
if (!plugin.isInWintertodt())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
panelComponent.getChildren().clear();
|
||||||
|
panelComponent.setPreferredSize(new Dimension(150, 0));
|
||||||
|
|
||||||
|
panelComponent.getChildren().add(TitleComponent.builder()
|
||||||
|
.text(plugin.getCurrentActivity().getActionString())
|
||||||
|
.color(plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
String inventoryString = plugin.getNumLogs() > 0 ? plugin.getInventoryScore() + " (" + plugin.getTotalPotentialinventoryScore() + ") pts" : plugin.getInventoryScore() + " pts";
|
||||||
|
panelComponent.getChildren().add(LineComponent.builder()
|
||||||
|
.left("Inventory:")
|
||||||
|
.leftColor(Color.WHITE)
|
||||||
|
.right(inventoryString)
|
||||||
|
.rightColor(plugin.getInventoryScore() > 0 ? Color.GREEN : Color.RED)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
String kindlingString = plugin.getNumLogs() > 0 ? plugin.getNumKindling() + " (" + (plugin.getNumLogs() + plugin.getNumKindling()) + ")" : Integer.toString(plugin.getNumKindling());
|
||||||
|
panelComponent.getChildren().add(LineComponent.builder()
|
||||||
|
.left("Kindling:")
|
||||||
|
.leftColor(Color.WHITE)
|
||||||
|
.right(kindlingString)
|
||||||
|
.rightColor(plugin.getNumKindling() + plugin.getNumLogs() > 0 ? Color.GREEN : Color.RED)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
return panelComponent.render(graphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,476 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.Instant;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import static net.runelite.api.AnimationID.CONSTRUCTION;
|
||||||
|
import static net.runelite.api.AnimationID.FIREMAKING;
|
||||||
|
import static net.runelite.api.AnimationID.FLETCHING_BOW_CUTTING;
|
||||||
|
import static net.runelite.api.AnimationID.IDLE;
|
||||||
|
import static net.runelite.api.AnimationID.LOOKING_INTO;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_3A_AXE;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_BLACK;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_IRON;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_RUNE;
|
||||||
|
import static net.runelite.api.AnimationID.WOODCUTTING_STEEL;
|
||||||
|
import net.runelite.api.ChatMessageType;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.InventoryID;
|
||||||
|
import net.runelite.api.Item;
|
||||||
|
import net.runelite.api.ItemContainer;
|
||||||
|
import static net.runelite.api.ItemID.BRUMA_KINDLING;
|
||||||
|
import static net.runelite.api.ItemID.BRUMA_ROOT;
|
||||||
|
import net.runelite.api.MessageNode;
|
||||||
|
import net.runelite.api.Player;
|
||||||
|
import net.runelite.api.events.AnimationChanged;
|
||||||
|
import net.runelite.api.events.GameTick;
|
||||||
|
import net.runelite.api.events.ItemContainerChanged;
|
||||||
|
import net.runelite.api.events.SetMessage;
|
||||||
|
import net.runelite.client.Notifier;
|
||||||
|
import net.runelite.client.chat.ChatMessageManager;
|
||||||
|
import net.runelite.client.config.ConfigManager;
|
||||||
|
import net.runelite.client.plugins.Plugin;
|
||||||
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
|
import net.runelite.client.util.ColorUtil;
|
||||||
|
|
||||||
|
@PluginDescriptor(
|
||||||
|
name = "Wintertodt",
|
||||||
|
description = "Wintertodt",
|
||||||
|
tags = {"minigame", "firemaking"}
|
||||||
|
)
|
||||||
|
@Slf4j
|
||||||
|
public class WintertodtPlugin extends Plugin
|
||||||
|
{
|
||||||
|
private static final int WINTERTODT_REGION = 6462;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Notifier notifier;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private WintertodtOverlay overlay;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private WintertodtConfig config;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ChatMessageManager chatMessageManager;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private WintertodtActivity currentActivity = WintertodtActivity.IDLE;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private int inventoryScore;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private int totalPotentialinventoryScore;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private int numLogs;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private int numKindling;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private boolean isInWintertodt;
|
||||||
|
|
||||||
|
private Instant lastActionTime;
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
WintertodtConfig getConfig(ConfigManager configManager)
|
||||||
|
{
|
||||||
|
return configManager.getConfig(WintertodtConfig.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void startUp() throws Exception
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
overlayManager.add(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void shutDown() throws Exception
|
||||||
|
{
|
||||||
|
overlayManager.remove(overlay);
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reset()
|
||||||
|
{
|
||||||
|
inventoryScore = 0;
|
||||||
|
totalPotentialinventoryScore = 0;
|
||||||
|
numLogs = 0;
|
||||||
|
numKindling = 0;
|
||||||
|
currentActivity = WintertodtActivity.IDLE;
|
||||||
|
lastActionTime = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isInWintertodtRegion()
|
||||||
|
{
|
||||||
|
if (client.getLocalPlayer() != null)
|
||||||
|
{
|
||||||
|
return client.getLocalPlayer().getWorldLocation().getRegionID() == WINTERTODT_REGION;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onGameTick(GameTick gameTick)
|
||||||
|
{
|
||||||
|
if (!isInWintertodtRegion())
|
||||||
|
{
|
||||||
|
if (isInWintertodt)
|
||||||
|
{
|
||||||
|
log.debug("Left Wintertodt!");
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
isInWintertodt = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isInWintertodt)
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
log.debug("Entered Wintertodt!");
|
||||||
|
}
|
||||||
|
isInWintertodt = true;
|
||||||
|
|
||||||
|
checkActionTimeout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkActionTimeout()
|
||||||
|
{
|
||||||
|
if (currentActivity == WintertodtActivity.IDLE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentAnimation = client.getLocalPlayer() != null ? client.getLocalPlayer().getAnimation() : -1;
|
||||||
|
if (currentAnimation != IDLE || lastActionTime == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Duration actionTimeout = Duration.ofSeconds(3);
|
||||||
|
Duration sinceAction = Duration.between(lastActionTime, Instant.now());
|
||||||
|
|
||||||
|
if (sinceAction.compareTo(actionTimeout) >= 0)
|
||||||
|
{
|
||||||
|
log.debug("Activity timeout!");
|
||||||
|
currentActivity = WintertodtActivity.IDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onSetMessage(SetMessage setMessage)
|
||||||
|
{
|
||||||
|
if (!isInWintertodt)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatMessageType chatMessageType = setMessage.getType();
|
||||||
|
|
||||||
|
if (chatMessageType != ChatMessageType.SERVER && chatMessageType != ChatMessageType.FILTERED)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageNode messageNode = setMessage.getMessageNode();
|
||||||
|
final WintertodtInterruptType interruptType;
|
||||||
|
|
||||||
|
if (messageNode.getValue().startsWith("The cold of"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.COLD;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("The freezing cold attack"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.SNOWFALL;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("The brazier is broken and shrapnel"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.BRAZIER;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("You have run out of bruma roots"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.OUT_OF_ROOTS;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("Your inventory is too full"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.INVENTORY_FULL;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("You fix the brazier"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.FIXED_BRAZIER;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("You light the brazier"))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.LIT_BRAZIER;
|
||||||
|
}
|
||||||
|
else if (messageNode.getValue().startsWith("The brazier has gone out."))
|
||||||
|
{
|
||||||
|
interruptType = WintertodtInterruptType.BRAZIER_WENT_OUT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean wasInterrupted = false;
|
||||||
|
boolean wasDamaged = false;
|
||||||
|
boolean neverNotify = false;
|
||||||
|
|
||||||
|
switch (interruptType)
|
||||||
|
{
|
||||||
|
case COLD:
|
||||||
|
case BRAZIER:
|
||||||
|
case SNOWFALL:
|
||||||
|
wasDamaged = true;
|
||||||
|
|
||||||
|
// Recolor message for damage notification
|
||||||
|
messageNode.setRuneLiteFormatMessage(ColorUtil.wrapWithColorTag(messageNode.getValue(), config.damageNotificationColor()));
|
||||||
|
chatMessageManager.update(messageNode);
|
||||||
|
client.refreshChat();
|
||||||
|
|
||||||
|
// all actions except woodcutting are interrupted from damage
|
||||||
|
if (currentActivity != WintertodtActivity.WOODCUTTING)
|
||||||
|
{
|
||||||
|
wasInterrupted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case INVENTORY_FULL:
|
||||||
|
case OUT_OF_ROOTS:
|
||||||
|
case BRAZIER_WENT_OUT:
|
||||||
|
wasInterrupted = true;
|
||||||
|
break;
|
||||||
|
case LIT_BRAZIER:
|
||||||
|
case FIXED_BRAZIER:
|
||||||
|
wasInterrupted = true;
|
||||||
|
neverNotify = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!neverNotify)
|
||||||
|
{
|
||||||
|
boolean shouldNotify = false;
|
||||||
|
|
||||||
|
switch (config.notifyCondition())
|
||||||
|
{
|
||||||
|
case ONLY_WHEN_INTERRUPTED:
|
||||||
|
if (wasInterrupted)
|
||||||
|
{
|
||||||
|
shouldNotify = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WHEN_DAMAGED:
|
||||||
|
if (wasDamaged)
|
||||||
|
{
|
||||||
|
shouldNotify = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EITHER:
|
||||||
|
shouldNotify = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldNotify)
|
||||||
|
{
|
||||||
|
notifyInterrupted(interruptType, wasInterrupted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wasInterrupted)
|
||||||
|
{
|
||||||
|
currentActivity = WintertodtActivity.IDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyInterrupted(WintertodtInterruptType interruptType, boolean wasActivityInterrupted)
|
||||||
|
{
|
||||||
|
final StringBuilder str = new StringBuilder();
|
||||||
|
|
||||||
|
str.append("Wintertodt: ");
|
||||||
|
|
||||||
|
if (wasActivityInterrupted)
|
||||||
|
{
|
||||||
|
str.append(currentActivity.getActionString());
|
||||||
|
str.append(" interrupted! ");
|
||||||
|
}
|
||||||
|
|
||||||
|
str.append(interruptType.getInterruptSourceString());
|
||||||
|
|
||||||
|
String notification = str.toString();
|
||||||
|
log.debug("Sending notification: {}", notification);
|
||||||
|
notifier.notify(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onAnimationChanged(final AnimationChanged event)
|
||||||
|
{
|
||||||
|
if (!isInWintertodt)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Player local = client.getLocalPlayer();
|
||||||
|
|
||||||
|
if (event.getActor() != local)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int animId = local.getAnimation();
|
||||||
|
switch (animId)
|
||||||
|
{
|
||||||
|
case WOODCUTTING_BRONZE:
|
||||||
|
case WOODCUTTING_IRON:
|
||||||
|
case WOODCUTTING_STEEL:
|
||||||
|
case WOODCUTTING_BLACK:
|
||||||
|
case WOODCUTTING_MITHRIL:
|
||||||
|
case WOODCUTTING_ADAMANT:
|
||||||
|
case WOODCUTTING_RUNE:
|
||||||
|
case WOODCUTTING_DRAGON:
|
||||||
|
case WOODCUTTING_INFERNAL:
|
||||||
|
case WOODCUTTING_3A_AXE:
|
||||||
|
setActivity(WintertodtActivity.WOODCUTTING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLETCHING_BOW_CUTTING:
|
||||||
|
setActivity(WintertodtActivity.FLETCHING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOOKING_INTO:
|
||||||
|
setActivity(WintertodtActivity.FEEDING_BRAZIER);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FIREMAKING:
|
||||||
|
setActivity(WintertodtActivity.LIGHTING_BRAZIER);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONSTRUCTION:
|
||||||
|
setActivity(WintertodtActivity.FIXING_BRAZIER);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void itemContainerChanged(ItemContainerChanged event)
|
||||||
|
{
|
||||||
|
final ItemContainer container = event.getItemContainer();
|
||||||
|
|
||||||
|
if (!isInWintertodt || container != client.getItemContainer(InventoryID.INVENTORY))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Item[] inv = container.getItems();
|
||||||
|
|
||||||
|
inventoryScore = 0;
|
||||||
|
totalPotentialinventoryScore = 0;
|
||||||
|
numLogs = 0;
|
||||||
|
numKindling = 0;
|
||||||
|
|
||||||
|
for (Item item : inv)
|
||||||
|
{
|
||||||
|
inventoryScore += getPoints(item.getId());
|
||||||
|
totalPotentialinventoryScore += getPotentialPoints(item.getId());
|
||||||
|
|
||||||
|
switch (item.getId())
|
||||||
|
{
|
||||||
|
case BRUMA_ROOT:
|
||||||
|
++numLogs;
|
||||||
|
break;
|
||||||
|
case BRUMA_KINDLING:
|
||||||
|
++numKindling;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//If we're currently fletching but there are no more logs, go ahead and abort fletching immediately
|
||||||
|
if (numLogs == 0 && currentActivity == WintertodtActivity.FLETCHING)
|
||||||
|
{
|
||||||
|
currentActivity = WintertodtActivity.IDLE;
|
||||||
|
}
|
||||||
|
//Otherwise, if we're currently feeding the brazier but we've run out of both logs and kindling, abort the feeding activity
|
||||||
|
else if (numLogs == 0 && numKindling == 0 && currentActivity == WintertodtActivity.FEEDING_BRAZIER)
|
||||||
|
{
|
||||||
|
currentActivity = WintertodtActivity.IDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setActivity(WintertodtActivity action)
|
||||||
|
{
|
||||||
|
currentActivity = action;
|
||||||
|
lastActionTime = Instant.now();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getPoints(int id)
|
||||||
|
{
|
||||||
|
switch (id)
|
||||||
|
{
|
||||||
|
case BRUMA_ROOT:
|
||||||
|
return 10;
|
||||||
|
case BRUMA_KINDLING:
|
||||||
|
return 25;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getPotentialPoints(int id)
|
||||||
|
{
|
||||||
|
switch (id)
|
||||||
|
{
|
||||||
|
case BRUMA_ROOT:
|
||||||
|
case BRUMA_KINDLING:
|
||||||
|
return 25;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, terminatusx <jbfleischman@gmail.com>
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.wintertodt.config;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public enum WintertodtNotifyMode
|
||||||
|
{
|
||||||
|
NONE("None"),
|
||||||
|
WHEN_DAMAGED("Damage Taken"),
|
||||||
|
ONLY_WHEN_INTERRUPTED("Action Interrupted"),
|
||||||
|
EITHER("Either");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user