Skip to content

Commit

Permalink
Fire some events on the forge bus
Browse files Browse the repository at this point in the history
  • Loading branch information
noeppi-noeppi committed Oct 24, 2022
1 parent 5730a79 commit b47647b
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/main/java/de/melanx/maledicta/EventListener.java
Expand Up @@ -66,7 +66,7 @@ public void onServerTick(TickEvent.ServerTickEvent event) {
for (ItemStack stack : player.getHandSlots()) {
stack.getCapability(EnergyCollectorImpl.INSTANCE).ifPresent(cap -> {
if (cap.negativeEnergy().test()) {
if (Util.tryToApplyCurse(stack)) {
if (Util.tryToApplyCurse(player, stack)) {
// summon custom lightning
LightningBolt entity = EntityType.LIGHTNING_BOLT.create(player.level);
LightningHelper.setColor(entity, "FF0000");
Expand Down
72 changes: 72 additions & 0 deletions src/main/java/de/melanx/maledicta/api/ApplyItemCurseEvent.java
@@ -0,0 +1,72 @@
package de.melanx.maledicta.api;

import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.eventbus.api.Event;

import javax.annotation.Nullable;

/**
* The event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS} whenever an item could get
* a new curse due to negative energy. The event is cancelable, if canceled, the curse won't be applied. The event
* does not have a result.
*/
public class ApplyItemCurseEvent extends Event {

private final Player player;
private final ItemStack stack;

@Nullable
private Enchantment enchantment;
private boolean force;

public ApplyItemCurseEvent(Player player, ItemStack stack, @Nullable Enchantment enchantment) {
this.player = player;
this.stack = stack;
this.enchantment = enchantment;
this.force = false;
}

public Player getPlayer() {
return player;
}

public ItemStack getStack() {
return stack;
}

/**
* Gets the enchantment that will be applied.
*/
@Nullable
public Enchantment getEnchantment() {
return enchantment;
}

/**
* Gets whether the enchantment is forced (will be applied even if it does not match the ItemStack)
*/
public boolean isForced() {
return force;
}

/**
* Sets the enchantment that will be applied.
*/
public void setEnchantment(@Nullable Enchantment enchantment) {
this.enchantment = enchantment;
}

/**
* Sets whether the enchantment is forced (will be applied even if it does not match the ItemStack)
*/
public void setForced(boolean force) {
this.force = force;
}

@Override
public boolean isCancelable() {
return true;
}
}
63 changes: 63 additions & 0 deletions src/main/java/de/melanx/maledicta/api/MaledictusAuferoEvent.java
@@ -0,0 +1,63 @@
package de.melanx.maledicta.api;

import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.eventbus.api.Event;

import java.util.List;

/**
* The event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS} whenever a lightning bolt
* hits a maledictus aufero. The event is cancelable, if canceled the maledictus aufero won't have any effects on
* the nearby items. The event does not have a result.
*/
public class MaledictusAuferoEvent extends Event {

private final Level level;
private final BlockState state;
private final BlockPos pos;
private final List<ItemEntity> allItems;
private final List<ItemEntity> cursedItems;

public MaledictusAuferoEvent(Level level, BlockState state, BlockPos pos, List<ItemEntity> allItems, List<ItemEntity> cursedItems) {
this.level = level;
this.state = state;
this.pos = pos.immutable();
this.allItems = List.copyOf(allItems);
this.cursedItems = List.copyOf(cursedItems);
}

public Level getLevel() {
return level;
}

public BlockState getState() {
return state;
}

public BlockPos getPos() {
return pos;
}

/**
* Gets all items in range of the maledictus aufero. These will get their negative energy halved
* and may be enchanted with curses from other items if applicable.
*/
public List<ItemEntity> getAllItems() {
return allItems;
}

/**
* Gets all the cursed items. These will get a curse removed (that may be put onto a different item if applicable).
*/
public List<ItemEntity> getCursedItems() {
return cursedItems;
}

@Override
public boolean isCancelable() {
return true;
}
}
@@ -1,6 +1,7 @@
package de.melanx.maledicta.blocks;

import de.melanx.maledicta.ModConfig;
import de.melanx.maledicta.api.MaledictusAuferoEvent;
import de.melanx.maledicta.capabilities.EnergyCollectorImpl;
import de.melanx.maledicta.lightning.LightningHelper;
import de.melanx.maledicta.network.ModNetwork;
Expand All @@ -20,6 +21,7 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.MinecraftForge;
import org.apache.commons.lang3.tuple.Triple;
import org.moddingx.libx.mod.ModX;
import org.moddingx.libx.registration.Registerable;
Expand Down Expand Up @@ -54,6 +56,8 @@ public void onLightningStrike(@Nonnull BlockState state, @Nonnull Level level, @
List<ItemEntity> cursedItems = items.stream()
.filter(item -> item.getItem().getAllEnchantments().entrySet().stream().anyMatch(entry -> entry.getKey().isCurse()))
.toList();

if (MinecraftForge.EVENT_BUS.post(new MaledictusAuferoEvent(level, state, pos, items, cursedItems))) return;

if (ModConfig.NegativeEnergy.enabled) {
for (ItemEntity item : items) {
Expand Down
13 changes: 11 additions & 2 deletions src/main/java/de/melanx/maledicta/util/Util.java
@@ -1,16 +1,19 @@
package de.melanx.maledicta.util;

import de.melanx.maledicta.Maledicta;
import de.melanx.maledicta.api.ApplyItemCurseEvent;
import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.*;
Expand Down Expand Up @@ -40,15 +43,21 @@ public static boolean isEnchantable(ItemStack stack) {
return stack.getMaxStackSize() == 1 && stack.isDamageableItem();
}

public static boolean tryToApplyCurse(ItemStack stack) {
public static boolean tryToApplyCurse(Player player, ItemStack stack) {
List<Enchantment> possibleEnchantments = new ArrayList<>(ForgeRegistries.ENCHANTMENTS.getValues()).stream().filter(enchantment -> enchantment.isCurse() && enchantment.canEnchant(stack)).toList();
if (possibleEnchantments.isEmpty()) {
return false;
}

RandomSource random = RandomSource.create();
Enchantment enchantment = possibleEnchantments.get(random.nextInt(possibleEnchantments.size()));
if (enchantment.canEnchant(stack) && stack.getEnchantmentLevel(enchantment) <= 0) {

ApplyItemCurseEvent event = new ApplyItemCurseEvent(player, stack, enchantment);
if (MinecraftForge.EVENT_BUS.post(event)) return false;
enchantment = event.getEnchantment();
if (enchantment == null) return false;

if ((event.isForced() || enchantment.canEnchant(stack)) && stack.getEnchantmentLevel(enchantment) <= 0) {
stack.enchant(enchantment, enchantment.getMaxLevel());
return true;
}
Expand Down

0 comments on commit b47647b

Please sign in to comment.