@@ -6,6 +6,7 @@
import hardcorequesting.event.PlayerDeathEventListener;
import hardcorequesting.event.PlayerTracker;
import hardcorequesting.event.WorldEventListener;
import hardcorequesting.io.SaveHandler;
import hardcorequesting.items.ModItems;
import hardcorequesting.network.NetworkManager;
import hardcorequesting.proxies.CommonProxy;
@@ -48,7 +49,7 @@ public void preInit(FMLPreInitializationEvent event) {
configDir = new File(path);
ConfigHandler.initModConfig(path);
ConfigHandler.initEditConfig(path);
QuestLine.init(path + File.separator + "remote", event.getSide().isClient()); // Init Quest line within config folder used for server connections
QuestLine.init(path + File.separator + SaveHandler.REMOTE, event.getSide().isClient()); // Init Quest line within config folder used for server connections

proxy.init();
proxy.initSounds(path);
@@ -235,9 +235,10 @@ public static void drawOverview(GuiQuestBook gui, ScrollBar tierScroll, ScrollBa
@SideOnly(Side.CLIENT)
public void draw(GuiQuestBook gui, int x, int y) {
gui.drawString(this.getName(), GuiQuestBook.GROUPS_X, GuiQuestBook.GROUPS_Y, this.getTier().getColor().getHexColor());
List<ItemStack> items = this.getItems();
List<ItemStack> items = new ArrayList<>(this.getItems());
items.add(null);
for (int i = 0; i < items.size(); i++) {
ItemStack itemStack = i < items.size() ? items.get(i) : null;
ItemStack itemStack = items.get(i);

int xPos = (i % GuiQuestBook.ITEMS_PER_LINE) * GuiQuestBook.GROUP_ITEMS_SPACING + GuiQuestBook.GROUP_ITEMS_X;
int yPos = (i / GuiQuestBook.ITEMS_PER_LINE) * GuiQuestBook.GROUP_ITEMS_SPACING + GuiQuestBook.GROUP_ITEMS_Y;
@@ -268,7 +269,8 @@ public void draw(GuiQuestBook gui, int x, int y) {

@SideOnly(Side.CLIENT)
public void mouseClicked(GuiQuestBook gui, int x, int y) {
List<ItemStack> items = this.getItems();
List<ItemStack> items = new ArrayList<>(this.getItems());
items.add(null);
for (int i = 0; i < items.size(); i++) {
int xPos = (i % GuiQuestBook.ITEMS_PER_LINE) * GuiQuestBook.GROUP_ITEMS_SPACING + GuiQuestBook.GROUP_ITEMS_X;
int yPos = (i / GuiQuestBook.ITEMS_PER_LINE) * GuiQuestBook.GROUP_ITEMS_SPACING + GuiQuestBook.GROUP_ITEMS_Y;
@@ -6,6 +6,7 @@
import hardcorequesting.client.interfaces.edit.GuiEditMenuTextEditor;
import hardcorequesting.client.interfaces.edit.GuiEditMenuTier;
import hardcorequesting.io.SaveHandler;
import hardcorequesting.quests.Quest;
import hardcorequesting.quests.QuestLine;
import hardcorequesting.util.SaveHelper;
import hardcorequesting.util.Translator;
@@ -66,6 +67,7 @@ public void setColor(GuiColor color) {
public static void saveAll() {
try {
SaveHandler.saveBags(SaveHandler.getLocalFile("bags"));
if (Quest.isEditing && Quest.saveDefault) SaveHandler.saveBags(SaveHandler.getDefaultFile("bags"));
} catch (IOException e) {
FMLLog.log("HQM", Level.INFO, "Failed to save bags");
}
@@ -14,10 +14,10 @@ public class GuiEditMenuTier extends GuiEditMenu {
private TextBoxGroup textBoxes;
private boolean clicked;

public GuiEditMenuTier(GuiQuestBook gui, EntityPlayer player, final GroupTier tier) {
public GuiEditMenuTier(GuiQuestBook gui, EntityPlayer player, GroupTier original) {
super(gui, player, true);
this.original = tier;
this.tier = tier.copy();
this.original = original;
this.tier = original.copy();
this.textBoxes = new TextBoxGroup();

BagTier[] values = BagTier.values();
@@ -25,6 +25,7 @@ public static void initEditConfig(String configPath) {

public static void loadSyncConfig() {
Quest.isEditing = syncConfig.get(Configuration.CATEGORY_GENERAL, EDITOR_KEY, EDITOR_DEFAULT, EDITOR_COMMENT).getBoolean(EDITOR_DEFAULT);
Quest.saveDefault = syncConfig.get(Configuration.CATEGORY_GENERAL, SAVE_DEFAULT_KEY, SAVE_DEFAULT_DEFAULT, SAVE_DEFAULT_COMMENT).getBoolean(SAVE_DEFAULT_DEFAULT);
if (HardcoreQuesting.proxy.isClient()) {
if (KEYMAP_DEFAULT == null) {
KEYMAP_DEFAULT = KeyboardHandler.getDefault();
@@ -40,6 +41,10 @@ public static void loadSyncConfig() {
private static final boolean EDITOR_DEFAULT = false;
private static final String EDITOR_COMMENT = "Only use this as a map maker who wants to create quests. Leaving this off allows you the play the existing quests.";

private static final String SAVE_DEFAULT_KEY = "SaveDefault";
private static final boolean SAVE_DEFAULT_DEFAULT = true;
private static final String SAVE_DEFAULT_COMMENT = "This will save quests in an general map used upon world creation";

private static final String KEYMAP_KEY = "KeyMap";
private static String[] KEYMAP_DEFAULT = null;
private static final String KEYMAP_COMMENT = "Hotkeys used in the book, one entry per line(Format: [key]:[mode]";
@@ -26,11 +26,18 @@ public void onLoad(WorldEvent.Load event) {
@SubscribeEvent
public void onSave(WorldEvent.Save event) {
if (!event.getWorld().isRemote && event.getWorld().provider.getDimension() == 0) {
WorldServer world = (WorldServer) event.getWorld();
QuestLine.saveAll();
}
}

@SubscribeEvent
public void onCreate(WorldEvent.CreateSpawnPosition event) {
if (!event.getWorld().isRemote && event.getWorld().provider.getDimension() == 0) {
WorldServer world = (WorldServer) event.getWorld();
QuestLine.copyDefaults(getWorldPath(world));
}
}

private File getWorldPath(WorldServer world) {
return world.getChunkSaveLocation();
}
@@ -14,6 +14,9 @@
import hardcorequesting.quests.QuestingData;
import hardcorequesting.reputation.Reputation;
import hardcorequesting.team.Team;
import net.minecraftforge.fml.common.FMLLog;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.Level;

import java.io.*;
import java.lang.reflect.Type;
@@ -51,35 +54,56 @@ public class SaveHandler {
&& !SETS.matcher(pathname.getName()).find()
&& !DEATHS.matcher(pathname.getName()).find();

public static File getExportFile(String name) {
File file = new File(new File(HardcoreQuesting.configDir, "exports"), name + ".json");
public static final String EXPORTS = "exports";
public static final String REMOTE = "remote";
public static final String DEFAULT = "default";

public static File getExportFile(String name) throws IOException {
File file = new File(new File(HardcoreQuesting.configDir, EXPORTS), name + ".json");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
return file;
}

public static File getLocalFile(String name) {
return new File(QuestLine.getActiveQuestLine().mainPath, name + ".json");
public static File getLocalFile(String name) throws IOException {
File file = new File(QuestLine.getActiveQuestLine().mainPath, name + ".json");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
return file;
}

public static File getRemoteFile(String name) throws IOException {
File file = new File(new File(QuestLine.getActiveQuestLine().mainPath, "remote"), name + ".json");
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
File file = new File(new File(QuestLine.getActiveQuestLine().mainPath, REMOTE), name + ".json");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
return file;
}

public static File getDefaultFile(String name) throws IOException {
File file = new File(new File(HardcoreQuesting.configDir, DEFAULT), name + ".json");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
return file;
}

public static File getExportFolder() {
return new File(HardcoreQuesting.configDir, "exports");
return new File(HardcoreQuesting.configDir, EXPORTS);
}

public static File getLocalFolder() {
return new File(QuestLine.getActiveQuestLine().mainPath);
}

public static File getRemoteFolder() {
return new File(QuestLine.getActiveQuestLine().mainPath, "remote");
return new File(QuestLine.getActiveQuestLine().mainPath, REMOTE);
}

public static File getDefaultFolder() {
return new File(HardcoreQuesting.configDir, DEFAULT);
}

public static void copyFolder(File from, File to) {
try {
FileUtils.copyDirectory(from, to);
} catch (IOException e) {
FMLLog.log("HQM", Level.INFO, "Couldn't copy default files");
}
}

public static void removeFile(File file) {
@@ -37,6 +37,7 @@

public class Quest {
public static boolean isEditing = false;
public static boolean saveDefault = true;
public static String selectedQuestId;

public static QuestTicker clientTicker;
@@ -6,6 +6,7 @@
import hardcorequesting.client.interfaces.edit.GuiEditMenuItem;
import hardcorequesting.client.sounds.SoundHandler;
import hardcorequesting.death.DeathStats;
import hardcorequesting.io.SaveHandler;
import hardcorequesting.network.NetworkManager;
import hardcorequesting.network.message.DeathStatsMessage;
import hardcorequesting.network.message.FullSyncMessage;
@@ -91,6 +92,12 @@ public static void loadWorldData(File worldPath, boolean isClient) {
init(path, isClient);
}

public static void copyDefaults(File worldPath) {
File path = new File(worldPath, "hqm");
if (!path.exists()) path.mkdirs();
SaveHandler.copyFolder(SaveHandler.getDefaultFolder(), path);
}

public static void saveAll() {
QuestingData.saveState();
DeathStats.saveAll();
@@ -81,6 +81,7 @@ public static void loadAll() {
public static void saveAll() {
try {
SaveHandler.saveAllQuestSets(SaveHandler.getLocalFolder());
if (Quest.isEditing && Quest.saveDefault) SaveHandler.saveAllQuestSets(SaveHandler.getDefaultFolder());
} catch (IOException e) {
FMLLog.log("HQM", Level.INFO, "Failed saving quest sets");
}
@@ -13,6 +13,8 @@
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.Arrays;

public class QuestTaskItemsDetect extends QuestTaskItems {
public QuestTaskItemsDetect(Quest parent, String description, String longDescription) {
super(parent, description, longDescription);
@@ -84,6 +86,8 @@ public void countItems(ItemStack[] itemsToCount, QuestDataTaskItems data, String

boolean updated = false;

if (data.progress.length < items.length)
data.progress = Arrays.copyOf(data.progress, items.length);
for (int i = 0; i < items.length; i++) {
ItemRequirement item = items[i];
if (!item.hasItem || item.required == data.progress[i]) {
@@ -611,6 +611,7 @@ public static void loadAll() {
public static void saveAll() {
try {
SaveHandler.saveReputations(SaveHandler.getLocalFile("reputations"));
if (Quest.isEditing && Quest.saveDefault) SaveHandler.saveReputations(SaveHandler.getDefaultFile("reputations"));
} catch (IOException e) {
FMLLog.log("HQM", Level.INFO, "Failed saving reputations");
}