Ефекти моба, також відомі як ефекти статусу або просто ефекти, є станом, який може вплинути на сутність. Вони можуть бути позитивні, негативні або нейтральні. Базова гра застосовує ці ефекти різними способами, такими як їжа, зілля тощо.
Команда /effect може бути використана для застосування ефектів до сутності.
Власні ефекти моба
Тут ми додамо новий спеціальний ефект під назвою Tater, який дає вам одне очко досвіду за кожен ігровий такт.
Розширення MobEffect
Створімо спеціальний клас ефекту, розширивши MobEffect, який є базовим класом для всіх ефектів.
java
public class TaterEffect extends MobEffect {
protected TaterEffect() {
// category: StatusEffectCategory - describes if the effect is helpful (BENEFICIAL), harmful (HARMFUL) or useless (NEUTRAL)
// color: int - Color is the color assigned to the effect (in RGB)
super(MobEffectCategory.BENEFICIAL, 0xe9b8b3);
}
// Called every tick to check if the effect can be applied or not
@Override
public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) {
// In our case, we just make it return true so that it applies the effect every tick
return true;
}
// Called when the effect is applied.
@Override
public boolean applyEffectTick(ServerLevel level, LivingEntity entity, int amplifier) {
if (entity instanceof Player) {
((Player) entity).giveExperiencePoints(1 << amplifier); // Higher amplifier gives you experience faster
}
return super.applyEffectTick(level, entity, amplifier);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Реєстрація вашого власного ефекту
Подібно до реєстрації блоків і предметів, ми використовуємо Registry.register для реєстрації нашого власного ефекту в реєстрі MOB_EFFECT. Це можна зробити в нашому ініціалізаторі.
java
public class ExampleModEffects implements ModInitializer {
public static final Holder<MobEffect> TATER =
Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "tater"), new TaterEffect());
@Override
public void onInitialize() {
// ...
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Текстура
Значок ефекту моба — це PNG розміром 18x18, який з’явиться на екрані інвентарю гравця. Розмістіть ваш значок у:
text
resources/assets/example-mod/textures/mob_effect/tater.pngПереклад
Як і будь-який інший переклад, ви можете додати запис із форматом ID "effect.example-mod.effect-identifier": "Value" до мовного файлу.
json
{
"effect.example-mod.tater": "Tater"
}1
2
3
2
3
Застосування ефекту
Варто поглянути на те, як ви зазвичай застосовуєте ефект до сутності.
TIP
Для швидкого тестування краще використати згадану раніше команду /effect:
mcfunction
effect give @p example-mod:tater1
Щоб застосувати внутрішній ефект, потрібно використати метод LivingEntity#addMobEffect, який приймає MobEffectInstance і повертає логічне значення, яке вказує, чи було успішно застосовано ефект.
java
var instance = new MobEffectInstance(ExampleModEffects.TATER, 5 * 20, 0, false, true, true);
entity.addEffect(instance);1
2
2
| Аргумент | Тип | Опис |
|---|---|---|
effect | Holder<MobEffect> | Голдер, який представляє ефект. |
duration | int | Тривалість ефекту в тактах; не секунд |
amplifier | int | Підсилювач до рівня ефекту. Він не відповідає рівню ефекту, а додається зверху. Отже, amplifier 4 => рівень 5 |
ambient | boolean | Це складно. Це в основному вказує, що ефект був доданий середовищем (наприклад, маяк) і не має прямої причини. Якщо true, значок ефекту в HUD буде показане накладення водянистого кольору. |
particles | boolean | Чи слід показувати частинки. |
icon | boolean | Чи показувати значок ефекту в HUD. Ефект буде показано в інвентарі незалежно від цього прапорця. |
INFO
Щоб створити зілля, яке використовує цей ефект, перегляньте зілля.







