mirror of
https://gitlab.com/2009scape/rt4-client.git
synced 2025-12-09 16:45:46 -07:00
Update to allow plugin metadata definition from annotations and load other classes in same folder as plugin.class.
This commit is contained in:
parent
9750195081
commit
3e12a9115d
15 changed files with 122 additions and 68 deletions
|
|
@ -1,4 +0,0 @@
|
|||
|
||||
AUTHOR='Ceikry'
|
||||
DESCRIPTION='Draws some info about varp changes on the screen.'
|
||||
VERSION=-1.0
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
package plugin;
|
||||
|
||||
import plugin.annotations.PluginMeta;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
|
|
@ -42,7 +44,21 @@ class PluginInfo {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public static PluginInfo loadFromClass(Class<?> clazz) {
|
||||
PluginMeta info = clazz.getAnnotation(PluginMeta.class);
|
||||
|
||||
if (info == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new PluginInfo(
|
||||
info.author(),
|
||||
info.description(),
|
||||
info.version()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ import java.net.URL;
|
|||
import java.net.URLClassLoader;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Responsible for loading and broadcasting methods to all plugins.
|
||||
|
|
@ -39,16 +41,11 @@ public class PluginRepository {
|
|||
|
||||
for(File file : Objects.requireNonNull(pluginsDirectory.listFiles())) {
|
||||
if(!file.isDirectory()) continue;
|
||||
if(file.getName().equals("META-INF")) continue;
|
||||
|
||||
File infoFile = new File(file.getAbsoluteFile() + File.separator + "plugin.properties");
|
||||
File pluginRoot = new File(file.getAbsoluteFile() + File.separator + "plugin.class");
|
||||
|
||||
PluginInfo info;
|
||||
if (infoFile.exists())
|
||||
info = PluginInfo.loadFromFile(infoFile);
|
||||
else
|
||||
info = new PluginInfo("Unknown", "", 1.0);
|
||||
|
||||
if (!pluginRoot.exists()) {
|
||||
System.err.println("Unable to load plugin " + file.getName() + " because plugin.class is absent!");
|
||||
continue;
|
||||
|
|
@ -56,6 +53,17 @@ public class PluginRepository {
|
|||
|
||||
Class<?> clazz = loader.loadClass(file.getName() + ".plugin");
|
||||
|
||||
PluginInfo info;
|
||||
if (infoFile.exists())
|
||||
info = PluginInfo.loadFromFile(infoFile);
|
||||
else
|
||||
info = PluginInfo.loadFromClass(clazz);
|
||||
|
||||
if (info == null) {
|
||||
System.err.println("Unable to load plugin " + file.getName() + " because it contains no information about author, version, etc!");
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
Plugin thisPlugin = (Plugin) clazz.newInstance();
|
||||
thisPlugin._init();
|
||||
|
|
@ -66,6 +74,15 @@ public class PluginRepository {
|
|||
return;
|
||||
}
|
||||
|
||||
List<File> otherClasses = Arrays.stream(Objects.requireNonNull(file.listFiles()))
|
||||
.filter((f) ->
|
||||
!f.getName().equals("plugin.class") && f.getName().contains(".class"))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
for (File f : otherClasses) {
|
||||
loader.loadClass(file.getName() + "." + f.getName().replace(".class",""));
|
||||
}
|
||||
|
||||
System.out.println("Successfully loaded plugin " + file.getName() + ", version " + info.version);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
11
client/src/main/java/plugin/annotations/PluginMeta.java
Normal file
11
client/src/main/java/plugin/annotations/PluginMeta.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package plugin.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface PluginMeta {
|
||||
String author();
|
||||
String description();
|
||||
double version();
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package InterfaceDebugPlugin;
|
||||
|
||||
import plugin.Plugin;
|
||||
import plugin.annotations.PluginMeta;
|
||||
import plugin.api.*;
|
||||
import rt4.Component;
|
||||
import rt4.GameShell;
|
||||
|
|
@ -8,6 +9,11 @@ import rt4.GameShell;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
@PluginMeta(
|
||||
author = "Ceikry",
|
||||
description = "Aids in identifying interface components/varps/model IDs.",
|
||||
version = 1.2
|
||||
)
|
||||
public class plugin extends Plugin {
|
||||
private boolean isEnabled;
|
||||
private boolean isVerbose;
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
AUTHOR='Ceikry'
|
||||
DESCRIPTION='Enables visual display of component children and a log of interface-related varps.'
|
||||
VERSION=1.1
|
||||
|
|
@ -1,12 +1,15 @@
|
|||
package OverheadDebugPlugin;
|
||||
|
||||
import plugin.Plugin;
|
||||
import plugin.annotations.PluginMeta;
|
||||
import plugin.api.*;
|
||||
import rt4.*;
|
||||
|
||||
/**
|
||||
* @author ceikry
|
||||
*/
|
||||
@PluginMeta(
|
||||
author = "Ceikry",
|
||||
description = "Draws helpful overhead debug information.",
|
||||
version = 1.3
|
||||
)
|
||||
public class plugin extends Plugin {
|
||||
private boolean isEnabled = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
AUTHOR="Ceikry"
|
||||
DESCRIPTION="Renders helpful debug text over the heads of players and NPCs."
|
||||
VERSION=1.0
|
||||
|
|
@ -1,12 +1,18 @@
|
|||
package VarpLogPlugin;
|
||||
|
||||
import plugin.Plugin;
|
||||
import plugin.annotations.PluginMeta;
|
||||
import plugin.api.*;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
||||
@PluginMeta(
|
||||
author = "Ceikry",
|
||||
description = "Adds a simple log of varp changes drawn directly to the screen.",
|
||||
version = 1.0
|
||||
)
|
||||
public class plugin extends Plugin {
|
||||
boolean isEnabled = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
AUTHOR='Ceikry'
|
||||
DESCRIPTION='Draws some info about varp changes on the screen.'
|
||||
VERSION=1.0
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package SlayerTrackerPlugin
|
||||
|
||||
import plugin.Plugin
|
||||
import plugin.annotations.PluginMeta
|
||||
import plugin.api.API
|
||||
import plugin.api.FontColor
|
||||
import plugin.api.FontType
|
||||
|
|
@ -9,10 +10,11 @@ import rt4.Sprite
|
|||
import java.awt.Color
|
||||
import java.lang.Exception
|
||||
|
||||
/**
|
||||
* Very simple slayer task tracker
|
||||
* @author Ceikry
|
||||
*/
|
||||
@PluginMeta(
|
||||
author = "Ceikry",
|
||||
description = "Draws a simple slayer task tracker onto the screen if one is active.",
|
||||
version = 1.0
|
||||
)
|
||||
class plugin : Plugin() {
|
||||
val boxColor = 6116423
|
||||
val posX = 5
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
AUTHOR='Ceikry'
|
||||
DESCRIPTION='Helps to keep track of kills remaining on a slayer task.'
|
||||
VERSION=1.1
|
||||
40
plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt
Normal file
40
plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
package XPDropPlugin
|
||||
|
||||
import plugin.api.API
|
||||
import rt4.Sprite
|
||||
|
||||
object XPSprites {
|
||||
fun getSpriteForSkill(skillId: Int) : Sprite? {
|
||||
return API.GetSprite(getSpriteId(skillId))
|
||||
}
|
||||
|
||||
private fun getSpriteId(skillId: Int) : Int {
|
||||
return when (skillId) {
|
||||
0 -> 197
|
||||
1 -> 199
|
||||
2 -> 198
|
||||
3 -> 203
|
||||
4 -> 200
|
||||
5 -> 201
|
||||
6 -> 202
|
||||
7 -> 212
|
||||
8 -> 214
|
||||
9 -> 208
|
||||
10 -> 211
|
||||
11 -> 213
|
||||
12 -> 207
|
||||
13 -> 210
|
||||
14 -> 209
|
||||
15 -> 205
|
||||
16 -> 204
|
||||
17 -> 206
|
||||
18 -> 216
|
||||
19 -> 217
|
||||
20 -> 215
|
||||
21 -> 220
|
||||
22 -> 221
|
||||
23 -> 222
|
||||
else -> 222
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +1,16 @@
|
|||
package XPDropPlugin;
|
||||
|
||||
import plugin.Plugin
|
||||
import plugin.annotations.PluginMeta
|
||||
import plugin.api.*
|
||||
import java.awt.Color
|
||||
import kotlin.math.ceil
|
||||
|
||||
/**
|
||||
* Displays some simple XP drops.
|
||||
* @author Ceikry
|
||||
*/
|
||||
@PluginMeta(
|
||||
author = "Ceikry",
|
||||
description = "Draws nice and clean experience drops onto the screen.",
|
||||
version = 1.2
|
||||
)
|
||||
class plugin : Plugin() {
|
||||
private val displayTimeout = 10000L // 10 seconds
|
||||
private val drawStart = 175
|
||||
|
|
@ -37,7 +39,7 @@ class plugin : Plugin() {
|
|||
removeList.add(gain)
|
||||
totalXp += gain.xp
|
||||
} else if (gain.currentPos <= drawStart){
|
||||
val sprite = API.GetSprite(getSpriteArchive(gain.skill))
|
||||
val sprite = XPSprites.getSpriteForSkill(skillId = gain.skill)
|
||||
sprite?.render(posX - 25, gain.currentPos - 20)
|
||||
API.DrawText(
|
||||
FontType.SMALL,
|
||||
|
|
@ -143,34 +145,4 @@ class plugin : Plugin() {
|
|||
}
|
||||
return newString.reversed()
|
||||
}
|
||||
|
||||
fun getSpriteArchive(skillId: Int): Int{
|
||||
return when(skillId) {
|
||||
0 -> 197
|
||||
1 -> 199
|
||||
2 -> 198
|
||||
3 -> 203
|
||||
4 -> 200
|
||||
5 -> 201
|
||||
6 -> 202
|
||||
7 -> 212
|
||||
8 -> 214
|
||||
9 -> 208
|
||||
10 -> 211
|
||||
11 -> 213
|
||||
12 -> 207
|
||||
13 -> 210
|
||||
14 -> 209
|
||||
15 -> 205
|
||||
16 -> 204
|
||||
17 -> 206
|
||||
18 -> 216
|
||||
19 -> 217
|
||||
20 -> 215
|
||||
21 -> 220
|
||||
22 -> 221
|
||||
23 -> 222
|
||||
else -> 222
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
AUTHOR='Ceikry'
|
||||
DESCRIPTION='Displays some pretty awesome XP drops :)'
|
||||
VERSION=1.1
|
||||
Loading…
Add table
Add a link
Reference in a new issue