Skip to content

Commit 2934e15

Browse files
committed
fix: omit jackson-core from neoforge jar
Also fixes a newer NeoForge compatibility with ServerExplosionMixin. Fixes #4153
1 parent cd3f230 commit 2934e15

File tree

10 files changed

+488
-138
lines changed

10 files changed

+488
-138
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* This file is part of Sponge, licensed under the MIT License (MIT).
3+
*
4+
* Copyright (c) SpongePowered <https://www.spongepowered.org>
5+
* Copyright (c) contributors
6+
*
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy
8+
* of this software and associated documentation files (the "Software"), to deal
9+
* in the Software without restriction, including without limitation the rights
10+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
* copies of the Software, and to permit persons to whom the Software is
12+
* furnished to do so, subject to the following conditions:
13+
*
14+
* The above copyright notice and this permission notice shall be included in
15+
* all copies or substantial portions of the Software.
16+
*
17+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
* THE SOFTWARE.
24+
*/
25+
package org.spongepowered.forge.mixin.core.world.level;
26+
27+
import net.minecraft.core.BlockPos;
28+
import net.minecraft.server.level.ServerLevel;
29+
import net.minecraft.world.entity.Entity;
30+
import net.minecraft.world.level.ServerExplosion;
31+
import net.minecraft.world.phys.AABB;
32+
import net.minecraft.world.phys.Vec3;
33+
import org.spongepowered.api.event.Cause;
34+
import org.spongepowered.api.event.SpongeEventFactory;
35+
import org.spongepowered.api.event.world.ExplosionEvent;
36+
import org.spongepowered.api.world.explosion.Explosion;
37+
import org.spongepowered.api.world.server.ServerLocation;
38+
import org.spongepowered.api.world.server.ServerWorld;
39+
import org.spongepowered.asm.mixin.Final;
40+
import org.spongepowered.asm.mixin.Mixin;
41+
import org.spongepowered.asm.mixin.Shadow;
42+
import org.spongepowered.asm.mixin.injection.At;
43+
import org.spongepowered.asm.mixin.injection.Redirect;
44+
import org.spongepowered.common.SpongeCommon;
45+
import org.spongepowered.common.event.ShouldFire;
46+
import org.spongepowered.common.event.tracking.PhaseTracker;
47+
import org.spongepowered.common.util.VecHelper;
48+
49+
import java.util.Collections;
50+
import java.util.List;
51+
import java.util.stream.Collectors;
52+
53+
@Mixin(ServerExplosion.class)
54+
public abstract class ServerExplosionMixin_Forge {
55+
56+
// @formatter:off
57+
@Shadow @Final private ServerLevel level;
58+
59+
@Shadow protected abstract boolean shadow$interactsWithBlocks();
60+
// @formatter:on
61+
62+
/**
63+
* These two fields are used in the mixin below, but require a redirect specific for SpongeVanilla
64+
* and SpongeForge as NeoForge makes a change to the method being used here.
65+
*
66+
* @see org.spongepowered.common.mixin.core.world.level.ServerExplosionMixin
67+
*/
68+
private boolean impl$shouldDamageEntities;
69+
private double impl$knockbackMultiplier;
70+
private List<BlockPos> impl$affectedBlocks;
71+
72+
@Redirect(method = "hurtEntities", at = @At(value = "INVOKE",
73+
target = "Lnet/minecraft/server/level/ServerLevel;getEntities(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/AABB;)Ljava/util/List;"))
74+
private List<Entity> forge$throwEventToFilterEntitiesOnHurt(final ServerLevel instance, final Entity sourceEntity, final AABB aabb) {
75+
final List<Entity> entities;
76+
if (this.impl$shouldDamageEntities) {
77+
// filter out invulnerable entities before event
78+
entities = instance.getEntities(sourceEntity, aabb).stream()
79+
.filter(e -> !e.ignoreExplosion((net.minecraft.world.level.Explosion) this))
80+
.toList();
81+
} else {
82+
entities = Collections.emptyList();
83+
}
84+
85+
if (ShouldFire.EXPLOSION_EVENT_DETONATE) {
86+
final var apiWorld = (ServerWorld) this.level;
87+
final var apiEntities = entities.stream().map(org.spongepowered.api.entity.Entity.class::cast).toList();
88+
final var apiBlockPositions = this.impl$affectedBlocks.stream().map(bp -> ServerLocation.of(apiWorld, VecHelper.toVector3i(bp))).toList();
89+
final Cause cause = PhaseTracker.getCauseStackManager().currentCause();
90+
final ExplosionEvent.Detonate event = SpongeEventFactory.createExplosionEventDetonate(cause, apiBlockPositions, apiEntities, (Explosion) this, apiWorld);
91+
if (SpongeCommon.post(event)) {
92+
this.impl$affectedBlocks.clear(); // no blocks affected
93+
return Collections.emptyList(); // no entities affected
94+
}
95+
if (this.shadow$interactsWithBlocks()) {
96+
this.impl$affectedBlocks = event.affectedLocations().stream().map(VecHelper::toBlockPos).collect(Collectors.toList());
97+
}
98+
if (this.impl$shouldDamageEntities) {
99+
return event.entities().stream().map(Entity.class::cast).toList();
100+
}
101+
}
102+
return entities;
103+
}
104+
105+
106+
@Redirect(method = "hurtEntities", at = @At(value = "NEW", target = "(DDD)Lnet/minecraft/world/phys/Vec3;"))
107+
private Vec3 forge$useKnockbackMultiplier(final double $$0, final double $$1, final double $$2) {
108+
// Honor our knockback value from event
109+
return new Vec3($$0 * this.impl$knockbackMultiplier,
110+
$$1 * this.impl$knockbackMultiplier,
111+
$$2 * this.impl$knockbackMultiplier);
112+
}
113+
114+
}
Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
11
{
2-
"required": true,
3-
"parent": "mixins.sponge.parent.json",
4-
"package": "org.spongepowered.forge.mixin.core",
5-
"priority": 1301,
6-
"mixins": [
7-
"api.event.EventMixin_Forge",
8-
"api.event.block.ChangeBlockEvent_AllMixin_Forge",
9-
"api.event.entity.ChangeEntityWorldEvent_PreMixin_Forge",
10-
"api.event.entity.ChangeEventWorldEvent_PostMixin_Forge",
11-
"commands.CommandsMixin_Forge",
12-
"minecraftforge.MinecraftForgeMixin_Forge",
13-
"minecraftforge.event.entity.EntityTravelToDimensionEventMixin_Forge",
14-
"minecraftforge.event.entity.player.PlayerEvent_PlayerChangedDimensionEventMixin_Forge",
15-
"minecraftforge.event.world.BlockEvent_BreakEventMixin_Forge",
16-
"minecraftforge.event.world.BlockEventMixin_Forge",
17-
"minecraftforge.internal.BrandingControlMixin_Forge",
18-
"minecraftforge.registries.ForgeRegistryMixin_Forge",
19-
"minecraftforge.registries.RegistryManagerMixin_Forge",
20-
"network.ConnectionMixin_Forge",
21-
"network.protocol.common.ClientboundCustomPayloadPacketMixin_Forge",
22-
"network.protocol.common.ServerboundCustomPayloadPacketMixin_Forge",
23-
"server.BootstrapMixin_Forge",
24-
"server.MinecraftServerMixin_Forge",
25-
"server.commands.SpreadPlayersCommandMixin_Forge",
26-
"server.level.ServerPlayerMixin_Forge",
27-
"server.network.ServerGamePacketListenerImplMixin_Forge",
28-
"world.entity.LivingEntityMixin_Forge",
29-
"world.entity.LivingEntityMixin_Forge_Attack_Impl",
30-
"world.entity.item.ItemEntityMixin_Forge",
31-
"world.entity.player.PlayerMixin_Forge_Attack_Impl",
32-
"world.entity.vehicle.BoatMixin_Forge",
33-
"world.level.block.FireBlockMixin_Forge",
34-
"world.level.block.entity.AbstractFurnaceBlockEntityMixin_Forge"
35-
],
36-
"client": [
37-
"client.MinecraftMixin_Forge",
38-
"client.main.MainMixin_Forge"
39-
],
40-
"server": [
41-
"server.MainMixin_Forge"
42-
]
2+
"required": true,
3+
"parent": "mixins.sponge.parent.json",
4+
"package": "org.spongepowered.forge.mixin.core",
5+
"priority": 1301,
6+
"mixins": [
7+
"api.event.EventMixin_Forge",
8+
"api.event.block.ChangeBlockEvent_AllMixin_Forge",
9+
"api.event.entity.ChangeEntityWorldEvent_PreMixin_Forge",
10+
"api.event.entity.ChangeEventWorldEvent_PostMixin_Forge",
11+
"commands.CommandsMixin_Forge",
12+
"minecraftforge.MinecraftForgeMixin_Forge",
13+
"minecraftforge.event.entity.EntityTravelToDimensionEventMixin_Forge",
14+
"minecraftforge.event.entity.player.PlayerEvent_PlayerChangedDimensionEventMixin_Forge",
15+
"minecraftforge.event.world.BlockEvent_BreakEventMixin_Forge",
16+
"minecraftforge.event.world.BlockEventMixin_Forge",
17+
"minecraftforge.internal.BrandingControlMixin_Forge",
18+
"minecraftforge.registries.ForgeRegistryMixin_Forge",
19+
"minecraftforge.registries.RegistryManagerMixin_Forge",
20+
"network.ConnectionMixin_Forge",
21+
"network.protocol.common.ClientboundCustomPayloadPacketMixin_Forge",
22+
"network.protocol.common.ServerboundCustomPayloadPacketMixin_Forge",
23+
"server.BootstrapMixin_Forge",
24+
"server.MinecraftServerMixin_Forge",
25+
"server.commands.SpreadPlayersCommandMixin_Forge",
26+
"server.level.ServerPlayerMixin_Forge",
27+
"server.network.ServerGamePacketListenerImplMixin_Forge",
28+
"world.entity.LivingEntityMixin_Forge",
29+
"world.entity.LivingEntityMixin_Forge_Attack_Impl",
30+
"world.entity.item.ItemEntityMixin_Forge",
31+
"world.entity.player.PlayerMixin_Forge_Attack_Impl",
32+
"world.entity.vehicle.BoatMixin_Forge",
33+
"world.level.ServerExplosionMixin_Forge",
34+
"world.level.block.FireBlockMixin_Forge",
35+
"world.level.block.entity.AbstractFurnaceBlockEntityMixin_Forge"
36+
],
37+
"client": [
38+
"client.MinecraftMixin_Forge",
39+
"client.main.MainMixin_Forge"
40+
],
41+
"server": [
42+
"server.MainMixin_Forge"
43+
]
4344
}

