package jk_5.nailed.server.map.gamerule; import com.google.common.collect.MapMaker; import jk_5.nailed.api.gamerule.DefaultGameRuleKey; import jk_5.nailed.api.gamerule.EditableGameRules; import jk_5.nailed.api.gamerule.GameRuleKey; import jk_5.nailed.api.gamerule.GameRules; import net.minecraft.nbt.NBTTagCompound; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Map; import java.util.Set; /** * No description given * * @author jk-5 */ public class DelegatingEditableGameRules extends DelegatingGameRules { private static final Logger logger = LogManager.getLogger(); private static final Map<GameRules, net.minecraft.world.GameRules> cache = new MapMaker().weakKeys().makeMap(); private final EditableGameRules wrapped; public DelegatingEditableGameRules(EditableGameRules wrapped) { //noinspection unchecked super((GameRules) wrapped); this.wrapped = wrapped; } @Override public void readGameRulesFromNBT(NBTTagCompound nbt) { //noinspection unchecked Set<String> keys = (Set<String>) nbt.getKeySet(); for(String key : keys){ this.setOrCreateGameRule(key, nbt.getString(key)); } } @Override public void addGameRule(String key, String value, ValueType type) { logger.warn("Tried to create gamerule {} (value: {}, type: {}). Ignoring", key, value, type); } @Override public void setOrCreateGameRule(String key, String value) { GameRuleKey<?> ruleKey = DefaultGameRuleKey.getByName(key); if(ruleKey == null){ logger.warn("Tried to set gamerule {} to {} but it does not exist. Ignoring", key, value); return; } if(ruleKey.getType() == GameRuleKey.Type.BOOL){ //noinspection unchecked wrapped.get((GameRuleKey<Boolean>) ruleKey).setValue(value.equals("true")); }else if(ruleKey.getType() == GameRuleKey.Type.INTEGER){ //noinspection unchecked wrapped.get((GameRuleKey<Integer>) ruleKey).setValue(Integer.parseInt(value)); } } public static net.minecraft.world.GameRules get(GameRules original){ if(!cache.containsKey(original)){ DelegatingGameRules v; if(original instanceof EditableGameRules){ v = new DelegatingEditableGameRules((EditableGameRules) original); }else{ //noinspection unchecked v = new DelegatingGameRules(original); } cache.put(original, v); return v; }else{ return cache.get(original); } } @Override public String toString() { return "DelegatingEditableGameRules{" + "wrapped=" + wrapped + '}'; } }