Skip to content

Commit c01dcd5

Browse files
committed
1.1.0 - Возможность: Автоматическое увеличение сложности при удалении от точки спавна
1 parent 0f16dc9 commit c01dcd5

File tree

6 files changed

+193
-21
lines changed

6 files changed

+193
-21
lines changed

README.md

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ SmartMobs - это инновационный плагин для Minecraft, к
55
## 🌟 Ключевые особенности
66

77
### 🎯 Естественная эволюция мобов
8-
- Два уровня развития: Мутировавшие (15% шанс) и Эволюционировавшие (5% шанс)
8+
- Два уровня развития: Мутировавшие и Эволюционировавшие (шансы настраиваются в конфиге)
99
- Уникальные тематические названия для каждого типа мобов
1010
- Логичная прогрессия от простых мутаций к продвинутым эволюционным формам
11+
- Возможность автоматического увеличения шанса спавна усиленных мобов при удалении от спавна.
1112

1213
### ⚡ Умные способности
1314
- **Скелеты**: повышенная скорость стрельбы, тройной выстрел у элитных
@@ -19,6 +20,7 @@ SmartMobs - это инновационный плагин для Minecraft, к
1920
### 🛠️ Полная кастомизация
2021
- Включение/отключение отдельных типов мобов
2122
- Настройка вероятностей появления
23+
- Настройка увеличения сложности
2224
- Регулировка множителей здоровья, урона и скорости
2325
- Кастомные названия и цвета для каждого моба
2426
- Гибкая настройка специальных способностей
@@ -71,11 +73,26 @@ SmartMobs - это инновационный плагин для Minecraft, к
7173
Плагин использует гибкую систему конфигурации YAML. Основные настройки:
7274

