fixed things

This commit is contained in:
Indyuce 2021-08-26 11:19:13 +02:00
parent f5ea91fd44
commit 7082cae74d
7 changed files with 336 additions and 444 deletions

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.Indyuce</groupId>
<artifactId>MMOItems</artifactId>
<version>6.6.0</version>
<version>6.6.1</version>
<name>MMOItems</name>
<description>A great item solution for your RPG server!!</description>
@ -139,7 +139,7 @@
<dependency>
<groupId>io.lumine</groupId>
<artifactId>MythicLib</artifactId>
<version>1.1.2</version>
<version>1.1.3</version>
<scope>provided</scope>
</dependency>

View File

@ -4,9 +4,11 @@ import com.evill4mer.RealDualWield.Api.PlayerDamageEntityWithOffhandEvent;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.api.stat.StatMap;
import io.lumine.mythic.lib.damage.DamageMetadata;
import io.lumine.mythic.lib.damage.DamageType;
import net.Indyuce.mmoitems.api.ItemAttackMetadata;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.TypeSet;
import net.Indyuce.mmoitems.api.interaction.weapon.Weapon;
import net.Indyuce.mmoitems.api.player.PlayerData;
@ -20,8 +22,11 @@ public class RealDualWieldHook implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void a(PlayerDamageEntityWithOffhandEvent event) {
// Citizens NPC support; also check if it's not a useless event
if (event.getDamage() == 0 || !(event.getEntity() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC"))
/*
* Citizens and Sentinels NPC support; damage = 0 check to ignore safety
* checks; check for entity attack
*/
if (event.getDamage() == 0 || !(event.getEntity() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC") || event.getPlayer().hasMetadata("NPC"))
return;
// Custom damage check
@ -30,15 +35,16 @@ public class RealDualWieldHook implements Listener {
return;
/*
* Must apply attack conditions before apply any effects.
* The event must be cancelled before anything is applied
* Must apply attack conditions before apply any effects. the event must
* be cancelled before anything is applied
*/
Player player = event.getPlayer();
PlayerData playerData = PlayerData.get(player);
NBTItem offhandItem = MythicLib.plugin.getVersion().getWrapper().getNBTItem(player.getInventory().getItemInOffHand());
NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(player.getInventory().getItemInMainHand());
ItemAttackMetadata attackMeta = null;
if (offhandItem.hasType()) {
Weapon weapon = new Weapon(playerData, offhandItem);
if (item.hasType() && Type.get(item.getType()) != Type.BLOCK) {
Weapon weapon = new Weapon(playerData, item);
if (weapon.getMMOItem().getType().getItemSet() == TypeSet.RANGE) {
event.setCancelled(true);
@ -49,11 +55,22 @@ public class RealDualWieldHook implements Listener {
event.setCancelled(true);
return;
}
if (!weapon.handleTargetedAttack(attackMeta = getAttack(playerData, event), target).isSuccessful()) {
event.setCancelled(true);
return;
}
}
// Cast on-hit abilities and add extra damage to the Bukkit event
ItemAttackMetadata attack = new ItemAttackMetadata(new DamageMetadata(event.getDamage(), DamageType.WEAPON, DamageType.PHYSICAL), playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.OFF_HAND));
attack.applyEffects(offhandItem, target);
event.setDamage(attack.getDamage().getDamage());
// Cast on-hit abilities and add the extra damage to the damage event
(attackMeta == null ? attackMeta = getAttack(playerData, event) : attackMeta).applyEffects(item, target);
// Finally update Bukkit event
event.setDamage(attackMeta.getDamage().getDamage());
}
private ItemAttackMetadata getAttack(PlayerData playerData, PlayerDamageEntityWithOffhandEvent event) {
StatMap.CachedStatMap cachedStatMap = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.OFF_HAND);
return new ItemAttackMetadata(new DamageMetadata(event.getDamage(), DamageType.WEAPON, DamageType.PHYSICAL), cachedStatMap);
}
}

View File

@ -1,126 +0,0 @@
package net.Indyuce.mmoitems.comp.mythicmobs;
import io.lumine.xikage.mythicmobs.MythicMobs;
import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitItemStack;
import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicDropLoadEvent;
import io.lumine.xikage.mythicmobs.drops.Drop;
import io.lumine.xikage.mythicmobs.drops.DropMetadata;
import io.lumine.xikage.mythicmobs.drops.IMultiDrop;
import io.lumine.xikage.mythicmobs.drops.LootBag;
import io.lumine.xikage.mythicmobs.drops.droppables.ItemDrop;
import io.lumine.xikage.mythicmobs.io.MythicLineConfig;
import io.lumine.xikage.mythicmobs.skills.SkillMetadata;
import io.lumine.xikage.mythicmobs.skills.placeholders.Placeholder;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.droptable.item.DropItem;
import net.Indyuce.mmoitems.api.droptable.item.MMOItemDropItem;
import net.Indyuce.mmoitems.api.player.PlayerData;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.util.logging.Level;
public class MythicMobsHook implements Listener {
/*
* has been moved over to MythicMobs because MMOItems needs access to MythicMobs
* abilities and therefore must be enabled after MythicMobs
*/
/*
* MUST NOT BE REMOVED - this class must be kept ad vitam aeternam in case we
* need to change something in MM compatibility and sent it back to MM devs
*/
public MythicMobsHook() {
/*MythicMobs.inst().getPlaceholderManager().register("mmoitems.skill",
Placeholder.meta((metadata, arg) -> String.valueOf(PlayerData
.get(metadata.getCaster().getEntity().getUniqueId()).getAbilityData().getCachedModifier(arg))));*/
Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin);
// MMOItems.plugin.getCrafting().registerIngredient("mythicitem", config -> new MythicItemIngredient(config),
// new ConditionalDisplay("&8" + AltChar.check + " &7#amount# #item#", "&c" + AltChar.cross + " &7#amount# #item#"),
// nbt -> nbt.hasTag("MYTHIC_TYPE"), nbt -> nbt.getString("MYTHIC_TYPE").toLowerCase());
}
/*
* registers custom drop types
*/
@EventHandler
public void a(MythicDropLoadEvent event) {
if (event.getDropName().equalsIgnoreCase("mmoitems") || event.getDropName().equalsIgnoreCase("mmoitem"))
event.register(new MMOItemsDrop(event.getConfig()));
}
/*
* register placeholders when MM is reloaded. the skill placeholder let players
* retrieve cached ability values.
*/
/*@EventHandler
public void b(MythicReloadedEvent event) {
MythicMobs.inst().getPlaceholderManager().register("mmoitems.skill",
Placeholder.meta((metadata, arg) -> String.valueOf(PlayerData
.get(metadata.getCaster().getEntity().getUniqueId()).getAbilityData().getCachedModifier(arg))));
}*/
private void registerSkillPlaceholders() {
/*
Placeholder.meta((meta, arg) -> {
SkillMetadata skillMeta = (SkillMetadata) meta;
skillMeta.getVariables().get("MMOStats");
return null;
} );
MythicMobs.inst().getPlaceholderManager().register("modifier",
Placeholder.meta((metadata, arg) -> String.valueOf(PlayerData
.get(metadata.getCaster().getEntity().getUniqueId()).getAbilityData().getCachedModifier(arg))));*/
}
public static class MMOItemsDrop extends Drop implements IMultiDrop {
private DropItem dropItem;
public MMOItemsDrop(MythicLineConfig config) {
super(config.getLine(), config);
/*
* TODO move try-catch to the MythicDropLoadEvent method and make the dropItem
* field final
*/
try {
String typeFormat = config.getString("type").toUpperCase().replace("-", "_");
Validate.isTrue(MMOItems.plugin.getTypes().has(typeFormat),
"Could not find type with ID " + typeFormat);
Type type = MMOItems.plugin.getTypes().get(typeFormat);
String id = config.getString("id");
Validate.notNull(id, "MMOItems ID cannot be null");
dropItem = new MMOItemDropItem(type, id, 1, config.getDouble("unidentified", 0), 1, 1);
} catch (IllegalArgumentException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not load drop item: " + exception.getMessage());
}
}
/*
* TODO remove null check with extra method from MythicDropLoadEvent
*/
@SuppressWarnings("deprecation")
@Override
public LootBag get(DropMetadata metadata) {
LootBag loot = new LootBag(metadata);
if (dropItem != null)
// TODO fix null
loot.add(new ItemDrop(this.getLine(), (MythicLineConfig) this.getConfig(),
new BukkitItemStack(dropItem.getItem(null, 1))));
return loot;
}
}
}

View File

@ -10,10 +10,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
/*
* this loads mmoitems comp for mythic mobs
* since MythicMobsHook is purely for documentation
*/
public class MythicMobsLoader {
public MythicMobsLoader() {

View File

@ -58,12 +58,13 @@ public class MythicMobsAbility extends Ability<MythicMobsAbilityMetadata> {
targetEntities.add(BukkitAdapter.adapt(target));
SkillMetadata data = new SkillMetadata(SkillTrigger.API, caster, trigger, BukkitAdapter.adapt(attackMeta.getDamager().getEyeLocation()), targetEntities, targetLocations, 1);
SkillMetadata data = new SkillMetadata(SkillTrigger.CAST, caster, trigger, BukkitAdapter.adapt(attackMeta.getDamager().getEyeLocation()), targetEntities, targetLocations, 1);
// Stats are cached inside a variable.
/*data.getVariables().putObject();*/
// Stats are cached inside a variable
data.getVariables().putObject("MMOStatMap", attackMeta.getStats());
data.getVariables().putObject("MMOSkill", ability.getAbility());
if (skill.usable(data, SkillTrigger.API))
if (skill.usable(data, SkillTrigger.CAST))
skill.execute(data);
else
attackMeta.setSuccessful(false);

View File

@ -119,12 +119,11 @@ public class ItemUse implements Listener {
if (MythicLib.plugin.getDamage().findInfo(target) != null)
return;
Player player = (Player) event.getDamager();
/*
* Must apply attack conditions before apply any effects. the event must
* be cancelled before anything is applied
*/
Player player = (Player) event.getDamager();
PlayerData playerData = PlayerData.get(player);
NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(player.getInventory().getItemInMainHand());
ItemAttackMetadata attackMeta = null;
@ -142,22 +141,25 @@ public class ItemUse implements Listener {
return;
}
StatMap.CachedStatMap cachedStatMap = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND);
attackMeta = new ItemAttackMetadata(new DamageMetadata(event.getDamage(), DamageType.WEAPON, DamageType.PHYSICAL), cachedStatMap);
if (!weapon.handleTargetedAttack(attackMeta, target).isSuccessful()) {
if (!weapon.handleTargetedAttack(attackMeta = getAttack(playerData, event), target).isSuccessful()) {
event.setCancelled(true);
return;
}
}
// Cast on-hit abilities and add the extra damage to the damage event
attackMeta.applyEffects(item, target);
(attackMeta == null ? attackMeta = getAttack(playerData, event) : attackMeta).applyEffects(item, target);
// Finally update Bukkit event
event.setDamage(attackMeta.getDamage().getDamage());
}
/*
private ItemAttackMetadata getAttack(PlayerData playerData, EntityDamageByEntityEvent event) {
StatMap.CachedStatMap cachedStatMap = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND);
return new ItemAttackMetadata(new DamageMetadata(event.getDamage(), DamageType.WEAPON, DamageType.PHYSICAL), cachedStatMap);
}
/**
* Event priority set to LOW to fix an infinite-exp glitch with
* MMOCore. MMOCore experience source listens on HIGH and must be
* higher than this event otherwise the exp is given even if the

View File

@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import io.lumine.mythic.lib.comp.mythicmobs.MythicSkillInfo;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
@ -13,7 +14,7 @@ import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.ability.Ability.CastingMode;
public class AbilityData {
public class AbilityData implements MythicSkillInfo {
private final Ability ability;
private final CastingMode castMode;
private final Map<String, Double> modifiers = new HashMap<>();
@ -90,8 +91,9 @@ public class AbilityData {
return modifiers.containsKey(path);
}
@Override
public double getModifier(String path) {
return modifiers.containsKey(path) ? modifiers.get(path) : ability.getDefaultValue(path);
return modifiers.getOrDefault(path, ability.getDefaultValue(path));
}
public JsonObject toJson() {