SHOW:
|
|
- or go back to the newest paste.
1 | package com.example.examplemod; | |
2 | ||
3 | import com.google.common.base.Throwables; | |
4 | import com.google.common.collect.ObjectArrays; | |
5 | import cpw.mods.fml.common.Mod; | |
6 | import cpw.mods.fml.common.Mod.EventHandler; | |
7 | import cpw.mods.fml.common.event.FMLPreInitializationEvent; | |
8 | import cpw.mods.fml.common.eventhandler.SubscribeEvent; | |
9 | import net.minecraft.world.biome.BiomeGenBase; | |
10 | import net.minecraft.world.gen.layer.GenLayer; | |
11 | import net.minecraft.world.gen.layer.GenLayerBiome; | |
12 | import net.minecraft.world.gen.layer.GenLayerRiverMix; | |
13 | import net.minecraft.world.gen.layer.MyModGenLayerAccessor; | |
14 | import net.minecraftforge.common.MinecraftForge; | |
15 | import net.minecraftforge.event.terraingen.WorldTypeEvent; | |
16 | ||
17 | import java.lang.reflect.Field; | |
18 | ||
19 | @Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION) | |
20 | public class ExampleMod | |
21 | { | |
22 | public static final String MODID = "examplemod"; | |
23 | public static final String VERSION = "1.0"; | |
24 | ||
25 | public static BiomeGenBase myBiome; | |
26 | ||
27 | @EventHandler | |
28 | public void preInit(FMLPreInitializationEvent event) { | |
29 | MinecraftForge.TERRAIN_GEN_BUS.register(this); | |
30 | ||
31 | myBiome = new BiomeGenBase(245) { | |
32 | ||
33 | }; | |
34 | } | |
35 | ||
36 | private static Field biomePatternGeneratorChainField; | |
37 | private static Field biomeArrayField; | |
38 | ||
39 | static { | |
40 | // TODO: SRG names for non-dev environment | |
41 | try { | |
42 | biomePatternGeneratorChainField = GenLayerRiverMix.class.getDeclaredField("biomePatternGeneratorChain"); | |
43 | biomePatternGeneratorChainField.setAccessible(true); | |
44 | ||
45 | // this is just an example, there are 4 biome arrays in the class, i am not 100% what they do | |
46 | biomeArrayField = GenLayerBiome.class.getDeclaredField("field_151621_d"); | |
47 | biomeArrayField.setAccessible(true); | |
48 | } catch (NoSuchFieldException e) { | |
49 | Throwables.propagate(e); | |
50 | } | |
51 | } | |
52 | ||
53 | @SubscribeEvent | |
54 | public void onGenLayerInit(WorldTypeEvent.InitBiomeGens event) throws IllegalAccessException { | |
55 | GenLayer biomeLayer = event.originalBiomeGens[1]; | |
56 | do { | |
57 | if (biomeLayer instanceof GenLayerRiverMix) { | |
58 | biomeLayer = (GenLayer) biomePatternGeneratorChainField.get(biomeLayer); | |
59 | } else { | |
60 | biomeLayer = MyModGenLayerAccessor.getParent(biomeLayer); | |
61 | } | |
62 | } while (biomeLayer != null && !(biomeLayer instanceof GenLayerBiome)); | |
63 | ||
64 | if (biomeLayer == null) { | |
65 | throw new IllegalStateException("couldn't locate GenLayerBiome!"); | |
66 | } | |
67 | ||
68 | BiomeGenBase[] biomes = (BiomeGenBase[]) biomeArrayField.get(biomeLayer); | |
69 | biomes = ObjectArrays.concat(biomes, myBiome); | |
70 | biomeArrayField.set(biomeLayer, biomes); | |
71 | } | |
72 | ||
73 | } | |
74 | ||
75 | package net.minecraft.world.gen.layer; | |
76 | ||
77 | /** | |
78 | * @author diesieben07 | |
79 | */ | |
80 | public final class MyModGenLayerAccessor { | |
81 | ||
82 | public static GenLayer getParent(GenLayer genLayer) { | |
83 | return genLayer.parent; | |
84 | } | |
85 | ||
86 | } |