aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/bloodasp/galacticgreg/registry/GalacticGregRegistry.java
blob: b45353da6ec909f3547c76e44e7eb58b6f2dab03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package bloodasp.galacticgreg.registry;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import net.minecraft.world.chunk.IChunkProvider;

import bloodasp.galacticgreg.GalacticGreg;
import bloodasp.galacticgreg.api.Enums.DimensionType;
import bloodasp.galacticgreg.api.ModContainer;
import bloodasp.galacticgreg.api.ModDimensionDef;
import bloodasp.galacticgreg.dynconfig.DynamicDimensionConfig;
import bloodasp.galacticgreg.generators.GenEllipsoid;
import cpw.mods.fml.common.Loader;

/**
 * GalacticGregs registry
 *
 */
public class GalacticGregRegistry {

    private static final Map<String, ModContainer> _mModContainers = new HashMap<>();
    public static final String DIM_UNKNOWN = "GGREG_DIMENSION_UNKNOWN";
    private static boolean _mInitializationDone = false;

    /**
     * Register new ModContainer in the registry. Call this after you've populated it with Dimensions and Blocks Must be
     * called from your own PreInit or Init event
     * 
     * @param pModContainer
     * @return
     */
    public static boolean registerModContainer(ModContainer pModContainer) {
        if (_mInitializationDone) {
            GalacticGreg.Logger.warn("Initialization is already done, you can't add more ModContainers!");
            return false;
        }

        if (_mModContainers.containsKey(pModContainer.getModName())) {
            GalacticGreg.Logger
                .warn("There is already a mod registered with that name: [%s]", pModContainer.getModName());
            return false;
        } else {
            GalacticGreg.Logger.info(
                "Registered new mod to generate ores: [%s] Dimensions provided: [%d]",
                pModContainer.getModName(),
                pModContainer.getDimensionList()
                    .size());
            _mModContainers.put(pModContainer.getModName(), pModContainer);
            return true;
        }
    }

    /**
     * Lookup the registered dimensions and try to find the DimensionDefinition that has the ChunkProvider that we have
     * here
     * 
     * @param pChunkProvider
     * @return
     */
    public static ModDimensionDef getDimensionTypeByChunkGenerator(IChunkProvider pChunkProvider) {
        try {
            if (!_mInitializationDone) return null;

            String tFQCPN = pChunkProvider.toString()
                .split("@")[0];
            ModDimensionDef tReturnMDD = null;

            for (ModContainer mc : _mModContainers.values()) {
                for (ModDimensionDef mdd : mc.getDimensionList()) {
                    if (mdd.getChunkProviderName()
                        .equals(tFQCPN)) {
                        tReturnMDD = mdd;
                        break;
                    }
                }
            }

            return tReturnMDD;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Get all registered modcontainers. Can only be done after the initialization process is done
     * 
     * @return
     */
    public static Collection<ModContainer> getModContainers() {
        if (!_mInitializationDone) return null;

        return _mModContainers.values();
    }

    /**
     * Initializes the Registry. Never do this in your code, GalacticGreg will crash if you do so
     */
    public static boolean InitRegistry() {
        if (_mInitializationDone) // never run init twice!
            return false;

        InitModContainers();

        DynamicDimensionConfig.InitDynamicConfig();
        return true;
    }

    /**
     * Parse modcontainers and search for loaded mods. Enable found mods for generation
     */
    private static void InitModContainers() {
        for (ModContainer mc : _mModContainers.values()) {
            if (!Loader.isModLoaded(mc.getModName()) && !mc.getModName()
                .equalsIgnoreCase("vanilla")) {
                GalacticGreg.Logger.warn(
                    "Ignoring ModRegistration for OreGen: [%s], because mod is not loaded. Did you misspell the name?",
                    mc.getModName());
                mc.setEnabled(false);
            } else {
                GalacticGreg.Logger.info("Mod [%s] is now enabled for OreGen by GalacticGreg", mc.getModName());
                mc.setEnabled(true);
                for (ModDimensionDef md : mc.getDimensionList()) {
                    GalacticGreg.Logger.info(
                        "ModID: [%s] DimName: [%s] ValidBlocks: [%d] Identifier: [%s] Generators: [%d]",
                        mc.getModName(),
                        md.getDimensionName(),
                        md.getReplaceableBlocks()
                            .size(),
                        md.getDimIdentifier(),
                        md.getSpaceObjectGenerators()
                            .size());

                    // Register default generator if dimension is asteroid and no generator was added
                    if (md.getDimensionType() == DimensionType.AsteroidAndPlanet
                        || md.getDimensionType() == DimensionType.Asteroid) {
                        if (md.getSpaceObjectGenerators()
                            .size() == 0) {
                            GalacticGreg.Logger.debug("No generators found, adding build-in ellipsoid generator");
                            md.registerSpaceObjectGenerator(new GenEllipsoid());
                        }
                        GalacticGreg.Logger.info(
                            "Asteroid-Enabled dimension. Registered Generators: [%d]",
                            md.getSpaceObjectGenerators()
                                .size());
                    }

                    md.finalizeReplaceableBlocks(mc.getModName());
                }
            }
        }
        _mInitializationDone = true;
    }

    /**
     * Returns ModContainer for given DimensionDefinition
     * 
     * @param pDimensionDefinition
     * @return
     */
    public static ModContainer getModContainerForDimension(ModDimensionDef pDimensionDefinition) {
        if (!_mInitializationDone) return null;

        try {
            for (ModContainer mc : _mModContainers.values()) {
                for (ModDimensionDef md : mc.getDimensionList()) {
                    if (pDimensionDefinition.getDimIdentifier()
                        .equals(md.getDimIdentifier())) {
                        return mc;
                    }
                }
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}