Jump to content

[1.8]Making configurations for Biome and Dimension IDs


NovaViper

Recommended Posts

Its good that you are eager to crack this problem. Though I think you shouldn't be sticking to this problem for too long, since the ConfigOptions do work, and are primarily not ment to be changed ingame. I would recommend finnishing up the rest of the mod, and go back to this problem afterwards.

 

Anyway, on to the new problem. are all the customClassMethod Called when they should? (e.g. ConfigHandler - init()method., ModConfiguration - getCategory() method. )

Projects:

Discontinued:

- N2ConfigAPI

- Meachanical Crafting Table

 

Latest:

- CollectionUtils

 

Coöperations:

- InGameConfigManager

Link to comment
Share on other sites

  • Replies 82
  • Created
  • Last Reply

Top Posters In This Topic

Honestly I dont know if thats is the problem. It wouldnt make sence that your config would be completly empty. I think there should be at least the 'vanilla' configCatagories if it would work this way. Therefore, make sure (with call hiearchy for example) if the methods get called correctly. Otherwise I dont think it will work.

 

Or lex must know what went wrong.

Projects:

Discontinued:

- N2ConfigAPI

- Meachanical Crafting Table

 

Latest:

- CollectionUtils

 

Coöperations:

- InGameConfigManager

Link to comment
Share on other sites

My last guese would be, that the init() method in the ConfigHandler Class doesnt get called, otherwise I dont know it anymore. Im sorry.

 

Edit: I would recommend sticking with the forge system for now, and try again later. The only problem is order/ranking, and its not gamebreaking either, fortunatly. So I would focus on (possible)bigger problems.

Projects:

Discontinued:

- N2ConfigAPI

- Meachanical Crafting Table

 

Latest:

- CollectionUtils

 

Coöperations:

- InGameConfigManager

Link to comment
Share on other sites

