diff --git a/build.gradle b/build.gradle index 148d077..06aa5ee 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { apply plugin: 'net.minecraftforge.gradle.forge' -version = "1.12.2-0.1.1" +version = "1.12.2-0.2.0" group = "com.charles445.simpledifficulty" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "SimpleDifficulty" diff --git a/src/main/java/com/charles445/simpledifficulty/SimpleDifficulty.java b/src/main/java/com/charles445/simpledifficulty/SimpleDifficulty.java index 747e666..c73c8cf 100644 --- a/src/main/java/com/charles445/simpledifficulty/SimpleDifficulty.java +++ b/src/main/java/com/charles445/simpledifficulty/SimpleDifficulty.java @@ -5,6 +5,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.charles445.simpledifficulty.command.CommandSimpleDifficulty; import com.charles445.simpledifficulty.debug.DebugVerifier; import com.charles445.simpledifficulty.network.PacketHandler; import com.charles445.simpledifficulty.proxy.IProxy; @@ -12,9 +13,11 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; @Mod ( @@ -29,7 +32,7 @@ public class SimpleDifficulty { public static final String MODID = "simpledifficulty"; public static final String NAME = "SimpleDifficulty"; - public static final String VERSION = "0.1.1"; + public static final String VERSION = "0.2.0"; @Mod.Instance(SimpleDifficulty.MODID) public static SimpleDifficulty instance; @@ -52,6 +55,12 @@ public static void preInit(FMLPreInitializationEvent event) } + @Mod.EventHandler + public static void init(FMLInitializationEvent event) + { + proxy.init(); + } + @Mod.EventHandler public static void postInit(FMLPostInitializationEvent event) { @@ -65,6 +74,12 @@ public static void loadComplete(FMLLoadCompleteEvent event) verifier.verify(); } + @Mod.EventHandler + public static void serverStarting(FMLServerStartingEvent event) + { + event.registerServerCommand(new CommandSimpleDifficulty()); + } + static { FluidRegistry.enableUniversalBucket(); diff --git a/src/main/java/com/charles445/simpledifficulty/api/config/JsonConfig.java b/src/main/java/com/charles445/simpledifficulty/api/config/JsonConfig.java new file mode 100644 index 0000000..0990b4a --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/config/JsonConfig.java @@ -0,0 +1,94 @@ +package com.charles445.simpledifficulty.api.config; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.charles445.simpledifficulty.api.config.json.JsonConsumableTemperature; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableThirst; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyTemperature; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyValue; +import com.charles445.simpledifficulty.api.config.json.JsonTemperature; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; + +public class JsonConfig +{ + public static Map armorTemperatures = new HashMap(); + public static Map> blockTemperatures = new HashMap>(); + public static Map fluidTemperatures = new HashMap(); + public static Map> consumableTemperature = new HashMap>(); + public static Map> consumableThirst = new HashMap>(); + + //TODO jdoc + + //Armor + + public static void registerArmorTemperature(ItemStack stack, float temperature) + { + registerArmorTemperature(stack.getItem().getRegistryName().toString(), temperature); + } + + public static void registerArmorTemperature(String registryName, float temperature) + { + armorTemperatures.put(registryName, new JsonTemperature(temperature)); + } + + //Blocks + + public static void registerBlockTemperature(Block block, float temperature, JsonPropertyValue... properties) + { + registerBlockTemperature(block.getRegistryName().toString(), temperature, properties); + } + + public static void registerBlockTemperature(String registryName, float temperature, JsonPropertyValue... properties) + { + if(!blockTemperatures.containsKey(registryName)) + blockTemperatures.put(registryName, new ArrayList()); + blockTemperatures.get(registryName).add(new JsonPropertyTemperature(temperature,properties)); + } + + //Fluid + + public static void registerFluidTemperature(String fluidName, float temperature) + { + fluidTemperatures.put(fluidName, new JsonTemperature(temperature)); + } + + //Consumable Temperature + + public static void registerConsumableTemperature(String group, ItemStack stack, float temperature, int duration) + { + String registryName = stack.getItem().getRegistryName().toString(); + if(!consumableTemperature.containsKey(registryName)) + consumableTemperature.put(registryName, new ArrayList()); + + if(stack.getHasSubtypes()) + consumableTemperature.get(registryName).add(new JsonConsumableTemperature(group, temperature, stack.getMetadata(), duration)); + else + consumableTemperature.get(registryName).add(new JsonConsumableTemperature(group, temperature, -1, duration)); + } + + //ConsumableThirst + + public static void registerConsumableThirst(ItemStack stack, int amount, float saturation, float thirstChance) + { + int metadata = -1; + + if(stack.getHasSubtypes()) + metadata = stack.getMetadata(); + + registerConsumableThirst(stack.getItem().getRegistryName().toString(), metadata, amount, saturation, thirstChance); + } + + public static void registerConsumableThirst(String registryName, int metadata, int amount, float saturation, float thirstChance) + { + if(!consumableThirst.containsKey(registryName)) + consumableThirst.put(registryName, new ArrayList()); + + consumableThirst.get(registryName).add(new JsonConsumableThirst(metadata,amount,saturation,thirstChance)); + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableTemperature.java b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableTemperature.java new file mode 100644 index 0000000..6ce0e83 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableTemperature.java @@ -0,0 +1,24 @@ +package com.charles445.simpledifficulty.api.config.json; + +import net.minecraft.item.ItemStack; + +public class JsonConsumableTemperature +{ + public String group; + public int metadata; + public float temperature; + public int duration; + + public JsonConsumableTemperature(String group, float temperature, int metadata, int duration) + { + this.temperature = temperature; + this.metadata = metadata; + this.duration = duration; + this.group = group.toLowerCase(); + } + + public boolean matches(ItemStack stack) + { + return metadata == -1 || metadata == 32767 || metadata == stack.getMetadata(); + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableThirst.java b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableThirst.java new file mode 100644 index 0000000..f74c199 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonConsumableThirst.java @@ -0,0 +1,24 @@ +package com.charles445.simpledifficulty.api.config.json; + +import net.minecraft.item.ItemStack; + +public class JsonConsumableThirst +{ + public int metadata; + public int amount; + public float saturation; + public float thirstyChance; + + public JsonConsumableThirst(int metadata, int amount, float saturation, float thirstyChance) + { + this.metadata = metadata; + this.amount = amount; + this.saturation = saturation; + this.thirstyChance = thirstyChance; + } + + public boolean matches(ItemStack stack) + { + return metadata == -1 || metadata == 32767 || metadata == stack.getMetadata(); + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/config/json/JsonPropertyTemperature.java b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyTemperature.java similarity index 85% rename from src/main/java/com/charles445/simpledifficulty/config/json/JsonPropertyTemperature.java rename to src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyTemperature.java index 4e2aa1b..eeb593e 100644 --- a/src/main/java/com/charles445/simpledifficulty/config/json/JsonPropertyTemperature.java +++ b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyTemperature.java @@ -1,4 +1,4 @@ -package com.charles445.simpledifficulty.config.json; +package com.charles445.simpledifficulty.api.config.json; import java.util.HashMap; import java.util.Map; @@ -16,11 +16,11 @@ public class JsonPropertyTemperature @SerializedName("temperature") public float temperature; - public JsonPropertyTemperature(float temperature, PropertyValue ... props) + public JsonPropertyTemperature(float temperature, JsonPropertyValue ... props) { this.temperature = temperature; this.properties = new HashMap(); - for(PropertyValue prop : props) + for(JsonPropertyValue prop : props) { properties.put(prop.property, prop.value); } diff --git a/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyValue.java b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyValue.java new file mode 100644 index 0000000..c57c5b2 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonPropertyValue.java @@ -0,0 +1,14 @@ +package com.charles445.simpledifficulty.api.config.json; + +public class JsonPropertyValue +{ + public String property; + public String value; + + public JsonPropertyValue(String property, String value) + { + this.property = property; + this.value = value; + } + +} diff --git a/src/main/java/com/charles445/simpledifficulty/config/json/JsonTemperature.java b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonTemperature.java similarity index 80% rename from src/main/java/com/charles445/simpledifficulty/config/json/JsonTemperature.java rename to src/main/java/com/charles445/simpledifficulty/api/config/json/JsonTemperature.java index 831d803..f9c95eb 100644 --- a/src/main/java/com/charles445/simpledifficulty/config/json/JsonTemperature.java +++ b/src/main/java/com/charles445/simpledifficulty/api/config/json/JsonTemperature.java @@ -1,4 +1,4 @@ -package com.charles445.simpledifficulty.config.json; +package com.charles445.simpledifficulty.api.config.json; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/com/charles445/simpledifficulty/api/temperature/ITemperatureCapability.java b/src/main/java/com/charles445/simpledifficulty/api/temperature/ITemperatureCapability.java index 3398aa5..5357aff 100644 --- a/src/main/java/com/charles445/simpledifficulty/api/temperature/ITemperatureCapability.java +++ b/src/main/java/com/charles445/simpledifficulty/api/temperature/ITemperatureCapability.java @@ -1,5 +1,7 @@ package com.charles445.simpledifficulty.api.temperature; +import com.google.common.collect.ImmutableMap; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import net.minecraftforge.fml.common.gameevent.TickEvent; @@ -8,13 +10,17 @@ public interface ITemperatureCapability { public int getTemperatureLevel(); public int getTemperatureTickTimer(); + public ImmutableMap getTemporaryModifiers(); public void setTemperatureLevel(int temperature); public void setTemperatureTickTimer(int ticktimer); + public void setTemporaryModifier(String name, float temperature, int duration); public void addTemperatureLevel(int temperature); public void addTemperatureTickTimer(int ticktimer); + public void clearTemporaryModifiers(); + /** * Returns the capability's matching TemperatureEnum enum * @return TemperatureEnum for the temperature diff --git a/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifier.java b/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifier.java new file mode 100644 index 0000000..d7408cf --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifier.java @@ -0,0 +1,15 @@ +package com.charles445.simpledifficulty.api.temperature; + +public class TemporaryModifier +{ + //Container for a temperature and a duration + + public float temperature; + public int duration; + + public TemporaryModifier(float temperature, int duration) + { + this.temperature = temperature; + this.duration = duration; + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifierGroupEnum.java b/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifierGroupEnum.java new file mode 100644 index 0000000..d75c32d --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/api/temperature/TemporaryModifierGroupEnum.java @@ -0,0 +1,19 @@ +package com.charles445.simpledifficulty.api.temperature; + +public enum TemporaryModifierGroupEnum +{ + FOOD("food"), + DRINK("drink"); + + private String group; + + private TemporaryModifierGroupEnum(String group) + { + this.group=group; + } + + public String group() + { + return group; + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/api/thirst/ThirstEnum.java b/src/main/java/com/charles445/simpledifficulty/api/thirst/ThirstEnum.java index ff50c7d..b28c5cd 100644 --- a/src/main/java/com/charles445/simpledifficulty/api/thirst/ThirstEnum.java +++ b/src/main/java/com/charles445/simpledifficulty/api/thirst/ThirstEnum.java @@ -2,10 +2,10 @@ public enum ThirstEnum { - NORMAL ( 3, 0.1f, 0.75f), //0.3 - RAIN ( 1, 0.05f, 0.0f), //0.05 - POTION ( 2, 0.1f, 0.0f), //0.2 - PURIFIED( 6, 0.5f, 0.0f); //3 + NORMAL ( 3, 0.3f, 0.75f), + RAIN ( 1, 0.05f, 0.0f), + POTION ( 2, 0.2f, 0.0f), + PURIFIED( 6, 3.0f, 0.0f); private int thirst; private float saturation; @@ -28,7 +28,7 @@ public float getSaturation() return saturation; } - public float getDirtyChance() + public float getThirstyChance() { return dirty; } diff --git a/src/main/java/com/charles445/simpledifficulty/block/BlockTemperature.java b/src/main/java/com/charles445/simpledifficulty/block/BlockTemperature.java index 68df8cb..5e79b10 100644 --- a/src/main/java/com/charles445/simpledifficulty/block/BlockTemperature.java +++ b/src/main/java/com/charles445/simpledifficulty/block/BlockTemperature.java @@ -31,7 +31,7 @@ public BlockTemperature(float temperature) this.temperature = temperature; } - public float getActiveTemperature() + public float getActiveTemperatureMult() { return temperature; } diff --git a/src/main/java/com/charles445/simpledifficulty/capability/TemperatureCapability.java b/src/main/java/com/charles445/simpledifficulty/capability/TemperatureCapability.java index 36f3b18..b813065 100644 --- a/src/main/java/com/charles445/simpledifficulty/capability/TemperatureCapability.java +++ b/src/main/java/com/charles445/simpledifficulty/capability/TemperatureCapability.java @@ -1,5 +1,8 @@ package com.charles445.simpledifficulty.capability; +import java.util.HashMap; +import java.util.Map; + import com.charles445.simpledifficulty.api.SDPotions; import com.charles445.simpledifficulty.api.config.ServerConfig; import com.charles445.simpledifficulty.api.config.ServerOptions; @@ -8,8 +11,10 @@ import com.charles445.simpledifficulty.api.temperature.TemperatureEnum; import com.charles445.simpledifficulty.api.temperature.TemperatureRegistry; import com.charles445.simpledifficulty.api.temperature.TemperatureUtil; +import com.charles445.simpledifficulty.api.temperature.TemporaryModifier; import com.charles445.simpledifficulty.config.ModConfig; import com.charles445.simpledifficulty.debug.DebugUtil; +import com.google.common.collect.ImmutableMap; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.PotionEffect; @@ -22,11 +27,15 @@ public class TemperatureCapability implements ITemperatureCapability private int temperature = 12; private int ticktimer = 0; + private Map temporaryModifiers = new HashMap(); + //Unsaved data private int oldtemperature = 0; private int updatetimer = 500; //Update immediately first time around private int targettemp = 0; private int debugtimer = 0; + private boolean manualDirty = false; + private int oldmodifiersize = 0; @Override public int getTemperatureLevel() @@ -133,6 +142,33 @@ else if(tempEnum==TemperatureEnum.FREEZING) } } } + + //I hope this isn't an expensive or leaky operation + //There's probably a better way to do this but I'm worried about concurrency, as always + Map tweaks = new HashMap(); + + int modifierSize = temporaryModifiers.size(); + + for(Map.Entry entry : temporaryModifiers.entrySet()) + { + TemporaryModifier tm = entry.getValue(); + + if(tm.duration > 0) + { + tweaks.put(entry.getKey(), new TemporaryModifier(tm.temperature, tm.duration - 1)); + } + } + + temporaryModifiers.clear(); + temporaryModifiers.putAll(tweaks); + tweaks.clear(); + + if(oldmodifiersize != temporaryModifiers.size()) + { + this.manualDirty = true; + } + + oldmodifiersize = temporaryModifiers.size(); } private void debugRoutine(EntityPlayer player, World world) @@ -174,13 +210,14 @@ private int getTemperatureTickLimit() @Override public boolean isDirty() { - return this.temperature!=this.oldtemperature; + return manualDirty || this.temperature!=this.oldtemperature; } @Override public void setClean() { this.oldtemperature = this.temperature; + this.manualDirty = false; } @Override @@ -188,4 +225,27 @@ public TemperatureEnum getTemperatureEnum() { return TemperatureUtil.getTemperatureEnum(getTemperatureLevel()); } + + @Override + public ImmutableMap getTemporaryModifiers() + { + return ImmutableMap.copyOf(temporaryModifiers); + } + + @Override + public void setTemporaryModifier(String name, float temp, int duration) + { + if(this.temporaryModifiers.containsKey(name)) + { + //Reset + this.manualDirty = true; + } + this.temporaryModifiers.put(name, new TemporaryModifier(temp, duration)); + } + + @Override + public void clearTemporaryModifiers() + { + this.temporaryModifiers.clear(); + } } diff --git a/src/main/java/com/charles445/simpledifficulty/capability/TemperatureStorage.java b/src/main/java/com/charles445/simpledifficulty/capability/TemperatureStorage.java index 7bc9473..9e3a4a6 100644 --- a/src/main/java/com/charles445/simpledifficulty/capability/TemperatureStorage.java +++ b/src/main/java/com/charles445/simpledifficulty/capability/TemperatureStorage.java @@ -1,9 +1,14 @@ package com.charles445.simpledifficulty.capability; +import java.util.Iterator; +import java.util.Map; + import com.charles445.simpledifficulty.api.temperature.ITemperatureCapability; +import com.charles445.simpledifficulty.api.temperature.TemporaryModifier; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability.IStorage; @@ -12,15 +17,32 @@ public class TemperatureStorage implements IStorage { private static final String temperatureLevel = "temperatureLevel"; private static final String temperatureTickTimer = "temperatureTickTimer"; - - //TODO External Modifiers + private static final String temporaryModifiers = "temporaryModifiers"; + private static final String NBT_name = "name"; + private static final String NBT_temperature = "temperature"; + private static final String NBT_duration = "duration"; @Override public NBTBase writeNBT(Capability capability, ITemperatureCapability instance, EnumFacing side) { NBTTagCompound compound = new NBTTagCompound(); + NBTTagList temporaryList = new NBTTagList(); + Map tempModMap = instance.getTemporaryModifiers(); + + for(Map.Entry entry : tempModMap.entrySet()) + { + TemporaryModifier tempMod = entry.getValue(); + NBTTagCompound tempModCompound = new NBTTagCompound(); + tempModCompound.setString(NBT_name, entry.getKey()); + tempModCompound.setFloat(NBT_temperature, tempMod.temperature); + tempModCompound.setInteger(NBT_duration, tempMod.duration); + temporaryList.appendTag(tempModCompound); + } + + compound.setInteger(temperatureLevel, instance.getTemperatureLevel()); compound.setInteger(temperatureTickTimer,instance.getTemperatureTickTimer()); + compound.setTag(temporaryModifiers, temporaryList); return compound; } @@ -36,6 +58,20 @@ public void readNBT(Capability capability, ITemperatureC instance.setTemperatureLevel(compound.getInteger(temperatureLevel)); if(compound.hasKey(temperatureTickTimer)) instance.setTemperatureTickTimer(compound.getInteger(temperatureTickTimer)); + if(compound.hasKey(temporaryModifiers)) + { + instance.clearTemporaryModifiers(); + NBTTagList temporaryModList = compound.getTagList(temporaryModifiers,10); + Iterator iterator = temporaryModList.iterator(); + while(iterator.hasNext()) + { + NBTTagCompound tempComp = (NBTTagCompound)iterator.next(); + if(tempComp.hasKey(NBT_name) && tempComp.hasKey(NBT_temperature) && tempComp.hasKey(NBT_duration)) + { + instance.setTemporaryModifier(tempComp.getString(NBT_name), tempComp.getFloat(NBT_temperature), tempComp.getInteger(NBT_duration)); + } + } + } } } } diff --git a/src/main/java/com/charles445/simpledifficulty/command/CommandSimpleDifficulty.java b/src/main/java/com/charles445/simpledifficulty/command/CommandSimpleDifficulty.java new file mode 100644 index 0000000..6305e72 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/command/CommandSimpleDifficulty.java @@ -0,0 +1,87 @@ +package com.charles445.simpledifficulty.command; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Nullable; + +import com.charles445.simpledifficulty.SimpleDifficulty; +import com.charles445.simpledifficulty.config.JsonConfigInternal; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; + +public class CommandSimpleDifficulty extends CommandBase +{ + private final List tabCompletions = Arrays.asList(new String[]{"updateJson"}); + + @Override + public String getName() + { + return "simpledifficulty"; + } + + @Override + public int getRequiredPermissionLevel() + { + return 0; + } + + @Override + public String getUsage(ICommandSender sender) + { + return "Options: updateJson"; + } + + @Override + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) + { + //return Collections.emptyList(); + return tabCompletions; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException + { + if(args.length==0) + { + help(sender); + return; + } + + switch(args[0]) + { + case "updateJson": updateJson(server, sender, args); break; + default: help(sender); break; + } + + } + + private void help(ICommandSender sender) + { + sender.sendMessage(new TextComponentString(this.getUsage(sender))); + } + + private void updateJson(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException + { + if(hasPermissionLevel(sender, 2)) + { + sender.sendMessage(new TextComponentString("Reloading SimpleDifficulty JSON")); + JsonConfigInternal.jsonErrors.clear(); + JsonConfigInternal.processAllJson(SimpleDifficulty.jsonDirectory); + for(String s : JsonConfigInternal.jsonErrors) + { + sender.sendMessage(new TextComponentString(s)); + } + } + } + + private boolean hasPermissionLevel(ICommandSender sender, int permLevel) + { + return sender.canUseCommand(permLevel, "simpledifficulty"); + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/compat/JsonCompatDefaults.java b/src/main/java/com/charles445/simpledifficulty/compat/JsonCompatDefaults.java index aef7e0e..be5477d 100644 --- a/src/main/java/com/charles445/simpledifficulty/compat/JsonCompatDefaults.java +++ b/src/main/java/com/charles445/simpledifficulty/compat/JsonCompatDefaults.java @@ -1,12 +1,8 @@ package com.charles445.simpledifficulty.compat; -import static com.charles445.simpledifficulty.config.JsonConfig.armorTemperatures; -import static com.charles445.simpledifficulty.config.JsonConfig.blockTemperatures; -import static com.charles445.simpledifficulty.config.JsonConfig.fluidTemperatures; - -import com.charles445.simpledifficulty.config.json.JsonPropertyTemperature; -import com.charles445.simpledifficulty.config.json.JsonTemperature; -import com.charles445.simpledifficulty.config.json.PropertyValue; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyTemperature; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyValue; public class JsonCompatDefaults { @@ -20,16 +16,20 @@ public void populate() populateSimpleCampfire(); } + //NOTE + //Currently, adding anything that would overlap (or have multiple states) will not work here + //Needs to be handled manually (only relevant to blockstate or metadata related things at the moment) + //Biomes O' Plenty private void populateBiomesOPlenty() { - fluidTemperatures.put("hot_spring_water", temperature(3.0f)); + addFluidTemperature("hot_spring_water", 3.0f); } //Lycanites Mobs private void populateLycanitesMobs() { - blockTemperatures.put("lycanitesmobs:purelava", propTemp(15.0f)); + addBlockTemperature("lycanitesmobs:purelava", 12.5f); //TODO considering adding the ooze to actually chill the surrounding area //That could be fun @@ -38,27 +38,57 @@ private void populateLycanitesMobs() //Simple Camp Fire private void populateSimpleCampfire() { - blockTemperatures.put("campfire:campfire", propTemp(7.0f)); + addBlockTemperature("campfire:campfire", 7.0f); } + // + // API + // - //Utility + private void addBlockTemperature(String registryName, float temperature, JsonPropertyValue... properties) + { + if(!JsonConfig.blockTemperatures.containsKey(registryName)) + { + JsonConfig.registerBlockTemperature(registryName, temperature, properties); + } + } - private JsonTemperature temperature(float temp) + private void addFluidTemperature(String fluidName, float temperature) { - return new JsonTemperature(temp); + if(!JsonConfig.fluidTemperatures.containsKey(fluidName)) + { + JsonConfig.registerFluidTemperature(fluidName, temperature); + } } + // + // Utility + // + private JsonPropertyTemperature propTemp(float temp) { return new JsonPropertyTemperature(temp); } - private JsonPropertyTemperature propTemp(float temp, PropertyValue... props) + private JsonPropertyTemperature propTemp(float temp, JsonPropertyValue... props) { return new JsonPropertyTemperature(temp, props); } + /* + //Old stuff + //Adding without overriding (in case a mod adds their own default) + private void put(final Map map, String str, final T obj) + { + if(!map.containsKey(str)) + map.put(str, obj); + } + + private JsonTemperature temperature(float temp) + { + return new JsonTemperature(temp); + } + */ } diff --git a/src/main/java/com/charles445/simpledifficulty/config/JsonConfig.java b/src/main/java/com/charles445/simpledifficulty/config/JsonConfig.java deleted file mode 100644 index 6791a49..0000000 --- a/src/main/java/com/charles445/simpledifficulty/config/JsonConfig.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.charles445.simpledifficulty.config; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; - -import com.charles445.simpledifficulty.SimpleDifficulty; -import com.charles445.simpledifficulty.api.SDBlocks; -import com.charles445.simpledifficulty.api.SDItems; -import com.charles445.simpledifficulty.compat.JsonCompatDefaults; -import com.charles445.simpledifficulty.config.json.PropertyValue; -import com.charles445.simpledifficulty.config.json.JsonTemperature; -import com.charles445.simpledifficulty.config.json.JsonPropertyTemperature; -import com.charles445.simpledifficulty.config.json.MaterialTemperature; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; - -import net.minecraft.init.Blocks; - -public class JsonConfig -{ - //TODO doesn't support different states on the same block... - //JSON stresses me out - - //TODO this whole thing isn't good - //TODO now that I get how this stuff works, sort of, make it better - - - //TODO a way for mods to set defaults for themselves via the API - - - - public static Map armorTemperatures = new HashMap(); - - public static Map blockTemperatures = new HashMap(); - - public static Map fluidTemperatures = new HashMap(); - - //TODO customizable materials? Probably not - public static MaterialTemperature materialTemperature = new MaterialTemperature(); - - public static void init(File jsonDirectory) - { - //Setup default JSON - - armorTemperatures.put(SDItems.wool_helmet.getRegistryName().toString(), new JsonTemperature(2.0f)); - armorTemperatures.put(SDItems.wool_chestplate.getRegistryName().toString(), new JsonTemperature(2.0f)); - armorTemperatures.put(SDItems.wool_leggings.getRegistryName().toString(), new JsonTemperature(2.0f)); - armorTemperatures.put(SDItems.wool_boots.getRegistryName().toString(), new JsonTemperature(2.0f)); - - armorTemperatures.put(SDItems.ice_helmet.getRegistryName().toString(), new JsonTemperature(-2.0f)); - armorTemperatures.put(SDItems.ice_chestplate.getRegistryName().toString(), new JsonTemperature(-2.0f)); - armorTemperatures.put(SDItems.ice_leggings.getRegistryName().toString(), new JsonTemperature(-2.0f)); - armorTemperatures.put(SDItems.ice_boots.getRegistryName().toString(), new JsonTemperature(-2.0f)); - - blockTemperatures.put(SDBlocks.campfire.getRegistryName().toString(), new JsonPropertyTemperature(7.0f, new PropertyValue("burning","true"))); - blockTemperatures.put(Blocks.LIT_FURNACE.getRegistryName().toString(), new JsonPropertyTemperature(3.0f)); - blockTemperatures.put(Blocks.LAVA.getRegistryName().toString(), new JsonPropertyTemperature(15.0f)); - blockTemperatures.put(Blocks.FLOWING_LAVA.getRegistryName().toString(), new JsonPropertyTemperature(15.0f)); - blockTemperatures.put(Blocks.MAGMA.getRegistryName().toString(), new JsonPropertyTemperature(12.5f)); - - //materialTemperature is not a Map - - //Mod Compatibility - - JsonCompatDefaults.instance.populate(); - - //TODO consider how fluidTemperatures should actually be stored. is Fluid name a reliable way to get their name? - - - //Process JSON - - armorTemperatures = processJson("armorTemperatures.json", armorTemperatures, new TypeToken>(){}.getType(), jsonDirectory); - blockTemperatures = processJson("blockTemperatures.json", blockTemperatures, new TypeToken>(){}.getType(), jsonDirectory); - fluidTemperatures = processJson("fluidTemperatures.json", fluidTemperatures, new TypeToken>(){}.getType(), jsonDirectory); - materialTemperature = processJson("materialTemperature.json", materialTemperature, new TypeToken(){}.getType(), jsonDirectory); - } - - public static T processJson(String jsonFileName, final T container, Type type, File jsonDirectory) - { - try - { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - - File jsonFile = new File(jsonDirectory,jsonFileName); - if(jsonFile.exists()) - { - //Read - //System.out.println("fromJson"); - return (T) gson.fromJson(new FileReader(jsonFile), type); - } - else - { - //Write - //System.out.println("toJson"); - //System.out.println(jsonFile.getAbsolutePath()); - - FileUtils.write(jsonFile,gson.toJson(container, type),(String)null); - return container; - } - } - catch(Exception e) - { - SimpleDifficulty.logger.error("Error reading JSON File: "+jsonFileName, e); - return container; - } - } -} diff --git a/src/main/java/com/charles445/simpledifficulty/config/JsonConfigInternal.java b/src/main/java/com/charles445/simpledifficulty/config/JsonConfigInternal.java new file mode 100644 index 0000000..8078ed8 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/config/JsonConfigInternal.java @@ -0,0 +1,177 @@ +package com.charles445.simpledifficulty.config; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; + +import com.charles445.simpledifficulty.SimpleDifficulty; +import com.charles445.simpledifficulty.api.SDBlocks; +import com.charles445.simpledifficulty.api.SDItems; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableTemperature; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableThirst; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyTemperature; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyValue; +import com.charles445.simpledifficulty.api.config.json.JsonTemperature; +import com.charles445.simpledifficulty.api.temperature.TemporaryModifierGroupEnum; +import com.charles445.simpledifficulty.api.thirst.ThirstEnum; +import com.charles445.simpledifficulty.compat.JsonCompatDefaults; +import com.charles445.simpledifficulty.config.json.MaterialTemperature; +import com.charles445.simpledifficulty.item.ItemJuice; +import com.charles445.simpledifficulty.item.ItemJuice.JuiceEnum; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +public class JsonConfigInternal +{ + //JSON stresses me out + + //TODO customizable materials? Probably not + public static MaterialTemperature materialTemperature = new MaterialTemperature(); + + public static List jsonErrors = new ArrayList(); + + public static void init(File jsonDirectory) + { + //Setup default JSON + + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.wool_helmet), 2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.wool_chestplate), 2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.wool_leggings), 2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.wool_boots), 2.0f); + + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.ice_helmet), -2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.ice_chestplate), -2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.ice_leggings), -2.0f); + JsonConfig.registerArmorTemperature(new ItemStack(SDItems.ice_boots), -2.0f); + + JsonConfig.registerBlockTemperature(SDBlocks.campfire, 7.0f, new JsonPropertyValue("burning", "true")); + JsonConfig.registerBlockTemperature(SDBlocks.campfire, 0.0f, new JsonPropertyValue("burning", "false")); //Example + + JsonConfig.registerBlockTemperature(Blocks.LIT_FURNACE, 4.0f); + JsonConfig.registerBlockTemperature(Blocks.LAVA, 12.5f); + JsonConfig.registerBlockTemperature(Blocks.FLOWING_LAVA, 12.5f); + JsonConfig.registerBlockTemperature(Blocks.MAGMA, 10f); + + JsonConfig.registerConsumableTemperature(TemporaryModifierGroupEnum.FOOD.group(), new ItemStack(Items.MUSHROOM_STEW), 1.0f, 1200); + JsonConfig.registerConsumableTemperature(TemporaryModifierGroupEnum.DRINK.group(), new ItemStack(SDItems.juice,1,JuiceEnum.CACTUS.ordinal()), 1.0f, 1200); + JsonConfig.registerConsumableTemperature(TemporaryModifierGroupEnum.DRINK.group(), new ItemStack(SDItems.juice,1,JuiceEnum.CHORUS_FRUIT.ordinal()), 1.0f, 2400); + + JsonConfig.registerConsumableThirst(new ItemStack(Items.MILK_BUCKET), 4, 1.0f, 0.2f); + + //materialTemperature is not a Map + + //Mod Compatibility + + JsonCompatDefaults.instance.populate(); + + //TODO consider how fluidTemperatures should actually be stored. is Fluid name a reliable way to get their name? + + processAllJson(jsonDirectory); + } + + public static void processAllJson(File jsonDirectory) + { + //Process JSON + + JsonConfig.armorTemperatures = processJson("armorTemperatures.json", JsonConfig.armorTemperatures, new TypeToken>(){}.getType(), jsonDirectory); + JsonConfig.fluidTemperatures = processJson("fluidTemperatures.json", JsonConfig.fluidTemperatures, new TypeToken>(){}.getType(), jsonDirectory); + materialTemperature = processJson("materialTemperature.json", materialTemperature, new TypeToken(){}.getType(), jsonDirectory); + JsonConfig.consumableTemperature = processJson("consumableTemperature.json", JsonConfig.consumableTemperature, new TypeToken>>(){}.getType(), jsonDirectory); + JsonConfig.consumableThirst = processJson("consumableThirst.json", JsonConfig.consumableThirst, new TypeToken>>(){}.getType(), jsonDirectory); + + //blockTemperatures migration (legacy support for 0.1.0 and 0.1.1) + //TODO once enough versions have passed, get rid of this whole thing and just leave it as what's in the try block (but with processJson instead) + + try + { + JsonConfig.blockTemperatures = processUncaughtJson("blockTemperatures.json", JsonConfig.blockTemperatures, new TypeToken>>(){}.getType(), jsonDirectory); + } + catch(Exception e) + { + //Attempt to read old format "" + Map dummyBlockTemperatures = new HashMap(); + dummyBlockTemperatures = processJson("blockTemperatures.json", dummyBlockTemperatures, new TypeToken>(){}.getType(), jsonDirectory); + if(!dummyBlockTemperatures.isEmpty()) + { + //Migrate the old format to the new format + SimpleDifficulty.logger.info("Attempting to migrate old blockTemperatures.json format"); + JsonConfig.blockTemperatures.clear(); + for(Map.Entry entry : dummyBlockTemperatures.entrySet()) + { + JsonConfig.blockTemperatures.put(entry.getKey(), Arrays.asList(entry.getValue())); + } + + //Migration finished, overwrite old + + try + { + manuallyWriteToJson("blockTemperatures.json", JsonConfig.blockTemperatures, new TypeToken>>(){}.getType(), jsonDirectory); + } + catch (Exception e1) + { + //Didn't work. + jsonErrors.add("config/simpledifficulty/blockTemperatures.json is in an old format. Please delete it!"); + } + } + } + } + + public static T processJson(String jsonFileName, final T container, Type type, File jsonDirectory) + { + try + { + return processUncaughtJson(jsonFileName, container, type, jsonDirectory); + } + catch(Exception e) + { + SimpleDifficulty.logger.error("Error managing JSON File: "+jsonFileName, e); + jsonErrors.add("config/simpledifficulty/"+jsonFileName+" failed to load!"); + return container; + } + } + + public static T processUncaughtJson(String jsonFileName, final T container, Type type, File jsonDirectory) throws Exception + { + File jsonFile = new File(jsonDirectory,jsonFileName); + if(jsonFile.exists()) + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + //Read + //System.out.println("fromJson"); + return (T) gson.fromJson(new FileReader(jsonFile), type); + } + else + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + //Write + //System.out.println("toJson"); + //System.out.println(jsonFile.getAbsolutePath()); + + FileUtils.write(jsonFile,gson.toJson(container, type),(String)null); + return container; + } + + } + + private static void manuallyWriteToJson(String jsonFileName, final T container, Type type, File jsonDirectory) throws Exception + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + File jsonFile = new File(jsonDirectory,jsonFileName); + FileUtils.write(jsonFile, gson.toJson(container, type),(String)null); + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/config/ModConfig.java b/src/main/java/com/charles445/simpledifficulty/config/ModConfig.java index d457be3..64a1da0 100644 --- a/src/main/java/com/charles445/simpledifficulty/config/ModConfig.java +++ b/src/main/java/com/charles445/simpledifficulty/config/ModConfig.java @@ -161,6 +161,31 @@ public static class SDCFGTemperature @Config.RangeInt public int enchantmentTemperature = 1; + @Config.Comment("Heater Temperature Change - Strength of heaters / chillers") + @Config.Name("HeaterTemperature") + @Config.RangeInt(min=-1000000, max=1000000) + public int heaterTemperature = 10; + + @Config.Comment("Heater Full Power Range - Distance where a heater / chiller starts to lose strength") + @Config.Name("HeaterFullPowerRange") + @Config.RangeDouble(min=0, max=50) + public double heaterFullPowerRange = 16; + + @Config.Comment("Heater Max Range - Distance where a heater / chiller has no effect") + @Config.Name("HeaterMaxRange") + @Config.RangeDouble(min=0, max=50) + public double heaterMaxRange = 32; + + @Config.Comment("Stacking Temperature - Whether multiple blocks in a vicinity should combine their effect") + @Config.Name("StackingTemperature") + public boolean stackingTemperature = true; + + @Config.Comment("Stacking Temperature Limit - How much more extreme block temperature can be from stacking temperature") + @Config.Name("StackingTemperatureLimit") + @Config.RangeDouble(min=0, max = 1000000) + public float stackingTemperatureLimit = 3; + + public static class SDCFGSereneSeasons { //Serene Seasons diff --git a/src/main/java/com/charles445/simpledifficulty/config/json/PropertyValue.java b/src/main/java/com/charles445/simpledifficulty/config/json/PropertyValue.java deleted file mode 100644 index 55cb962..0000000 --- a/src/main/java/com/charles445/simpledifficulty/config/json/PropertyValue.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.charles445.simpledifficulty.config.json; - -public class PropertyValue -{ - public String property; - public String value; - - public PropertyValue(String property, String value) - { - this.property = property; - this.value = value; - } - -} diff --git a/src/main/java/com/charles445/simpledifficulty/handler/ConfigHandler.java b/src/main/java/com/charles445/simpledifficulty/handler/ConfigHandler.java index a8cc394..d0b13ab 100644 --- a/src/main/java/com/charles445/simpledifficulty/handler/ConfigHandler.java +++ b/src/main/java/com/charles445/simpledifficulty/handler/ConfigHandler.java @@ -1,14 +1,19 @@ package com.charles445.simpledifficulty.handler; import com.charles445.simpledifficulty.SimpleDifficulty; +import com.charles445.simpledifficulty.config.JsonConfigInternal; import com.charles445.simpledifficulty.config.ModConfig; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; public class ConfigHandler { @@ -48,4 +53,14 @@ public void onWorldEventUnload(WorldEvent.Unload event) } } } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) + { + for(String s : JsonConfigInternal.jsonErrors) + { + event.player.sendMessage(new TextComponentString(s)); + } + } } diff --git a/src/main/java/com/charles445/simpledifficulty/handler/TemperatureHandler.java b/src/main/java/com/charles445/simpledifficulty/handler/TemperatureHandler.java new file mode 100644 index 0000000..cf8d1f2 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/handler/TemperatureHandler.java @@ -0,0 +1,58 @@ +package com.charles445.simpledifficulty.handler; + +import java.util.List; + +import com.charles445.simpledifficulty.api.SDCapabilities; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.QuickConfig; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableTemperature; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +public class TemperatureHandler +{ + //Both Sides + @SubscribeEvent + public void onLivingEntityUseItemFinish(LivingEntityUseItemEvent.Finish event) + { + if(!QuickConfig.isTemperatureEnabled()) + return; + + if(event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer)event.getEntityLiving(); + + if(player.world.isRemote) + return; + + //Server Side + + ItemStack stack = event.getItem(); + + List consumableList = JsonConfig.consumableTemperature.get(stack.getItem().getRegistryName().toString()); + + if(consumableList!=null) + { + for(JsonConsumableTemperature jct : consumableList) + { + if(jct==null) + continue; + + if(jct.matches(stack)) + { + SDCapabilities.getTemperatureData(player).setTemporaryModifier(jct.group, jct.temperature, jct.duration); + break; + } + } + } + else + { + //Alternative + } + } + + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/handler/ThirstHandler.java b/src/main/java/com/charles445/simpledifficulty/handler/ThirstHandler.java index 1270b8d..469a988 100644 --- a/src/main/java/com/charles445/simpledifficulty/handler/ThirstHandler.java +++ b/src/main/java/com/charles445/simpledifficulty/handler/ThirstHandler.java @@ -1,8 +1,12 @@ package com.charles445.simpledifficulty.handler; +import java.util.List; + import com.charles445.simpledifficulty.api.SDCapabilities; import com.charles445.simpledifficulty.api.SDPotions; +import com.charles445.simpledifficulty.api.config.JsonConfig; import com.charles445.simpledifficulty.api.config.QuickConfig; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableThirst; import com.charles445.simpledifficulty.api.thirst.IThirstCapability; import com.charles445.simpledifficulty.api.thirst.ThirstEnum; import com.charles445.simpledifficulty.api.thirst.ThirstUtil; @@ -38,6 +42,9 @@ public class ThirstHandler @SubscribeEvent public void onLivingEntityUseItemFinish(LivingEntityUseItemEvent.Finish event) { + if(!QuickConfig.isThirstEnabled()) + return; + if(event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.getEntityLiving(); @@ -82,9 +89,24 @@ else if(SDPotions.potionTypes.containsValue(potionType)) if(potionType.getEffects().isEmpty()) */ } - - //TODO custom stuff? API stuff? - + else + { + //JSON + List consumableList = JsonConfig.consumableThirst.get(stack.getItem().getRegistryName().toString()); + if(consumableList!=null) + { + for(JsonConsumableThirst jct : consumableList) + { + if(jct==null) + continue; + if(jct.matches(stack)) + { + ThirstUtil.takeDrink(player, jct.amount, jct.saturation, jct.thirstyChance); + break; + } + } + } + } } } diff --git a/src/main/java/com/charles445/simpledifficulty/item/ItemCanteen.java b/src/main/java/com/charles445/simpledifficulty/item/ItemCanteen.java index cd391fa..26c2644 100644 --- a/src/main/java/com/charles445/simpledifficulty/item/ItemCanteen.java +++ b/src/main/java/com/charles445/simpledifficulty/item/ItemCanteen.java @@ -6,6 +6,7 @@ import com.charles445.simpledifficulty.SimpleDifficulty; import com.charles445.simpledifficulty.api.SDCapabilities; +import com.charles445.simpledifficulty.api.config.QuickConfig; import com.charles445.simpledifficulty.api.thirst.IThirstCapability; import com.charles445.simpledifficulty.api.thirst.ThirstEnum; import com.charles445.simpledifficulty.api.thirst.ThirstEnumBlockPos; @@ -122,7 +123,7 @@ public ActionResult onItemRightClick(World world, EntityPlayer player if(!isCanteenEmpty(stack)) { IThirstCapability capability = SDCapabilities.getThirstData(player); - if(capability.isThirsty()) + if(capability.isThirsty() || !QuickConfig.isThirstEnabled()) { player.setActiveHand(hand); //DebugUtil.messageAll("itemdamage is not maxdamage ActionResult SUCCESS"); @@ -205,7 +206,7 @@ public float getDirtyChance(ItemStack stack) if(type>=ThirstEnum.values().length) return 0.0f; - return ThirstEnum.values()[type].getDirtyChance(); + return ThirstEnum.values()[type].getThirstyChance(); } private void createTag(ItemStack stack) diff --git a/src/main/java/com/charles445/simpledifficulty/item/ItemDrinkBase.java b/src/main/java/com/charles445/simpledifficulty/item/ItemDrinkBase.java index 9056494..37289bc 100644 --- a/src/main/java/com/charles445/simpledifficulty/item/ItemDrinkBase.java +++ b/src/main/java/com/charles445/simpledifficulty/item/ItemDrinkBase.java @@ -1,6 +1,11 @@ package com.charles445.simpledifficulty.item; +import java.util.List; + import com.charles445.simpledifficulty.api.SDCapabilities; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.QuickConfig; +import com.charles445.simpledifficulty.api.config.json.JsonConsumableThirst; import com.charles445.simpledifficulty.api.thirst.IThirstCapability; import com.charles445.simpledifficulty.api.thirst.ThirstUtil; import com.charles445.simpledifficulty.capability.ThirstCapability; @@ -50,6 +55,9 @@ public ActionResult onItemRightClick(World world, EntityPlayer player { ItemStack stack = player.getHeldItem(hand); + if(!QuickConfig.isThirstEnabled()) + return new ActionResult(EnumActionResult.SUCCESS, stack); + IThirstCapability capability = SDCapabilities.getThirstData(player); if(capability.isThirsty()) { @@ -67,7 +75,29 @@ public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase return stack; EntityPlayer player = (EntityPlayer)entityLiving; - ThirstUtil.takeDrink(player, this.getThirstLevel(stack), this.getSaturationLevel(stack), this.getDirtyChance(stack)); + + List jctList = JsonConfig.consumableThirst.get(this.getRegistryName().toString()); + + boolean override = false; + + if(jctList!=null) + { + for(JsonConsumableThirst jct : jctList) + { + if(jct==null) + continue; + + if(jct.matches(stack)) + { + override = true; + break; + } + } + } + + if(!override) + ThirstUtil.takeDrink(player, this.getThirstLevel(stack), this.getSaturationLevel(stack), this.getDirtyChance(stack)); + this.runSecondaryEffect(player, stack); return new ItemStack(Items.GLASS_BOTTLE); } diff --git a/src/main/java/com/charles445/simpledifficulty/item/ItemJuice.java b/src/main/java/com/charles445/simpledifficulty/item/ItemJuice.java index a9068bd..89fd12e 100644 --- a/src/main/java/com/charles445/simpledifficulty/item/ItemJuice.java +++ b/src/main/java/com/charles445/simpledifficulty/item/ItemJuice.java @@ -88,16 +88,16 @@ public boolean hasEffect(ItemStack stack) public static enum JuiceEnum { - APPLE( 8, 0.8f), //6.4 - BEETROOT( 10, 0.8f), //8 - CACTUS( 9, 0.3f), //2.7 - CARROT( 8, 0.6f), //4.8 - CHORUS_FRUIT( 12, 0.6f), //7.2 - GOLDEN_APPLE( 20, 1.0f), //20 - GOLDEN_CARROT( 14, 1.0f), //14 - GOLDEN_MELON( 16, 1.0f), //16 - MELON( 8, 0.5f), //4 - PUMPKIN( 7, 0.7f); //4.9 + APPLE( 8, 6.4f), + BEETROOT( 10, 8.0f), + CACTUS( 9, 2.7f), + CARROT( 8, 4.8f), + CHORUS_FRUIT( 12, 7.2f), + GOLDEN_APPLE( 20, 20.0f), + GOLDEN_CARROT( 14, 14.0f), + GOLDEN_MELON( 16, 16.0f), + MELON( 8, 4.0f), + PUMPKIN( 7, 4.9f); private int thirst; private float saturation; diff --git a/src/main/java/com/charles445/simpledifficulty/item/ItemPurifiedWaterBottle.java b/src/main/java/com/charles445/simpledifficulty/item/ItemPurifiedWaterBottle.java index 5c4a282..3dc9af5 100644 --- a/src/main/java/com/charles445/simpledifficulty/item/ItemPurifiedWaterBottle.java +++ b/src/main/java/com/charles445/simpledifficulty/item/ItemPurifiedWaterBottle.java @@ -21,6 +21,6 @@ public float getSaturationLevel(ItemStack stack) @Override public float getDirtyChance(ItemStack stack) { - return ThirstEnum.PURIFIED.getDirtyChance(); + return ThirstEnum.PURIFIED.getThirstyChance(); } } diff --git a/src/main/java/com/charles445/simpledifficulty/network/MessageDrinkWater.java b/src/main/java/com/charles445/simpledifficulty/network/MessageDrinkWater.java index 6244e0e..2471564 100644 --- a/src/main/java/com/charles445/simpledifficulty/network/MessageDrinkWater.java +++ b/src/main/java/com/charles445/simpledifficulty/network/MessageDrinkWater.java @@ -53,7 +53,7 @@ public IMessage onMessage(MessageDrinkWater message, MessageContext ctx) //Enum now has important values - ThirstUtil.takeDrink(player, result.getThirst(), result.getSaturation(), result.getDirtyChance()); + ThirstUtil.takeDrink(player, result.getThirst(), result.getSaturation(), result.getThirstyChance()); }); } diff --git a/src/main/java/com/charles445/simpledifficulty/proxy/ClientProxy.java b/src/main/java/com/charles445/simpledifficulty/proxy/ClientProxy.java index 234eeb8..9e08bb3 100644 --- a/src/main/java/com/charles445/simpledifficulty/proxy/ClientProxy.java +++ b/src/main/java/com/charles445/simpledifficulty/proxy/ClientProxy.java @@ -17,17 +17,21 @@ public class ClientProxy extends CommonProxy @Override public void preInit() { - SimpleDifficulty.logger.debug("SimpleDifficulty Client Proxy preInit"); super.preInit(); MinecraftForge.EVENT_BUS.register(new TemperatureGui()); MinecraftForge.EVENT_BUS.register(new ThirstGui()); MinecraftForge.EVENT_BUS.register(new TooltipHandler()); } + @Override + public void init() + { + super.init(); + } + @Override public void postInit() { - SimpleDifficulty.logger.debug("SimpleDifficulty Client Proxy postInit"); super.postInit(); } diff --git a/src/main/java/com/charles445/simpledifficulty/proxy/CommonProxy.java b/src/main/java/com/charles445/simpledifficulty/proxy/CommonProxy.java index 44baa5c..c00c510 100644 --- a/src/main/java/com/charles445/simpledifficulty/proxy/CommonProxy.java +++ b/src/main/java/com/charles445/simpledifficulty/proxy/CommonProxy.java @@ -11,21 +11,22 @@ import com.charles445.simpledifficulty.capability.ThirstCapability; import com.charles445.simpledifficulty.capability.ThirstStorage; import com.charles445.simpledifficulty.compat.CompatController; -import com.charles445.simpledifficulty.config.JsonConfig; +import com.charles445.simpledifficulty.config.JsonConfigInternal; import com.charles445.simpledifficulty.config.ModConfig; import com.charles445.simpledifficulty.handler.BlockHandler; import com.charles445.simpledifficulty.handler.CapabilityHandler; import com.charles445.simpledifficulty.handler.ConfigHandler; import com.charles445.simpledifficulty.handler.MiscHandler; +import com.charles445.simpledifficulty.handler.TemperatureHandler; import com.charles445.simpledifficulty.handler.ThirstHandler; import com.charles445.simpledifficulty.temperature.ModifierAltitude; import com.charles445.simpledifficulty.temperature.ModifierArmor; import com.charles445.simpledifficulty.temperature.ModifierBiome; -import com.charles445.simpledifficulty.temperature.ModifierBlock; +import com.charles445.simpledifficulty.temperature.ModifierBlocksTiles; import com.charles445.simpledifficulty.temperature.ModifierDefault; import com.charles445.simpledifficulty.temperature.ModifierSnow; import com.charles445.simpledifficulty.temperature.ModifierSprint; -import com.charles445.simpledifficulty.temperature.ModifierTileEntities; +import com.charles445.simpledifficulty.temperature.ModifierTemporary; import com.charles445.simpledifficulty.temperature.ModifierTime; import com.charles445.simpledifficulty.temperature.ModifierWet; import com.charles445.simpledifficulty.util.internal.TemperatureUtilInternal; @@ -59,6 +60,7 @@ public void preInit() MinecraftForge.EVENT_BUS.register(new CapabilityHandler()); MinecraftForge.EVENT_BUS.register(new ConfigHandler()); MinecraftForge.EVENT_BUS.register(new MiscHandler()); + MinecraftForge.EVENT_BUS.register(new TemperatureHandler()); MinecraftForge.EVENT_BUS.register(new ThirstHandler()); //Populate TemperatureRegistry @@ -66,19 +68,25 @@ public void preInit() TemperatureRegistry.registerModifier(new ModifierAltitude()); TemperatureRegistry.registerModifier(new ModifierArmor()); TemperatureRegistry.registerModifier(new ModifierBiome()); - TemperatureRegistry.registerModifier(new ModifierBlock()); - TemperatureRegistry.registerModifier(new ModifierTileEntities()); + TemperatureRegistry.registerModifier(new ModifierBlocksTiles()); TemperatureRegistry.registerModifier(new ModifierSnow()); TemperatureRegistry.registerModifier(new ModifierSprint()); + TemperatureRegistry.registerModifier(new ModifierTemporary()); TemperatureRegistry.registerModifier(new ModifierTime()); TemperatureRegistry.registerModifier(new ModifierWet()); } + @Override + public void init() + { + + } + @Override public void postInit() { //Setup JSON Configurations - JsonConfig.init(SimpleDifficulty.jsonDirectory); + JsonConfigInternal.init(SimpleDifficulty.jsonDirectory); //Setup Mod Compatibility CompatController.setup(); diff --git a/src/main/java/com/charles445/simpledifficulty/proxy/IProxy.java b/src/main/java/com/charles445/simpledifficulty/proxy/IProxy.java index 65e14ed..f66ad4c 100644 --- a/src/main/java/com/charles445/simpledifficulty/proxy/IProxy.java +++ b/src/main/java/com/charles445/simpledifficulty/proxy/IProxy.java @@ -11,6 +11,8 @@ public interface IProxy { public void preInit(); + public void init(); + public void postInit(); public Side getSide(); diff --git a/src/main/java/com/charles445/simpledifficulty/proxy/ServerProxy.java b/src/main/java/com/charles445/simpledifficulty/proxy/ServerProxy.java index 6afc1f3..79f08fa 100644 --- a/src/main/java/com/charles445/simpledifficulty/proxy/ServerProxy.java +++ b/src/main/java/com/charles445/simpledifficulty/proxy/ServerProxy.java @@ -9,19 +9,23 @@ public class ServerProxy extends CommonProxy { + //Participation Award + @Override public void preInit() { - SimpleDifficulty.logger.debug("SimpleDifficulty Server Proxy preInit"); super.preInit(); - - //Participation Award + } + + @Override + public void init() + { + super.init(); } @Override public void postInit() { - SimpleDifficulty.logger.debug("SimpleDifficulty Server Proxy postInit"); super.postInit(); } diff --git a/src/main/java/com/charles445/simpledifficulty/register/RegisterBlocks.java b/src/main/java/com/charles445/simpledifficulty/register/RegisterBlocks.java index 968cf0e..55fdff6 100644 --- a/src/main/java/com/charles445/simpledifficulty/register/RegisterBlocks.java +++ b/src/main/java/com/charles445/simpledifficulty/register/RegisterBlocks.java @@ -32,8 +32,8 @@ public static void registerBlocks(RegistryEvent.Register event) campfire = registerAs("campfire", new BlockCampfire(), registry); rainCollector = registerAs("rain_collector", new BlockRainCollector(), registry); - heater = registerAs("heater", new BlockTemperature(10.0f), registry); - chiller = registerAs("chiller", new BlockTemperature(-10.0f), registry); + heater = registerAs("heater", new BlockTemperature(1.0f), registry); + chiller = registerAs("chiller", new BlockTemperature(-1.0f), registry); //Tile Entities GameRegistry.registerTileEntity(TileEntityTemperature.class, new ResourceLocation(SimpleDifficulty.MODID,"temperatureChanged")); diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierArmor.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierArmor.java index 101478e..80fc065 100644 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierArmor.java +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierArmor.java @@ -1,10 +1,10 @@ package com.charles445.simpledifficulty.temperature; import com.charles445.simpledifficulty.api.SDEnchantments; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.json.JsonTemperature; import com.charles445.simpledifficulty.api.temperature.TemperatureUtil; -import com.charles445.simpledifficulty.config.JsonConfig; import com.charles445.simpledifficulty.config.ModConfig; -import com.charles445.simpledifficulty.config.json.JsonTemperature; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBase.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBase.java index 180a8ac..8e5a83e 100644 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBase.java +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBase.java @@ -1,6 +1,7 @@ package com.charles445.simpledifficulty.temperature; import com.charles445.simpledifficulty.api.temperature.ITemperatureModifier; +import com.charles445.simpledifficulty.api.temperature.TemperatureEnum; import com.charles445.simpledifficulty.config.ModConfig; import net.minecraft.entity.player.EntityPlayer; @@ -11,13 +12,40 @@ public abstract class ModifierBase implements ITemperatureModifier { - //TODO consider altitude and biome merging? It'd be heavily reliant on vanilla though + //Trying to mentally organize the modifiers to determine which ones should be unique and which ones should override others + + /* -- + * Unique World Modifiers (Ambience, Intangible Environment, Natural) + * + * Altitude + * Biome + * Default + * Season + * Snow + * Time + * Wet + * -- + * Proximity World Modifiers (Blocks, Tile Entities, Unnatural, Radiates Heat) + * + * Proximity (Blocks, Tile Entities) + * -- + * Unique Player Modifiers (Armor, Items, Effects, State) + * + * Armor + * Sprint + * Temporary + * -- + */ + + private final String name; + protected final float defaultTemperature; protected ModifierBase(String name) { this.name=name; + this.defaultTemperature = (TemperatureEnum.NORMAL.getUpperBound() + TemperatureEnum.COLD.getUpperBound()) / 2; } @Override diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlock.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlock.java deleted file mode 100644 index 8128237..0000000 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlock.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.charles445.simpledifficulty.temperature; - -import com.charles445.simpledifficulty.config.JsonConfig; -import com.charles445.simpledifficulty.config.json.JsonPropertyTemperature; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ModifierBlock extends ModifierBase -{ - public ModifierBlock() - { - super("Blocks"); - } - - @Override - public float getWorldInfluence(World world, BlockPos pos) - { - //7 x 5 x 7 (245) (-3, 3, -3, 1, -3, 3) - //9 x 5 x 9 (405) (-4, 4, -3, 1, -4, 4) - - float coldestValue = 0.0f; - float hottestValue = 0.0f; - - for(int x = -4; x <= 4; x++) - { - for(int y = -3; y <= 1; y++) - { - for (int z = -4; z <= 4; z++) - { - final BlockPos blockpos = pos.add(x, y, z); - final IBlockState blockstate = world.getBlockState(blockpos); - final Block block = blockstate.getBlock(); - - JsonPropertyTemperature tempInfo = JsonConfig.blockTemperatures.get(block.getRegistryName().toString()); - if(tempInfo!=null) - { - float blockTemp = tempInfo.temperature; - boolean hot = blockTemp>=0.0f?true:false; - - if(hot) - { - if(blockTemp <= hottestValue) - continue; - } - else - { - if(blockTemp >= coldestValue) - continue; - } - - if(tempInfo.matchesState(blockstate)) - { - //Do a thing - //SimpleDifficulty.logger.debug("Match at pos: "+blockpos.toString()); - - if(hot) - { - if(blockTemp > hottestValue) - hottestValue = blockTemp; - } - else - { - if(blockTemp < coldestValue) - { - coldestValue = blockTemp; - } - } - } - } - else - { - //Material 'support' - //It's just fire and the JSON probably won't be configurable any time soon - //There's no real need for pack makers to add materials, I don't think? - - //It turns out this check runs really fast - if(blockstate.getMaterial()==Material.FIRE) - { - if(JsonConfig.materialTemperature.fire > hottestValue) - hottestValue = JsonConfig.materialTemperature.fire; - } - } - } - } - } - - return coldestValue + hottestValue; - } -} diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlocksTiles.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlocksTiles.java new file mode 100644 index 0000000..89d84f9 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierBlocksTiles.java @@ -0,0 +1,384 @@ +package com.charles445.simpledifficulty.temperature; + +import java.util.List; +import java.util.Map; + +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.ServerConfig; +import com.charles445.simpledifficulty.api.config.ServerOptions; +import com.charles445.simpledifficulty.api.config.json.JsonPropertyTemperature; +import com.charles445.simpledifficulty.api.temperature.ITemperatureTileEntity; +import com.charles445.simpledifficulty.api.temperature.TemperatureEnum; +import com.charles445.simpledifficulty.config.JsonConfigInternal; +import com.charles445.simpledifficulty.config.ModConfig; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; + +public class ModifierBlocksTiles extends ModifierBase +{ + private final float rangeMax = TemperatureEnum.BURNING.getUpperBound() - TemperatureEnum.FREEZING.getLowerBound(); + private final float maxTemp = TemperatureEnum.BURNING.getUpperBound(); + private final float minTemp = TemperatureEnum.FREEZING.getLowerBound(); + + private float coldestValue = 0.0f; + private float hottestValue = 0.0f; + private float coldestResultValue = 0.0f; + private float hottestResultValue = 0.0f; + private float hotTotal = 0.0f; + private float coldTotal = 0.0f; + + public ModifierBlocksTiles() + { + super("BlocksTiles"); + } + + @Override + public float getWorldInfluence(World world, BlockPos pos) + { + //Gathering things in the "proximity" to the player. + + //Things this should include: + + //Blocks + //TileEntities + //Multiblocks (if possible ?) + //Entities (is this the right place for them too?) + + + //7 x 5 x 7 (245) (-3, 3, -3, 1, -3, 3) + //9 x 5 x 9 (405) (-4, 4, -3, 1, -4, 4) + + coldestValue = 0.0f; + hottestValue = 0.0f; + + coldestResultValue = 0.0f; + hottestResultValue = 0.0f; + + hotTotal = 0.0f; + coldTotal = 0.0f; + + doBlocksRoutine(world, pos); + + doTileEntitiesRoutine(world,pos); + + if(!ModConfig.server.temperature.stackingTemperature) + { + //If not diminishing returns, end here + return hottestValue + coldestValue; + } + + //Attempt 3 or so + + //Remove hottest/coldest from totals + hotTotal -= hottestValue; + coldTotal -= coldestValue; + + float hotLogValue = hottestValue * (float)Math.sqrt(easyLog(hotTotal)); + float coldLogValue = coldestValue * (float)Math.sqrt(easyLog(coldTotal)); + + float result = hotLogValue + coldLogValue; + + if(result > hottestValue) + { + //Hotter than hottestValue, clamp + return Math.min(hottestValue + ModConfig.server.temperature.stackingTemperatureLimit, result); + } + else if(result < coldestValue) + { + //Colder than coldestValue, clamp + return Math.max(coldestValue - ModConfig.server.temperature.stackingTemperatureLimit, result); + } + else + { + //Within bounds, no need to clamp + return result; + } + + + + + // diminishing returns + + //Attempt 1 and 2 + + //So two campfires next to each other normally have the power of one, which is unusual + //This next part makes it so more blocks means more temperature, although it's still mostly dictated by the hottest or coldest block + + + //Remove the hottest or coldest result value from the totals + + /* + hotTotal -= hottestResultValue; + coldTotal -= coldestResultValue; + */ + + /* + + hotTotal -= hottestValue; + coldTotal -= coldestValue; + + float diminish = 10.0f; + + + //float hotLogValue = hottestValue + easyLog(hotTotal / diminish) - 1.0f; + //float coldLogValue = coldestValue - easyLog(coldTotal / diminish) + 1.0f; + + float hotLogValue = hottestValue * easyLog(hotTotal / (1.0f + hottestValue + hottestValue)); + float coldLogValue = coldestValue * easyLog(coldTotal / (1.0f + (-1.0f * (coldestValue + coldestValue)))); + + return MathHelper.clamp(hotLogValue, hottestValue, hottestValue + 2) + MathHelper.clamp(coldestValue, coldestValue - 2, coldestValue); + */ + + // diminishing returns would be nice but so far the attempts have had lackluster results + + } + + private void doBlocksRoutine(World world, BlockPos pos) + { + for(int x = -4; x <= 4; x++) + { + for(int y = -3; y <= 1; y++) + { + for (int z = -4; z <= 4; z++) + { + final BlockPos blockpos = pos.add(x, y, z); + final IBlockState blockstate = world.getBlockState(blockpos); + final Block block = blockstate.getBlock(); + + //JsonPropertyTemperature tempInfo = JsonConfigInternal.blockTemperatures.get(block.getRegistryName().toString()); + List tempInfoList = JsonConfig.blockTemperatures.get(block.getRegistryName().toString()); + + if(tempInfoList!=null) + { + for(JsonPropertyTemperature tempInfo : tempInfoList) + { + if(tempInfo==null) + continue; + + float blockTemp = tempInfo.temperature; + + if(blockTemp == 0.0f) + continue; + + if(tempInfo.matchesState(blockstate)) + { + //Do a thing + //SimpleDifficulty.logger.debug("Match at pos: "+blockpos.toString()); + + processTemp(blockTemp); + } + } + } + else + { + //Material 'support' + //It's just fire and the JSON probably won't be configurable any time soon + //There's no real need for pack makers to add materials, I don't think? + + //It turns out this check runs really fast + if(blockstate.getMaterial()==Material.FIRE) + { + processTemp(JsonConfigInternal.materialTemperature.fire); + } + } + } + } + } + } + + private void doTileEntitiesRoutine(World world, BlockPos pos) + { + /// + /// TILE ENTITIES + /// + + if(!ServerConfig.instance.getBoolean(ServerOptions.TEMPERATURE_TE_ENABLED)) + return; + + + FloatPair pair = new FloatPair(); + + // 7x7 box + for(int x = -3 ; x <= 3; x++) + { + for(int z = -3; z <= 3; z++) + { + checkChunkAndProcess(pair, world, pos.add(x * 16, 0, z * 16), pos); + } + } + + //The FloatPair is unused right now, it was used when it was in ModifierTileEntities + + + + /* 5x5 box with points (29) + + for(int x = -2 ; x <= 2; x++) + { + for(int z = -2; z <= 2; z++) + { + checkChunk(pair, world, selfPos.add(x * 16, 0, z * 16), selfPos); + } + } + checkChunk(pair, world, selfPos.add(-48, 0, 0), selfPos); + checkChunk(pair, world, selfPos.add(48, 0, 0), selfPos); + checkChunk(pair, world, selfPos.add(0, 0, -48), selfPos); + checkChunk(pair, world, selfPos.add(0, 0, 48), selfPos); + */ + } + + private void processTemp(float blockTemp) + { + if(blockTemp==0.0f) + return; + + if(blockTemp>=0.0f) + processHot(blockTemp); + else + processCold(blockTemp); + } + + private void processHot(float blockTemp) + { + hotTotal += blockTemp; + if(blockTemp > hottestValue) + { + hottestValue = blockTemp; + } + } + + private void processCold(float blockTemp) + { + coldTotal += blockTemp; + if(blockTemp < coldestValue) + { + coldestValue = blockTemp; + } + } + + private void checkChunkAndProcess(FloatPair pair, World world, BlockPos pos, BlockPos selfPos) + { + if(isChunkLoaded(world, pos)) + { + Chunk chunk = world.getChunkProvider().provideChunk(pos.getX() >> 4, pos.getZ() >> 4); + for(Map.Entry entry : chunk.getTileEntityMap().entrySet()) + { + processTemp(checkTileEntity(world, entry.getKey(), entry.getValue(), selfPos)); + + /* + float tileResult = checkTileEntity(world, entry.getKey(), entry.getValue(), selfPos); + if(tileResult > pair.high) + { + pair.high = tileResult; + processHot(pair.high); + } + else if(tileResult < pair.low) + { + pair.low = tileResult; + processCold(pair.low); + }*/ + } + } + } + + private float checkTileEntity(World world, BlockPos pos, TileEntity tileEntity, BlockPos selfPos) + { + double distance = pos.distanceSq(selfPos); + + if(distance < 2500.0d) + { + //Within 50 blocks + + if(tileEntity instanceof ITemperatureTileEntity) + { + return ((ITemperatureTileEntity)tileEntity).getInfluence(selfPos, distance); + } + } + return 0.0f; + } + + private boolean isChunkLoaded(World world, BlockPos pos) + { + if(world.isRemote) + { + //WorldClient don't care + return true; + } + else + { + //WorldServer + return ((WorldServer)world).getChunkProvider().chunkExists(pos.getX() >> 4, pos.getZ() >> 4); + } + + } + + private class FloatPair + { + protected float high; + protected float low; + + protected FloatPair() + { + high = 0.0f; + low = 0.0f; + } + } + + /* + private void processHot(float blockTemp) + { + float blockResult = (blockTemp / easyLogPowEight(blockTemp)); + hotTotal+=blockResult; + if(blockTemp > hottestValue) + { + hottestValue = blockTemp; + hottestResultValue = blockResult; + } + } + + private void processCold(float blockTemp) + { + float blockResult = (blockTemp / easyLogPowEight(blockTemp)); + coldTotal+=blockResult; + if(blockTemp < coldestValue) + { + coldestValue = blockTemp; + coldestResultValue = blockResult; + } + } + */ + + private float easyLog(float f) + { + if(f >= 0.0f) + { + return (float)Math.log10(f + 10.0f); + } + else + { + return (float)Math.log10(-1.0f * f + 10.0f); + } + } + + private float easyLogPowTwo(float f) + { + float ff = easyLog(f); + return ff * ff; + } + + private float easyLogPowEight(float f) + { + float ff = easyLog(f); + ff = ff * ff; //2 + ff = ff * ff; //4 + return ff * ff; //8 + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierDefault.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierDefault.java index 9c1406a..c829c5c 100644 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierDefault.java +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierDefault.java @@ -7,12 +7,9 @@ public class ModifierDefault extends ModifierBase { - private final float defaultTemperature; - public ModifierDefault() { super("Default"); - this.defaultTemperature = (TemperatureEnum.NORMAL.getUpperBound() + TemperatureEnum.COLD.getUpperBound()) / 2; } @Override diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTemporary.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTemporary.java new file mode 100644 index 0000000..e032d91 --- /dev/null +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTemporary.java @@ -0,0 +1,27 @@ +package com.charles445.simpledifficulty.temperature; + +import java.util.Map; + +import com.charles445.simpledifficulty.api.SDCapabilities; +import com.charles445.simpledifficulty.api.temperature.TemporaryModifier; + +import net.minecraft.entity.player.EntityPlayer; + +public class ModifierTemporary extends ModifierBase +{ + public ModifierTemporary() + { + super("Temporary"); + } + + @Override + public float getPlayerInfluence(EntityPlayer player) + { + float sum = 0.0f; + for(TemporaryModifier tm : SDCapabilities.getTemperatureData(player).getTemporaryModifiers().values()) + { + sum += tm.temperature; + } + return sum; + } +} diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTileEntities.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTileEntities.java deleted file mode 100644 index a7cbfde..0000000 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierTileEntities.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.charles445.simpledifficulty.temperature; - -import java.util.Map; - -import com.charles445.simpledifficulty.api.config.ServerConfig; -import com.charles445.simpledifficulty.api.config.ServerOptions; -import com.charles445.simpledifficulty.api.temperature.ITemperatureTileEntity; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; - -public class ModifierTileEntities extends ModifierBase -{ - public ModifierTileEntities() - { - super("TileEntities"); - } - - @Override - public float getWorldInfluence(World world, BlockPos selfPos) - { - if(!ServerConfig.instance.getBoolean(ServerOptions.TEMPERATURE_TE_ENABLED)) - return 0.0f; - - - FloatPair pair = new FloatPair(); - - // 7x7 box - for(int x = -3 ; x <= 3; x++) - { - for(int z = -3; z <= 3; z++) - { - checkChunk(pair, world, selfPos.add(x * 16, 0, z * 16), selfPos); - } - } - - - /* 5x5 box with points (29) - - for(int x = -2 ; x <= 2; x++) - { - for(int z = -2; z <= 2; z++) - { - checkChunk(pair, world, selfPos.add(x * 16, 0, z * 16), selfPos); - } - } - checkChunk(pair, world, selfPos.add(-48, 0, 0), selfPos); - checkChunk(pair, world, selfPos.add(48, 0, 0), selfPos); - checkChunk(pair, world, selfPos.add(0, 0, -48), selfPos); - checkChunk(pair, world, selfPos.add(0, 0, 48), selfPos); - */ - - return pair.high + pair.low; - } - - private void checkChunk(FloatPair pair, World world, BlockPos pos, BlockPos selfPos) - { - if(isChunkLoaded(world, pos)) - { - Chunk chunk = world.getChunkProvider().provideChunk(pos.getX() >> 4, pos.getZ() >> 4); - for(Map.Entry entry : chunk.getTileEntityMap().entrySet()) - { - float tileResult = checkTileEntity(world, entry.getKey(), entry.getValue(), selfPos); - if(tileResult > pair.high) - { - pair.high = tileResult; - } - else if(tileResult < pair.low) - { - pair.low = tileResult; - } - } - } - } - - private float checkTileEntity(World world, BlockPos pos, TileEntity tileEntity, BlockPos selfPos) - { - double distance = pos.distanceSq(selfPos); - - if(distance < 2500.0d) - { - //Within 50 blocks - - if(tileEntity instanceof ITemperatureTileEntity) - { - return ((ITemperatureTileEntity)tileEntity).getInfluence(selfPos, distance); - } - } - return 0.0f; - } - - private boolean isChunkLoaded(World world, BlockPos pos) - { - if(world.isRemote) - { - //WorldClient don't care - return true; - } - else - { - //WorldServer - return ((WorldServer)world).getChunkProvider().chunkExists(pos.getX() >> 4, pos.getZ() >> 4); - } - - } - - private class FloatPair - { - protected float high; - protected float low; - - protected FloatPair() - { - high = 0.0f; - low = 0.0f; - } - } -} - - diff --git a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierWet.java b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierWet.java index 6034699..0b6e992 100644 --- a/src/main/java/com/charles445/simpledifficulty/temperature/ModifierWet.java +++ b/src/main/java/com/charles445/simpledifficulty/temperature/ModifierWet.java @@ -1,14 +1,12 @@ package com.charles445.simpledifficulty.temperature; -import com.charles445.simpledifficulty.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.JsonConfig; +import com.charles445.simpledifficulty.api.config.json.JsonTemperature; import com.charles445.simpledifficulty.config.ModConfig; -import com.charles445.simpledifficulty.config.json.JsonPropertyTemperature; -import com.charles445.simpledifficulty.config.json.JsonTemperature; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; diff --git a/src/main/java/com/charles445/simpledifficulty/tileentity/TileEntityTemperature.java b/src/main/java/com/charles445/simpledifficulty/tileentity/TileEntityTemperature.java index 71851db..11849a5 100644 --- a/src/main/java/com/charles445/simpledifficulty/tileentity/TileEntityTemperature.java +++ b/src/main/java/com/charles445/simpledifficulty/tileentity/TileEntityTemperature.java @@ -2,6 +2,7 @@ import com.charles445.simpledifficulty.api.temperature.ITemperatureTileEntity; import com.charles445.simpledifficulty.block.BlockTemperature; +import com.charles445.simpledifficulty.config.ModConfig; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -22,11 +23,23 @@ public float getInfluence(BlockPos targetPos, double distance) if(enabled) { //Math and stuff - float activeTemp = ((BlockTemperature)block).getActiveTemperature(); - if(distance < 1250.0d) + float activeTemp = ((BlockTemperature)block).getActiveTemperatureMult() * ModConfig.server.temperature.heaterTemperature; + + double fullPowerSq = sq(ModConfig.server.temperature.heaterFullPowerRange); + + if(distance < fullPowerSq) + { return activeTemp; + } else - return activeTemp * Math.max(0.0f, 1.0f - (float)((distance - 1250.0d) / 1250.0d)); + { + double distanceDiv = sq(ModConfig.server.temperature.heaterMaxRange) - fullPowerSq; + + if(distanceDiv <= 0d) + return 0.0f; + + return activeTemp * Math.max(0.0f, 1.0f - (float)((distance - fullPowerSq) / distanceDiv)); + } } else { @@ -40,4 +53,9 @@ public float getInfluence(BlockPos targetPos, double distance) return 0.0f; } } + + private double sq(double d) + { + return d * d; + } } diff --git a/src/main/java/com/charles445/simpledifficulty/util/internal/ThirstUtilInternal.java b/src/main/java/com/charles445/simpledifficulty/util/internal/ThirstUtilInternal.java index 8dfef3d..541a1eb 100644 --- a/src/main/java/com/charles445/simpledifficulty/util/internal/ThirstUtilInternal.java +++ b/src/main/java/com/charles445/simpledifficulty/util/internal/ThirstUtilInternal.java @@ -131,12 +131,13 @@ public void takeDrink(EntityPlayer player, int thirst, float saturation, float d //In TAN, any drink with a hydration higher than 0.5f will be more beneficial to you if you drink it when you're not as thirsty - //In this mod, saturation is half as powerful and capped at 1.0f - //Because of that, there is also no need to check the player's current thirst level - //There should be no saturation advantageous time to drink anything - //Safety checks are done in addThirstSaturation itself + //In this mod, there's no saturation advantageous time to drink anything - capability.addThirstSaturation(Math.min(1.0f, saturation) * thirst); + + capability.addThirstSaturation(saturation); + + //Old + //capability.addThirstSaturation(Math.min(1.0f, saturation) * thirst); //Test for dirtiness if(dirtyChance != 0.0f && player.world.rand.nextFloat() < dirtyChance) @@ -156,7 +157,7 @@ public void takeDrink(EntityPlayer player, int thirst, float saturation) @Override public void takeDrink(EntityPlayer player, ThirstEnum type) { - takeDrink(player, type.getThirst(), type.getSaturation(), type.getDirtyChance()); + takeDrink(player, type.getThirst(), type.getSaturation(), type.getThirstyChance()); } @Override