208 lines
4.4 KiB
Java
208 lines
4.4 KiB
Java
package com.toofifty.easygiantsfoundry;
|
|
|
|
import com.toofifty.easygiantsfoundry.enums.Heat;
|
|
import com.toofifty.easygiantsfoundry.enums.Stage;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
import net.runelite.api.Client;
|
|
import net.runelite.api.widgets.Widget;
|
|
|
|
import javax.inject.Inject;
|
|
import javax.inject.Singleton;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
@Singleton
|
|
public class EasyGiantsFoundryState
|
|
{
|
|
// heat and progress are from 0-1000
|
|
private static final int VARBIT_HEAT = 13948;
|
|
private static final int VARBIT_PROGRESS = 13949;
|
|
|
|
private static final int VARBIT_ORE_COUNT = 13934;
|
|
private static final int VARBIT_FORTE_SELECTED = 13910;
|
|
private static final int VARBIT_BLADE_SELECTED = 13911;
|
|
private static final int VARBIT_TIP_SELECTED = 13912;
|
|
|
|
// 0 - load bars
|
|
// 1 - set mould
|
|
// 2 - collect preform
|
|
// 3 -
|
|
static final int VARBIT_GAME_STAGE = 13914;
|
|
|
|
private static final int WIDGET_HEAT_PARENT = 49414153;
|
|
private static final int WIDGET_LOW_HEAT_PARENT = 49414163;
|
|
private static final int WIDGET_MED_HEAT_PARENT = 49414164;
|
|
private static final int WIDGET_HIGH_HEAT_PARENT = 49414165;
|
|
|
|
static final int WIDGET_PROGRESS_PARENT = 49414219;
|
|
// children with type 3 are stage boxes
|
|
// every 11th child is a sprite
|
|
|
|
private static final int SPRITE_ID_TRIP_HAMMER = 4442;
|
|
private static final int SPRITE_ID_GRINDSTONE = 4443;
|
|
private static final int SPRITE_ID_POLISHING_WHEEL = 4444;
|
|
|
|
@Inject
|
|
private Client client;
|
|
|
|
@Setter
|
|
@Getter
|
|
private boolean enabled;
|
|
|
|
private final List<Stage> stages = new ArrayList<>();
|
|
private double heatRangeRatio = 0;
|
|
|
|
public void reset()
|
|
{
|
|
stages.clear();
|
|
heatRangeRatio = 0;
|
|
}
|
|
|
|
public int getHeatAmount()
|
|
{
|
|
return client.getVarbitValue(VARBIT_HEAT);
|
|
}
|
|
|
|
public int getProgressAmount()
|
|
{
|
|
return client.getVarbitValue(VARBIT_PROGRESS);
|
|
}
|
|
|
|
public double getHeatRangeRatio()
|
|
{
|
|
if (heatRangeRatio == 0)
|
|
{
|
|
Widget heatWidget = client.getWidget(WIDGET_HEAT_PARENT);
|
|
Widget medHeat = client.getWidget(WIDGET_MED_HEAT_PARENT);
|
|
if (medHeat == null || heatWidget == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
heatRangeRatio = medHeat.getWidth() /(double) heatWidget.getWidth();
|
|
}
|
|
|
|
return heatRangeRatio;
|
|
}
|
|
|
|
public int[] getLowHeatRange()
|
|
{
|
|
return new int[]{
|
|
(int) ((1 / 6d - getHeatRangeRatio() / 2) * 1000),
|
|
(int) ((1 / 6d + getHeatRangeRatio() / 2) * 1000),
|
|
};
|
|
}
|
|
|
|
public int[] getMedHeatRange()
|
|
{
|
|
return new int[]{
|
|
(int) ((3 / 6d - getHeatRangeRatio() / 2) * 1000),
|
|
(int) ((3 / 6d + getHeatRangeRatio() / 2) * 1000),
|
|
};
|
|
}
|
|
|
|
public int[] getHighHeatRange()
|
|
{
|
|
return new int[]{
|
|
(int) ((5 / 6d - getHeatRangeRatio() / 2) * 1000),
|
|
(int) ((5 / 6d + getHeatRangeRatio() / 2) * 1000),
|
|
};
|
|
}
|
|
|
|
public List<Stage> getStages()
|
|
{
|
|
if (stages.isEmpty())
|
|
{
|
|
Widget progressParent = client.getWidget(WIDGET_PROGRESS_PARENT);
|
|
if (progressParent == null || progressParent.getChildren() == null)
|
|
{
|
|
return new ArrayList<>();
|
|
}
|
|
|
|
for (Widget child : progressParent.getChildren())
|
|
{
|
|
switch (child.getSpriteId())
|
|
{
|
|
case SPRITE_ID_TRIP_HAMMER:
|
|
stages.add(Stage.TRIP_HAMMER);
|
|
break;
|
|
case SPRITE_ID_GRINDSTONE:
|
|
stages.add(Stage.GRINDSTONE);
|
|
break;
|
|
case SPRITE_ID_POLISHING_WHEEL:
|
|
stages.add(Stage.POLISHING_WHEEL);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return stages;
|
|
}
|
|
|
|
public Stage getCurrentStage()
|
|
{
|
|
int index = (int) (getProgressAmount() / 1000d * getStages().size());
|
|
if (index < 0 || index > getStages().size() - 1)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getStages().get(index);
|
|
}
|
|
|
|
public Heat getCurrentHeat()
|
|
{
|
|
int heat = getHeatAmount();
|
|
|
|
int[] low = getLowHeatRange();
|
|
if (heat > low[0] && heat < low[1])
|
|
{
|
|
return Heat.LOW;
|
|
}
|
|
|
|
int[] med = getMedHeatRange();
|
|
if (heat > med[0] && heat < med[1])
|
|
{
|
|
return Heat.MED;
|
|
}
|
|
|
|
int[] high = getHighHeatRange();
|
|
if (heat > high[0] && heat < high[1])
|
|
{
|
|
return Heat.HIGH;
|
|
}
|
|
|
|
return Heat.NONE;
|
|
}
|
|
|
|
public int getHeatChangeNeeded()
|
|
{
|
|
Heat requiredHeat = getCurrentStage().getHeat();
|
|
int heat = getHeatAmount();
|
|
|
|
int[] range;
|
|
switch (requiredHeat)
|
|
{
|
|
case LOW:
|
|
range = getLowHeatRange();
|
|
break;
|
|
case MED:
|
|
range = getMedHeatRange();
|
|
break;
|
|
case HIGH:
|
|
range = getHighHeatRange();
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
|
|
if (heat < range[0])
|
|
return range[0] - heat;
|
|
else if (heat > range[1])
|
|
return range[1] - heat;
|
|
else
|
|
return 0;
|
|
}
|
|
}
|