Skip to content

Commit cea8b38

Browse files
committed
v1.2.0 - добавлен кролик убийца и другие новые мобы. Сообщения вынесены в конфиг. Добавлена поддержка MinIMessages для имён мобов
1 parent 2903aa2 commit cea8b38

File tree

9 files changed

+542
-282
lines changed

9 files changed

+542
-282
lines changed

README.md

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ SmartMobs - это инновационный плагин для Minecraft, к
4040

4141
Плагин охватывает всех основных враждебных мобов Minecraft:
4242

43-
| Обычный моб | Мутировавший | Эволюционировавший |
44-
|-------------|--------------|-------------------|
45-
| Зомби | Гниющий Странник | Порченый Бродяга |
46-
| Скелет | Вечный Часовой | Костяной Отзвук |
47-
| Крипер | Испепеляющий Гость | Грозовой Разрыв |
48-
| Паук | Шёлковый Убийца | Тенетный Властитель |
49-
| Эндермен | Бездонный Скиталец | Пространственный Разлом |
50-
| Ведьма | Болотная Зельеварка | Теневая Колдунья |
51-
| Фантом | Ночной Кошмар | Эфирный Крик |
52-
| Блейз | Огненный Дух | Адское Ядро |
53-
| Гаст | Туманный Призрак | Небесный Плач |
54-
| И ещё 15+ типов мобов! | | |
43+
| Обычный моб | Мутировавший | Эволюционировавший |
44+
|------------------------|---------------------|-------------------------|
45+
| Зомби | Гниющий Странник | Порченый Бродяга |
46+
| Скелет | Вечный Часовой | Костяной Отзвук |
47+
| Крипер | Испепеляющий Гость | Грозовой Разрыв |
48+
| Паук | Шёлковый Убийца | Тенетный Властитель |
49+
| Эндермен | Бездонный Скиталец | Пространственный Разлом |
50+
| Ведьма | Болотная Зельеварка | Теневая Колдунья |
51+
| Фантом | Ночной Кошмар | Эфирный Крик |
52+
| Блейз | Огненный Дух | Адское Ядро |
53+
| Гаст | Туманный Призрак | Небесный Плач |
54+
| И ещё 25+ типов мобов! | | |
5555

5656
## ⚙️ Технические характеристики
5757

@@ -74,6 +74,26 @@ SmartMobs - это инновационный плагин для Minecraft, к
7474

