Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mikigal/configapi
Config API for Bukkit 1.8 - 1.20 based on Dynamic Proxies
https://github.com/mikigal/configapi
bukkit bukkit-api config config-api configuration minecraft parser reflections spigot spigot-api yaml yml
Last synced: 2 months ago
JSON representation
Config API for Bukkit 1.8 - 1.20 based on Dynamic Proxies
- Host: GitHub
- URL: https://github.com/mikigal/configapi
- Owner: mikigal
- Created: 2020-10-12T14:33:34.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-04-22T20:47:22.000Z (8 months ago)
- Last Synced: 2024-10-13T22:41:57.160Z (2 months ago)
- Topics: bukkit, bukkit-api, config, config-api, configuration, minecraft, parser, reflections, spigot, spigot-api, yaml, yml
- Language: Java
- Homepage:
- Size: 152 KB
- Stars: 31
- Watchers: 3
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.MD
Awesome Lists containing this project
README
# ConfigAPI
Config API for Bukkit 1.8 - 1.20 based on dynamic proxies## Features:
- Works with Bukkit 1.8 - 1.20
- Compatible with Java 8 - 17
- Multiple configuration files
- Fastly create configs via Java interface with `default` getters
- Automatic generation of config's YAML file
- Automatic update of config's file after add new methods to it's interface
- Support for setting new values to config
- System of serializers for custom objects (e.g. ItemStack, Location)
- Automatic serialization of custom objects based on reflections (mainly for simple DAO/DTO objects)
- Support of comments in YAML config
- Automatic translation of `&` based colors## Import
#### Gradle
```groovy
maven {
url = 'https://repo.mikigal.pl/releases'
}compile group: 'pl.mikigal', name: 'ConfigAPI', version: '1.2.6'
```#### Maven
```xmlmikigal-repo
https://repo.mikigal.pl/releasespl.mikigal
ConfigAPI
1.2.6
compile```
## How to use?
#### Java code
```java
public class TestPlugin extends JavaPlugin {private static TestConfig testConfig;
@Override
public void onEnable() {
testConfig = ConfigAPI.init(
TestConfig.class, // Class of config's interface
NameStyle.UNDERSCORE, // Style of fields' name in YAML file
CommentStyle.INLINE, // Style of comments in YAML file
true, // Automatic translation of '&' based colors
this // Instance of plugin
);// You can simply access data from the config by getters
System.out.println(testConfig.getExampleMessage());
Bukkit.getPlayer("mikigal").getInventory().addItem(testConfig.getAward());// After calling setter new data are automatically saved to file
testConfig.setAward(new ItemStack(Material.DIRT));// If you want to do something manually you can access instance of YamlConfiguration
testConfig.getBukkitConfiguration();
}public static TestConfig getTestConfig() {
return testConfig;
}
}@ConfigName("test.yml") // Name of YAML file
public interface TestConfig extends Config {@Comment("This comment will be saved to YAML file!")
default String getExampleMessage() {
// Getter method should return default value of the field
return "&cIt's default value of example message";
}default ItemStack getAward() {
return Item.of(Material.DIAMOND_SWORD)
.name("&cAward")
.lore("&aFirst line", "&cSecond line")
.toItem();
}public void setAward(ItemStack award);
// Key of Map must be String
default Map getValues() {
Map map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);return map;
}default List getSpawnPoints() {
World world = Bukkit.getWorld("world");
return Arrays.asList(
new Location(world, 0, 100, 0),
new Location(world, 10, 90, 10, 90f, 0f),
new Location(world, 20, 80, 20, 0f, 180f)
);
}
}
```#### Automatic generated YAML from above Java code
```yaml
example_message: '&cIt''s default value of example message' # This comment will be saved to YAML file!
spawn_points:
structure: java.util.ArrayList
type: org.bukkit.Location
'0':
world: world
x: 0.0
y: 100.0
z: 0.0
yaw: 0.0
pitch: 0.0
'1':
world: world
x: 10.0
y: 90.0
z: 10.0
yaw: 90.0
pitch: 0.0
'2':
world: world
x: 20.0
y: 80.0
z: 20.0
yaw: 0.0
pitch: 180.0
values:
structure: java.util.HashMap
type: java.lang.Integer
a: 1
b: 2
award:
material: DIAMOND_SWORD
amount: 1
name: '&cAward'
lore:
structure: java.util.ArrayList
type: java.lang.String
'0': '&aFirst line'
'1': '&cSecond line'
```## Serializers
### API has built-in serializers for:
- ItemStack
- Location
- PotionEffect
- ShapedRecipe
- UUID#### Automatic serializing of custom objects
If you have some simple DAO/DTO object you can serialize it without writing custom serializer!```java
public class User implements Serializable { // It must implement Serializable interface
private String username;
private int kills;
private transient String temporary; // Transient fields will not be serialized!public User() { // It MUST have no-args constructor!
}
public User(String username, int kills, String temporary) {
this.username = username;
this.kills = kills;
this.temporary = temporary;
}// Getters and setters...
}@ConfigName("config")
public interface MyConfig extends Config {void setUser(User user);
default User getTest() {
return new User("mikigal", 1, "some text");
}
}
```#### You can also make your own serializers
For more advanced objects you can make your own serializer
```java
public class PotionEffectSerializer extends Serializer {@Override
protected void saveObject(String path, PotionEffect object, BukkitConfiguration configuration) {
// In saveObject() method you have to set data of object to config. You can use set() method to set another object which need serialization too
configuration.set(path + ".type", object.getType().getName());
configuration.set(path + ".duration", object.getDuration());
configuration.set(path + ".amplifier", object.getAmplifier());
}@Override
public PotionEffect deserialize(String path, BukkitConfiguration configuration) {
// In deserialize() method you have to load data from config and return instance of object
PotionEffectType type = PotionEffectType.getByName(configuration.getString(path + ".type"));
int duration = configuration.getInt(path + ".duration");
int amplifier = configuration.getInt(path + ".amplifier");if (type == null) {
throw new InvalidConfigFileException("Invalid PotionEffect type (path: " + path + ")");
}return new PotionEffect(type, duration, amplifier);
}
}public class TestPlugin extends JavaPlugin {
@Override
public void onEnable() {
// Remember to register you Serializer before use!
ConfigAPI.registerSerializer(PotionEffect.class, new PotionEffectSerializer());// Init your configs...
}
}