7375
```
74-
# Настройки модов SmartMobs
76+
# Настройки SmartMobs
7577
# Вероятности появления различных типов мобов
7678
chances:
77-
hardened: 0.15
78-
elite: 0.05
79+
hardened: 0.10 # Начальный шанс появления hardened моба
80+
elite: 0.01 # Начальный шанс появления elite моба
81+
radius-complication: false # Нужно ли увеличивать сложность мобов в зависимости от удаления от спавна
82+
world-radius: 10000 # Радиус мира до которого происходит увеличение сложности
83+
radius-levels:
84+
- from: 0.0 # начало зоны (0 = спавн)
85+
to: 0.33 # конец зоны (0.33 = треть от world-radius)
86+
hardened: 0.5 # шанс hardened при конце зоны
87+
elite: 0.05 # шанс elite при конце зоны
88+
- from: 0.33
89+
to: 0.66
90+
hardened: 0.5
91+
elite: 0.5
92+
- from: 0.66
93+
to: 1.0
94+
hardened: 0.2
95+
elite: 0.8
7996
8097
# Включить/выключить модификации для каждого моба
8198
enabled-mobs:
@@ -106,7 +123,7 @@ elite:
106123
107124
# Специфические способности для разных мобов
108125
special-abilities:
109-
skeleton:
126+
skeleton:
110127
hardened:
111128
arrow-speed-multiplier: 1.4
112129
attack-speed: 1.4
@@ -137,7 +154,7 @@ special-abilities:
137154

138155
- **Автоматическая генерация конфига** - при первом запуске создаётся полный конфиг со всеми настройками
139156
- **Оптимизированная обработка** - проверки на включённые мобы выполняются до усиления
140-
- **Визуальные эффекты** - частицы при спавне усиленных мобов
157+
- **Динамическая сложность мобов по расстоянию от спавна** - можно настроить в конфиге
141158

142159
## 🤝 Вклад в разработку
143160

build.gradle

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
group = 'com.flyaway.smartmobs'
6-
version = '1.0.0'
6+
version = '1.1.0'
77

88
java {
99
toolchain {
@@ -26,3 +26,13 @@ dependencies {
2626
tasks.jar {
2727
archiveBaseName.set("SmartMobs")
2828
}
29+
30+
tasks.processResources {
31+
filesMatching("plugin.yml") {
32+
expand(
33+
version: project.version,
34+
name: project.name,
35+
group: project.group
36+
)
37+
}
38+
}

src/main/java/com/flyaway/smartmobs/ConfigManager.java

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.flyaway.smartmobs;
22

33
import org.bukkit.configuration.file.FileConfiguration;
4+
import org.bukkit.configuration.ConfigurationSection;
45
import org.bukkit.entity.EntityType;
56

67
import java.util.List;
@@ -18,6 +19,9 @@ public class ConfigManager {
1819
// Вероятности
1920
private double hardenedChance = 0.15;
2021
private double eliteChance = 0.05;
22+
private boolean radiusComplication = false;
23+
private double worldRadius = 10000;
24+
List<RadiusLevel> radiusLevels = new ArrayList<>();
2125

2226
// Множители для hardened
2327
private double hardenedHpMultiplier = 1.25;
@@ -52,14 +56,40 @@ public void loadConfig() {
5256

5357
public void reloadConfig() {
5458
SmartMobs plugin = SmartMobs.getInstance();
55-
plugin.reloadConfig();
5659
loadConfig();
5760
}
5861

5962
private void loadChances() {
6063
if (config == null) return;
6164
hardenedChance = config.getDouble("chances.hardened", hardenedChance);
6265
eliteChance = config.getDouble("chances.elite", eliteChance);
66+
worldRadius = config.getDouble("chances.world-radius", 10000.0);
67+
radiusComplication = config.getBoolean("chances.radius-complication", false);
68+
if (!radiusComplication) return;
69+
70+
List<RadiusLevel> result = new ArrayList<>();
71+
72+
List<?> rawList = config.getList("chances.radius-levels");
73+
if (rawList == null) {
74+
SmartMobs.getInstance().getLogger().warning("[SmartMobs] radius-levels не найден в конфиге!");
75+
return;
76+
}
77+
78+
for (Object item : rawList) {
79+
if (item instanceof Map<?, ?> map) {
80+
double from = parseDouble(map.get("from"), 0.0);
81+
double to = parseDouble(map.get("to"), 1.0);
82+
double hardened = parseDouble(map.get("hardened"), getHardenedChance());
83+
double elite = parseDouble(map.get("elite"), getEliteChance());
84+
85+
result.add(new RadiusLevel(from, to, hardened, elite));
86+
} else {
87+
SmartMobs.getInstance().getLogger().warning("[SmartMobs] Элемент radius-levels имеет неверный формат: " + item);
88+
}
89+
}
90+
91+
radiusLevels = result;
92+
SmartMobs.getInstance().getLogger().info("[SmartMobs] Загружено уровней сложности: " + result.size());
6393
}
6494

6595
private void loadEnabledMobs() {
@@ -164,8 +194,15 @@ private void loadSpecialAbilities() {
164194
public double getEliteChance() { return eliteChance; }
165195
public boolean isMobEnabled(EntityType type) { return enabledMobs.getOrDefault(type, false); }
166196
public boolean isMobEnabled(String mobName) {
167-
if (config == null) return false;
168-
return config.getBoolean("enabled-mobs." + mobName.toLowerCase(), false);
197+
if (mobName == null) return false;
198+
199+
try {
200+
EntityType type = EntityType.valueOf(mobName.toUpperCase());
201+
return enabledMobs.getOrDefault(type, false);
202+
} catch (IllegalArgumentException e) {
203+
SmartMobs.getInstance().getLogger().warning("[SmartMobs] isMobEnabled: неизвестный тип моба " + mobName);
204+
return false;
205+
}
169206
}
170207
public double getHardenedHpMultiplier() { return hardenedHpMultiplier; }
171208
public double getHardenedDamageMultiplier() { return hardenedDamageMultiplier; }
@@ -183,11 +220,10 @@ public boolean isMobEnabled(String mobName) {
183220

184221
public List<String> getEnabledMobTypes() {
185222
List<String> result = new ArrayList<>();
186-
if (config == null || !config.isConfigurationSection("enabled-mobs")) return result;
187223

188-
for (String key : config.getConfigurationSection("enabled-mobs").getKeys(false)) {
189-
if (config.getBoolean("enabled-mobs." + key)) {
190-
result.add(key.toLowerCase());
224+
for (Map.Entry<EntityType, Boolean> entry : enabledMobs.entrySet()) {
225+
if (Boolean.TRUE.equals(entry.getValue())) {
226+
result.add(entry.getKey().name().toLowerCase());
191227
}
192228
}
193229
return result;
@@ -198,6 +234,42 @@ public String getDisplayName(String type, EntityType mobType) {
198234
return names != null ? names.get(mobType) : null;
199235
}
200236

237+
public boolean isRadiusComplicationEnabled() {
238+
return radiusComplication;
239+
}
240+
241+
public double getWorldRadius() {
242+
return worldRadius;
243+
}
244+
245+
public static class RadiusLevel {
246+
public final double from;
247+
public final double to;
248+
public final double hardened;
249+
public final double elite;
250+
251+
public RadiusLevel(double from, double to, double hardened, double elite) {
252+
this.from = from;
253+
this.to = to;
254+
this.hardened = hardened;
255+
this.elite = elite;
256+
}
257+
}
258+
259+
public List<RadiusLevel> getRadiusLevels() {
260+
return radiusLevels;
261+
}
262+
263+
private double parseDouble(Object obj, double def) {
264+
if (obj instanceof Number num) return num.doubleValue();
265+
if (obj instanceof String str) {
266+
try {
267+
return Double.parseDouble(str);
268+
} catch (NumberFormatException ignored) {}
269+
}
270+
return def;
271+
}
272+
201273
@SuppressWarnings("unchecked")
202274
public Map<String, Object> getSpecialAbilities(EntityType mobType, String variant) {
203275
Map<String, Object> abilities = specialAbilities.get(mobType);

src/main/java/com/flyaway/smartmobs/MobManager.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.bukkit.potion.PotionEffectType;
1010
import org.bukkit.scheduler.BukkitRunnable;
1111

12+
import java.util.List;
1213
import java.util.Map;
1314
import java.util.Random;
1415

@@ -25,17 +26,74 @@ public void enhanceMob(LivingEntity entity) {
2526
if (entity == null || configManager == null) return;
2627
if (!configManager.isMobEnabled(entity.getType())) return;
2728

28-
double rand = random.nextDouble();
2929
double hardenedChance = configManager.getHardenedChance();
3030
double eliteChance = configManager.getEliteChance();
3131

32+
if (configManager.isRadiusComplicationEnabled()) {
33+
double worldRadius = configManager.getWorldRadius();
34+
35+
// Безопасность: worldRadius должен быть > 0
36+
if (worldRadius >= 0) {
37+
double distance = entity.getWorld().getSpawnLocation().distance(entity.getLocation());
38+
double normalized = Math.min(distance / worldRadius, 1.0);
39+
40+
var logger = SmartMobs.getInstance().getLogger();
41+
42+
List<ConfigManager.RadiusLevel> levels = configManager.getRadiusLevels();
43+
if (levels != null && !levels.isEmpty()) {
44+
boolean found = false;
45+
// Логируем уровни для отладки (индекс и границы)
46+
for (int i = 0; i < levels.size(); i++) {
47+
ConfigManager.RadiusLevel lvl = levels.get(i);
48+
}
49+
50+
for (int i = 0; i < levels.size(); i++) {
51+
ConfigManager.RadiusLevel level = levels.get(i);
52+
53+
// Нормализованные границы должны быть валидными; если level.to < level.from — пропускаем
54+
if (level.to < level.from) {
55+
continue;
56+
}
57+
58+
if (normalized >= level.from && normalized <= level.to) {
59+
double denom = (level.to - level.from);
60+
double factor = denom <= 0.0 ? 0.0 : (normalized - level.from) / denom;
61+
// интерполируем от базовых значений к значениям уровня
62+
hardenedChance = interpolate(configManager.getHardenedChance(), level.hardened, factor);
63+
eliteChance = interpolate(configManager.getEliteChance(), level.elite, factor);
64+
found = true;
65+
break;
66+
}
67+
}
68+
69+
// Если не нашли подходящий уровень:
70+
if (!found) {
71+
// если за пределом (normalized >= 1.0) — используем последний уровень как "максимальный"
72+
if (normalized >= 1.0) {
73+
ConfigManager.RadiusLevel last = levels.get(levels.size() - 1);
74+
hardenedChance = last.hardened;
75+
eliteChance = last.elite;
76+
} else {
77+
// иначе — логируем, что ни один уровень не подошёл (возможен разрыв в уровнях)
78+
logger.warning(String.format("[SmartMobs] Не найден уровень для normalized=%.4f. Проверь radius-levels в конфиge.", normalized));
79+
}
80+
}
81+
}
82+
}
83+
}
84+
85+
double rand = random.nextDouble();
3286
if (rand < eliteChance) {
3387
makeElite(entity);
3488
} else if (rand < eliteChance + hardenedChance) {
3589
makeHardened(entity);
3690
}
3791
}
3892

93+
private double interpolate(double start, double end, double t) {
94+
return start + (end - start) * Math.max(0.0, Math.min(1.0, t));
95+
}
96+
3997
private double getDoubleFromConfig(Object value) {
4098
if (value instanceof Integer) return ((Integer) value).doubleValue();
4199
if (value instanceof Double) return (Double) value;

src/main/resources/config.yml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
1-
# Настройки модов SmartMobs
1+
# Настройки SmartMobs
22
# Вероятности появления различных типов мобов
33
chances:
4-
hardened: 0.15
5-
elite: 0.05
4+
hardened: 0.10 # Начальный шанс появления hardened моба
5+
elite: 0.01 # Начальный шанс появления elite моба
6+
radius-complication: false # Нужно ли увеличивать сложность мобов в зависимости от удаления от спавна
7+
world-radius: 10000 # Радиус мира до которого происходит увеличение сложности
8+
radius-levels:
9+
- from: 0.0 # начало зоны (0 = спавн)
10+
to: 0.33 # конец зоны (0.33 = треть от world-radius)
11+
hardened: 0.5 # шанс hardened при конце зоны
12+
elite: 0.05 # шанс elite при конце зоны
13+
- from: 0.33
14+
to: 0.66
15+
hardened: 0.5
16+
elite: 0.5
17+
- from: 0.66
18+
to: 1.0
19+
hardened: 0.2
20+
elite: 0.8
621

722
# Включить/выключить модификации для каждого моба
823
enabled-mobs:

src/main/resources/plugin.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
name: SmartMobs
2-
main: com.flyaway.smartmobs.SmartMobs
3-
version: 1.0.0
1+
name: ${name}
2+
main: ${group}.SmartMobs
3+
version: ${version}
44
api-version: 1.21
55
author: FlyAwayMaking
66
website: https://github.com/flyawaymaking

0 commit comments

Comments
 (0)