Боевая система

Настоящий .jv модуль с локальным классом и накопительным счётчиком через Variable Bridge.

Этот модуль — реальный код, написанный и проверенный во время стресс-теста версии 1.1: он успешно скомпилировался и выполнился на Paper 26.1.2 / Skript 2.16.1.

// modules/combat_core.jv
class Hit {
    final String attacker;
    final double damage;
    Hit(String attacker, double damage) { this.attacker = attacker; this.damage = damage; }
}

java.util.List<Hit> hits = new java.util.ArrayList<>();
hits.add(new Hit("Zombie", 4.5));
hits.add(new Hit("Skeleton", 3.0));
hits.add(new Hit("Creeper", 22.0));

double total = 0;
StringBuilder summaryBuilder = new StringBuilder();
for (int i = 0; i < hits.size(); i++) {
    Hit hit = (Hit) hits.get(i);
    total += hit.damage;
    if (i > 0) {
        summaryBuilder.append(", ");
    }
    summaryBuilder.append(hit.attacker).append("=").append(hit.damage);
}
String summary = summaryBuilder.toString();

setVar("combat_total_damage", total);
setVar("combat_summary", summary);
setVar("combat_hit_count", hits.size());

sender.sendMessage("[Combat] total=" + total + " hits=" + hits.size() + " (" + summary + ")");

Запускается из команды:

command /combat:
    trigger:
        run jv "modules/combat_core.jv"

Что здесь демонстрируется

  • Локальный класс (class Hit { ... }) — работает в Janino без модификатора final, см. Матрицу совместимости.
  • Явный каст (Hit) hits.get(i) — обходит известное ограничение: generic-тип коллекции с локальным классом Janino типизирует как Object.
  • setVar для сбора результатов.

Значения из этого примера видны в рамках одного вызова (например, через /jvdebug vars combat), но не переживают отдельные срабатывания команды. Подробности — Область видимости.