Skip to content

Commit 72bf34f

Browse files
committed
chore: merge upstream changes
Small changes to replace certain Redirects and Overwrites with WrapOperations and Shared local references. This brings better mod compatibility moving forward.
2 parents 68d8ce7 + 680b7f5 commit 72bf34f

File tree

26 files changed

+962
-705
lines changed

26 files changed

+962
-705
lines changed

forge/src/launch/java/org/spongepowered/forge/launch/bridge/event/ForgeEventBridge_Forge.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.checkerframework.checker.nullness.qual.Nullable;
2828
import org.spongepowered.api.event.Event;
2929

30-
public interface ForgeEventBridge_Forge {
30+
public interface ForgeEventBridge_Forge<E extends Event> {
3131

3232
/**
3333
* Syncs the Sponge event to this Forge event
@@ -39,7 +39,7 @@ public interface ForgeEventBridge_Forge {
3939
*
4040
* @param event The Sponge event
4141
*/
42-
void bridge$syncFrom(Event event);
42+
void bridge$syncFrom(E event);
4343

4444
/**
4545
* Syncs the Forge event to this Sponge event
@@ -51,11 +51,11 @@ public interface ForgeEventBridge_Forge {
5151
*
5252
* @param event The Sponge event
5353
*/
54-
void bridge$syncTo(Event event);
54+
void bridge$syncTo(E event);
5555

5656
/**
5757
* Creates a Sponge event from this Forge event
5858
*/
59-
@Nullable Event bridge$createSpongeEvent();
59+
@Nullable E bridge$createSpongeEvent();
6060

6161
}

forge/src/launch/java/org/spongepowered/forge/launch/event/ForgeEventManager.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,8 @@ public boolean post(final Event event) {
113113

114114
@Override
115115
public boolean post(final Event event, final IEventBusInvokeDispatcher wrapper) {
116-
if (event instanceof ForgeEventBridge_Forge) {
116+
if (event instanceof ForgeEventBridge_Forge<?> forgeEvent) {
117117
// intercept!
118-
final ForgeEventBridge_Forge forgeEvent = (ForgeEventBridge_Forge) event;
119118
final org.spongepowered.api.event.@Nullable Event spongeEvent = forgeEvent.bridge$createSpongeEvent();
120119
if (spongeEvent != null) {
121120
return this.postDualBus(spongeEvent, Collections.singleton(event), wrapper);
@@ -150,8 +149,10 @@ public boolean post(final org.spongepowered.api.event.Event event) {
150149

151150
// Implementation
152151

153-
private boolean postDualBus(final org.spongepowered.api.event.Event spongeEvent, final Collection<? extends Event> forgeEvents,
154-
final IEventBusInvokeDispatcher dispatcher) {
152+
@SuppressWarnings({"unchecked", "rawtypes"})
153+
private boolean postDualBus(
154+
final org.spongepowered.api.event.Event spongeEvent, final Collection<? extends Event> forgeEvents,
155+
final IEventBusInvokeDispatcher dispatcher) {
155156
try (final NoExceptionClosable ignored = this.preparePost(spongeEvent)) {
156157
final RegisteredListener.Cache listeners = this.getHandlerCache(spongeEvent);
157158
final List<RegisteredListener<?>> beforeModifications = listeners.beforeModifications();

forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/EntityTravelToDimensionEventMixin_Forge.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import net.minecraftforge.event.entity.EntityEvent;
3232
import net.minecraftforge.event.entity.EntityTravelToDimensionEvent;
3333
import org.checkerframework.checker.nullness.qual.Nullable;
34-
import org.spongepowered.api.event.Event;
3534
import org.spongepowered.api.event.SpongeEventFactory;
3635
import org.spongepowered.api.event.entity.ChangeEntityWorldEvent;
3736
import org.spongepowered.asm.mixin.Final;
@@ -43,30 +42,30 @@
4342
import org.spongepowered.forge.launch.bridge.event.ForgeEventBridge_Forge;
4443

4544
@Mixin(value = EntityTravelToDimensionEvent.class, remap = false)
46-
public abstract class EntityTravelToDimensionEventMixin_Forge implements ForgeEventBridge_Forge {
45+
public abstract class EntityTravelToDimensionEventMixin_Forge extends EntityEvent implements ForgeEventBridge_Forge<ChangeEntityWorldEvent.Pre> {
4746

4847
// @formatter:off
4948
@Shadow @Final @Mutable private ResourceKey<Level> dimension;
5049
// @formatter:on
5150

51+
private EntityTravelToDimensionEventMixin_Forge(Entity entity) {
52+
super(entity);
53+
}
54+
5255
@Override
53-
public void bridge$syncFrom(final Event event) {
54-
if (event instanceof ChangeEntityWorldEvent.Pre) {
55-
((net.minecraftforge.eventbus.api.Event) (Object) this).setCanceled(((ChangeEntityWorldEvent.Pre) event).isCancelled());
56-
this.dimension = ((ServerLevel) ((ChangeEntityWorldEvent.Pre) event).destinationWorld()).dimension();
57-
}
56+
public void bridge$syncFrom(final ChangeEntityWorldEvent.Pre event) {
57+
this.setCanceled(event.isCancelled());
58+
this.dimension = ((ServerLevel) event.destinationWorld()).dimension();
5859
}
5960

6061
@Override
61-
public void bridge$syncTo(final Event event) {
62-
if (event instanceof ChangeEntityWorldEvent.Pre) {
63-
((ChangeEntityWorldEvent.Pre) event).setCancelled(((net.minecraftforge.eventbus.api.Event) (Object) this).isCanceled());
64-
}
62+
public void bridge$syncTo(final ChangeEntityWorldEvent.Pre event) {
63+
event.setCancelled(this.isCanceled());
6564
}
6665

6766
@Override
68-
public @Nullable Event bridge$createSpongeEvent() {
69-
final Entity entity = ((EntityEvent) (Object) this).getEntity();
67+
public ChangeEntityWorldEvent.@Nullable Pre bridge$createSpongeEvent() {
68+
final Entity entity = this.getEntity();
7069
final ServerLevel toWorld = SpongeCommon.server().getLevel(this.dimension);
7170
return SpongeEventFactory.createChangeEntityWorldEventPre(PhaseTracker.getCauseStackManager().currentCause(),
7271
(org.spongepowered.api.entity.Entity) entity, (org.spongepowered.api.world.server.ServerWorld) entity.getCommandSenderWorld(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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.minecraftforge.event.entity;
26+
27+
import net.minecraft.world.entity.item.ItemEntity;
28+
import net.minecraft.world.entity.player.Player;
29+
import net.minecraftforge.event.entity.item.ItemEvent;
30+
import net.minecraftforge.event.entity.item.ItemTossEvent;
31+
import org.checkerframework.checker.nullness.qual.Nullable;
32+
import org.spongepowered.api.entity.Entity;
33+
import org.spongepowered.api.event.EventContextKeys;
34+
import org.spongepowered.api.event.SpongeEventFactory;
35+
import org.spongepowered.api.event.cause.entity.SpawnTypes;
36+
import org.spongepowered.api.event.item.inventory.DropItemEvent;
37+
import org.spongepowered.asm.mixin.Final;
38+
import org.spongepowered.asm.mixin.Mixin;
39+
import org.spongepowered.asm.mixin.Shadow;
40+
import org.spongepowered.common.event.tracking.PhaseTracker;
41+
import org.spongepowered.forge.launch.bridge.event.ForgeEventBridge_Forge;
42+
43+
import java.util.ArrayList;
44+
45+
@Mixin(ItemTossEvent.class)
46+
public abstract class ItemTossEventMixin_Forge extends ItemEvent implements ForgeEventBridge_Forge<DropItemEvent.Dispense> {
47+
48+
//@formatter:off
49+
@Shadow private @Final Player player;
50+
//@formatter:on
51+
52+
private ItemTossEventMixin_Forge(ItemEntity itemEntity) {
53+
super(itemEntity);
54+
}
55+
56+
@Override
57+
public void bridge$syncFrom(DropItemEvent.Dispense event) {
58+
event.entities().stream()
59+
.filter(e -> e instanceof ItemEntity)
60+
.map(e -> (ItemEntity) e)
61+
.findFirst()
62+
.ifPresent(e -> this.getEntity().setItem(e.getItem()));
63+
this.setCanceled(event.isCancelled());
64+
}
65+
66+
@Override
67+
public void bridge$syncTo(DropItemEvent.Dispense event) {
68+
event.setCancelled(this.isCanceled());
69+
}
70+
71+
@Override
72+
public DropItemEvent.@Nullable Dispense bridge$createSpongeEvent() {
73+
if (this.player.level().isClientSide()) {
74+
return null;
75+
}
76+
try (final var frame = PhaseTracker.getInstance().pushCauseFrame()) {
77+
frame.addContext(EventContextKeys.SPAWN_TYPE, SpawnTypes.DROPPED_ITEM);
78+
final var cause = frame.currentCause();
79+
final var toSpawn = (Entity) this.getEntity();
80+
final var list = new ArrayList<Entity>();
81+
list.add(toSpawn);
82+
return SpongeEventFactory.createDropItemEventDispense(cause, list);
83+
}
84+
}
85+
}

forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/player/PlayerEvent_PlayerChangedDimensionEventMixin_Forge.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
import net.minecraft.world.level.Level;
2929
import net.minecraftforge.event.entity.player.PlayerEvent;
3030
import org.spongepowered.api.entity.Entity;
31-
import org.spongepowered.api.event.Event;
3231
import org.spongepowered.api.event.SpongeEventFactory;
32+
import org.spongepowered.api.event.entity.ChangeEntityWorldEvent;
3333
import org.spongepowered.api.world.server.ServerWorld;
3434
import org.spongepowered.asm.mixin.Final;
3535
import org.spongepowered.asm.mixin.Mixin;
@@ -39,26 +39,26 @@
3939
import org.spongepowered.forge.launch.bridge.event.ForgeEventBridge_Forge;
4040

4141
@Mixin(value = PlayerEvent.PlayerChangedDimensionEvent.class, remap = false)
42-
public final class PlayerEvent_PlayerChangedDimensionEventMixin_Forge implements ForgeEventBridge_Forge {
42+
public final class PlayerEvent_PlayerChangedDimensionEventMixin_Forge implements ForgeEventBridge_Forge<ChangeEntityWorldEvent.Post>{
4343

4444
// @formatter:off
4545
@Shadow @Final private ResourceKey<Level> fromDim;
4646
@Shadow @Final private ResourceKey<Level> toDim;
4747
// @formatter:on
4848

4949
@Override
50-
public void bridge$syncFrom(final Event event) {
50+
public void bridge$syncFrom(final ChangeEntityWorldEvent.Post event) {
5151
// nothing to do -- informational only
5252
}
5353

5454
@Override
55-
public void bridge$syncTo(final Event event) {
55+
public void bridge$syncTo(final ChangeEntityWorldEvent.Post event) {
5656
// nothing to do -- informational only
5757
}
5858

5959
@SuppressWarnings("ConstantConditions")
6060
@Override
61-
public Event bridge$createSpongeEvent() {
61+
public ChangeEntityWorldEvent.Post bridge$createSpongeEvent() {
6262
final PlayerEvent.PlayerChangedDimensionEvent thisEvent = (PlayerEvent.PlayerChangedDimensionEvent) (Object) this;
6363
return SpongeEventFactory.createChangeEntityWorldEventPost(
6464
PhaseTracker.getCauseStackManager().currentCause(),

forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEventMixin_Forge.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@
2828
import net.minecraft.world.level.LevelAccessor;
2929
import net.minecraft.world.level.block.state.BlockState;
3030
import net.minecraftforge.event.level.BlockEvent;
31+
import net.minecraftforge.eventbus.api.Event;
3132
import org.spongepowered.asm.mixin.Mixin;
3233
import org.spongepowered.asm.mixin.Shadow;
3334

3435
@Mixin(value = BlockEvent.class, remap = false)
35-
public abstract class BlockEventMixin_Forge {
36+
public abstract class BlockEventMixin_Forge extends Event {
3637

3738
// @formatter:off
3839
@Shadow public abstract LevelAccessor shadow$getLevel();

forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEvent_BreakEventMixin_Forge.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.spongepowered.api.block.BlockTypes;
3232
import org.spongepowered.api.block.transaction.BlockTransaction;
3333
import org.spongepowered.api.block.transaction.Operations;
34-
import org.spongepowered.api.event.Event;
3534
import org.spongepowered.api.event.SpongeEventFactory;
3635
import org.spongepowered.api.event.block.ChangeBlockEvent;
3736
import org.spongepowered.api.world.server.ServerWorld;
@@ -45,37 +44,33 @@
4544
import java.util.Collections;
4645

4746
@Mixin(value = BlockEvent.BreakEvent.class, remap = false)
48-
public abstract class BlockEvent_BreakEventMixin_Forge extends BlockEventMixin_Forge implements ForgeEventBridge_Forge {
47+
public abstract class BlockEvent_BreakEventMixin_Forge extends BlockEventMixin_Forge implements ForgeEventBridge_Forge<ChangeBlockEvent.All> {
4948

5049
@Override
51-
public void bridge$syncFrom(final Event event) {
52-
if (event instanceof ChangeBlockEvent.All) {
53-
final ChangeBlockEvent.All changeBlockEventAll = (ChangeBlockEvent.All) event;
54-
final Vector3i pos = VecHelper.toVector3i(this.shadow$getPos());
55-
if (changeBlockEventAll.isCancelled() ||
56-
changeBlockEventAll.transactions()
57-
.stream()
58-
.filter(x -> x.original().position().equals(pos))
59-
.anyMatch(x -> !x.isValid() || x.operation() != Operations.BREAK.get() || x.custom().isPresent())) {
60-
((net.minecraftforge.eventbus.api.Event) (Object) this).setCanceled(true);
61-
}
50+
public void bridge$syncFrom(final ChangeBlockEvent.All event) {
51+
final Vector3i pos = VecHelper.toVector3i(this.shadow$getPos());
52+
if (event.isCancelled() ||
53+
event.transactions()
54+
.stream()
55+
.filter(x -> x.original().position().equals(pos))
56+
.anyMatch(x -> !x.isValid() || x.operation() != Operations.BREAK.get() || x.custom().isPresent())) {
57+
this.setCanceled(true);
6258
}
6359
}
6460

6561
@Override
66-
public void bridge$syncTo(final Event event) {
67-
if (event instanceof ChangeBlockEvent.All && ((net.minecraftforge.eventbus.api.Event) (Object) this).isCanceled()) {
62+
public void bridge$syncTo(final ChangeBlockEvent.All event) {
63+
if (this.isCanceled()) {
6864
final Vector3i pos = VecHelper.toVector3i(this.shadow$getPos());
69-
((ChangeBlockEvent.All) event).transactions(Operations.BREAK.get()).filter(x -> x.original().position().equals(pos))
65+
event.transactions(Operations.BREAK.get()).filter(x -> x.original().position().equals(pos))
7066
.forEach(x -> x.setValid(false));
7167
}
7268
}
7369

7470
@Override
75-
public @Nullable Event bridge$createSpongeEvent() {
71+
public ChangeBlockEvent.@Nullable All bridge$createSpongeEvent() {
7672
final LevelAccessor accessor = this.shadow$getLevel();
77-
if (accessor instanceof ServerWorld) {
78-
final ServerWorld serverWorld = (ServerWorld) accessor;
73+
if (accessor instanceof ServerWorld serverWorld) {
7974
final BlockTransaction transaction = new BlockTransaction(
8075
SpongeBlockSnapshot.BuilderImpl
8176
.pooled()

forge/src/mixins/resources/mixins.spongeforge.core.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"commands.CommandsMixin_Forge",
1212
"minecraftforge.MinecraftForgeMixin_Forge",
1313
"minecraftforge.event.entity.EntityTravelToDimensionEventMixin_Forge",
14-
"minecraftforge.event.entity.player.PlayerEvent_PlayerChangedDimensionEventMixin_Forge",
14+
"minecraftforge.event.entity.ItemTossEventMixin_Forge",
15+
"minecraftforge.event.entity.player.PlayerEvent_PlayerChangedDimensionEventMixin_Forge",
1516
"minecraftforge.event.world.BlockEvent_BreakEventMixin_Forge",
1617
"minecraftforge.event.world.BlockEventMixin_Forge",
1718
"minecraftforge.internal.BrandingControlMixin_Forge",

0 commit comments

Comments
 (0)