gradle/verification-metadata.xml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3911,6 +3911,14 @@
39113911
<sha256 value="849395aae6f3db840aae543f2407901e589b5b2b2b1aefaa2ecefef04f84f2c1" origin="Generated by Gradle"/>
39123912
</artifact>
39133913
</component>
3914+
<component group="net.neoforged" name="accesstransformers" version="11.0.1">
3915+
<artifact name="accesstransformers-11.0.1.jar">
3916+
<sha256 value="db59934c1a355e8af08443857c25eed66958b70ba3323485b1eb3dd807efa312" origin="Generated by Gradle"/>
3917+
</artifact>
3918+
<artifact name="accesstransformers-11.0.1.module">
3919+
<sha256 value="6eae5ebf7b69fad34c206bd8c6c04c1569d80febcd055f860113d0361417d689" origin="Generated by Gradle"/>
3920+
</artifact>
3921+
</component>
39143922
<component group="net.neoforged" name="bus" version="8.0.1">
39153923
<artifact name="bus-8.0.1.jar">
39163924
<sha256 value="569cb2776a2179a464a00373a1a4cbfead409567e7d02d4006f46dbbbd043767" origin="Generated by Gradle"/>
@@ -3988,6 +3996,20 @@
39883996
<sha256 value="c89a15d695df791f03d814c04f3a63c0fd65fe5f688933cfd8f3b989d4beb143" origin="Generated by Gradle"/>
39893997
</artifact>
39903998
</component>
3999+
<component group="net.neoforged" name="neoforge" version="21.3.35-beta">
4000+
<artifact name="neoforge-21.3.35-beta-installer.jar">
4001+
<sha256 value="c26a23d54c623f6493787e2b7aa5eb2864d6a86fac425b322ad4ec9283aa3d91" origin="Generated by Gradle"/>
4002+
</artifact>
4003+
<artifact name="neoforge-21.3.35-beta-universal.jar">
4004+
<sha256 value="a4a942ef8915d2464540a632df16f7cdf06eefecbd67bcdf1dc87fad51c6b4e5" origin="Generated by Gradle"/>
4005+
</artifact>
4006+
<artifact name="neoforge-21.3.35-beta-userdev.jar">
4007+
<sha256 value="da7402ac1256a96413e2a8d8eb7f75c86bff2f6dfd547dc69487b713d4033f2f" origin="Generated by Gradle"/>
4008+
</artifact>
4009+
<artifact name="neoforge-21.3.35-beta.module">
4010+
<sha256 value="f29c86be720f8ec62e2e64043c0aabe9e06313a61f34e97a673e149b9e61bbc8" origin="Generated by Gradle"/>
4011+
</artifact>
4012+
</component>
39914013
<component group="net.neoforged" name="neoform" version="1.21.1-20240808.144430">
39924014
<artifact name="neoform-1.21.1-20240808.144430.module">
39934015
<sha256 value="c697a0da4423ac17b9a5f891782a4bfd65143a39a3773de43cb54c67ba7d5747" origin="Generated by Gradle"/>
@@ -4028,6 +4050,22 @@
40284050
<sha256 value="c7fa624126b4adccdc3f15429a883e4b8a9ecb429e48068c411ae30740f16405" origin="Generated by Gradle"/>
40294051
</artifact>
40304052
</component>
4053+
<component group="net.neoforged.accesstransformers" name="at-modlauncher" version="11.0.1">
4054+
<artifact name="at-modlauncher-11.0.1.jar">
4055+
<sha256 value="8db72ca9f53d537edeca91438e7b815eed1abbc0dd7fca054d3fd47ab5d39d4a" origin="Generated by Gradle"/>
4056+
</artifact>
4057+
<artifact name="at-modlauncher-11.0.1.module">
4058+
<sha256 value="b002c8065c43f412d6847b042dc3d7ff1bcdfc06e261cbcea1b815982a358fe9" origin="Generated by Gradle"/>
4059+
</artifact>
4060+
</component>
4061+
<component group="net.neoforged.accesstransformers" name="at-parser" version="11.0.1">
4062+
<artifact name="at-parser-11.0.1.jar">
4063+
<sha256 value="22945fd13ab88ba9f565401f7de769992dfa22101ede41a62be6fcd5e439aeaa" origin="Generated by Gradle"/>
4064+
</artifact>
4065+
<artifact name="at-parser-11.0.1.module">
4066+
<sha256 value="fb6beb80d0797f17e9afb55955ddb01853c73ac868883d329a775f6ff57f6cdc" origin="Generated by Gradle"/>
4067+
</artifact>
4068+
</component>
40314069
<component group="net.neoforged.fancymodloader" name="earlydisplay" version="4.0.24">
40324070
<artifact name="earlydisplay-4.0.24.jar">
40334071
<sha256 value="147a2da4102ebe5629b88fa9b95ce78be397936641a7f09302dc08ee92f93326" origin="Generated by Gradle"/>
@@ -4044,6 +4082,14 @@
40444082
<sha256 value="a22a2c0a12489ef39bd6737c6b95b489f1827eb0785b70a07e1d570d8d4392a4" origin="Generated by Gradle"/>
40454083
</artifact>
40464084
</component>
4085+
<component group="net.neoforged.fancymodloader" name="earlydisplay" version="5.0.1">
4086+
<artifact name="earlydisplay-5.0.1.jar">
4087+
<sha256 value="7ff8b368bedf6dddb2e43276da22f32f0f1ee7c169e62aa5474de5d1c3f23d65" origin="Generated by Gradle"/>
4088+
</artifact>
4089+
<artifact name="earlydisplay-5.0.1.module">
4090+
<sha256 value="e9efd7b4a93fc187271c107f8b4d77e185ef27831b3380fd40a2537e5f218e5c" origin="Generated by Gradle"/>
4091+
</artifact>
4092+
</component>
40474093
<component group="net.neoforged.fancymodloader" name="loader" version="4.0.24">
40484094
<artifact name="loader-4.0.24.jar">
40494095
<sha256 value="c76d1e7c27b40dcb4ba9f376766a95845647dff21f5e3a77d32858461f109ca1" origin="Generated by Gradle"/>
@@ -4060,6 +4106,14 @@
40604106
<sha256 value="20fab1d5a8b01feb153807cbaaee73a3d7cb43f582ec976e56e7ce9d28ad4c07" origin="Generated by Gradle"/>
40614107
</artifact>
40624108
</component>
4109+
<component group="net.neoforged.fancymodloader" name="loader" version="5.0.1">
4110+
<artifact name="loader-5.0.1.jar">
4111+
<sha256 value="065a834d856f5df0d2fe97f906ab16a3e2618183377195b1afa11550fb9384e4" origin="Generated by Gradle"/>
4112+
</artifact>
4113+
<artifact name="loader-5.0.1.module">
4114+
<sha256 value="d2738674aa09a2f5711b2dc2af9ba261d251e47525da2706a8607f08df7e3888" origin="Generated by Gradle"/>
4115+
</artifact>
4116+
</component>
40634117
<component group="net.neoforged.installertools" name="installertools" version="2.1.2">
40644118
<artifact name="installertools-2.1.2-fatjar.jar">
40654119
<sha256 value="9fe7c6df17299f661b9cd07fc1c4e85493b63efae6bb9da0255a97d9d0a87c60" origin="Generated by Gradle"/>

neoforge/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,9 @@ tasks {
352352

353353
from(commonProject.sourceSets.named("applaunch").map { it.output })
354354
from(forgeAppLaunch.output)
355+
// We need to exclude this as NeoForge ships jackson-core as a library
356+
// and we would be violating the packages
357+
dependencyFilter.exclude(dependencyFilter.dependency("com.fasterxml.jackson.core:jackson-core"))
355358

356359
// Make sure to relocate access widener so that we don't conflict with other coremods
357360
relocate("net.fabricmc.accesswidener", "org.spongepowered.neoforge.libs.accesswidener")

neoforge/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name=SpongeNeo
22
implementation=NeoForge
33
description=The SpongeAPI implementation for NeoForge
44

5-
neoForgeVersion=21.3.0-beta
5+
neoForgeVersion=21.3.35-beta
66
loom.platform=neoforge
77
fabric.loom.dontRemap=true
88
mixinConfigs=mixins.spongeneo.accessors.json,mixins.spongeneo.api.json,mixins.spongeneo.inventory.json,mixins.spongeneo.core.json,mixins.spongeneo.tracker.json

0 commit comments

Comments
 (0)