Added files via upload
This commit is contained in:
parent
ae586c2dc0
commit
24af593426
|
@ -0,0 +1,999 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using StardewValley;
|
||||
using StardewModdingAPI;
|
||||
using StardewValley.Menus;
|
||||
using System.IO;
|
||||
using System.Timers;
|
||||
using System.Windows.Input;
|
||||
using StardewValley.Characters;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
|
||||
/*
|
||||
TO DO:
|
||||
|
||||
*/
|
||||
namespace Stardew_Save_Anywhere_Mod
|
||||
{
|
||||
public class Class1 : Mod
|
||||
{
|
||||
// string save_path="";
|
||||
|
||||
bool initialize = false;
|
||||
|
||||
|
||||
string key_binding="K";
|
||||
|
||||
bool game_loaded = false;
|
||||
string player_map_name;
|
||||
int player_tile_x;
|
||||
int player_tile_Y;
|
||||
bool player_flop = false;
|
||||
|
||||
int game_time;
|
||||
double timer_interval = 3500;
|
||||
|
||||
bool timer = true;
|
||||
|
||||
bool game_updated_and_loaded = false;
|
||||
|
||||
|
||||
bool warped = false;
|
||||
|
||||
bool simulate_time;
|
||||
bool warp_character;
|
||||
|
||||
|
||||
Timer aTimer = new Timer(3500); //fires every X miliseconds. 3500 is 4 times faster than the game's normal speed //originally this was 2000
|
||||
|
||||
|
||||
string npc_name;
|
||||
string npc_map_name;
|
||||
bool npc_map_outside;
|
||||
Microsoft.Xna.Framework.Point npc_point;
|
||||
int npc_x;
|
||||
int npc_y;
|
||||
|
||||
public override void Entry(params object[] objects)
|
||||
{
|
||||
//set up all of my events here
|
||||
StardewModdingAPI.Events.PlayerEvents.LoadedGame += PlayerEvents_LoadedGame;
|
||||
// StardewModdingAPI.Events.TimeEvents.TimeOfDayChanged += TimeEvents_TimeOfDayChanged; Not used as of version 1.0.1
|
||||
StardewModdingAPI.Events.TimeEvents.DayOfMonthChanged += TimeEvents_DayOfMonthChanged;
|
||||
StardewModdingAPI.Events.GameEvents.OneSecondTick += GameEvents_OneSecondTick;
|
||||
StardewModdingAPI.Events.ControlEvents.KeyPressed += ControlEvents_KeyPressed;
|
||||
}
|
||||
|
||||
public void TimeEvents_DayOfMonthChanged(object sender, StardewModdingAPI.Events.EventArgsIntChanged e)
|
||||
{
|
||||
if (game_loaded == true)
|
||||
{
|
||||
file_clean_up();
|
||||
game_time = 600; //resets the game time so that simulation doesn't happen every day.
|
||||
game_updated_and_loaded = true; //prevents the next day from being updated
|
||||
StardewValley.Game1.player.canMove = true; //do I even use this?
|
||||
}
|
||||
}
|
||||
|
||||
public void ControlEvents_KeyPressed(object sender, StardewModdingAPI.Events.EventArgsKeyPressed e)
|
||||
{
|
||||
//DataLoader_Settings(); //update the key if players changed it while playing.
|
||||
if (e.KeyPressed.ToString() ==key_binding) //if the key is pressed, load my cusom save function
|
||||
{
|
||||
my_save();
|
||||
}
|
||||
}
|
||||
|
||||
public void GameEvents_OneSecondTick(object sender, EventArgs e)
|
||||
{ //updates the info every second
|
||||
|
||||
if (game_loaded == true)
|
||||
{
|
||||
|
||||
if (initialize == false)
|
||||
{
|
||||
|
||||
// DataLoader_Settings(); //load up the mod config file.
|
||||
DataLoader_Horse();
|
||||
DataLoader_NPC(false); //loads the NPC's with original location info
|
||||
initialize = true;
|
||||
|
||||
|
||||
if (simulate_time == true)
|
||||
{
|
||||
timer = false;
|
||||
simulate_time = false;
|
||||
}
|
||||
else timer = true;
|
||||
|
||||
if (warp_character == true && game_updated_and_loaded == false)
|
||||
{
|
||||
warped = false;
|
||||
//warp_character = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
else warped = true;
|
||||
|
||||
DataLoader_Player(); //warps the character and changes the game time. WTF HOW DID THIS BREAK???
|
||||
|
||||
if (warped == false)
|
||||
{
|
||||
|
||||
game_updated_and_loaded = false;
|
||||
if (StardewValley.Game1.player.currentLocation.name != player_map_name && warped==false)
|
||||
{
|
||||
|
||||
|
||||
MyWritter_NPC(true); //writes in the NPC's info. May be redundant?
|
||||
warped = true;
|
||||
StardewValley.Game1.warpFarmer(player_map_name, player_tile_x, player_tile_Y, player_flop); //player flop is always false. //Just incase I run this a couple of times.
|
||||
StardewValley.Game1.warpFarmer(player_map_name, player_tile_x, player_tile_Y, player_flop); //player flop is always false. //probably bad programming practice.
|
||||
StardewValley.Game1.warpFarmer(player_map_name, player_tile_x, player_tile_Y, player_flop); //player flop is always false.
|
||||
Log.Success("WARPED");
|
||||
//timer = false; //activate my timer. False means that it hasn't been initialized.
|
||||
game_updated_and_loaded = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// DataLoader_NPC(false);
|
||||
if (warped == true && timer == false)
|
||||
{
|
||||
//load config info for the timer here.
|
||||
|
||||
aTimer.Interval = timer_interval; //this should update the timer to run at the config amount of seconds.
|
||||
|
||||
timer = true; //timer is now running
|
||||
|
||||
aTimer.AutoReset = true;
|
||||
aTimer.Enabled = true;
|
||||
|
||||
aTimer.Elapsed += ATimer_Elapsed;
|
||||
|
||||
//simulate time here
|
||||
|
||||
if (Game1.timeOfDay >= game_time) aTimer.Enabled = false; //disable my timer
|
||||
|
||||
//aTimer.Enabled = false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void ATimer_Elapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
if (game_updated_and_loaded == true) return;
|
||||
if (Game1.timeOfDay < game_time)
|
||||
{
|
||||
Game1.performTenMinuteClockUpdate();
|
||||
/*
|
||||
if (create_original == false)
|
||||
{
|
||||
MyWritter_NPC(true);
|
||||
create_original = true;
|
||||
}
|
||||
*/
|
||||
Log.Info("This is the current time: Keep simulating :" + Game1.timeOfDay);
|
||||
|
||||
|
||||
foreach (StardewValley.GameLocation asdf in Game1.locations)
|
||||
{
|
||||
GameLocation NPClocation = (GameLocation)asdf;
|
||||
foreach (StardewValley.NPC obj in NPClocation.characters)
|
||||
{
|
||||
obj.addedSpeed = 7; //changes how fast npc's move in the world. Default added speed I put was 9 when timer_interval was 2000 miliseconds
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (Game1.timeOfDay >= game_time)
|
||||
{
|
||||
game_updated_and_loaded = true;
|
||||
Game1.player.canMove = true;
|
||||
game_time = 600; //reset the game_time so that oversimulation doesn't happen again while playing.
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public void TimeEvents_TimeOfDayChanged(object sender, StardewModdingAPI.Events.EventArgsIntChanged e)
|
||||
{
|
||||
if (Game1.timeOfDay < game_time)
|
||||
{
|
||||
|
||||
if (game_loaded == true)
|
||||
{
|
||||
//do nothing right now. I might need this later though.
|
||||
}
|
||||
|
||||
|
||||
GameLocation farm = StardewValley.Game1.getLocationFromName("Farm");
|
||||
StardewValley.TerrainFeatures.HoeDirt mydirt;
|
||||
foreach (StardewValley.TerrainFeatures.TerrainFeature dirty in farm.terrainFeatures.Values)
|
||||
{
|
||||
// Log.Error("IS THIS WRONG?");
|
||||
if (dirty is StardewValley.TerrainFeatures.HoeDirt)
|
||||
{
|
||||
// Log.Error("JELLO SAUCE!!!");
|
||||
mydirt =(StardewValley.TerrainFeatures.HoeDirt)dirty;
|
||||
Log.Info("CONVERSION");
|
||||
if (mydirt.state.Equals(0)) //0 is dry, 1 is watered
|
||||
{
|
||||
|
||||
Log.Error("NEED SOME WATER");
|
||||
}
|
||||
|
||||
if (mydirt.state.Equals(1)) //0 is dry, 1 is watered
|
||||
{
|
||||
|
||||
Log.Success("NICE AND WET");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//This originally was the code to preserve soil, but Ape apparently covered that in the save functionality. Still I'll keep it here incase I need to update the farm later.
|
||||
|
||||
} //end game loaded if
|
||||
}
|
||||
*/
|
||||
public void PlayerEvents_LoadedGame(object sender, StardewModdingAPI.Events.EventArgsLoadedGameChanged e)
|
||||
{
|
||||
game_loaded = true;
|
||||
DataLoader_Settings();
|
||||
MyWritter_Settings();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void DataLoader_Settings()
|
||||
{
|
||||
//loads the data to the variables upon loading the game.
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation = Path.Combine(PathOnDisk, "Save_Anywhere_Config");
|
||||
string mylocation2 = mylocation;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
// Console.WriteLine("Can't load custom save info since the file doesn't exist.");
|
||||
|
||||
key_binding = "K";
|
||||
timer_interval = 3500;
|
||||
warp_character = true;
|
||||
simulate_time = true;
|
||||
// Log.Info("KEY TIME");
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// Console.WriteLine("HEY THERE IM LOADING DATA");
|
||||
string[] readtext = File.ReadAllLines(mylocation3);
|
||||
key_binding = Convert.ToString(readtext[3]);
|
||||
timer_interval = Convert.ToDouble(readtext[5]);
|
||||
simulate_time = Convert.ToBoolean(readtext[7]);
|
||||
warp_character = Convert.ToBoolean(readtext[9]);
|
||||
|
||||
|
||||
// Log.Info(key_binding);
|
||||
// Log.Info(Convert.ToString(readtext[3]));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void MyWritter_Settings()
|
||||
{
|
||||
|
||||
//write all of my info to a text file.
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
|
||||
string mylocation = Path.Combine(PathOnDisk, "Save_Anywhere_Config");
|
||||
string mylocation2 = mylocation;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
|
||||
string[] mystring3 = new string[20];
|
||||
if (!File.Exists(mylocation3))
|
||||
{
|
||||
Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now.");
|
||||
|
||||
mystring3[0] = "Config: Save_Anywhere Info. Feel free to mess with these settings.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Key binding for saving anywhere. Press this key to save anywhere!";
|
||||
mystring3[3] = key_binding.ToString();
|
||||
|
||||
mystring3[4] = "Timer interval for NPCs. Default 3500 which simulates game time at 4x speed.";
|
||||
mystring3[5] = timer_interval.ToString();
|
||||
|
||||
mystring3[6] = "Simulate game time? Game time will be sped up until restored before saving";
|
||||
mystring3[7] = simulate_time.ToString();
|
||||
|
||||
mystring3[8] = "Warp player when loading?";
|
||||
mystring3[9] = warp_character.ToString();
|
||||
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
mystring3[0] = "Config: Save_Anywhere Info. Feel free to mess with these settings.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Key binding for saving anywhere. Press this key to save anywhere!";
|
||||
mystring3[3] = key_binding.ToString();
|
||||
|
||||
mystring3[4] = "Timer interval for NPCs. Default 3500 which simulates game time at 4x speed.";
|
||||
mystring3[5] = timer_interval.ToString();
|
||||
|
||||
mystring3[6] = "Simulate game time? Game time will be sped up until restored before saving";
|
||||
mystring3[7] = simulate_time.ToString();
|
||||
|
||||
mystring3[8] = "Warp player when loading?";
|
||||
mystring3[9] = warp_character.ToString();
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
}
|
||||
|
||||
void MyWritter_Player()
|
||||
{
|
||||
|
||||
MyWritter_Settings();
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
|
||||
string mylocation = Path.Combine(PathOnDisk, "Player_Save_Info_");
|
||||
string mylocation2 = mylocation + myname;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
string[] mystring3 = new string[20];
|
||||
if (!File.Exists(mylocation3))
|
||||
{
|
||||
Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now.");
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
mystring3[0] = "Player: Save_Anywhere Info. Editing this might break some things.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Player Current Game Time";
|
||||
mystring3[3] = Game1.timeOfDay.ToString();
|
||||
|
||||
mystring3[4] = "Player Current Map Name";
|
||||
mystring3[5] = player_map_name.ToString();
|
||||
|
||||
mystring3[6] = "Player X Position";
|
||||
mystring3[7] = player_tile_x.ToString();
|
||||
|
||||
mystring3[8] = "Player Y Position";
|
||||
mystring3[9] = player_tile_Y.ToString();
|
||||
|
||||
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
mystring3[0] = "Player: Save_Anywhere Info. Editing this might break some things.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Player Current Game Time";
|
||||
mystring3[3] = Game1.timeOfDay.ToString();
|
||||
|
||||
mystring3[4] = "Player Current Map Name";
|
||||
mystring3[5] = player_map_name.ToString();
|
||||
|
||||
mystring3[6] = "Player X Position";
|
||||
mystring3[7] = player_tile_x.ToString();
|
||||
|
||||
mystring3[8] = "Player Y Position";
|
||||
mystring3[9] = player_tile_Y.ToString();
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
}
|
||||
|
||||
void DataLoader_Player()
|
||||
{
|
||||
// DataLoader_Settings();
|
||||
//loads the data to the variables upon loading the game.
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation = Path.Combine(PathOnDisk, "Player_Save_Info_");
|
||||
string mylocation2 = mylocation + myname;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
|
||||
if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
// Console.WriteLine("Can't load custom save info since the file doesn't exist.");
|
||||
warped = true;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// Console.WriteLine("HEY THERE IM LOADING DATA");
|
||||
|
||||
string[] readtext = File.ReadAllLines(mylocation3);
|
||||
game_time = Convert.ToInt32(readtext[3]);
|
||||
player_map_name = Convert.ToString(readtext[5]);
|
||||
player_tile_x = Convert.ToInt32(readtext[7]);
|
||||
player_tile_Y = Convert.ToInt32(readtext[9]);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MyWritter_Horse()
|
||||
{
|
||||
|
||||
Horse horse = Utility.findHorse();
|
||||
|
||||
|
||||
if (horse == null)
|
||||
{
|
||||
//Game1.getFarm().characters.Add((NPC)new Horse(this.player_tile_x + 1, this.player_tile_Y + 1));
|
||||
Log.Info("NEIGH: No horse exists");
|
||||
return;
|
||||
}
|
||||
// else
|
||||
// Game1.warpCharacter((NPC)horse, Game1.player.currentLocation.name, StardewValley.Game1.player.getTileLocationPoint(), false, true);
|
||||
|
||||
|
||||
|
||||
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
|
||||
string mylocation = Path.Combine(PathOnDisk, "Horse_Save_Info_");
|
||||
string mylocation2 = mylocation + myname;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
string[] mystring3 = new string[20];
|
||||
if (!File.Exists(mylocation3))
|
||||
{
|
||||
|
||||
|
||||
Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now.");
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
mystring3[0] = "Horse: Save_Anywhere Info. Editing this might break some things.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Player Current Map Name";
|
||||
mystring3[3] = horse.currentLocation.name.ToString();
|
||||
|
||||
mystring3[4] = "Player X Position";
|
||||
mystring3[5] = horse.getTileX().ToString();
|
||||
|
||||
mystring3[6] = "Player Y Position";
|
||||
mystring3[7] = horse.getTileY().ToString();
|
||||
|
||||
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now.");
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
mystring3[0] = "Horse: Save_Anywhere Info. Editing this might break some things.";
|
||||
mystring3[1] = "====================================================================================";
|
||||
|
||||
mystring3[2] = "Player Current Map Name";
|
||||
mystring3[3] = horse.currentLocation.name.ToString();
|
||||
|
||||
mystring3[4] = "Player X Position";
|
||||
mystring3[5] = horse.getTileX().ToString();
|
||||
|
||||
mystring3[6] = "Player Y Position";
|
||||
mystring3[7] = horse.getTileY().ToString();
|
||||
|
||||
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
}
|
||||
|
||||
void DataLoader_Horse()
|
||||
{
|
||||
Horse horse = Utility.findHorse();
|
||||
if (horse == null)
|
||||
{
|
||||
//Game1.getFarm().characters.Add((NPC)new Horse(this.player_tile_x + 1, this.player_tile_Y + 1));
|
||||
Log.Info("NEIGH: No horse exists");
|
||||
return;
|
||||
}
|
||||
// else
|
||||
//Game1.warpCharacter((NPC)horse, Game1.player.currentLocation.name, StardewValley.Game1.player.getTileLocationPoint(), false, true);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// DataLoader_Settings();
|
||||
//loads the data to the variables upon loading the game.
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation = Path.Combine(PathOnDisk, "Horse_Save_Info_");
|
||||
string mylocation2 = mylocation + myname;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
// Console.WriteLine("Can't load custom save info since the file doesn't exist.");
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
string horse_map_name = "";
|
||||
int horse_x;
|
||||
int horse_y;
|
||||
|
||||
Point horse_point;
|
||||
|
||||
// Console.WriteLine("HEY THERE IM LOADING DATA");
|
||||
string[] readtext = File.ReadAllLines(mylocation3);
|
||||
horse_map_name = Convert.ToString(readtext[3]);
|
||||
horse_x = Convert.ToInt32(readtext[5]);
|
||||
horse_y = Convert.ToInt32(readtext[7]);
|
||||
|
||||
horse_point.X = horse_x;
|
||||
horse_point.Y = horse_y;
|
||||
|
||||
Game1.warpCharacter((NPC)horse, horse_map_name, horse_point, false, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void my_save()
|
||||
{
|
||||
if (Game1.player.currentLocation.name == "CommunityCenter")
|
||||
{
|
||||
Log.Error("There is an issue saving in the community center. Blame the Junimos not being saved to the player's save file.");
|
||||
Log.Error("Your data has not been saved. Sorry for the issue.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Game1.player.currentLocation.name == "Sewer")
|
||||
{
|
||||
Log.Error("There is an issue saving in the Sewer. Blame the animals for not being saved to the player's save file.");
|
||||
Log.Error("Your data has not been saved. Sorry for the issue.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//if a player has shipped an item, run this code.
|
||||
if (Enumerable.Count<Item>((IEnumerable<Item>)Game1.getFarm().shippingBin) > 0)
|
||||
{
|
||||
Game1.endOfNightMenus.Push((IClickableMenu)new ShippingMenu(Game1.getFarm().shippingBin));
|
||||
Game1.showEndOfNightStuff(); //shows the nightly shipping menu.
|
||||
Game1.getFarm().shippingBin.Clear(); //clears out the shipping bin to prevent exploits
|
||||
}
|
||||
|
||||
Game1.activeClickableMenu = new StardewValley.Menus.SaveGameMenu(); //This command is what allows the player to save anywhere as it calls the saving function.
|
||||
|
||||
|
||||
//grab the player's info
|
||||
player_map_name = StardewValley.Game1.player.currentLocation.name;
|
||||
player_tile_x = StardewValley.Game1.player.getTileX();
|
||||
player_tile_Y = StardewValley.Game1.player.getTileY();
|
||||
player_flop = false;
|
||||
|
||||
MyWritter_Player(); //write my info to a text file
|
||||
|
||||
|
||||
MyWritter_Horse();
|
||||
|
||||
DataLoader_Settings(); //load settings. Prevents acidental overwrite.
|
||||
MyWritter_Settings(); //save settings.
|
||||
|
||||
//Game1.warpFarmer(player_map_name, player_tile_x, player_tile_Y, player_flop); //refresh the player's location just incase. That will prove that they character's info was valid.
|
||||
|
||||
//so this is essentially the basics of the code...
|
||||
// Log.Error("IS THIS BREAKING?");
|
||||
}
|
||||
|
||||
|
||||
void file_clean_up()
|
||||
{
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation = Path.Combine(PathOnDisk, "Player_Save_Info_");
|
||||
string mylocation2 = mylocation + myname;
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
|
||||
if (File.Exists(mylocation3)) //delete the custom save when going to bed.
|
||||
{
|
||||
File.Delete(mylocation3); //clean up the player's save info
|
||||
}
|
||||
|
||||
|
||||
mylocation = Path.Combine(PathOnDisk, "Horse_Save_Info_");
|
||||
mylocation2 = mylocation + myname;
|
||||
mylocation3 = mylocation2 + ".txt";
|
||||
|
||||
if (File.Exists(mylocation3)) //delete the custom save when going to bed.
|
||||
{
|
||||
File.Delete(mylocation3); //clean up the player's horse save info
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DataLoader_NPC(bool sleep)
|
||||
{
|
||||
//loads the data to the variables upon loading the game.
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation = Path.Combine(PathOnDisk, "NPC_Original_Save_Info_");
|
||||
string mylocation_save = Path.Combine(PathOnDisk, "NPC_Original_Save_Info_");
|
||||
|
||||
if (sleep == true)
|
||||
{
|
||||
mylocation = Path.Combine(PathOnDisk, "NPC_Save_Info_");
|
||||
}
|
||||
|
||||
string myloc2B = mylocation_save;
|
||||
string mylocation2 = mylocation;
|
||||
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
string myloc3B = myloc2B + ".txt";
|
||||
|
||||
if (!File.Exists(myloc3B)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
|
||||
// Log.Error(" I CAN NOT LOAD Can't load original save info since the file doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
|
||||
// Log.Error(" I CAN NOT LOAD Can't load custom save info since the file doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
int i = 3;
|
||||
|
||||
|
||||
if (sleep == true)
|
||||
{
|
||||
mylocation = Path.Combine(PathOnDisk, "NPC_Save_Info_");
|
||||
}
|
||||
|
||||
if (!File.Exists(myloc3B)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
|
||||
// Log.Error(" I CAN NOT LOAD Can't load original save info since the file doesn't exist.");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out.
|
||||
{
|
||||
|
||||
// Log.Error(" I CAN NOT LOAD Can't load custom save info since the file doesn't exist.");
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
|
||||
// Console.WriteLine("HEY THERE IM LOADING DATA");
|
||||
|
||||
//Saves all of the info for NPC's into a file.
|
||||
string[] readtext = File.ReadAllLines(mylocation3);
|
||||
string[] readtexty = File.ReadAllLines(myloc3B);
|
||||
|
||||
int j = 0;
|
||||
List<NPC> list = new List<NPC>(); //This will collect all of the info for the NPC's and save it into a list
|
||||
|
||||
foreach (StardewValley.GameLocation asdf in Game1.locations)
|
||||
{
|
||||
var NPClocationd = (GameLocation)asdf;
|
||||
Log.Error(asdf.name); //show the loaded location's name.
|
||||
System.Threading.Thread.Sleep(50); //prevent the game from loading characters too quickly by delaying time 10 miliseconds.
|
||||
if (asdf.name == "Farm") continue;
|
||||
if (asdf.name == "CommunityCenter") continue;
|
||||
foreach (StardewValley.NPC obj in NPClocationd.characters)
|
||||
{
|
||||
Log.Success(obj.name);
|
||||
|
||||
list.Add(obj); //add the character to the list. Warping them inside of this loop here breaks things.
|
||||
|
||||
}
|
||||
|
||||
foreach (NPC item in list) //iterate across my NPC list
|
||||
{
|
||||
i = 3;
|
||||
while (item.name != readtexty[i]) //look across the NPC_Origina_Info file
|
||||
{
|
||||
i += 11;
|
||||
}
|
||||
|
||||
Log.Info(i); //tell me where I am at. Line # = i+1
|
||||
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
if (readtext[i] == "") break;
|
||||
if (readtext[i] == "\n") break;
|
||||
|
||||
//npc_name = Convert.ToString(readtexty[i]);
|
||||
Log.Info(npc_name);
|
||||
// Log.Error("WHAT IS THIS?");
|
||||
//System.Threading.Thread.Sleep(1000);
|
||||
i += 2;
|
||||
|
||||
npc_map_name = Convert.ToString(readtexty[i]);
|
||||
Log.Info(npc_map_name);
|
||||
//System.Threading.Thread.Sleep(1000);
|
||||
i += 2;
|
||||
|
||||
|
||||
npc_map_outside = Convert.ToBoolean(readtexty[i]);
|
||||
Log.Info(npc_map_outside);
|
||||
//System.Threading.Thread.Sleep(1000);
|
||||
i += 2;
|
||||
|
||||
|
||||
npc_x = Convert.ToInt32(readtexty[i]);
|
||||
Log.Info(npc_x);
|
||||
//System.Threading.Thread.Sleep(1000);
|
||||
i += 2;
|
||||
|
||||
|
||||
npc_y = Convert.ToInt32(readtexty[i]);
|
||||
Log.Info(npc_y);
|
||||
//System.Threading.Thread.Sleep(3000);
|
||||
i += 3;
|
||||
|
||||
Log.Info(i);
|
||||
// System.Threading.Thread.Sleep(100);
|
||||
|
||||
npc_point.X = npc_x;
|
||||
npc_point.Y = npc_y;
|
||||
|
||||
Microsoft.Xna.Framework.Vector2 myvector2;
|
||||
|
||||
myvector2.X = npc_x;
|
||||
myvector2.Y = npc_y;
|
||||
|
||||
Log.Info("character warp!");
|
||||
|
||||
//basically I just filled the console with debugging information. You are welcome.
|
||||
|
||||
|
||||
Game1.warpCharacter(item, npc_map_name, npc_point, true, true); //warp my npc back to original location
|
||||
//list.Remove(item);
|
||||
|
||||
i = 3;
|
||||
}
|
||||
list.Clear(); //clean up my list
|
||||
|
||||
}
|
||||
|
||||
|
||||
//timer = false;
|
||||
} //end for eaches
|
||||
}
|
||||
|
||||
void MyWritter_NPC(bool sleep)
|
||||
{
|
||||
//basically grabs all of the Npc's info and saves it to a text document. Takes a second or so.
|
||||
|
||||
|
||||
string myname = StardewValley.Game1.player.name;
|
||||
string mylocation;
|
||||
string mylocation2;
|
||||
if (sleep == false)
|
||||
{
|
||||
mylocation = Path.Combine(PathOnDisk, "NPC_Save_Info_");
|
||||
mylocation2 = mylocation;
|
||||
}
|
||||
else
|
||||
{
|
||||
mylocation = Path.Combine(PathOnDisk, "NPC_Original_Save_Info_");
|
||||
mylocation2 = mylocation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
string mylocation3 = mylocation2 + ".txt";
|
||||
int counter = 1;
|
||||
GameLocation NPClocation;
|
||||
foreach (StardewValley.GameLocation asdf in Game1.locations)
|
||||
{
|
||||
NPClocation = (GameLocation)asdf;
|
||||
|
||||
|
||||
foreach (StardewValley.NPC obj in NPClocation.characters)
|
||||
{
|
||||
counter += 11;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
string[] mystring3 = new string[counter];
|
||||
if (!File.Exists(mylocation3))
|
||||
{
|
||||
|
||||
int i = 0;
|
||||
mystring3[i] = "NPC : SAVE ANYWHERE INFO. DON'T TOUCH THIS";
|
||||
i++;
|
||||
foreach (StardewValley.GameLocation asdf in Game1.locations)
|
||||
{
|
||||
NPClocation = (GameLocation)asdf;
|
||||
|
||||
if (NPClocation.name == "CommunityCenter")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
foreach (StardewValley.NPC obj in NPClocation.characters)
|
||||
{
|
||||
//grab all of the NPC INFO.
|
||||
// Log.Info(obj.getName());
|
||||
npc_name = obj.getName();
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
// Log.Info(obj.currentLocation.name);
|
||||
npc_map_name = obj.currentLocation.name;
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
|
||||
// Log.Info(NPClocation.isOutdoors);
|
||||
npc_map_outside = NPClocation.isOutdoors;
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
npc_point.X = obj.getTileX();
|
||||
npc_point.Y = obj.getTileY();
|
||||
|
||||
//Log.Info(obj.getTileLocationPoint());
|
||||
//npc_point = obj.getTileLocationPoint();
|
||||
//System.Threading.Thread.Sleep(5);
|
||||
|
||||
Log.Success("Let's save all of the NPCS in the world!");
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
|
||||
|
||||
mystring3[i] = "====================================================================================";
|
||||
i++;
|
||||
mystring3[i] = "NPC NAME";
|
||||
i++;
|
||||
mystring3[i] = obj.getName().ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC Current Map Name";
|
||||
i++;
|
||||
mystring3[i] = obj.currentLocation.name.ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC IS OUTSIDE?";
|
||||
i++;
|
||||
mystring3[i] = NPClocation.isOutdoors.ToString();
|
||||
i++;
|
||||
|
||||
|
||||
|
||||
mystring3[i] = "NPC TILE LOCATION : X";
|
||||
i++;
|
||||
mystring3[i] = npc_point.X.ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC TILE LOCATION : Y";
|
||||
i++;
|
||||
mystring3[i] = npc_point.Y.ToString();
|
||||
i++;
|
||||
|
||||
|
||||
//NPCS WILL FIGURE OUT MOVEMENT ON THEIR OWN.
|
||||
//I CAN SIMPLY (SIMULATE TIME) OR (WARP THEM??)
|
||||
}
|
||||
}
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
int i = 0;
|
||||
mystring3[i] = "NPC : SAVE ANYWHERE INFO. DON'T TOUCH THIS";
|
||||
i++;
|
||||
foreach (StardewValley.GameLocation asdf in Game1.locations)
|
||||
{
|
||||
NPClocation = (GameLocation)asdf;
|
||||
|
||||
|
||||
foreach (StardewValley.NPC obj in NPClocation.characters)
|
||||
{
|
||||
//grab all of the NPC INFO.
|
||||
Log.Info(obj.getName());
|
||||
npc_name = obj.getName();
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
Log.Info(obj.currentLocation.name);
|
||||
npc_map_name = obj.currentLocation.name;
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
|
||||
Log.Info(NPClocation.isOutdoors);
|
||||
npc_map_outside = NPClocation.isOutdoors;
|
||||
System.Threading.Thread.Sleep(5);
|
||||
|
||||
npc_point.X = obj.getTileX();
|
||||
npc_point.Y = obj.getTileY();
|
||||
|
||||
//Log.Info(obj.getTileLocationPoint());
|
||||
//npc_point = obj.getTileLocationPoint();
|
||||
//System.Threading.Thread.Sleep(5);
|
||||
|
||||
Log.Success("Let's save all of the NPCS in the world!");
|
||||
//write out the info to a text file at the end of a day. This will run if it doesnt exist.
|
||||
|
||||
|
||||
|
||||
mystring3[i] = "====================================================================================";
|
||||
i++;
|
||||
mystring3[i] = "NPC NAME";
|
||||
i++;
|
||||
mystring3[i] = obj.getName().ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC Current Map Name";
|
||||
i++;
|
||||
mystring3[i] = obj.currentLocation.name.ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC IS OUTSIDE?";
|
||||
i++;
|
||||
mystring3[i] = NPClocation.isOutdoors.ToString();
|
||||
i++;
|
||||
|
||||
|
||||
|
||||
mystring3[i] = "NPC TILE LOCATION : X";
|
||||
i++;
|
||||
mystring3[i] = npc_point.X.ToString();
|
||||
i++;
|
||||
|
||||
mystring3[i] = "NPC TILE LOCATION : Y";
|
||||
i++;
|
||||
mystring3[i] = npc_point.Y.ToString();
|
||||
i++;
|
||||
|
||||
|
||||
//NPCS WILL FIGURE OUT MOVEMENT ON THEIR OWN.
|
||||
//I CAN SIMPLY (SIMULATE TIME) OR (WARP THEM??)
|
||||
}
|
||||
}
|
||||
|
||||
File.WriteAllLines(mylocation3, mystring3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//end class
|
|
@ -0,0 +1,36 @@
|
|||
Good afternoon everyone, and today I'd like to announce my biggest project yet, the Save_Anywhere mod!
|
||||
|
||||
Now before you get super excited let me go over the basics of what this mod does.
|
||||
|
||||
Normally when you want to save you have to go to bed and go to the next day, which is typically ok. However, sometimes you want to save where you are and come back later to resume playing. What this mod does (at the time of writing) can be summarized like this.
|
||||
|
||||
1.Save the player's save file like going to bed would.
|
||||
-Things such as tiles watered, stamina, health, etc are preserved. Note that not everything that is
|
||||
normally saved is preserved.
|
||||
|
||||
2. Warp the player upon loading the game to the position they were when they saved. *1
|
||||
3. Calculate shipping for the player upon saving (because items shipped aren't saved to a save file)
|
||||
4.Recalculate NPC's path finding to be as as possible. *2.
|
||||
5. Simulate game time up until when the character loaded. *3
|
||||
6. Generated "save_anywhere saves" are deleted upon going to bed to prevent the character from being warped unnecessarily. One is always generated/updated when you save.
|
||||
Now the asterisks are for the following.
|
||||
|
||||
*1. There is an issue where if you happen to resize/move/alter the game's window while the game is starting up/loading, then the player will not properly warp back to their original location. If this happens, reload the game and don't alter the game window/screen.
|
||||
|
||||
*2. I discovered when you save the game and reload it, that NPCs get randomly warped around the world which caused a massive problem. When the mod loads it will calculate the NPC's original positions and put them back into their staring positions so it might take just a few seconds before the game loads all the way.
|
||||
|
||||
*3. I chose to rapidly simulate in game time so that NPCs would be able to properly path find back to their save-game positions. For every 2 real life seconds, 10 in game minutes will pass and NPCs will move considerably faster to make sure that they move back to their save-game positions. This will last until the game-time is updated to the time when the game was saved.
|
||||
|
||||
Now in order to save the mod, you just need to press a key while playing the game. "k" is the default key, but you can change this in the config file.
|
||||
|
||||
That pretty much sums it up to this point. I'm going to take a nap since this took me roughly 15+ hours to figure out.
|
||||
|
||||
If anyone finds any issues while using this mod please post your message down below and I'll see if I can figure it out.
|
||||
|
||||
Thanks and have fun. =)
|
||||
|
||||
-Alpha_Omegasis
|
||||
|
||||
Min Requirements:
|
||||
SMAPI 0.40
|
||||
Stardew Valley 1.07
|
|
@ -0,0 +1,20 @@
|
|||
Config: Save_Anywhere Info. Feel free to mess with these settings.
|
||||
====================================================================================
|
||||
Key binding for saving anywhere. Press this key to save anywhere!
|
||||
K
|
||||
Timer interval for NPCs. Default 3500 which simulates game time at 4x speed.
|
||||
3500
|
||||
Simulate game time? Game time will be sped up until restored before saving
|
||||
False
|
||||
Warp player when loading?
|
||||
True
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"Name": "Save_Anywhere",
|
||||
"Authour": "Alpha_Omegasis",
|
||||
"Version": {
|
||||
"MajorVersion": 0,
|
||||
"MinorVersion": 0,
|
||||
"PatchVersion": 0,
|
||||
"Build": ""
|
||||
},
|
||||
"Description": "Save anywhere at the click of a key.",
|
||||
"UniqueID": "4108e859-333c-4fec-a1a7-d2e18c1019fe",
|
||||
"PerSaveConfigs": false,
|
||||
"EntryDll": "Stardew_Save_Anywhere_Mod.dll"
|
||||
}
|
Loading…
Reference in New Issue