Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/bentahsin/configuration/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ public void init(Object configInstance, String fileName) {
return;
}

if (!loadFailed) {
mapper.resetToDefaults(configInstance);
}

if (!loadFailed) {
handleBackupOnMigration(configInstance, yamlConfig, file);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import com.bentahsin.configuration.converter.Converter;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.*;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType;

import java.lang.reflect.Method;
import java.util.*;
Expand All @@ -25,63 +28,93 @@ public ItemStack convertToField(Map<String, Object> source) {
Material material = Material.getMaterial(matStr.toUpperCase());
if (material == null) material = Material.STONE;

int amount = (int) source.getOrDefault("amount", 1);
int amount = 1;
if (source.get("amount") instanceof Number) {
amount = ((Number) source.get("amount")).intValue();
}

ItemStack item = new ItemStack(material, amount);
ItemMeta meta = item.getItemMeta();

if (meta != null) {
if (source.containsKey("name")) {
meta.setDisplayName(color((String) source.get("name")));
meta.setDisplayName(color(String.valueOf(source.get("name"))));
}

if (source.containsKey("lore")) {
Object loreObj = source.get("lore");
if (loreObj instanceof List) {
@SuppressWarnings("unchecked")
List<String> rawLore = (List<String>) loreObj;
meta.setLore(rawLore.stream().map(this::color).collect(Collectors.toList()));
if (source.get("lore") instanceof List) {
List<?> rawList = (List<?>) source.get("lore");
List<String> lore = new ArrayList<>();
for (Object obj : rawList) {
if (obj != null) {
lore.add(color(obj.toString()));
}
}
meta.setLore(lore);
}

if (source.containsKey("custom_model_data") && source.get("custom_model_data") instanceof Integer) {
int data = (int) source.get("custom_model_data");
setCustomModelData(meta, data);
if (source.get("custom_model_data") instanceof Number) {
setCustomModelData(meta, ((Number) source.get("custom_model_data")).intValue());
}

if (source.containsKey("flags")) {
Object flagsObj = source.get("flags");
if (flagsObj instanceof List) {
@SuppressWarnings("unchecked")
List<String> flags = (List<String>) flagsObj;
for (String f : flags) {
if (source.containsKey("unbreakable") && source.get("unbreakable") instanceof Boolean) {
meta.setUnbreakable((boolean) source.get("unbreakable"));
}

if (source.get("flags") instanceof List) {
List<?> flags = (List<?>) source.get("flags");
for (Object obj : flags) {
if (obj instanceof String) {
try {
meta.addItemFlags(ItemFlag.valueOf(f.toUpperCase()));
meta.addItemFlags(ItemFlag.valueOf(((String) obj).toUpperCase()));
} catch (IllegalArgumentException ignored) {}
}
}
}

if (source.containsKey("enchantments")) {
Object enchsObj = source.get("enchantments");
if (enchsObj instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> enchs = (Map<String, Object>) enchsObj;

for (Map.Entry<String, Object> entry : enchs.entrySet()) {
Enchantment ench = getEnchantment(entry.getKey());
if (ench != null && entry.getValue() instanceof Integer) {
meta.addEnchant(ench, (int) entry.getValue(), true);
if (source.get("enchantments") instanceof Map) {
Map<?, ?> enchs = (Map<?, ?>) source.get("enchantments");
for (Map.Entry<?, ?> entry : enchs.entrySet()) {
if (entry.getKey() instanceof String && entry.getValue() instanceof Number) {
Enchantment ench = getEnchantment((String) entry.getKey());
if (ench != null) {
meta.addEnchant(ench, ((Number) entry.getValue()).intValue(), true);
}
}
}
}

if (meta instanceof LeatherArmorMeta && source.containsKey("color")) {
String hex = String.valueOf(source.get("color"));
if (hex.startsWith("#") && hex.length() == 7) {
try {
((LeatherArmorMeta) meta).setColor(Color.fromRGB(
Integer.valueOf(hex.substring(1, 3), 16),
Integer.valueOf(hex.substring(3, 5), 16),
Integer.valueOf(hex.substring(5, 7), 16)
));
} catch (Exception ignored) {}
}
}

if (meta instanceof SkullMeta && source.containsKey("skull_owner")) {
((SkullMeta) meta).setOwner(String.valueOf(source.get("skull_owner")));
}

if (meta instanceof PotionMeta && source.containsKey("potion_type")) {
try {
PotionType type = PotionType.valueOf(String.valueOf(source.get("potion_type")).toUpperCase());
boolean extended = (boolean) source.getOrDefault("potion_extended", false);
boolean upgraded = (boolean) source.getOrDefault("potion_upgraded", false);
((PotionMeta) meta).setBasePotionData(new PotionData(type, extended, upgraded));
} catch (Exception ignored) {}
}

item.setItemMeta(meta);
}
return item;

} catch (Exception e) {
Bukkit.getLogger().log(Level.WARNING, "[Configuration] Encountered an error while transforming ItemStack!", e);
Bukkit.getLogger().log(Level.WARNING, "[Configuration] Error loading ItemStack!", e);
return new ItemStack(Material.AIR);
}
}
Expand All @@ -107,10 +140,10 @@ public Map<String, Object> convertToConfig(ItemStack item) {
.collect(Collectors.toList()));
}

Integer customModelData = getCustomModelData(meta);
if (customModelData != null) {
map.put("custom_model_data", customModelData);
}
Integer cmd = getCustomModelData(meta);
if (cmd != null) map.put("custom_model_data", cmd);

if (meta.isUnbreakable()) map.put("unbreakable", true);

if (!meta.getItemFlags().isEmpty()) {
List<String> flags = new ArrayList<>();
Expand All @@ -121,11 +154,34 @@ public Map<String, Object> convertToConfig(ItemStack item) {
if (meta.hasEnchants()) {
Map<String, Integer> enchs = new LinkedHashMap<>();
for (Map.Entry<Enchantment, Integer> entry : meta.getEnchants().entrySet()) {
String enchName = getEnchantmentName(entry.getKey());
enchs.put(enchName, entry.getValue());
enchs.put(getEnchantmentName(entry.getKey()), entry.getValue());
}
map.put("enchantments", enchs);
}

if (meta instanceof LeatherArmorMeta) {
Color color = ((LeatherArmorMeta) meta).getColor();
Color defaultColor = Bukkit.getItemFactory().getDefaultLeatherColor();

if (!color.equals(defaultColor)) {
String hex = String.format("#%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue());
map.put("color", hex);
}
}

if (meta instanceof SkullMeta) {
SkullMeta skull = (SkullMeta) meta;
if (skull.hasOwner()) {
map.put("skull_owner", skull.getOwner());
}
}

if (meta instanceof PotionMeta) {
PotionData data = ((PotionMeta) meta).getBasePotionData();
map.put("potion_type", data.getType().name());
if (data.isExtended()) map.put("potion_extended", true);
if (data.isUpgraded()) map.put("potion_upgraded", true);
}
}
return map;
}
Expand All @@ -134,7 +190,6 @@ private String color(String s) {
return ChatColor.translateAlternateColorCodes('&', s);
}


private void setCustomModelData(ItemMeta meta, int data) {
try {
Method method = meta.getClass().getMethod("setCustomModelData", Integer.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,27 @@
@SuppressWarnings("unused")
public class LocationConverter implements Converter<String, Location> {

/**
* Config'den gelen String veriyi (örn: "world,100,64,200,90,0") Location nesnesine çevirir.
*/
@Override
public Location convertToField(String source) {
if (source == null || !source.contains(",")) {
return null;
}
if (source == null || !source.contains(",")) return null;

try {
String[] parts = source.split(",");

if (parts.length < 4) {
return null;
}
if (parts.length < 4) return null;

String worldName = parts[0];
World world = Bukkit.getWorld(worldName);

if (world == null) {
Bukkit.getLogger().warning("[Configuration] World '" + worldName + "' not found for location!");
return null;
}

double x = Double.parseDouble(parts[1]);
double y = Double.parseDouble(parts[2]);
double z = Double.parseDouble(parts[3]);

float yaw = 0;
float pitch = 0;

if (parts.length > 4) {
yaw = Float.parseFloat(parts[4]);
}
if (parts.length > 5) {
pitch = Float.parseFloat(parts[5]);
}
float yaw = parts.length > 4 ? Float.parseFloat(parts[4]) : 0;
float pitch = parts.length > 5 ? Float.parseFloat(parts[5]) : 0;

return new Location(world, x, y, z, yaw, pitch);

Expand All @@ -50,30 +39,20 @@ public Location convertToField(String source) {
}
}

/**
* Location nesnesini Config için sıkıştırılmış String formatına çevirir.
*/
@Override
public String convertToConfig(Location loc) {
if (loc == null) return null;
if (loc == null || loc.getWorld() == null) return null;

String worldName = (loc.getWorld() != null) ? loc.getWorld().getName() : "world";
return worldName + "," +
return loc.getWorld().getName() + "," +
format(loc.getX()) + "," +
format(loc.getY()) + "," +
format(loc.getZ()) + "," +
format(loc.getYaw()) + "," +
format(loc.getPitch());
}

/**
* Sayıları temiz formatlar.
* Örn: 10.0 -> "10", 10.5678 -> "10.57"
*/
private String format(double d) {
if (d == (long) d) {
return String.format(Locale.ENGLISH, "%d", (long) d);
}
if (d == (long) d) return String.format(Locale.ENGLISH, "%d", (long) d);
return String.format(Locale.ENGLISH, "%.2f", d);
}
}
Original file line number Diff line number Diff line change
@@ -1,35 +1,25 @@
package com.bentahsin.configuration.converter.impl;

import com.bentahsin.configuration.converter.Converter;

import java.util.concurrent.TimeUnit;

@SuppressWarnings("unused")
public class TimeConverter implements Converter<String, Long> {

/**
* Config'den gelen String süreyi (örn: "1h 10m") saniyeye (Long) çevirir.
*/
@Override
public Long convertToField(String source) {
if (source == null || source.isEmpty()) return 0L;
return parseTime(source);
}

/**
* Sınıftaki saniye değerini (Long), Config için okunabilir formata (örn: "1h 5m 30s") çevirir.
*/
@Override
public String convertToConfig(Long source) {
if (source == null || source == 0) return "0s";

long seconds = source;
long days = TimeUnit.SECONDS.toDays(seconds);
seconds -= TimeUnit.DAYS.toSeconds(days);

long hours = TimeUnit.SECONDS.toHours(seconds);
seconds -= TimeUnit.HOURS.toSeconds(hours);

long minutes = TimeUnit.SECONDS.toMinutes(seconds);
seconds -= TimeUnit.MINUTES.toSeconds(minutes);

Expand All @@ -38,42 +28,28 @@ public String convertToConfig(Long source) {
if (hours > 0) sb.append(hours).append("h ");
if (minutes > 0) sb.append(minutes).append("m ");
if (seconds > 0) sb.append(seconds).append("s");

return sb.toString().trim();
}

/**
* Zaman formatını ayrıştıran gelişmiş parser.
* Desteklenen formatlar: 1d, 10h, 30m, 45s ve bunların kombinasyonları.
* Örn: "1h 30m", "100s", "5m"
*/
private long parseTime(String timeStr) {
long totalSeconds = 0;
double totalSeconds = 0;
StringBuilder numberBuffer = new StringBuilder();

for (char c : timeStr.toLowerCase().toCharArray()) {
if (Character.isWhitespace(c)) continue;

if (Character.isDigit(c)) {
if (Character.isDigit(c) || c == '.') {
numberBuffer.append(c);
} else if (Character.isLetter(c)) {
if (numberBuffer.length() == 0) continue;

try {
long val = Long.parseLong(numberBuffer.toString());
double val = Double.parseDouble(numberBuffer.toString());
switch (c) {
case 'd':
totalSeconds += val * 86400;
break;
case 'h':
totalSeconds += val * 3600;
break;
case 'm':
totalSeconds += val * 60;
break;
case 's':
totalSeconds += val;
break;
case 'd': totalSeconds += val * 86400; break;
case 'h': totalSeconds += val * 3600; break;
case 'm': totalSeconds += val * 60; break;
case 's': totalSeconds += val; break;
}
} catch (NumberFormatException ignored) {}
numberBuffer.setLength(0);
Expand All @@ -82,10 +58,10 @@ private long parseTime(String timeStr) {

if (numberBuffer.length() > 0) {
try {
totalSeconds += Long.parseLong(numberBuffer.toString());
totalSeconds += Double.parseDouble(numberBuffer.toString());
} catch (NumberFormatException ignored) {}
}

return totalSeconds;
return Math.round(totalSeconds);
}
}
Loading