Skip to content
Open
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 build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ repositories {
name = "alessiodp-repo"
url = uri("https://repo.alessiodp.com/releases/")
}

maven("https://mvn.lumine.io/repository/maven-public/") // ModelEngine
}

val pluginVersion = project.properties["pluginVersion"]
Expand All @@ -79,6 +81,8 @@ dependencies {
compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.13")
compileOnly("net.luckperms:api:5.5")
compileOnly("com.alessiodp.parties:parties-api:3.2.16")
compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.8")
compileOnly("com.github.retrooper:packetevents-spigot:2.9.5")
compileOnly(files("libs/DungeonMMO.jar"))
compileOnly(files("libs/OBTeam.jar"))
compileOnly(files("libs/GSit-2.4.2.jar"))
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/jp/mincra/mincramagics/MincraMagics.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.civious.dungeonmmo.api.DungeonMMOAPI;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import io.th0rgal.oraxen.api.OraxenItems;
import io.th0rgal.oraxen.mechanics.MechanicsManager;
import jp.mincra.bkvfx.BKVfx;
Expand All @@ -19,6 +21,7 @@
import jp.mincra.mincramagics.hud.DamageIndicator;
import jp.mincra.mincramagics.hud.HudManager;
import jp.mincra.mincramagics.oraxen.mechanic.artifact.ArtifactMechanicFactory;
import jp.mincra.mincramagics.oraxen.mechanic.broom.BroomMechanicFactory;
import jp.mincra.mincramagics.oraxen.mechanic.gui.GUIMechanicFactory;
import jp.mincra.mincramagics.oraxen.mechanic.material.MaterialMechanicFactory;
import jp.mincra.mincramagics.party.OBTeamWrapper;
Expand Down Expand Up @@ -60,10 +63,19 @@ public final class MincraMagics extends JavaPlugin {

private static JobRewardDao jobRewardDao;

@Override
public void onLoad() {
// PacketEvents の初期化 (Oraxen や ModelEngine より先に)
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this));
PacketEvents.getAPI().load();
}

