Skip to content

Commit eb50e02

Browse files
committed
Merge remote-tracking branch 'upstream/api-12' into loofah/api-12
2 parents be30c1b + 9ba43ca commit eb50e02

File tree

237 files changed

+5111
-3013
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

237 files changed

+5111
-3013
lines changed

.editorconfig

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
root = true
22

3-
[*mixins*.json]
4-
indent_size = 4
5-
63
[*]
74
charset = utf-8
85
end_of_line = lf
@@ -12,6 +9,8 @@ insert_final_newline = false
129
max_line_length = 120
1310
tab_width = 4
1411

12+
[*mixins*.json]
13+
indent_size = 2
1514

1615
[*.yaml]
1716
indent_size = 2

.github/workflows/deploy.yaml

+15-8
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,33 @@ jobs:
2929
fail-fast: false
3030
matrix:
3131
project:
32+
- common
3233
- vanilla
3334
- forge
3435
- neoforge
3536
include:
37+
- project: common
38+
gradleProject: ''
39+
skipUpdateBranch: false
3640
- project: vanilla
37-
gradleProject: SpongeVanilla
41+
gradleProject: ':SpongeVanilla'
42+
skipUpdateBranch: false
3843
- project: forge
39-
gradleProject: SpongeForge
44+
gradleProject: ':SpongeForge'
45+
skipUpdateBranch: true
4046
- project: neoforge
41-
gradleProject: SpongeNeo
47+
gradleProject: ':SpongeNeo'
48+
skipUpdateBranch: true
4249
steps:
4350
- name: setup
44-
if: "!startsWith(github.ref, 'refs/heads/update/') || matrix.project == 'vanilla'"
51+
if: "!(matrix.skipUpdateBranch && startsWith(github.ref, 'refs/heads/update/'))"
4552
id: setup
4653
uses: SpongePowered/.github/.github/actions/setup-java-env@master
4754
with:
4855
runtime_version: 21
4956
publishing_branch_regex: ''
5057
- name: setup / minecraft cache
51-
if: "!startsWith(github.ref, 'refs/heads/update/') || matrix.project == 'vanilla'"
58+
if: "!(matrix.skipUpdateBranch && startsWith(github.ref, 'refs/heads/update/'))"
5259
uses: "actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9" # v4.0.2
5360
with:
5461
path: |
@@ -59,14 +66,14 @@ jobs:
5966
${{ runner.os }}-minecraft-${{ env.CACHE_REV }}-
6067
# We don't need to run tests again, so we just publish
6168
- name: setup / workspace
62-
if: "!startsWith(github.ref, 'refs/heads/update/') || matrix.project == 'vanilla'"
69+
if: "!(matrix.skipUpdateBranch && startsWith(github.ref, 'refs/heads/update/'))"
6370
run: |
6471
echo "GIT_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
6572
echo "GIT_BRANCH=${GITHUB_REF##*/}" >> $GITHUB_ENV
6673
echo "BUILD_NUMBER=${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
6774
- name: Publish to Sponge Maven & GitHub Packages
68-
if: "!startsWith(github.ref, 'refs/heads/update/') || matrix.project == 'vanilla'"
69-
run: ./gradlew -s -Pprojects=vanilla,${{ matrix.project }} :${{ matrix.gradleProject }}:publish
75+
if: "!(matrix.skipUpdateBranch && startsWith(github.ref, 'refs/heads/update/'))"
76+
run: ./gradlew -s -Pprojects=${{ matrix.project }} ${{ matrix.gradleProject }}:publish
7077
env:
7178
CI_SYSTEM: Github Actions
7279
GITHUB_USERNAME: "${{ github.actor }}"

forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/PluginFileParser.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ private static ModJarMetadata newModJarMetadata() {
9393
public static ModFile newPluginInstance(final IModLocator locator, final Path... path) {
9494
ModJarMetadata mjm = newModJarMetadata();
9595
ModFile modFile = (ModFile) ModFileFactory.FACTORY.build(SecureJar.from(jar -> mjm, path), locator, PluginFileParser::parsePluginMetadata);
96-
mjm.setModFile(modFile);
96+
if (modFile.getModFileInfo() != null) {
97+
mjm.setModFile(modFile);
98+
}
9799
return modFile;
98100
}
99101

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

+4-4
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

+5-4
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/launch/java/org/spongepowered/forge/launch/event/SpongeEventBus.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public boolean post(final Event event, final IEventBusInvokeDispatcher wrapper)
124124
if (!this.rtrackPhases && Objects.equals(listener.getClass(), EventPriority.class)) continue;
125125

126126
try (
127-
final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame();
127+
final CauseStackManager.StackFrame frame = PhaseTracker.getInstance().pushCauseFrame();
128128
final PhaseContext<@NonNull ?> context = SpongeEventManager.createListenerContext(null))
129129
{
130130
if (context != null) {

forge/src/main/java/org/spongepowered/forge/SpongeForgeMod.java

-18
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
package org.spongepowered.forge;
2626

2727
import net.minecraft.client.Minecraft;
28-
import net.minecraft.world.entity.EntityType;
29-
import net.minecraft.world.entity.MobCategory;
3028
import net.minecraftforge.common.MinecraftForge;
3129
import net.minecraftforge.event.entity.EntityAttributeCreationEvent;
3230
import net.minecraftforge.event.server.ServerAboutToStartEvent;
@@ -38,8 +36,6 @@
3836
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
3937
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
4038
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
41-
import net.minecraftforge.registries.ForgeRegistries;
42-
import net.minecraftforge.registries.RegisterEvent;
4339
import org.apache.logging.log4j.LogManager;
4440
import org.apache.logging.log4j.Logger;
4541
import org.spongepowered.api.Client;
@@ -72,7 +68,6 @@ public SpongeForgeMod() {
7268
// modBus: add all FML events with it
7369
modBus.addListener(this::onCommonSetup);
7470
modBus.addListener(this::onClientSetup);
75-
modBus.addListener(this::onRegister);
7671
modBus.addListener(this::onEntityAttributeCreationEvent);
7772

7873
// annotation events, for non-FML things
@@ -137,19 +132,6 @@ public void onServerStoppingEvent(final ServerStoppingEvent event) {
137132
lifecycle.callStoppingEngineEvent((Server) event.getServer());
138133
}
139134

140-
public void onRegister(RegisterEvent event) {
141-
if (event.getRegistryKey() == ForgeRegistries.Keys.ENTITY_TYPES) {
142-
SpongeEntityTypes.HUMAN = EntityType.Builder.of(HumanEntity::new, MobCategory.MISC)
143-
.noSave()
144-
.sized(0.6F, 1.8F)
145-
.clientTrackingRange(org.spongepowered.common.util.Constants.Entity.Player.TRACKING_RANGE)
146-
.updateInterval(2)
147-
.build("sponge:human")
148-
;
149-
150-
event.register(ForgeRegistries.Keys.ENTITY_TYPES, helper -> helper.register(HumanEntity.KEY, SpongeEntityTypes.HUMAN));
151-
}
152-
}
153135
public void onEntityAttributeCreationEvent(final EntityAttributeCreationEvent event) {
154136
event.put(SpongeEntityTypes.HUMAN, HumanEntity.createAttributes());
155137
}

forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public abstract class CommandsMixin_Forge {
8080
final Function<SuggestionProvider<S>, SuggestionProvider<T>> execute,
8181
final ServerPlayer player
8282
) {
83-
try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) {
83+
try (final CauseStackManager.StackFrame frame = PhaseTracker.getInstance().pushCauseFrame()) {
8484
frame.pushCause(player);
8585
frame.addContext(EventContextKeys.SUBJECT, (Subject) player);
8686
final CommandCause sourceToUse = ((CommandSourceStackBridge) sourceToResult).bridge$withCurrentCause();

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

+13-14
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,32 +42,32 @@
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);
71-
return SpongeEventFactory.createChangeEntityWorldEventPre(PhaseTracker.getCauseStackManager().currentCause(),
70+
return SpongeEventFactory.createChangeEntityWorldEventPre(PhaseTracker.getInstance().currentCause(),
7271
(org.spongepowered.api.entity.Entity) entity, (org.spongepowered.api.world.server.ServerWorld) entity.getCommandSenderWorld(),
7372
(org.spongepowered.api.world.server.ServerWorld) toWorld, (org.spongepowered.api.world.server.ServerWorld) toWorld);
7473
}
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

+6-6
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,29 +39,29 @@
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(
64-
PhaseTracker.getCauseStackManager().currentCause(),
64+
PhaseTracker.getInstance().currentCause(),
6565
(Entity) thisEvent.getEntity(),
6666
(ServerWorld) SpongeCommon.server().getLevel(this.fromDim),
6767
(ServerWorld) SpongeCommon.server().getLevel(this.toDim),

0 commit comments

Comments
 (0)