Skip to content

Commit cbd94d8

Browse files
authored
Support HugeFungusFeature and AbstractHugeMushroomFeature in TreeGrowthEvent (#166)
1 parent 7bf978d commit cbd94d8

File tree

10 files changed

+441
-20
lines changed

10 files changed

+441
-20
lines changed

neoforge.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ neoForge {
1111
accessTransformers = [
1212
"src/main/resources/${mod_id}.accesstransformer.cfg"
1313
]
14-
// interfaceInjectionData.from "src/main/resources/interfaces.json"
14+
interfaceInjectionData.from "src/main/resources/interfaces.json"
1515

1616
parchment {
1717
mappingsVersion = project.parchment_mappings_version

src/main/java/net/swedz/tesseract/neoforge/compat/tyg/mixin/TYGTreeGrowthEventMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import net.minecraft.world.level.block.state.BlockState;
99
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
1010
import net.neoforged.neoforge.common.NeoForge;
11-
import net.swedz.tesseract.neoforge.event.TreeGrowthEvent;
11+
import net.swedz.tesseract.neoforge.event.treegrowth.TreeGrowthEvent;
1212
import org.spongepowered.asm.mixin.Mixin;
1313
import org.spongepowered.asm.mixin.injection.At;
1414
import org.spongepowered.asm.mixin.injection.Inject;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.swedz.tesseract.neoforge.event.treegrowth;
2+
3+
import net.minecraft.core.BlockPos;
4+
5+
import java.util.List;
6+
7+
public interface FeaturePlacedBlockTracker
8+
{
9+
default void clearTrackedBlockPositions()
10+
{
11+
throw new UnsupportedOperationException();
12+
}
13+
14+
default void trackBlockPosition(BlockPos pos)
15+
{
16+
throw new UnsupportedOperationException();
17+
}
18+
19+
default List<BlockPos> getTrackedBlockPositions()
20+
{
21+
throw new UnsupportedOperationException();
22+
}
23+
}
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
package net.swedz.tesseract.neoforge.event.treegrowth;
2+
3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.core.Direction;
5+
import net.minecraft.core.Holder;
6+
import net.minecraft.core.RegistryAccess;
7+
import net.minecraft.core.particles.ParticleOptions;
8+
import net.minecraft.server.MinecraftServer;
9+
import net.minecraft.server.level.ServerLevel;
10+
import net.minecraft.sounds.SoundEvent;
11+
import net.minecraft.sounds.SoundSource;
12+
import net.minecraft.util.RandomSource;
13+
import net.minecraft.world.DifficultyInstance;
14+
import net.minecraft.world.entity.Entity;
15+
import net.minecraft.world.entity.player.Player;
16+
import net.minecraft.world.flag.FeatureFlagSet;
17+
import net.minecraft.world.level.WorldGenLevel;
18+
import net.minecraft.world.level.biome.Biome;
19+
import net.minecraft.world.level.biome.BiomeManager;
20+
import net.minecraft.world.level.block.Block;
21+
import net.minecraft.world.level.block.entity.BlockEntity;
22+
import net.minecraft.world.level.block.state.BlockState;
23+
import net.minecraft.world.level.border.WorldBorder;
24+
import net.minecraft.world.level.chunk.ChunkAccess;
25+
import net.minecraft.world.level.chunk.ChunkSource;
26+
import net.minecraft.world.level.chunk.status.ChunkStatus;
27+
import net.minecraft.world.level.dimension.DimensionType;
28+
import net.minecraft.world.level.entity.EntityTypeTest;
29+
import net.minecraft.world.level.gameevent.GameEvent;
30+
import net.minecraft.world.level.levelgen.Heightmap;
31+
import net.minecraft.world.level.lighting.LevelLightEngine;
32+
import net.minecraft.world.level.material.Fluid;
33+
import net.minecraft.world.level.material.FluidState;
34+
import net.minecraft.world.level.storage.LevelData;
35+
import net.minecraft.world.phys.AABB;
36+
import net.minecraft.world.phys.Vec3;
37+
import net.minecraft.world.ticks.LevelTickAccess;
38+
import net.swedz.tesseract.neoforge.api.Assert;
39+
40+
import java.util.List;
41+
import java.util.function.Consumer;
42+
import java.util.function.Predicate;
43+
44+
@SuppressWarnings("deprecation")
45+
public final class TrackingWorldGenLevel implements WorldGenLevel
46+
{
47+
private final WorldGenLevel level;
48+
49+
private final Consumer<BlockPos> onSetBlock;
50+
51+
public TrackingWorldGenLevel(WorldGenLevel level, Consumer<BlockPos> onSetBlock)
52+
{
53+
Assert.noneNull(level, onSetBlock);
54+
this.level = level;
55+
this.onSetBlock = onSetBlock;
56+
}
57+
58+
@Override
59+
public long getSeed()
60+
{
61+
return level.getSeed();
62+
}
63+
64+
@Override
65+
public ServerLevel getLevel()
66+
{
67+
return level.getLevel();
68+
}
69+
70+
@Override
71+
public long nextSubTickCount()
72+
{
73+
return level.nextSubTickCount();
74+
}
75+
76+
@Override
77+
public LevelTickAccess<Block> getBlockTicks()
78+
{
79+
return level.getBlockTicks();
80+
}
81+
82+
@Override
83+
public LevelTickAccess<Fluid> getFluidTicks()
84+
{
85+
return level.getFluidTicks();
86+
}
87+
88+
@Override
89+
public LevelData getLevelData()
90+
{
91+
return level.getLevelData();
92+
}
93+
94+
@Override
95+
public DifficultyInstance getCurrentDifficultyAt(BlockPos pos)
96+
{
97+
return level.getCurrentDifficultyAt(pos);
98+
}
99+
100+
@Override
101+
public MinecraftServer getServer()
102+
{
103+
return level.getServer();
104+
}
105+
106+
@Override
107+
public ChunkSource getChunkSource()
108+
{
109+
return level.getChunkSource();
110+
}
111+
112+
@Override
113+
public RandomSource getRandom()
114+
{
115+
return level.getRandom();
116+
}
117+
118+
@Override
119+
public void playSound(Player player, BlockPos pos, SoundEvent sound, SoundSource source, float volume, float pitch)
120+
{
121+
level.playSound(player, pos, sound, source, volume, pitch);
122+
}
123+
124+
@Override
125+
public void addParticle(ParticleOptions particleData, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed)
126+
{
127+
level.addParticle(particleData, x, y, z, xSpeed, ySpeed, zSpeed);
128+
}
129+
130+
@Override
131+
public void levelEvent(Player player, int type, BlockPos pos, int data)
132+
{
133+
level.levelEvent(player, type, pos, data);
134+
}
135+
136+
@Override
137+
public void gameEvent(Holder<GameEvent> gameEvent, Vec3 pos, GameEvent.Context context)
138+
{
139+
level.gameEvent(gameEvent, pos, context);
140+
}
141+
142+
@Override
143+
public float getShade(Direction direction, boolean shade)
144+
{
145+
return level.getShade(direction, shade);
146+
}
147+
148+
@Override
149+
public LevelLightEngine getLightEngine()
150+
{
151+
return level.getLightEngine();
152+
}
153+
154+
@Override
155+
public WorldBorder getWorldBorder()
156+
{
157+
return level.getWorldBorder();
158+
}
159+
160+
@Override
161+
public BlockEntity getBlockEntity(BlockPos pos)
162+
{
163+
return level.getBlockEntity(pos);
164+
}
165+
166+
@Override
167+
public BlockState getBlockState(BlockPos pos)
168+
{
169+
return level.getBlockState(pos);
170+
}
171+
172+
@Override
173+
public FluidState getFluidState(BlockPos pos)
174+
{
175+
return level.getFluidState(pos);
176+
}
177+
178+
@Override
179+
public List<Entity> getEntities(Entity entity, AABB area, Predicate<? super Entity> predicate)
180+
{
181+
return level.getEntities(entity, area);
182+
}
183+
184+
@Override
185+
public <T extends Entity> List<T> getEntities(EntityTypeTest<Entity, T> entityTypeTest, AABB bounds, Predicate<? super T> predicate)
186+
{
187+
return level.getEntities(entityTypeTest, bounds, predicate);
188+
}
189+
190+
@Override
191+
public List<? extends Player> players()
192+
{
193+
return level.players();
194+
}
195+
196+
@Override
197+
public ChunkAccess getChunk(int x, int z, ChunkStatus chunkStatus, boolean requireChunk)
198+
{
199+
return level.getChunk(x, z, chunkStatus, requireChunk);
200+
}
201+
202+
@Override
203+
public int getHeight(Heightmap.Types heightmapType, int x, int z)
204+
{
205+
return level.getHeight(heightmapType, x, z);
206+
}
207+
208+
@Override
209+
public int getSkyDarken()
210+
{
211+
return level.getSkyDarken();
212+
}
213+
214+
@Override
215+
public BiomeManager getBiomeManager()
216+
{
217+
return level.getBiomeManager();
218+
}
219+
220+
@Override
221+
public Holder<Biome> getUncachedNoiseBiome(int x, int y, int z)
222+
{
223+
return level.getUncachedNoiseBiome(x, y, z);
224+
}
225+
226+
@Override
227+
public boolean isClientSide()
228+
{
229+
return level.isClientSide();
230+
}
231+
232+
@Override
233+
public int getSeaLevel()
234+
{
235+
return level.getSeaLevel();
236+
}
237+
238+
@Override
239+
public DimensionType dimensionType()
240+
{
241+
return level.dimensionType();
242+
}
243+
244+
@Override
245+
public RegistryAccess registryAccess()
246+
{
247+
return level.registryAccess();
248+
}
249+
250+
@Override
251+
public FeatureFlagSet enabledFeatures()
252+
{
253+
return level.enabledFeatures();
254+
}
255+
256+
@Override
257+
public boolean isStateAtPosition(BlockPos pos, Predicate<BlockState> state)
258+
{
259+
return level.isStateAtPosition(pos, state);
260+
}
261+
262+
@Override
263+
public boolean isFluidAtPosition(BlockPos pos, Predicate<FluidState> predicate)
264+
{
265+
return level.isFluidAtPosition(pos, predicate);
266+
}
267+
268+
@Override
269+
public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft)
270+
{
271+
if(level.setBlock(pos, state, flags, recursionLeft))
272+
{
273+
onSetBlock.accept(pos.immutable());
274+
return true;
275+
}
276+
return false;
277+
}
278+
279+
@Override
280+
public boolean removeBlock(BlockPos pos, boolean isMoving)
281+
{
282+
return level.removeBlock(pos, isMoving);
283+
}
284+
285+
@Override
286+
public boolean destroyBlock(BlockPos pos, boolean dropBlock, Entity entity, int recursionLeft)
287+
{
288+
return level.destroyBlock(pos, dropBlock, entity, recursionLeft);
289+
}
290+
}

src/main/java/net/swedz/tesseract/neoforge/event/TreeGrowthEvent.java renamed to src/main/java/net/swedz/tesseract/neoforge/event/treegrowth/TreeGrowthEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.swedz.tesseract.neoforge.event;
1+
package net.swedz.tesseract.neoforge.event.treegrowth;
22

33
import com.google.common.collect.Lists;
44
import net.minecraft.core.BlockPos;
@@ -9,7 +9,7 @@
99
import java.util.ArrayList;
1010
import java.util.List;
1111

12-
public class TreeGrowthEvent extends BlockEvent
12+
public final class TreeGrowthEvent extends BlockEvent
1313
{
1414
private final List<BlockPos> positions;
1515

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.swedz.tesseract.neoforge.mixin.event.treegrowth;
2+
3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
5+
import net.swedz.tesseract.neoforge.event.treegrowth.FeaturePlacedBlockTracker;
6+
import org.apache.commons.compress.utils.Lists;
7+
import org.spongepowered.asm.mixin.Implements;
8+
import org.spongepowered.asm.mixin.Interface;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Unique;
11+
12+
import java.util.List;
13+
14+
@Mixin(FeaturePlaceContext.class)
15+
@Implements(@Interface(iface = FeaturePlacedBlockTracker.class, prefix = "featurePlacedBlockTracker$"))
16+
public class FeaturePlaceContextGrowthEventMixin
17+
{
18+
@Unique
19+
private final List<BlockPos> trackedPlacedBlockPositions = Lists.newArrayList();
20+
21+
public void featurePlacedBlockTracker$clearTrackedBlockPositions()
22+
{
23+
trackedPlacedBlockPositions.clear();
24+
}
25+
26+
public void featurePlacedBlockTracker$trackBlockPosition(BlockPos pos)
27+
{
28+
trackedPlacedBlockPositions.add(pos);
29+
}
30+
31+
public List<BlockPos> featurePlacedBlockTracker$getTrackedBlockPositions()
32+
{
33+
return trackedPlacedBlockPositions;
34+
}
35+
}

0 commit comments

Comments
 (0)