@Override
public void onEnable() {
INSTANCE = this;

PacketEvents.getAPI().init();

// Managers
audiences = BukkitAudiences.create(this);
protocolManager = ProtocolLibrary.getProtocolManager();
Expand Down Expand Up @@ -102,6 +114,7 @@ public void onEnable() {
MechanicsManager.registerMechanicFactory("artifact", new ArtifactMechanicFactory("artifact"), true);
MechanicsManager.registerMechanicFactory("material", new MaterialMechanicFactory("material"), true);
MechanicsManager.registerMechanicFactory("gui", new GUIMechanicFactory("gui"), true);
MechanicsManager.registerMechanicFactory("broom", new BroomMechanicFactory("broom"), true);
OraxenItems.loadItems();

// Skills
Expand Down Expand Up @@ -164,13 +177,15 @@ public void onEnable() {
@Override
public void onDisable() {
damageIndicator.removeAll();
PacketEvents.getAPI().terminate();
}

public void reload() {
configManager.reloadConfigs();
MechanicsManager.registerMechanicFactory("artifact", new ArtifactMechanicFactory("artifact"), true);
MechanicsManager.registerMechanicFactory("material", new MaterialMechanicFactory("material"), true);
MechanicsManager.registerMechanicFactory("gui", new GUIMechanicFactory("gui"), true);
MechanicsManager.registerMechanicFactory("broom", new BroomMechanicFactory("broom"), true);
OraxenItems.loadItems();
Fonts.reload();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package jp.mincra.mincramagics.domain.refinement;

import io.th0rgal.oraxen.items.ItemBuilder;
import jp.mincra.mincramagics.MincraMagics;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Tag;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.inventory.EquipmentSlotGroup;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
* 精錬値の効果を適用するクラス
*/
public class RefinementEffect {
private static final Map<ItemType, Map<Attribute, Function<Integer, Double>>> attrEffects = Map.of(
ItemType.ARMOR, Map.of(
Attribute.ARMOR, (level) -> level * 0.01,
Attribute.ARMOR_TOUGHNESS, (level) -> level * 0.001
),
ItemType.SWORD, Map.of(
Attribute.ATTACK_DAMAGE, (level) -> switch (level) {
case 13 -> 0.69;
case 14 -> 0.96;
case 15 -> 1.25;
default -> level * 0.01;
}
)
);
private static final Map<ItemType, EquipmentSlotGroup> slotGroups = Map.of(
ItemType.ARMOR, EquipmentSlotGroup.ARMOR,
ItemType.SWORD, EquipmentSlotGroup.MAINHAND
);
@Deprecated
private static final NamespacedKey ATTRIBUTE_REFINE_KEY = new NamespacedKey(MincraMagics.getInstance(), "refine");
@Deprecated
private static final NamespacedKey ATTRIBUTE_REFINE_RATE_KEY = new NamespacedKey(MincraMagics.getInstance(), "refine_rate");

private final JavaPlugin plugin;

public RefinementEffect(JavaPlugin plugin) {
this.plugin = plugin;
}

/**
* 精錬レベルに応じたエフェクトを追加
* - 武器の場合: attribute_modifiers.attack_damage +1% * refineLevel (<+13), +169% (+13), +196% (+14), +225% (+15)
* - 防具の場合: attribute_modifiers.armor +1% * refineLevel, attribute_modifiers.armor_toughness +0.1% * refineLevel
* @param builder
* @param refineLevel
*/
public void apply(ItemBuilder builder, ItemStack item, int refineLevel) {
if (refineLevel <= 0) return;

// 初期化 (全消去)
for (final var attr : AttributeHelper.allAttributes) {
builder.removeAttributeModifiers(attr, refineEffectKey(attr));
builder.removeAttributeModifiers(attr, defaultValueKey(attr));
}

// デフォルト値を追加
for (final var entry : AttributeHelper.defaultAttribute(item.getType()).entrySet()) {
final var attr = entry.getKey();
final var modifier = entry.getValue();
builder.addAttributeModifiers(attr, new AttributeModifier(defaultValueKey(attr), modifier.getAmount(), modifier.getOperation(), modifier.getSlotGroup()));
}

// refinement 強化の modifier を追加
final var itemType = ItemType.fromMaterial(item.getType());
for (final var entry : attrEffects.get(itemType).entrySet()) {
final var attr = entry.getKey();
final var amount = entry.getValue().apply(refineLevel);
builder.addAttributeModifiers(attr, new AttributeModifier(refineEffectKey(attr), amount, AttributeModifier.Operation.ADD_SCALAR, slotGroups.get(itemType)));
}

// 古い NamespacedKey の attributeModifier を削除
builder.removeAttributeModifiers(Attribute.ATTACK_DAMAGE, ATTRIBUTE_REFINE_KEY);
builder.removeAttributeModifiers(Attribute.ATTACK_DAMAGE, ATTRIBUTE_REFINE_RATE_KEY);
builder.removeAttributeModifiers(Attribute.ARMOR, ATTRIBUTE_REFINE_KEY);
builder.removeAttributeModifiers(Attribute.ARMOR, ATTRIBUTE_REFINE_RATE_KEY);
builder.removeAttributeModifiers(Attribute.ARMOR_TOUGHNESS, ATTRIBUTE_REFINE_KEY);
builder.removeAttributeModifiers(Attribute.ARMOR_TOUGHNESS, ATTRIBUTE_REFINE_RATE_KEY);

builder.clearItemStack();
}

private NamespacedKey refineEffectKey(Attribute attribute) {
return new NamespacedKey(plugin, "refine_" + attribute.key().value());
}

// アイテムデフォルト値の attributeModifier のためのキー
private NamespacedKey defaultValueKey(Attribute attribute) {
return new NamespacedKey(plugin, "default_" + attribute.key().value());
}
}

enum ItemType {
ARMOR,
SWORD;

public static ItemType fromMaterial(Material material) {
if (Tag.ITEMS_HEAD_ARMOR.isTagged(material) ||
Tag.ITEMS_CHEST_ARMOR.isTagged(material) ||
Tag.ITEMS_LEG_ARMOR.isTagged(material) ||
Tag.ITEMS_FOOT_ARMOR.isTagged(material)
) return ARMOR;

return SWORD;
}
}

class AttributeHelper {
static final List<Attribute> allAttributes = List.of(
Attribute.MAX_HEALTH,
Attribute.FOLLOW_RANGE,
Attribute.KNOCKBACK_RESISTANCE,
Attribute.MOVEMENT_SPEED,
Attribute.FLYING_SPEED,
Attribute.ATTACK_DAMAGE,
Attribute.ATTACK_KNOCKBACK,
Attribute.ATTACK_SPEED,
Attribute.ARMOR,
Attribute.ARMOR_TOUGHNESS,
Attribute.FALL_DAMAGE_MULTIPLIER,
Attribute.LUCK,
Attribute.MAX_ABSORPTION,
Attribute.SAFE_FALL_DISTANCE,
Attribute.SCALE,
Attribute.STEP_HEIGHT,
Attribute.GRAVITY,
Attribute.JUMP_STRENGTH,
Attribute.BURNING_TIME,
Attribute.CAMERA_DISTANCE,
Attribute.EXPLOSION_KNOCKBACK_RESISTANCE,
Attribute.MOVEMENT_EFFICIENCY,
Attribute.OXYGEN_BONUS,
Attribute.WATER_MOVEMENT_EFFICIENCY,
Attribute.TEMPT_RANGE,
Attribute.BLOCK_INTERACTION_RANGE,
Attribute.ENTITY_INTERACTION_RANGE,
Attribute.BLOCK_BREAK_SPEED,
Attribute.MINING_EFFICIENCY,
Attribute.SNEAKING_SPEED,
Attribute.SUBMERGED_MINING_SPEED,
Attribute.SWEEPING_DAMAGE_RATIO,
Attribute.SPAWN_REINFORCEMENTS,
Attribute.WAYPOINT_TRANSMIT_RANGE,
Attribute.WAYPOINT_RECEIVE_RANGE
);

public static Map<Attribute, AttributeModifier> defaultAttribute(Material material) {
final var item = new ItemStack(material);
final var meta = item.getItemMeta();

if (meta == null) return Map.of();

return allAttributes.stream().map(attr -> {
final var modifiers = meta.getAttributeModifiers(attr);
if (modifiers == null) return null;
final var first = modifiers.stream().findFirst();
return first.map(attributeModifier -> Map.entry(attr, attributeModifier)).orElse(null);
})
.filter(Objects::nonNull)
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));

}
}
Loading