7575
```
7676
# Настройки SmartMobs
77+
# Сообщения плагина
78+
messages:
79+
# Общие сообщения
80+
no-permission: "<red>❌ У вас нет прав на использование этой команды."
81+
only-players: "<red>❌ Только игрок может спавнить мобов."
82+
unknown-subcommand: "<red>❌ Неизвестная подкоманда."
83+
84+
# Команда spawn
85+
spawn-usage: "<yellow>Использование: /smartmobs spawn <mob> <hardened|elite>"
86+
spawn-no-permission: "<red>❌ У вас нет прав на спавн мобов."
87+
spawn-mob-disabled: "<red>❌ Моб <white>{mob}</white> отключён в конфиге."
88+
spawn-unknown-mob: "<red>❌ Неизвестный тип моба: <white>{mob}"
89+
spawn-not-living: "<red>❌ Этот тип не является живым существом."
90+
spawn-unknown-variant: "<red>❌ Неизвестный вариант: <white>{variant}"
91+
spawn-success: "<green>✔ Заспавнен <yellow>{variant}</yellow> <gray>{mob}</gray>."
92+
93+
# Команда reload
94+
reload-no-permission: "<red>❌ У вас нет прав на перезагрузку плагина."
95+
reload-success: "<green>✔ Конфиг SmartMobs перезагружен."
96+
7797
# Вероятности появления различных типов мобов
7898
chances:
7999
hardened: 0.10 # Начальный шанс появления hardened моба

build.gradle

Lines changed: 1 addition & 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.1.0'
6+
version = '1.2.0'
77

88
java {
99
toolchain {

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

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

3-
import org.bukkit.NamespacedKey;
43
import org.bukkit.persistence.PersistentDataType;
54
import org.bukkit.persistence.PersistentDataContainer;
65
import org.bukkit.entity.*;
@@ -21,18 +20,19 @@
2120
public class AbilityListener implements Listener {
2221
private final Random random = new Random();
2322

24-
public AbilityListener() {}
23+
public AbilityListener() {
24+
}
2525

2626
// ========== SKELETON ==========
2727
@EventHandler
2828
public void onEntityShootBow(EntityShootBowEvent event) {
29-
if (!(event.getEntity() instanceof Skeleton skeleton)) return;
29+
if (!(event.getEntity() instanceof AbstractSkeleton skeleton)) return;
3030

3131
PersistentDataContainer pdc = skeleton.getPersistentDataContainer();
3232

3333
// Получаем множитель скорости
3434
Double speedMultiplier = pdc.get(MobKeys.ARROW_SPEED_MULTIPLIER, PersistentDataType.DOUBLE);
35-
if (speedMultiplier != null && event.getProjectile() != null) {
35+
if (speedMultiplier != null) {
3636
Vector velocity = applySpeedAndTrajectoryCorrection(skeleton, event.getProjectile().getVelocity(), speedMultiplier);
3737
event.getProjectile().setVelocity(velocity);
3838
}
@@ -66,7 +66,7 @@ public void run() {
6666
}
6767

6868
// Общий метод для коррекции скорости и траектории
69-
private Vector applySpeedAndTrajectoryCorrection(Skeleton skeleton, Vector velocity, double speedMultiplier) {
69+
private Vector applySpeedAndTrajectoryCorrection(AbstractSkeleton skeleton, Vector velocity, double speedMultiplier) {
7070
Vector result = velocity.clone().normalize().multiply(velocity.length() * speedMultiplier);
7171

7272
LivingEntity target = skeleton.getTarget();
@@ -134,7 +134,7 @@ public void onEndermanTeleport(EntityTeleportEvent event) {
134134

135135
Double teleportRange = pdc.get(MobKeys.TELEPORT_RANGE, PersistentDataType.DOUBLE);
136136

137-
if (teleportRange != null) {
137+
if (teleportRange != null && event.getTo() != null) {
138138
Vector dir = event.getTo().toVector().subtract(event.getFrom().toVector());
139139
event.setTo(event.getFrom().clone().add(dir.multiply(teleportRange)));
140140
}
@@ -145,7 +145,7 @@ public void onEntityDamage(EntityDamageEvent event) {
145145
if (!(event.getEntity() instanceof Enderman enderman)) return;
146146

147147
if (event.getCause() == EntityDamageEvent.DamageCause.DROWNING ||
148-
event.getCause() == EntityDamageEvent.DamageCause.CONTACT) {
148+
event.getCause() == EntityDamageEvent.DamageCause.CONTACT) {
149149

150150
// Проверяем, имеет ли эндермен иммунитет к воде
151151
if (!enderman.getPersistentDataContainer().has(MobKeys.WATER_RESISTANT, PersistentDataType.BYTE)) {
@@ -166,12 +166,12 @@ public void onPotionSplash(PotionSplashEvent event) {
166166
if (potionStrength != null) {
167167
for (PotionEffect effect : event.getPotion().getEffects()) {
168168
PotionEffect newEffect = new PotionEffect(
169-
effect.getType(),
170-
Math.max(1, (int) (effect.getDuration() * potionStrength)),
171-
Math.max(0, (int) (effect.getAmplifier() * potionStrength)),
172-
effect.isAmbient(),
173-
effect.hasParticles(),
174-
effect.hasIcon()
169+
effect.getType(),
170+
Math.max(1, (int) (effect.getDuration() * potionStrength)),
171+
Math.max(0, (int) (effect.getAmplifier() * potionStrength)),
172+
effect.isAmbient(),
173+
effect.hasParticles(),
174+
effect.hasIcon()
175175
);
176176
for (LivingEntity le : event.getAffectedEntities()) le.addPotionEffect(newEffect);
177177
}
@@ -250,7 +250,7 @@ public void onGhastShoot(ProjectileLaunchEvent event) {
250250
Double explosionPower = pdc.get(MobKeys.EXPLOSION_POWER, PersistentDataType.DOUBLE);
251251

252252
if (fireballSpeed != null) proj.setVelocity(proj.getVelocity().multiply(fireballSpeed));
253-
if (explosionPower != null) proj.setYield((float)(proj.getYield() * explosionPower));
253+
if (explosionPower != null) proj.setYield((float) (proj.getYield() * explosionPower));
254254

255255
if (!pdc.has(MobKeys.TRIPLE_SHOT, PersistentDataType.BYTE)) return;
256256

@@ -283,8 +283,8 @@ public void onGhastShoot(ProjectileLaunchEvent event) {
283283
right.setVelocity(rightVel);
284284

285285
if (explosionPower != null) {
286-
left.setYield((float)(left.getYield() * explosionPower));
287-
right.setYield((float)(right.getYield() * explosionPower));
286+
left.setYield((float) (left.getYield() * explosionPower));
287+
right.setYield((float) (right.getYield() * explosionPower));
288288
}
289289
}
290290

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

Lines changed: 65 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
package com.flyaway.smartmobs;
22

33
import org.bukkit.configuration.file.FileConfiguration;
4-
import org.bukkit.configuration.ConfigurationSection;
54
import org.bukkit.entity.EntityType;
65

7-
import java.util.List;
8-
import java.util.ArrayList;
9-
import java.util.HashMap;
10-
import java.util.Map;
6+
import java.util.*;
117

128
public class ConfigManager {
139

1410
private FileConfiguration config;
15-
private Map<EntityType, Boolean> enabledMobs = new HashMap<>();
16-
private Map<String, Map<EntityType, String>> displayNames = new HashMap<>();
17-
private Map<EntityType, Map<String, Object>> specialAbilities = new HashMap<>();
11+
private final Map<EntityType, Boolean> enabledMobs = new HashMap<>();
12+
private final Map<String, Map<EntityType, String>> displayNames = new HashMap<>();
13+
private final Map<EntityType, Map<String, Object>> specialAbilities = new HashMap<>();
1814

1915
// Вероятности
2016
private double hardenedChance = 0.15;
@@ -28,15 +24,13 @@ public class ConfigManager {
2824
private double hardenedDamageMultiplier = 1.25;
2925
private double hardenedKnockbackResistance = 0.5;
3026
private boolean hardenedNameVisible = true;
31-
private int hardenedShowDuration = 3;
3227

3328
// Множители для elite
3429
private double eliteHpMultiplier = 1.5;
3530
private double eliteDamageMultiplier = 1.5;
3631
private double eliteSpeedMultiplier = 1.4;
3732
private double eliteKnockbackResistance = 0.8;
3833
private boolean eliteNameVisible = true;
39-
private int eliteShowDuration = 3;
4034
private boolean eliteStrengthEnabled = true;
4135
private int eliteStrengthLevel = 0;
4236

@@ -114,7 +108,6 @@ private void loadHardenedSettings() {
114108
hardenedDamageMultiplier = config.getDouble("hardened.damage-multiplier", hardenedDamageMultiplier);
115109
hardenedKnockbackResistance = config.getDouble("hardened.knockback-resistance", hardenedKnockbackResistance);
116110
hardenedNameVisible = config.getBoolean("hardened.name-visible", hardenedNameVisible);
117-
hardenedShowDuration = config.getInt("hardened.show-duration", hardenedShowDuration);
118111
}
119112

120113
private void loadEliteSettings() {
@@ -124,7 +117,6 @@ private void loadEliteSettings() {
124117
eliteSpeedMultiplier = config.getDouble("elite.speed-multiplier", eliteSpeedMultiplier);
125118
eliteKnockbackResistance = config.getDouble("elite.knockback-resistance", eliteKnockbackResistance);
126119
eliteNameVisible = config.getBoolean("elite.name-visible", eliteNameVisible);
127-
eliteShowDuration = config.getInt("elite.show-duration", eliteShowDuration);
128120
eliteStrengthEnabled = config.getBoolean("elite.strength.enabled", eliteStrengthEnabled);
129121
eliteStrengthLevel = config.getInt("elite.strength.level", eliteStrengthLevel);
130122
}
@@ -190,9 +182,22 @@ private void loadSpecialAbilities() {
190182
}
191183

192184
// Getters
193-
public double getHardenedChance() { return hardenedChance; }
194-
public double getEliteChance() { return eliteChance; }
195-
public boolean isMobEnabled(EntityType type) { return enabledMobs.getOrDefault(type, false); }
185+
public double getHardenedChance() {
186+
return hardenedChance;
187+
}
188+
189+
public double getEliteChance() {
190+
return eliteChance;
191+
}
192+
193+
public boolean isMobEnabled(EntityType type) {
194+
return enabledMobs.getOrDefault(type, false);
195+
}
196+
197+
public String getMessage(String key) {
198+
return config.getString("messages." + key, "message-not-found: " + key);
199+
}
200+
196201
public boolean isMobEnabled(String mobName) {
197202
if (mobName == null) return false;
198203

@@ -204,19 +209,42 @@ public boolean isMobEnabled(String mobName) {
204209
return false;
205210
}
206211
}
207-
public double getHardenedHpMultiplier() { return hardenedHpMultiplier; }
208-
public double getHardenedDamageMultiplier() { return hardenedDamageMultiplier; }
209-
public double getHardenedKnockbackResistance() { return hardenedKnockbackResistance; }
210-
public boolean isHardenedNameVisible() { return hardenedNameVisible; }
211-
public int getHardenedShowDuration() { return hardenedShowDuration; }
212-
public double getEliteHpMultiplier() { return eliteHpMultiplier; }
213-
public double getEliteDamageMultiplier() { return eliteDamageMultiplier; }
214-
public double getEliteSpeedMultiplier() { return eliteSpeedMultiplier; }
215-
public double getEliteKnockbackResistance() { return eliteKnockbackResistance; }
216-
public boolean isEliteNameVisible() { return eliteNameVisible; }
217-
public int getEliteShowDuration() { return eliteShowDuration; }
218-
public boolean isEliteStrengthEnabled() { return eliteStrengthEnabled; }
219-
public int getEliteStrengthLevel() { return eliteStrengthLevel; }
212+
213+
public double getHardenedHpMultiplier() {
214+
return hardenedHpMultiplier;
215+
}
216+
217+
public double getHardenedDamageMultiplier() {
218+
return hardenedDamageMultiplier;
219+
}
220+
221+
public double getHardenedKnockbackResistance() {
222+
return hardenedKnockbackResistance;
223+
}
224+
225+
public double getEliteHpMultiplier() {
226+
return eliteHpMultiplier;
227+
}
228+
229+
public double getEliteDamageMultiplier() {
230+
return eliteDamageMultiplier;
231+
}
232+
233+
public double getEliteSpeedMultiplier() {
234+
return eliteSpeedMultiplier;
235+
}
236+
237+
public double getEliteKnockbackResistance() {
238+
return eliteKnockbackResistance;
239+
}
240+
241+
public boolean isEliteStrengthEnabled() {
242+
return eliteStrengthEnabled;
243+
}
244+
245+
public int getEliteStrengthLevel() {
246+
return eliteStrengthLevel;
247+
}
220248

221249
public List<String> getEnabledMobTypes() {
222250
List<String> result = new ArrayList<>();
@@ -229,7 +257,14 @@ public List<String> getEnabledMobTypes() {
229257
return result;
230258
}
231259

260+
public boolean isNameVisible(String type) {
261+
if (Objects.equals(type, "hardened")) return hardenedNameVisible;
262+
else if (Objects.equals(type, "elite")) return eliteNameVisible;
263+
return false;
264+
}
265+
232266
public String getDisplayName(String type, EntityType mobType) {
267+
if (!isNameVisible(type)) return null;
233268
Map<EntityType, String> names = displayNames.get(type);
234269
return names != null ? names.get(mobType) : null;
235270
}
@@ -265,7 +300,8 @@ private double parseDouble(Object obj, double def) {
265300
if (obj instanceof String str) {
266301
try {
267302
return Double.parseDouble(str);
268-
} catch (NumberFormatException ignored) {}
303+
} catch (NumberFormatException ignored) {
304+
}
269305
}
270306
return def;
271307
}

0 commit comments

Comments
 (0)