Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
ac2bbe5
feat: update to snapshot 25w02a
gabizou Jan 12, 2025
83fc2ca
feat: update api content and changes for 25w03a
gabizou Jan 16, 2025
1e5c1e4
chore: merge upstream changes
gabizou Jan 16, 2025
c64cb90
chore: merge api-14 additions with WolfVariant
gabizou Jan 23, 2025
bdfd8fc
feat!: update for 25w04a
gabizou Jan 23, 2025
0ab192d
feat!: update content api to 25w05a
gabizou Feb 1, 2025
848d9fc
chore: merge api-14 for additions
gabizou Feb 8, 2025
d2a4ac9
chore: update to 25w06a
gabizou Feb 8, 2025
e6b498a
feat: add content for 25w06a
gabizou Feb 8, 2025
36fa064
chore: update from upstream api-14
gabizou Feb 15, 2025
35709f3
feat: update implementation to 25w07a
gabizou Feb 15, 2025
d3cdbf4
feat: add content for 25w07a
gabizou Feb 15, 2025
3b096d5
chore: merge upstream fixes from api-14
gabizou Feb 23, 2025
569507e
feat(minecraft): update to 25w08a
gabizou Feb 23, 2025
3bfedc3
feat: implement Wolf Sound Variant Key
gabizou Feb 23, 2025
2ead90f
chore: update from upstream api-14
gabizou Mar 3, 2025
7ea90f4
chore(deps): update to 25w09b
gabizou Mar 3, 2025
b039b78
fix(crash): avoid a possible movement-fix crash
gabizou Mar 8, 2025
ffd2fa4
chore(nits): run spotlessApply
gabizou Mar 8, 2025
7fee7c1
chore: update from upstream api-14
gabizou Mar 8, 2025
034aad3
feat(content): update api for new features from 25w09a
gabizou Mar 8, 2025
99ebdc6
feat(content): update to 25w10a
gabizou Mar 8, 2025
6c0cf29
feat(content): update api for content from 25w10a
gabizou Mar 8, 2025
eb1cb97
chore: merge api-14 for updates
gabizou Mar 9, 2025
a832113
chore: merge api-14 for updates
gabizou Mar 9, 2025
02842fd
chore: merge api-14 for updates
gabizou Mar 15, 2025
19e13ff
feat(content): update to 1.21.5-pre2
gabizou Mar 15, 2025
41d46ba
revert fix(crash): avoid a possible movement-fix crash
gabizou Mar 15, 2025
94f48be
feat(minecraft): update to 1.21.5-rc1
gabizou Mar 21, 2025
b100de0
Fix missed returns in SpongeWorldManager from 0e7fe7e
aromaa Mar 24, 2025
077ab50
chore: merge api-14 for updates
gabizou Mar 26, 2025
0d1d074
feat(minecraft): update to 1.21.5
gabizou Mar 26, 2025
3c92e3e
introduce scoped registry holder using PhaseTracker
Faithcaio Mar 26, 2025
e624c20
no violation of cause
Faithcaio Mar 27, 2025
98f14b4
Remove container open/close logic from CloseMenuTransaction
aromaa Mar 30, 2025
4718623
fix typo
Faithcaio Mar 29, 2025
7c83623
fix InventoryMenu#setTitle
Faithcaio Mar 30, 2025
dcca0de
implement BLOCK_CRUMBLE/TRAIL particleoptions
Faithcaio Mar 30, 2025
8691a3f
Implement virtual component rendering options
aromaa Mar 30, 2025
3841a60
log exception when failing to parse commands on startup
Faithcaio Apr 2, 2025
35cc8c8
don't log CommandSyntaxException
Faithcaio Apr 2, 2025
a29d2fd
Delay loading server functions until services are available
aromaa Apr 2, 2025
3bb57ec
clamp mod-provided progress for bossbars (#4203)
MrHell228 Apr 3, 2025
daa5d16
Expose world's WorldArchetype & WorldArchetypeType
aromaa Apr 9, 2025
b924659
Bump ASM to 9.8
Yeregorix Apr 11, 2025
c2c51f3
Remove level save overwrite
Yeregorix Apr 12, 2025
abd5b99
No longer shade configurate-jackson
Yeregorix Apr 18, 2025
a8c8cb3
Merge branch 'api-12' into api-13
Yeregorix Apr 19, 2025
c583f28
Merge branch 'api-13' into api-14
Yeregorix Apr 19, 2025
2bed0e3
Rewrite attack and damage events (#4138)
Yeregorix Apr 19, 2025
2dd685e
chore: merge api-14 for updates
gabizou Apr 19, 2025
fb76cfc
feat(forge): update MinecraftForge to 1.21.5
gabizou Apr 20, 2025
382e226
feat(neo): update NeoForge to 1.21.5-21.5.47-beta
gabizou Mar 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion SpongeAPI
Submodule SpongeAPI updated 92 files
+1 −1 gradle.properties
+1 −1 src/main/java/org/spongepowered/api/adventure/ChatTypes.java
+5 −0 src/main/java/org/spongepowered/api/adventure/ResolveOperations.java
+20 −2 src/main/java/org/spongepowered/api/adventure/SpongeComponents.java
+18 −0 src/main/java/org/spongepowered/api/block/BlockTypes.java
+4 −0 src/main/java/org/spongepowered/api/block/entity/BlockEntityTypes.java
+1 −1 src/main/java/org/spongepowered/api/command/registrar/tree/CommandTreeNodeTypes.java
+10 −2 src/main/java/org/spongepowered/api/data/BlockStateKeys.java
+31 −0 src/main/java/org/spongepowered/api/data/Keys.java
+1 −1 src/main/java/org/spongepowered/api/data/type/ArtTypes.java
+0 −2 src/main/java/org/spongepowered/api/data/type/AxolotlVariants.java
+1 −1 src/main/java/org/spongepowered/api/data/type/BannerPatternShapes.java
+3 −3 src/main/java/org/spongepowered/api/data/type/CatTypes.java
+3 −12 src/main/java/org/spongepowered/api/data/type/ChickenVariant.java
+56 −0 src/main/java/org/spongepowered/api/data/type/ChickenVariants.java
+32 −0 src/main/java/org/spongepowered/api/data/type/CowVariant.java
+59 −0 src/main/java/org/spongepowered/api/data/type/CowVariants.java
+33 −0 src/main/java/org/spongepowered/api/data/type/CreakingHeartState.java
+58 −0 src/main/java/org/spongepowered/api/data/type/CreakingHeartStates.java
+3 −3 src/main/java/org/spongepowered/api/data/type/FrogTypes.java
+32 −0 src/main/java/org/spongepowered/api/data/type/PigType.java
+59 −0 src/main/java/org/spongepowered/api/data/type/PigTypes.java
+33 −0 src/main/java/org/spongepowered/api/data/type/TestBlockMode.java
+54 −0 src/main/java/org/spongepowered/api/data/type/TestBlockModes.java
+32 −0 src/main/java/org/spongepowered/api/data/type/WolfSoundVariant.java
+64 −0 src/main/java/org/spongepowered/api/data/type/WolfSoundVariants.java
+16 −16 src/main/java/org/spongepowered/api/data/type/WolfVariants.java
+13 −0 src/main/java/org/spongepowered/api/effect/particle/ParticleOptions.java
+4 −0 src/main/java/org/spongepowered/api/effect/particle/ParticleTypes.java
+103 −1 src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java
+1 −1 src/main/java/org/spongepowered/api/effect/sound/music/MusicDiscs.java
+4 −2 src/main/java/org/spongepowered/api/entity/EntityTypes.java
+6 −0 src/main/java/org/spongepowered/api/entity/Saddleable.java
+15 −2 src/main/java/org/spongepowered/api/entity/living/animal/Pig.java
+3 −3 src/main/java/org/spongepowered/api/entity/living/animal/Strider.java
+9 −0 src/main/java/org/spongepowered/api/entity/living/animal/Wolf.java
+2 −2 src/main/java/org/spongepowered/api/entity/living/animal/horse/HorseLike.java
+0 −120 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageFunction.java
+44 −212 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageModifier.java
+0 −199 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageModifierTypes.java
+199 −0 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageStep.java
+9 −18 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageStepHistory.java
+58 −0 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageStepType.java
+204 −0 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageStepTypes.java
+1 −1 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypes.java
+30 −322 src/main/java/org/spongepowered/api/event/entity/AttackEntityEvent.java
+182 −0 src/main/java/org/spongepowered/api/event/entity/DamageCalculationEvent.java
+20 −236 src/main/java/org/spongepowered/api/event/entity/DamageEntityEvent.java
+0 −194 src/main/java/org/spongepowered/api/event/impl/entity/AbstractAttackEntityEvent.java
+69 −0 src/main/java/org/spongepowered/api/event/impl/entity/AbstractDamageCalculationEventPre.java
+0 −202 src/main/java/org/spongepowered/api/event/impl/entity/AbstractDamageEntityEvent.java
+40 −0 src/main/java/org/spongepowered/api/event/impl/entity/AbstractDamageEntityEventPost.java
+0 −105 src/main/java/org/spongepowered/api/event/impl/entity/AbstractModifierEvent.java
+22 −0 src/main/java/org/spongepowered/api/item/ItemTypes.java
+1 −1 src/main/java/org/spongepowered/api/item/enchantment/EnchantmentTypes.java
+2 −0 src/main/java/org/spongepowered/api/item/inventory/equipment/EquipmentGroups.java
+2 −0 src/main/java/org/spongepowered/api/item/inventory/equipment/EquipmentTypes.java
+1 −1 src/main/java/org/spongepowered/api/item/recipe/smithing/TrimMaterials.java
+1 −1 src/main/java/org/spongepowered/api/item/recipe/smithing/TrimPatterns.java
+0 −8 src/main/java/org/spongepowered/api/raid/Raid.java
+8 −0 src/main/java/org/spongepowered/api/registry/RegistryKey.java
+2 −0 src/main/java/org/spongepowered/api/registry/RegistryType.java
+23 −5 src/main/java/org/spongepowered/api/registry/RegistryTypes.java
+0 −4 src/main/java/org/spongepowered/api/state/BooleanStateProperties.java
+10 −0 src/main/java/org/spongepowered/api/state/EnumStateProperties.java
+4 −0 src/main/java/org/spongepowered/api/state/IntegerStateProperties.java
+4 −0 src/main/java/org/spongepowered/api/tag/BiomeTags.java
+12 −2 src/main/java/org/spongepowered/api/tag/BlockTypeTags.java
+4 −0 src/main/java/org/spongepowered/api/tag/EntityTypeTags.java
+6 −0 src/main/java/org/spongepowered/api/tag/ItemTypeTags.java
+5 −4 src/main/java/org/spongepowered/api/world/BlockChangeFlag.java
+1 −1 src/main/java/org/spongepowered/api/world/WorldTypes.java
+1 −1 src/main/java/org/spongepowered/api/world/biome/Biomes.java
+4 −0 src/main/java/org/spongepowered/api/world/gamerule/GameRules.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/carver/Carvers.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/config/flat/FlatGeneratorConfigs.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/config/noise/DensityFunctions.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/config/noise/NoiseGeneratorConfigs.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/config/noise/Noises.java
+3 −1 src/main/java/org/spongepowered/api/world/generation/feature/FeatureTypes.java
+44 −4 src/main/java/org/spongepowered/api/world/generation/feature/Features.java
+44 −4 src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatures.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/feature/PlacementModifierTypes.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/structure/StructureSets.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/structure/Structures.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPools.java
+1 −1 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorLists.java
+2 −1 src/main/java/org/spongepowered/api/world/server/WorldArchetype.java
+2 −1 src/main/java/org/spongepowered/api/world/server/WorldArchetypeType.java
+1 −1 src/main/java/org/spongepowered/api/world/server/WorldArchetypeTypes.java
+9 −0 src/main/java/org/spongepowered/api/world/server/storage/ServerWorldProperties.java
+0 −251 src/test/java/org/spongepowered/api/event/SpongeAbstractDamageEntityEventTest.java
2 changes: 1 addition & 1 deletion build-logic/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies {
implementation(libs.accessWidener)

// arch-loom is used by SpongeNeo but must be declared here to avoid a classloader conflict with its transitive dependencies
api("dev.architectury:architectury-loom:1.7.423")
api("dev.architectury:architectury-loom:1.10.430")
}

indraSpotlessLicenser {
Expand Down
4 changes: 0 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,6 @@ dependencies {
exclude(group = "org.spongepowered", module = "configurate-core")
exclude(group = "org.checkerframework", module = "checker-qual") // We use our own version
}
applaunchConfig(libs.configurate.jackson) {
exclude(group = "org.spongepowered", module = "configurate-core")
exclude(group = "org.checkerframework", module = "checker-qual") // We use our own version
}
applaunchConfig(libs.log4j.core)
applaunchConfig(libs.log4j.jpl)
applaunchConfig(apiLibs.pluginSpi) {
Expand Down
6 changes: 1 addition & 5 deletions forge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,6 @@ dependencies {
exclude(group = "org.spongepowered", module = "configurate-core")
exclude(group = "org.checkerframework", module = "checker-qual")
}
service(libs.configurate.jackson) {
exclude(group = "org.spongepowered", module = "configurate-core")
exclude(group = "org.checkerframework", module = "checker-qual")
}

val game = gameLibrariesConfig.name
game("org.spongepowered:spongeapi:$apiVersion")
Expand Down Expand Up @@ -224,7 +220,7 @@ AWToAT.convert(awFiles, atFile)
val mixinConfigs: MutableSet<String> = spongeImpl.mixinConfigurations

extensions.configure(UserDevExtension::class) {
mappings("official", "1.21.4")
mappings("official", "1.21.5")
accessTransformers.from(atFile)
reobf = false

Expand Down
4 changes: 1 addition & 3 deletions forge/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,5 @@ name=SpongeForge
implementation=Forge
description=The SpongeAPI implementation for MinecraftForge

forgeVersion=54.0.12
loom.platform=forge
fabric.loom.dontRemap=true
forgeVersion=55.0.6
mixinConfigs=mixins.spongeforge.accessors.json,mixins.spongeforge.api.json,mixins.spongeforge.inventory.json,mixins.spongeforge.inventory.shared.json,mixins.spongeforge.core.json,mixins.spongeforge.core.shared.json,mixins.spongeforge.tracker.json
3 changes: 0 additions & 3 deletions forge/src/main/resources/forge.superclasschange
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
{
"org.spongepowered.api.entity.ai.goal.AbstractGoal": "net.minecraft.world.entity.ai.goal.Goal"
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,36 +22,28 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.common.mixin.api.minecraft.world.level.biome;
package org.spongepowered.forge.mixin.core.minecraftforge.registries;

import net.minecraft.world.level.biome.MobSpawnSettings;
import org.spongepowered.api.entity.EntityType;
import org.spongepowered.api.world.biome.spawner.NaturalSpawner;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.common.accessor.core.MappedRegistryAccessor;

@Mixin(MobSpawnSettings.SpawnerData.class)
public abstract class MobSpawnSettings_SpawnerDataMixin_API implements NaturalSpawner {

// @formatter:off
@Shadow @Final public net.minecraft.world.entity.EntityType<?> type;
@Shadow @Final public int minCount;
@Shadow @Final public int maxCount;
// @formatter:on

@Override
public EntityType<?> type() {
return (EntityType<?>) this.type;
}
/**
* Due to the Accessor being intrinsically implemented on top of MappedRegistry, the
* extended NamespacedWrapper class redefines frozen as a private field, leaving the
* original accessor to be useless. To fix registry issues, we therefore re-implement
* our accessor interface explicitly for registry purposes.
*
* @author gabizou - Minecraft 1.21.5 MinecraftForge 55.0.6
* @param <T>
*/
@Mixin(targets = "net/minecraftforge/registries/NamespacedWrapper")
public abstract class NamespacedWrapperMixin_Forge<T> implements MappedRegistryAccessor<T> {

@Override
public int min() {
return this.minCount;
}
@Shadow private boolean frozen;

@Override
public int max() {
return this.maxCount;
public boolean accessor$frozen() {
return this.frozen;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* This file is part of Sponge, licensed under the MIT License (MIT).
*
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.forge.mixin.core.resources;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.RegistryDataLoader;
import net.minecraft.util.DependencySorter;
import org.spongepowered.api.registry.Registry;
import org.spongepowered.api.registry.RegistryRoots;
import org.spongepowered.api.registry.RegistryType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.common.accessor.resources.RegistryDataLoader_LoaderAccessor;
import org.spongepowered.common.bridge.core.WritableRegistryBridge;
import org.spongepowered.common.bridge.resources.RegistryDataLoader_LoaderBridge;
import org.spongepowered.common.launch.Launch;
import org.spongepowered.common.launch.Lifecycle;
import org.spongepowered.common.registry.SpongeRegistryDependencyEntry;
import org.spongepowered.common.registry.SpongeRegistryHolder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Mixin(RegistryDataLoader.class)
public class RegistryDataLoaderMixin_Forge {


@SuppressWarnings({"rawtypes", "unchecked"})
@WrapOperation(method = "load(Lnet/minecraft/resources/RegistryDataLoader$LoadingFunction;Ljava/util/List;Ljava/util/List;)Lnet/minecraft/core/RegistryAccess$Frozen;",
at = @At(value = "INVOKE", target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", ordinal = 1))
private static void impl$onLoad(final List<RegistryDataLoader_LoaderAccessor<?>> instance, final Consumer<?> consumer, final Operation<Void> original) {
// TODO: Remote layer
final DependencySorter<RegistryType<?>, SpongeRegistryDependencyEntry<RegistryDataLoader_LoaderAccessor<?>>> dependencies = new DependencySorter<>();
final Lifecycle lifecycle = Launch.instance().lifecycle();
instance.stream()
.filter(l -> ((RegistryDataLoader_LoaderBridge) l).bridge$registryHolder() != null)
.collect(Collectors.groupingBy(l -> ((RegistryDataLoader_LoaderBridge) l).bridge$registryHolder(), Collectors.toSet()))
.forEach((k, v) -> {
((SpongeRegistryHolder) k).setRootMinecraftRegistry(new RegistryAccess.ImmutableRegistryAccess(
(List) Stream.concat(k.streamRegistries(RegistryRoots.MINECRAFT), v.stream().map(RegistryDataLoader_LoaderAccessor::accessor$registry)).toList()));
lifecycle.processServerRegistries(k, v.stream()
.filter(l -> !RegistryDataLoader.DIMENSION_REGISTRIES.contains(l.accessor$data())) // NOTE: DIMENSION_REGISTRIES are special!
.map(l -> (Registry<?>) l.accessor$registry()));
v.forEach(l -> dependencies.addEntry(((Registry<?>) l.accessor$registry()).type(),
new SpongeRegistryDependencyEntry<>(l, ((WritableRegistryBridge<?>) l.accessor$registry()).bridge$pendingDependencies().toList())));
});

List<RegistryDataLoader_LoaderAccessor<?>> loaders = new ArrayList<>(instance.size());
dependencies.orderByDependencies(($, v) -> loaders.add(v.cookie()));

original.call(Collections.unmodifiableList(loaders), consumer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* This file is part of Sponge, licensed under the MIT License (MIT).
*
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.forge.mixin.core.world.entity;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.event.entity.living.ShieldBlockEvent;
import org.spongepowered.api.event.cause.entity.damage.DamageStepTypes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.common.bridge.world.entity.TrackedDamageBridge;
import org.spongepowered.common.event.cause.entity.damage.SpongeDamageStep;
import org.spongepowered.common.event.cause.entity.damage.SpongeDamageTracker;
import org.spongepowered.common.item.util.ItemStackUtil;

@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin_Forge_Damage implements TrackedDamageBridge {

//@formatter:off
@Shadow public abstract ItemStack shadow$getUseItem();
//@formatter:on

@ModifyConstant(method = "actuallyHurt", constant = @Constant(floatValue = 0), slice = @Slice(
from = @At(value = "INVOKE", target = "Lnet/minecraftforge/common/ForgeHooks;onLivingHurt(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/damagesource/DamageSource;F)F"),
to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F")))
private float damage$doNotReturnEarly(final float constant) {
return Float.NaN;
}

@WrapOperation(method = "hurtServer",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/world/entity/LivingEntity;applyItemBlocking(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/damagesource/DamageSource;F)F"
))
private float damage$initiateBlockingStep(
final LivingEntity self, final ServerLevel level, final DamageSource source, final float originalDamage,
final Operation<Float> original) {
final SpongeDamageTracker tracker = this.damage$tracker();
if (tracker == null) {
return original.call(self, level, source, originalDamage);
}

final SpongeDamageStep step = tracker.newStep(DamageStepTypes.SHIELD, ItemStackUtil.snapshotOf(this.shadow$getUseItem()));
float damage = (float) step.applyChildrenBefore(originalDamage);
return original.call(self, level, source, damage);
}


@WrapOperation(method = "applyItemBlocking", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/event/ForgeEventFactory;onShieldBlock(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/damagesource/DamageSource;FLnet/minecraft/world/item/ItemStack;)Lnet/minecraftforge/event/entity/living/ShieldBlockEvent;"))
private ShieldBlockEvent damage$modifyBeforeAndAfterShield(
final LivingEntity self, final DamageSource source, final float originalDamage, final ItemStack stack,
final Operation<ShieldBlockEvent> operation
) {
final SpongeDamageTracker tracker = this.damage$tracker();
if (tracker == null) {
return operation.call(self, source, originalDamage, stack);
}
final var step = tracker.currentStep(DamageStepTypes.SHIELD);
if (step == null) {
return operation.call(self, source, originalDamage, stack);
}
float damage = (float) step.damageBeforeSelf().getAsDouble();
final ShieldBlockEvent event;
if (step.isSkipped()) {
event = new ShieldBlockEvent(self, source, damage, stack);
event.setCanceled(true);
} else {
event = operation.call(self, source, damage, stack);
if (!event.isCanceled()) {
damage -= event.getBlockedDamage();
}
}
step.applyChildrenAfter(damage);
return event;
}

@ModifyArg(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/common/ForgeHooks;onLivingDamage(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/damagesource/DamageSource;F)F"))
private float damage$firePostEvent_Living(final float damage) {
return this.damage$firePostEvent(damage);
}
}

This file was deleted.

Loading
Loading