Novetus_src/Novetus/NovetusCore/CharCustom/CustomizationFuncs.cs

159 lines
5.6 KiB
C#

#region Usings
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
#endregion
#region Customization Functions
class CustomizationFuncs
{
//modified from the following:
//https://stackoverflow.com/questions/28887314/performance-of-image-loading
//https://stackoverflow.com/questions/2479771/c-why-am-i-getting-the-process-cannot-access-the-file-because-it-is-being-u
public static Image LoadImage(string fileFullName, string fallbackFileFullName = "")
{
Image image = null;
try
{
using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(fileFullName)))
{
image = Image.FromStream(ms);
}
// PropertyItems seem to get lost when fileStream is closed to quickly (?); perhaps
// this is the reason Microsoft didn't want to close it in the first place.
PropertyItem[] items = image.PropertyItems;
foreach (PropertyItem item in items)
{
image.SetPropertyItem(item);
}
}
catch (Exception)
{
image = LoadImage(fallbackFileFullName);
}
return image;
}
public static void ChangeItem(string item, string itemdir, string defaultitem, PictureBox outputImage, TextBox outputString, ListBox box, bool initial, bool hatsinextra = false)
{
ChangeItem(item, itemdir, defaultitem, outputImage, outputString, box, initial, null, hatsinextra);
}
public static void ChangeItem(string item, string itemdir, string defaultitem, PictureBox outputImage, TextBox outputString, ListBox box, bool initial, Settings.Provider provider, bool hatsinextra = false)
{
if (Directory.Exists(itemdir))
{
if (initial)
{
if (!hatsinextra)
{
box.Items.Clear();
}
DirectoryInfo dinfo = new DirectoryInfo(itemdir);
FileInfo[] Files = dinfo.GetFiles("*.rbxm");
foreach (FileInfo file in Files)
{
if (file.Name.Equals(string.Empty))
{
continue;
}
if (hatsinextra)
{
if (file.Name.Equals("NoHat.rbxm"))
{
continue;
}
}
box.Items.Add(file.Name);
}
//selecting items triggers the event.
try
{
box.SelectedItem = item;
}
catch (Exception)
{
box.SelectedItem = defaultitem + ".rbxm";
}
box.Enabled = true;
}
}
if (File.Exists(itemdir + @"\\" + item.Replace(".rbxm", "") + "_desc.txt"))
{
outputString.Text = File.ReadAllText(itemdir + @"\\" + item.Replace(".rbxm", "") + "_desc.txt");
}
else
{
outputString.Text = item;
}
if (provider != null && IsItemURL(item))
{
outputImage.Image = GetItemURLImageFromProvider(provider);
}
else
{
outputImage.Image = LoadImage(itemdir + @"\\" + item.Replace(".rbxm", "") + ".png", itemdir + @"\\" + defaultitem + ".png");
}
}
public static bool IsItemURL(string item)
{
if (item.Contains("http://"))
return true;
return false;
}
public static Image GetItemURLImageFromProvider(Settings.Provider provider)
{
if (provider != null)
return LoadImage(GlobalPaths.CustomPlayerDir + @"\\" + provider.Icon, GlobalPaths.extradir + @"\\NoExtra.png");
return LoadImage(GlobalPaths.extradir + @"\\NoExtra.png");
}
//we launch the 3dview seperately from normal clients.
public static void Launch3DView()
{
GlobalFuncs.ReloadLoadoutValue();
//HACK!
try
{
GlobalFuncs.ChangeGameSettings("2011E");
}
catch(Exception)
{
}
string luafile = "rbxasset://scripts\\\\CSView.lua";
string mapfile = GlobalPaths.BasePathLauncher + "\\preview\\content\\fonts\\3DView.rbxl";
string rbxexe = GlobalPaths.BasePathLauncher + "\\preview\\3DView.exe";
string quote = "\"";
string args = quote + mapfile + "\" -script \" dofile('" + luafile + "'); _G.CS3DView(0,'" + GlobalVars.UserConfiguration.PlayerName + "'," + GlobalVars.Loadout + ");" + quote;
try
{
Process client = new Process();
client.StartInfo.FileName = rbxexe;
client.StartInfo.Arguments = args;
client.Start();
client.PriorityClass = ProcessPriorityClass.RealTime;
}
catch (Exception ex)
{
MessageBox.Show("Failed to launch Novetus. (Error: " + ex.Message + ")", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
#endregion