Your config is empty because, your private Map<String, Property> properties = new TreeMap<String, Property>(); that is defined in new class is empty... :D (because fields can't be overrided like methods)...

You have 3 options to avoid this:

- Override all emthods and fields in order to fill your porperties and not super one

- Use reflection to get private field

- getValues(), returns this private list without sorting. All you want to do now is convert Map<String, Property> into List<Property>...

Link to comment
Share on other sites

Oops, forgot to post my code

 

ModConfiguration

package common.zeroquest.core.configuration;

import java.io.File;
import java.util.Map;
import java.util.TreeMap;

import net.minecraftforge.common.config.Configuration;

public class ModConfiguration extends Configuration {

private Map<String, ModConfigCategory> categories = new TreeMap<String, ModConfigCategory>();
private boolean changed = false;

public ModConfiguration() {}

/**
 * Create a configuration file for the file given in parameter.
 */
public ModConfiguration(File file) {
	super(file);
}

@Override
public ModConfigCategory getCategory(String category) {
	ModConfigCategory ret = categories.get(category);

	if (ret == null) {
		if (category.contains(CATEGORY_SPLITTER)) {
			String[] hierarchy = category.split("\\" + CATEGORY_SPLITTER);
			ModConfigCategory parent = categories.get(hierarchy[0]);

			if (parent == null) {
				parent = new ModConfigCategory(hierarchy[0]);
				categories.put(parent.getQualifiedName(), parent);
				changed = true;
			}

			for (int i = 1; i < hierarchy.length; i++) {
				String name = ModConfigCategory.getQualifiedName(hierarchy[i], parent);
				ModConfigCategory child = categories.get(name);

				if (child == null) {
					child = new ModConfigCategory(hierarchy[i], parent);
					categories.put(name, child);
					changed = true;
				}

				ret = child;
				parent = child;
			}
		}
		else {
			ret = new ModConfigCategory(category);
			categories.put(category, ret);
			changed = true;
		}
	}

	return ret;
}

}

 

ModConfigCategory

package common.zeroquest.core.configuration;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.google.common.collect.ImmutableList;

import net.minecraftforge.common.config.ConfigCategory;
import net.minecraftforge.common.config.Property;

public class ModConfigCategory extends ConfigCategory {

public ModConfigCategory(String name) {
	super(name);
}

public ModConfigCategory(String name, ModConfigCategory parent) {
	super(name, parent);
}

@Override
public List<Property> getOrderedValues() {

	return ImmutableList.copyOf(getValues().values());
}

}

 

ConfigHandler

package common.zeroquest.core.handlers;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import net.minecraftforge.common.config.Property;

import org.apache.logging.log4j.Logger;

import common.zeroquest.ZeroQuest;
import common.zeroquest.core.configuration.ModConfiguration;
import common.zeroquest.lib.Constants;
import common.zeroquest.lib.IDs;

public class ConfigHandler {

// Add more Categories for GuiFactory\\
public static ModConfiguration config;
public static final String CATEGORY_LOAD = "load";
public static final String CATEGORY_FUNCTION = "function";
public static final String CATEGORY_MISC = "miscellaneous";
public static final String CATEGORY_DIMENSION = "dimensions";
public static final String CATEGORY_BIOME = "biomes";

public static void init(File file) {
	config = new ModConfiguration(file);
	loadConfig();
}

public static void loadConfig() {

	config.addCustomCategoryComment(CATEGORY_FUNCTION, "Here you can manage all mod and entity functions");
	config.addCustomCategoryComment(CATEGORY_LOAD, "Here you can manage what the mod loads into the game");
	config.addCustomCategoryComment(CATEGORY_MISC, "Here you can manage the miscellaneous functions of the mod");
	config.addCustomCategoryComment(CATEGORY_DIMENSION, "Here you can manage the mod's dimension factors");
	config.addCustomCategoryComment(CATEGORY_BIOME, "Here you can manage the mod's biome factors");

	//@formatter:off
	/*=================================Load Configurations==========================================*/
	//@formatter:on
	Constants.DEF_DARKLOAD = config.get(CATEGORY_LOAD, "DarkElements", Constants.DEF_DARKLOAD).setLanguageKey(Constants.guiKey + "DarkElements").setRequiresMcRestart(true).getBoolean(Constants.DEF_DARKLOAD);
	Constants.DEF_STARTING_ITEMS = config.get(CATEGORY_LOAD, "StartingItems", Constants.DEF_STARTING_ITEMS).setLanguageKey(Constants.guiKey + "StartingItems").getBoolean(Constants.DEF_STARTING_ITEMS);
	Constants.DEF_MODCHECKER = config.get(CATEGORY_LOAD, "ModCheck", Constants.DEF_MODCHECKER).setLanguageKey(Constants.guiKey + "ModCheck").getBoolean(Constants.DEF_MODCHECKER);

	//@formatter:off
	/*=================================Function Configurations==========================================*/
	//@formatter:on
	Constants.DEF_HEALING = config.get(CATEGORY_FUNCTION, "Healing", Constants.DEF_HEALING).setLanguageKey(Constants.guiKey + "Healing").getBoolean(Constants.DEF_HEALING);
	Constants.DEF_SNOWSTEP = config.get(CATEGORY_FUNCTION, "SnowStep", Constants.DEF_SNOWSTEP).setLanguageKey(Constants.guiKey + "SnowStep").getBoolean(Constants.DEF_SNOWSTEP);
	Constants.DEF_GRASSSTEP = config.get(CATEGORY_FUNCTION, "GrassStep", Constants.DEF_GRASSSTEP).setLanguageKey(Constants.guiKey + "GrassStep").getBoolean(Constants.DEF_GRASSSTEP);

	//@formatter:off
	/*=================================Miscellaneous Configurations==========================================*/
	//@formatter:on

	Constants.DEF_HOWL = config.get(CATEGORY_MISC, "Howl", Constants.DEF_HOWL).setLanguageKey(Constants.guiKey + "Howl").getBoolean(Constants.DEF_HOWL);
	Constants.DEF_IS_HUNGER_ON = config.get(CATEGORY_MISC, "HungerDecay", Constants.DEF_IS_HUNGER_ON).setLanguageKey(Constants.guiKey + "HungerDecay").getBoolean(Constants.DEF_IS_HUNGER_ON);

	//@formatter:off
	/*=================================DimensionsConfigurations==========================================*/
	//@formatter:on

	IDs.Nillax = config.get(CATEGORY_DIMENSION, "NillaxID", IDs.Nillax).setLanguageKey(Constants.guiKey + "NillaxID").setRequiresMcRestart(true).getInt(IDs.Nillax);
	if (Constants.DEF_DARKLOAD == true) {
		IDs.Darkax = config.get(CATEGORY_DIMENSION, "DarkaxID", IDs.Darkax).setLanguageKey(Constants.guiKey + "DarkaxID").setRequiresMcRestart(true).getInt(IDs.Darkax);
	}

	//@formatter:off
	/*=================================BiomesConfigurations==========================================*/
	//@formatter:on
	IDs.bioZone = config.get(CATEGORY_BIOME, "BioZoneID", IDs.bioZone).setLanguageKey(Constants.guiKey + "BioZoneID").setRequiresMcRestart(true).getInt(IDs.bioZone);
	IDs.redSeed = config.get(CATEGORY_BIOME, "RedSeedID", IDs.redSeed).setLanguageKey(Constants.guiKey + "RedSeedID").setRequiresMcRestart(true).getInt(IDs.redSeed);
	IDs.blueTaiga = config.get(CATEGORY_BIOME, "BlueTaigaID", IDs.blueTaiga).setLanguageKey(Constants.guiKey + "BlueTaigaID").setRequiresMcRestart(true).getInt(IDs.blueTaiga);
	IDs.blueTaigaHills = config.get(CATEGORY_BIOME, "BlueTaigaHillsID", IDs.blueTaigaHills).setLanguageKey(Constants.guiKey + "BlueTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueTaigaHills);
	IDs.blueColdTaiga = config.get(CATEGORY_BIOME, "BlueColdTaigaID", IDs.blueColdTaiga).setLanguageKey(Constants.guiKey + "BlueColdTaigaID").setRequiresMcRestart(true).getInt(IDs.blueColdTaiga);
	IDs.blueColdTaigaHills = config.get(CATEGORY_BIOME, "BlueColdTaigaHillsID", IDs.blueColdTaigaHills).setLanguageKey(Constants.guiKey + "BlueColdTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueColdTaigaHills);
	IDs.blueMegaTaiga = config.get(CATEGORY_BIOME, "BlueMegaTaigaID", IDs.blueMegaTaiga).setLanguageKey(Constants.guiKey + "BlueMegaTaigaID").setRequiresMcRestart(true).getInt(IDs.blueMegaTaiga);
	IDs.blueMegaTaigaHills = config.get(CATEGORY_BIOME, "BlueMegaTaigaHillsID", IDs.blueMegaTaigaHills).setLanguageKey(Constants.guiKey + "BlueMegaTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueMegaTaigaHills);
	IDs.pinkZone = config.get(CATEGORY_BIOME, "PinkZoneID", IDs.pinkZone).setLanguageKey(Constants.guiKey + "PinkZoneID").setRequiresMcRestart(true).getInt(IDs.pinkZone);
	IDs.destroZone = config.get(CATEGORY_BIOME, "DestroZoneID", IDs.destroZone).setLanguageKey(Constants.guiKey + "DestroZoneID").setRequiresMcRestart(true).getInt(IDs.destroZone);
	IDs.destroZoneHills = config.get(CATEGORY_BIOME, "DestroZoneHillsID", IDs.destroZoneHills).setLanguageKey(Constants.guiKey + "DestroZoneHillsID").setRequiresMcRestart(true).getInt(IDs.destroZoneHills);
	IDs.walRockland = config.get(CATEGORY_BIOME, "WalRocklandID", IDs.walRockland).setLanguageKey(Constants.guiKey + "WalRocklandID").setRequiresMcRestart(true).getInt(IDs.walRockland);
	if (Constants.DEF_DARKLOAD == true) {
		IDs.darkWasteland = config.get(CATEGORY_BIOME, "DarkaxBiomeID", IDs.darkWasteland).setLanguageKey(Constants.guiKey + "DarkaxBiomeID").setRequiresMcRestart(true).getInt(IDs.darkWasteland);
	}
	IDs.nileSavanna = config.get(CATEGORY_BIOME, "NileSavannaID", IDs.nileSavanna).setLanguageKey(Constants.guiKey + "NileSavannaID").setRequiresMcRestart(true).getInt(IDs.nileSavanna);
	IDs.nileSavannaPlateau = config.get(CATEGORY_BIOME, "NileSavannaPlateauID", IDs.nileSavannaPlateau).setLanguageKey(Constants.guiKey + "NileSavannaPlateauID").setRequiresMcRestart(true).getInt(IDs.nileSavannaPlateau);
	IDs.nileJungle = config.get(CATEGORY_BIOME, "NileJungleID", IDs.nileJungle).setLanguageKey(Constants.guiKey + "NileJungleID").setRequiresMcRestart(true).getInt(IDs.nileJungle);
	IDs.nileJungleHills = config.get(CATEGORY_BIOME, "NileJungleHillsID", IDs.nileJungleHills).setLanguageKey(Constants.guiKey + "NileJungleHillsID").setRequiresMcRestart(true).getInt(IDs.nileJungleHills);
	IDs.nileJungleEdge = config.get(CATEGORY_BIOME, "NileJungleEdgeID", IDs.nileJungleEdge).setLanguageKey(Constants.guiKey + "NileJungleEdgeID").setRequiresMcRestart(true).getInt(IDs.nileJungleEdge);
	IDs.nileSwampland = config.get(CATEGORY_BIOME, "NileSwamplandID", IDs.nileSwampland).setLanguageKey(Constants.guiKey + "NileSwamplandID").setRequiresMcRestart(true).getInt(IDs.nileSwampland);
	IDs.nileMesa = config.get(CATEGORY_BIOME, "NileMesaID", IDs.nileMesa).setLanguageKey(Constants.guiKey + "NileMesaID").setRequiresMcRestart(true).getInt(IDs.nileMesa);
	IDs.nileMesaPlateau_F = config.get(CATEGORY_BIOME, "NileMesaPlateauFID", IDs.nileMesaPlateau_F).setLanguageKey(Constants.guiKey + "NileMesaPlateauFID").setRequiresMcRestart(true).getInt(IDs.nileMesaPlateau_F);
	IDs.nileMesaPlateau = config.get(CATEGORY_BIOME, "NileMesaPlateauID", IDs.nileMesaPlateau).setLanguageKey(Constants.guiKey + "NileMesaPlateauID").setRequiresMcRestart(true).getInt(IDs.nileMesaPlateau);
	IDs.nileMountains = config.get(CATEGORY_BIOME, "NileMountainsID", IDs.nileMountains).setLanguageKey(Constants.guiKey + "NileMountainsID").setRequiresMcRestart(true).getInt(IDs.nileMountains);
	IDs.nileMountainsEdge = config.get(CATEGORY_BIOME, "NileMountainsEdgeID", IDs.nileMountainsEdge).setLanguageKey(Constants.guiKey + "NileMountainsEdgeID").setRequiresMcRestart(true).getInt(IDs.nileMountainsEdge);
	IDs.nileMountainsPlus = config.get(CATEGORY_BIOME, "NileMountainsPlusID", IDs.nileMountainsPlus).setLanguageKey(Constants.guiKey + "NileMountainsPlusID").setRequiresMcRestart(true).getInt(IDs.nileMountainsPlus);

	if (config.hasChanged()) {
		config.save();
	}
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

I'm not sure how to use a reflection, but I'm getting an error from eclipse from attempting to use it

 

null
org.eclipse.recommenders.calls.rcp
Error
Sun Jun 07 10:53:25 CDT 2015
Proposal matching failed for [METHOD_REF]{completion:clone(), declSign:[Ljava.lang.annotation.Annotation;, sign:()[Ljava.lang.annotation.Annotation;, declKey:, key:, name:clone, replace:[492,492], token:[492,492], relevance:35}.

org.eclipse.recommenders.utils.Logs$LogTraceException
at org.eclipse.recommenders.utils.Logs$LogTraceException.newTrace(Logs.java:377)
at org.eclipse.recommenders.utils.Logs.log(Logs.java:130)
at org.eclipse.recommenders.internal.calls.rcp.CallCompletionSessionProcessor.process(CallCompletionSessionProcessor.java:203)
at org.eclipse.recommenders.completion.rcp.processable.IntelligentCompletionProposalComputer.fireProcessProposal(IntelligentCompletionProposalComputer.java:243)
at org.eclipse.recommenders.completion.rcp.processable.IntelligentCompletionProposalComputer.computeCompletionProposals(IntelligentCompletionProposalComputer.java:143)
at org.eclipse.jdt.internal.ui.text.java.CompletionProposalComputerDescriptor.computeCompletionProposals(CompletionProposalComputerDescriptor.java:333)
at org.eclipse.jdt.internal.ui.text.java.CompletionProposalCategory.computeCompletionProposals(CompletionProposalCategory.java:337)
at org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.collectProposals(ContentAssistProcessor.java:325)
at org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.computeCompletionProposals(ContentAssistProcessor.java:282)
at org.eclipse.jface.text.contentassist.ContentAssistant$5.run(ContentAssistant.java:1904)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.jface.text.contentassist.ContentAssistant.computeCompletionProposals(ContentAssistant.java:1902)
at org.eclipse.jface.text.contentassist.CompletionProposalPopup.computeProposals(CompletionProposalPopup.java:573)
at org.eclipse.jface.text.contentassist.CompletionProposalPopup.access$16(CompletionProposalPopup.java:570)
at org.eclipse.jface.text.contentassist.CompletionProposalPopup$2.run(CompletionProposalPopup.java:505)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.jface.text.contentassist.CompletionProposalPopup.showProposals(CompletionProposalPopup.java:499)
at org.eclipse.jface.text.contentassist.ContentAssistant$2.run(ContentAssistant.java:384)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
at org.eclipse.equinox.launcher.Main.run(Main.java:1465)

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

	Class c = Class.forName("net.minecraftforge.common.config.Configuration");
Field privateStringField = PrivateObject.class.getDeclaredField("privateString");

public ModConfiguration() {}

/**
 * Create a configuration file for the file given in parameter.
 */
public ModConfiguration(File file) {
	super(file);
}

@Override
public ModConfigCategory getCategory(String category) {
	ModConfigCategory ret = c.getMethods()..get(category);

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

And this also

 

package common.zeroquest.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionAll {

public static void main(String[] args) {
	try{
		Class c = Class.forName("net.minecraftforge.common.config.Configuration");
		//Method methodList[] = c.getDeclaredMethods();
		Field[] fields = c.getDeclaredFields();
		System.out.println(fields); << Error here
	}catch (Exception e){
		System.out.println("ERROR:" + e.getMessage());
	}
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

In this case, you have to reflect a private field, it s done like so:

1) Get class (by name or in any way).

2) Call class.getDeclaredField(name) method to get private field (getField does not return private fields, but return super defined fields (getDeclaredField does not)).

3) Call field.setAcessible(true), this will make this field value acessible.

4) Now call either:

4.1) get(instance), where instance is instance of object from which you want to get this field (can be null for static fields)...

4.2) set(instance, value), where instance is instance of object from which you want to get this field (can be null for static fields) and value - value you want to set it to...

Link to comment
Share on other sites

I'm a little confued at step 4, do I get the Configuration class name? I'm using the Reflection class I made like this

 

ModConfiguration

package common.zeroquest.core.configuration;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.TreeMap;

import common.zeroquest.reflection.ReflectionConfig;

import net.minecraftforge.common.config.Configuration;

public class ModConfiguration extends Configuration {

public ModConfiguration() {}

/**
 * Create a configuration file for the file given in parameter.
 */
public ModConfiguration(File file) {
	super(file);
}

@Override
public ModConfigCategory getCategory(String category) {
	ModConfigCategory ret = ReflectionConfig.main(Configuration.class.toString()).get(category);

	if (ret == null) {
		if (category.contains(CATEGORY_SPLITTER)) {
			String[] hierarchy = category.split("\\" + CATEGORY_SPLITTER);
			ModConfigCategory parent = categories.get(hierarchy[0]);

			if (parent == null) {
				parent = new ModConfigCategory(hierarchy[0]);
				categories.put(parent.getQualifiedName(), parent);
				changed = true;
			}
			for (int i = 1; i < hierarchy.length; i++) {
				String name = ModConfigCategory.getQualifiedName(hierarchy[i], parent);
				ModConfigCategory child = categories.get(name);

				if (child == null) {
					child = new ModConfigCategory(hierarchy[i], parent);
					categories.put(name, child);
					changed = true;
				}

				ret = child;
				parent = child;
			}
		}
		else {
			ret = new ModConfigCategory(category);
			categories.put(category, ret);
			changed = true;
		}
	}
	return ret;
}
}

 

Reflection

package common.zeroquest.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionConfig {

public static void main(String[] args) {
	try{
		Class c = Class.forName("net.minecraftforge.common.config.Configuration");
		//Method methodList[] = c.getDeclaredMethods();
		Field field = c.getDeclaredField("categories");
		field.setAccessible(true);
		field.get(args);
		System.out.println(field);
	}catch (Exception e){
		System.out.println("ERROR:" + e.getMessage());
	}
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

field.get(instance) is the equal to instance.fieldName, with one but: You can access private fields like that...

 

Some examples of reflection.

These will be true:

1)

this.a == getClass().getField("a").get(this);

if a is public field

2)

this.a == getClass().getDeclaredField("a").get(this);

if a is not super field

If

a

is private super field (

SuperClass{private Object a; ChildClass extends SuperClass{}

) , 1ststatement will give compile error, 2nd will throw null pinter, 3rd will throw null pinter, 4th will work:

1)

Object b = a;

2)

Object b = getClass().getField("a").get(this);

3)

Object b = Class.forName("SuperClass").getField("a").get(this);

4)

Object b = Class.forName("SuperClass").getDeclaredField("a").get(this);

 

 

So it total, your method should probably look like this:

Get super map with reflection

Do all stuff and thigs with this map that you just got (get values, add, remove...)

Set set super map using reflection to this changed map (just to be sure it changed)

Return needed value

Link to comment
Share on other sites

I thought it was needed, whenever I put the methods in the class, I get errors from eclipse saying ClassNotFoundExpection

Then show how, where and exact error log... And also you don't even need this method! I'm serious!

Link to comment
Share on other sites

Description	Resource	Path	Location	Type
Unhandled exception type NoSuchFieldException	ModConfiguration.java	/Minecraft/src/main/java/common/zeroquest/core/configuration	line 13	Java Problem
Unhandled exception type ClassNotFoundException	ModConfiguration.java	/Minecraft/src/main/java/common/zeroquest/core/configuration	line 12	Java Problem

 

I can't grab a description about it

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

And my code

package common.zeroquest.core.configuration;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.TreeMap;

import net.minecraftforge.common.config.Configuration;

public class ModConfiguration extends Configuration {

Class c = Class.forName("net.minecraftforge.common.config.Configuration"); <<<Error : ClassNotFoundException
Field fieldString = c.getDeclaredField("categories"); <<<Error: NoSuchFieldException
Field fieldBoolean = c.getDeclaredField("changed"); <<<<Error:NoSuchFieldException

public ModConfiguration() {}

/**
 * Create a configuration file for the file given in parameter.
 */
public ModConfiguration(File file) {
	super(file);
}

@Override
public ModConfigCategory getCategory(String category) {
	fieldString.setAccessible(true);
	fieldBoolean.setAccessible(true);

	ModConfigCategory ret = categories.get(category);

	if (ret == null) {
		if (category.contains(CATEGORY_SPLITTER)) {
			String[] hierarchy = category.split("\\" + CATEGORY_SPLITTER);
			ModConfigCategory parent = categories.get(hierarchy[0]);

			if (parent == null) {
				parent = new ModConfigCategory(hierarchy[0]);
				categories.put(parent.getQualifiedName(), parent);
				changed = true;
			}
			for (int i = 1; i < hierarchy.length; i++) {
				String name = ModConfigCategory.getQualifiedName(hierarchy[i], parent);
				ModConfigCategory child = categories.get(name);

				if (child == null) {
					child = new ModConfigCategory(hierarchy[i], parent);
					categories.put(name, child);
					changed = true;
				}

				ret = child;
				parent = child;
			}
		}
		else {
			ret = new ModConfigCategory(category);
			categories.put(category, ret);
			changed = true;
		}
	}
	return ret;
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements




×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.