package jk_5.nailed.server.map.gamerule;
import jk_5.nailed.api.gamerule.DefaultGameRuleKey;
import jk_5.nailed.api.gamerule.GameRule;
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.ArrayList;
import java.util.List;
/**
* No description given
*
* @author jk-5
*/
public class DelegatingGameRules extends net.minecraft.world.GameRules {
private static final Logger logger = LogManager.getLogger();
private final GameRules<GameRule<?>> wrapped;
private boolean allowCreation = true;
public DelegatingGameRules(GameRules<GameRule<?>> wrapped) {
super();
this.allowCreation = false; //Creation will be done in the super constructor. Don't log messages when it happens
this.wrapped = wrapped;
}
@Override
public void addGameRule(String key, String value, ValueType type) {
if(!allowCreation) logger.warn("Tried to add gamerule {} (value: {}, type: {}) to immutable gamerules object. Ignoring", key, value, type.name());
}
@Override
public void setOrCreateGameRule(String key, String value) {
logger.warn("Tried to add gamerule {} (value: {}) to immutable gamerules object. Ignoring", key, value);
}
@Override
public String getGameRuleStringValue(String name) {
return wrapped.get(DefaultGameRuleKey.getByName(name)).toString();
}
@Override
public boolean getGameRuleBooleanValue(String name) {
GameRuleKey<?> key = DefaultGameRuleKey.getByName(name);
if(key == null){
logger.warn("Could not find gamerule key for rule " + name);
return false;
}
if(key.getType() == GameRuleKey.Type.BOOL){
//noinspection unchecked
return wrapped.get((GameRuleKey<Boolean>) key).getValue();
}else{
logger.warn("Requested boolean gamerule with name {} but it was of type {}", name, key.getType());
return false;
}
}
@Override
public int getInt(String name) {
GameRuleKey<?> key = DefaultGameRuleKey.getByName(name);
if(key.getType() == GameRuleKey.Type.INTEGER){
//noinspection unchecked
return wrapped.get((GameRuleKey<Integer>) key).getValue();
}else{
logger.warn("Requested integer gamerule with name {} but it was of type {}", name, key.getType());
return 0;
}
}
@Override
public NBTTagCompound writeGameRulesToNBT() {
NBTTagCompound nbt = new NBTTagCompound();
for(GameRule<?> rule : wrapped.list()){
nbt.setString(rule.getKey().getName(), rule.getValue().toString());
}
return nbt;
}
@Override
public void readGameRulesFromNBT(NBTTagCompound nbt) {
logger.warn("Tried to read immutable gamerules object from nbt. Ignoring");
}
@Override
public String[] getRules() {
List<String> ret = new ArrayList<String>(this.wrapped.list().size());
for(GameRule<?> rule : this.wrapped.list()){
ret.add(rule.getKey().getName());
}
return ret.toArray(new String[ret.size()]);
}
@Override
public boolean hasRule(String name) {
for(GameRule<?> rule : this.wrapped.list()){
if(rule.getKey().getName().equalsIgnoreCase(name)){
return true;
}
}
return false;
}
@Override
public boolean areSameType(String key, ValueType type) {
if(type == ValueType.ANY_VALUE) return true;
GameRuleKey<?> ruleKey = null;
for(GameRule<?> rule : this.wrapped.list()){
if(rule.getKey().getName().equalsIgnoreCase(key)){
ruleKey = rule.getKey();
}
}
if(ruleKey == null) return false;
return (ruleKey.getType() == GameRuleKey.Type.BOOL && type == ValueType.BOOLEAN_VALUE) || (ruleKey.getType() == GameRuleKey.Type.INTEGER && type == ValueType.NUMERICAL_VALUE);
}
@Override
public String toString() {
return "DelegatingGameRules{" +
"wrapped=" + wrapped +
'}';
}
}