This commit is contained in:
Brian Neumann-Fopiano
2026-07-21 12:00:17 -04:00
parent d76dadec30
commit f6f06c1ab9
141 changed files with 10717 additions and 1725 deletions
@@ -19,18 +19,37 @@
package art.arcane.iris.forge;
import art.arcane.iris.modded.ModdedLoader;
import art.arcane.iris.modded.service.ModdedTreeFellerService;
import net.minecraft.commands.Commands;
import net.minecraft.core.BlockPos;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.util.Result;
import net.minecraftforge.event.level.BlockEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.FMLLoader;
import net.minecraftforge.fml.loading.FMLPaths;
import net.minecraftforge.forgespi.language.IModFileInfo;
import net.minecraftforge.server.ServerLifecycleHooks;
import net.minecraftforge.server.permission.PermissionAPI;
import net.minecraftforge.server.permission.nodes.PermissionNode;
import net.minecraftforge.server.permission.nodes.PermissionTypes;
import java.io.File;
import java.nio.file.Path;
public final class ForgeModdedLoader implements ModdedLoader {
public static final PermissionNode<Boolean> TREE_FELLER_PERMISSION = new PermissionNode<>(
"iris",
"treefeller",
PermissionTypes.BOOLEAN,
(player, playerId, contexts) ->
player != null && Commands.LEVEL_GAMEMASTERS.check(player.permissions())
);
@Override
public String platformName() {
return "forge";
@@ -73,4 +92,29 @@ public final class ForgeModdedLoader implements ModdedLoader {
IModFileInfo info = ModList.getModFileById("irisworldgen");
return info == null ? null : info.getFile().getFilePath().toFile();
}
@Override
public boolean hasTreeFellerPermission(ServerPlayer player) {
return PermissionAPI.getPermission(player, TREE_FELLER_PERMISSION);
}
@Override
public boolean canTreeFellerBreak(
ServerLevel level,
ServerPlayer player,
BlockPos position,
BlockState state
) {
return ModdedTreeFellerService.runBreakProbe(() -> {
BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(
level,
position,
state,
player,
Result.DEFAULT
);
BlockEvent.BreakEvent.BUS.post(event);
return !event.getResult().isDenied();
});
}
}
@@ -65,6 +65,10 @@ public final class IrisForgeBlockLootModifier extends LootModifier {
if (result == null) {
return generatedLoot;
}
if (result.routeCombinedDrops(generatedLoot)) {
generatedLoot.clear();
return generatedLoot;
}
if (result.replaceVanillaDrops()) {
generatedLoot.clear();
}
@@ -44,12 +44,15 @@ import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.event.server.ServerStoppingEvent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.loot.IGlobalLootModifier;
import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.eventbus.api.listener.Priority;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.FMLLoader;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.server.permission.events.PermissionGatherEvent;
import java.util.function.Predicate;
@@ -80,6 +83,11 @@ public final class IrisForgeBootstrap {
ModdedEngineBootstrap.levelLoaded(level);
}
});
LevelEvent.Unload.BUS.addListener((LevelEvent.Unload event) -> {
if (event.getLevel() instanceof ServerLevel level) {
ModdedEngineBootstrap.levelUnloaded(level);
}
});
PlayerEvent.PlayerLoggedInEvent.BUS.addListener((PlayerEvent.PlayerLoggedInEvent event) -> {
if (event.getEntity() instanceof ServerPlayer player) {
ModdedProtocolHandler.onPlayerJoin(player);
@@ -96,11 +104,32 @@ public final class IrisForgeBootstrap {
}
});
RegisterCommandsEvent.BUS.addListener((RegisterCommandsEvent event) -> IrisModdedCommands.register(event.getDispatcher()));
PermissionGatherEvent.Nodes.BUS.addListener((PermissionGatherEvent.Nodes event) ->
event.addNodes(ForgeModdedLoader.TREE_FELLER_PERMISSION));
BlockEvent.BreakEvent.BUS.addListener((BlockEvent.BreakEvent event) -> {
if (event.getLevel() instanceof ServerLevel level && !event.getResult().isDenied()) {
ModdedBlockBreakHandler.prepare(level, event.getPos(), event.getState());
if (event.getLevel() instanceof ServerLevel level
&& event.getPlayer() instanceof ServerPlayer player
&& !event.getResult().isDenied()) {
ModdedBlockBreakHandler.prepare(level, player, event.getPos(), event.getState());
}
});
BlockEvent.EntityPlaceEvent.BUS.addListener(Priority.MONITOR, false, (BlockEvent.EntityPlaceEvent event) -> {
if (!(event instanceof BlockEvent.EntityMultiPlaceEvent)
&& event.getLevel() instanceof ServerLevel level) {
ModdedBlockBreakHandler.clearPlacedProvenance(level, event.getPos());
}
});
BlockEvent.EntityMultiPlaceEvent.BUS.addListener(
Priority.MONITOR,
false,
(BlockEvent.EntityMultiPlaceEvent event) -> {
for (BlockSnapshot snapshot : event.getReplacedBlockSnapshots()) {
if (snapshot.getLevel() instanceof ServerLevel level) {
ModdedBlockBreakHandler.clearPlacedProvenance(level, snapshot.getPos());
}
}
}
);
PlayerInteractEvent.LeftClickBlock.BUS.addListener((Predicate<PlayerInteractEvent.LeftClickBlock>) (PlayerInteractEvent.LeftClickBlock event) ->
ModdedWandService.attackBlock(event.getEntity(), event.getLevel(), event.getHand(), event.getPos()));
PlayerInteractEvent.RightClickBlock.BUS.addListener((Predicate<PlayerInteractEvent.RightClickBlock>) (PlayerInteractEvent.RightClickBlock event) ->