From 7d702b0f8dc69369dc03c97eeb2f307546187137 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 3 Aug 2019 05:06:17 +0200 Subject: [PATCH 1/2] Updated to v0.3.1 --- CrosshairMod/Button.cs | 41 ------- CrosshairMod/Crosshair.cs | 21 +++- CrosshairMod/CrosshairMod.csproj | 10 +- CrosshairMod/Interface.cs | 134 ++++++++++++++-------- CrosshairMod/Interface/Button.cs | 60 ++++++++++ CrosshairMod/Interface/InputObject.cs | 36 ++++++ CrosshairMod/Interface/Slider.cs | 40 +++++++ CrosshairMod/Logging.cs | 36 +++++- CrosshairMod/Main.cs | 33 ++++-- CrosshairMod/Settings.cs | 49 ++++++-- CrosshairMod/bin/Release/CrosshairMod.dll | Bin 13312 -> 0 bytes CrosshairMod/chSettings.sett | 6 - LICENSE | 21 ++++ README.md | 8 +- 14 files changed, 371 insertions(+), 124 deletions(-) delete mode 100644 CrosshairMod/Button.cs create mode 100644 CrosshairMod/Interface/Button.cs create mode 100644 CrosshairMod/Interface/InputObject.cs create mode 100644 CrosshairMod/Interface/Slider.cs delete mode 100644 CrosshairMod/bin/Release/CrosshairMod.dll delete mode 100644 CrosshairMod/chSettings.sett create mode 100644 LICENSE diff --git a/CrosshairMod/Button.cs b/CrosshairMod/Button.cs deleted file mode 100644 index 687f67e..0000000 --- a/CrosshairMod/Button.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using UnityEngine; - -namespace CrosshairMod -{ - // Button Wrapper class, utilizing GUI.Button() - class GUIButton - { - - public Vector2 position = new Vector2(0, 0); - public Vector2 dimensions = new Vector2(0, 0); - public string label = ""; - public event EventHandler OnClick; - - public GUIButton(uint x, uint y, uint width, uint height, string label) - { - Logging.Log("Button Constructor"); - - this.position = new Vector2(x, y); - this.dimensions = new Vector2(width, height); - this.label = label; - } - - public GUIButton() - { - // Empty - } - - public void Update() - { - bool buttonPressed = GUI.Button(new Rect(position, dimensions), label); - if (buttonPressed) - OnClick?.Invoke(this, EventArgs.Empty); - } - } -} diff --git a/CrosshairMod/Crosshair.cs b/CrosshairMod/Crosshair.cs index 1b6c7ee..d8727c9 100644 --- a/CrosshairMod/Crosshair.cs +++ b/CrosshairMod/Crosshair.cs @@ -2,16 +2,23 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; + using UnityEngine; namespace CrosshairMod { + /* The class responsible for drawing/creating/administrating the crosshair. + * + * This is where settings are applied to the crosshair. + */ static class Crosshair { + // Crosshair Texture / Style private static Texture2D m_texture = new Texture2D(0, 0); private static GUIStyle m_style; + + // If crosshair is visible or hidden private static bool m_enabled = true; private static bool m_validState = true; @@ -22,6 +29,12 @@ namespace CrosshairMod Settings.SetSetting("crosshairVisible", 1, true); } + // Returns wether the crosshair is enabled + public static bool Enabled() + { + return m_enabled; + } + // Change Color public static void SetColor(int r, int g, int b, int a) { @@ -112,8 +125,11 @@ namespace CrosshairMod m_style.normal.background = m_texture; } + // Render the Crosshair public static void Render() { + // If the crosshair is faulty, then don't execute this code + // This is here to stop the Logger from spamming the console. if (m_validState) { if (InvalidCrosshair()) @@ -122,13 +138,14 @@ namespace CrosshairMod return; } + // Don't draw a hidden crosshair. Duh. if (m_enabled) GUI.Label(new Rect(Screen.width / 2 - m_texture.width / 2, Screen.height / 2 - m_texture.height / 2, m_texture.width, m_texture.height), m_texture, m_style); } } - + // Check Crosshair State private static bool InvalidCrosshair() { // Check if the texture is bigger than (0, 0) to see if it was initialized. diff --git a/CrosshairMod/CrosshairMod.csproj b/CrosshairMod/CrosshairMod.csproj index 1f918ef..b48e39e 100644 --- a/CrosshairMod/CrosshairMod.csproj +++ b/CrosshairMod/CrosshairMod.csproj @@ -9,9 +9,10 @@ Properties CrosshairMod CrosshairMod - v4.7.2 + v3.5 512 true + true @@ -44,16 +45,15 @@ - + + + - - - \ No newline at end of file diff --git a/CrosshairMod/Interface.cs b/CrosshairMod/Interface.cs index d8e4634..53b71c7 100644 --- a/CrosshairMod/Interface.cs +++ b/CrosshairMod/Interface.cs @@ -2,55 +2,86 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; + using UnityEngine; namespace CrosshairMod { + + /* A class that handles the Crosshair GUI. + * + * Contains all Buttons, Sliders etc. that are able to modify the crosshair. + */ + + // TODO: Create GUILayout.Window to make a less crappy version of the settings window static class Interface { + // Saves wether the interface is visible or not private static bool m_visible = false; - private static Dictionary m_buttons = new Dictionary(); + // Stores all Buttons used in the interface. + private static List m_inputs = new List(); + + // Values of the RGBA Sliders private static int rSliderValue, gSliderValue, bSliderValue, aSliderValue; - - private static Texture2D m_background = new Texture2D(1, 1); - private static GUIStyle m_style = new GUIStyle(); - + // Position ind dimension of the GUI background private static Vector2 m_position; private static Vector2 m_dimension; + + // Creates a new button object and adds it to the List + private static void AddButton(float x, float y, float width, float height, string label, string ID, params EventHandler[] onClickEvent) + { + GUIButton buttonObj = new GUIButton(x, y, width, height, label, ID, onClickEvent); + m_inputs.Add(buttonObj); + } + + // Creates a new slider object and adds it to the List + // Returns the index of the button + private static void AddSlider(float x, float y, float width, float height, float min, float max, float init, string ID) + { + GUISlider sliderObj = new GUISlider(x, y, width, height, min, max, init, ID); + m_inputs.Add(sliderObj); + } + // Initializes all Buttons, gives them their function etc public static void Init() { + // Set dimension to 0.25 of the screen width/height m_dimension = new Vector2(Screen.width / 4, Screen.height / 4); + // Center the interface m_position = new Vector2((Screen.width - m_dimension.x) / 2, (Screen.height - m_dimension.y) / 2); - m_background.SetPixel(0, 0, new Color(0.4f, 0.4f, 0.4f, 0.4f)); - m_background.wrapMode = TextureWrapMode.Repeat; - m_background.Apply(); - m_style.normal.background = m_background; + // Create Crosshair Visibilty Button + AddButton(20, 20, 200, 30, + (Crosshair.Enabled() ? "Hide Crosshair" : "Show Crosshair"), "Toggle", (object sender, EventArgs e) => { Crosshair.Toggle(); }, + (object sender, EventArgs e) => { GUIButton btn = (GUIButton)sender; btn.label = (Crosshair.Enabled() ? "Hide Crosshair" : "Show Crosshair"); }); - m_buttons.Add("visibility", new GUIButton((uint)m_position.x + 20, (uint)m_position.y + 20, 200, 30, "Toggle Crosshair")); - m_buttons["visibility"].OnClick += (object sender, EventArgs e) => { Crosshair.Toggle(); }; + // Create Crosshair Size +/- Buttons + AddButton(20, 60, 30, 30, + "-", "sizedown", (object sender, EventArgs e) => { Crosshair.ChangeSize(-1); }); + AddButton(190, 60, 30, 30, + "+", "sizeup", (object sender, EventArgs e) => { Crosshair.ChangeSize(+1); }); - m_buttons.Add("size-", new GUIButton((uint)m_position.x + 20, (uint)m_position.y + 60, 30, 30, "-")); - m_buttons.Add("size+", new GUIButton((uint)m_position.x + 190, (uint)m_position.y + 60, 30, 30, "+")); - m_buttons["size-"].OnClick += (object sender, EventArgs e) => { Crosshair.ChangeSize(-1); }; - m_buttons["size+"].OnClick += (object sender, EventArgs e) => { Crosshair.ChangeSize(+1); }; - - m_buttons.Add("thick-", new GUIButton((uint)m_position.x + 20, (uint)m_position.y + 100, 30, 30, "-")); - m_buttons.Add("thick+", new GUIButton((uint)m_position.x + 190, (uint)m_position.y + 100, 30, 30, "+")); - m_buttons["thick-"].OnClick += (object sender, EventArgs e) => { Crosshair.ChangeThickness(-1); }; - m_buttons["thick+"].OnClick += (object sender, EventArgs e) => { Crosshair.ChangeThickness(+1); }; + // Create Crosshair Thickness +/- Buttons + AddButton(20, 100, 30, 30, + "-", "thickdown", (object sender, EventArgs e) => { Crosshair.ChangeThickness(-1); }); + AddButton(190, 100, 30, 30, + "+", "thickup", (object sender, EventArgs e) => { Crosshair.ChangeThickness(+1); }); rSliderValue = Settings.GetValue("crosshairColorRed"); gSliderValue = Settings.GetValue("crosshairColorGreen"); bSliderValue = Settings.GetValue("crosshairColorBlue"); aSliderValue = Settings.GetValue("crosshairColorAlpha"); + + // Create RGBA Sliders + AddSlider(m_dimension.x / 2 + 60, 30, 200, 10, 0, 255, rSliderValue, "red"); + AddSlider(m_dimension.x / 2 + 60, 70, 200, 30, 0, 255, gSliderValue, "green"); + AddSlider(m_dimension.x / 2 + 60, 110, 200, 30, 0, 255, bSliderValue, "blue"); + AddSlider(m_dimension.x / 2 + 60, 150, 200, 30, 0, 255, aSliderValue, "alpha"); } // Displays / Hides the menu @@ -59,40 +90,47 @@ namespace CrosshairMod m_visible = !m_visible; } - // Renders the Panel, but also handles Updating the buttons + // Renders the window public static void Render() { - if(m_visible) - { - GUI.Label(new Rect(m_position, m_dimension), m_background, m_style); - - GUI.Label(new Rect(m_position.x + 60, m_position.y + 70, 120, 30), "Length: " + Settings.GetValue("crosshairLength")); - GUI.Label(new Rect(m_position.x + 60, m_position.y + 110, 120, 30), "Thickness: " + Settings.GetValue("crosshairThickness")); - - GUI.Label(new Rect(m_position.x + m_dimension.x / 2 + 20, m_position.y + 30, 200, 30), "R: " + rSliderValue); - rSliderValue = (int)GUI.HorizontalSlider(new Rect(m_position.x + m_dimension.x / 2 + 60, m_position.y + 20, 200, 30), (int)rSliderValue, 0f, 255f); - - GUI.Label(new Rect(m_position.x + m_dimension.x / 2 + 20, m_position.y + 70, 200, 30), "G: " + gSliderValue); - gSliderValue = (int)GUI.HorizontalSlider(new Rect(m_position.x + m_dimension.x / 2 + 60, m_position.y + 60, 200, 30), (int)gSliderValue, 0f, 255f); - - GUI.Label(new Rect(m_position.x + m_dimension.x / 2 + 20, m_position.y + 110, 200, 30), "B: " + bSliderValue); - bSliderValue = (int)GUI.HorizontalSlider(new Rect(m_position.x + m_dimension.x / 2 + 60, m_position.y + 100, 200, 30), (int)bSliderValue, 0f, 255f); - - GUI.Label(new Rect(m_position.x + m_dimension.x / 2 + 20, m_position.y + 150, 200, 30), "A: " + aSliderValue); - aSliderValue = (int)GUI.HorizontalSlider(new Rect(m_position.x + m_dimension.x / 2 + 60, m_position.y + 140, 200, 30), (int)aSliderValue, 0f, 255f); - - Crosshair.SetColor(rSliderValue, gSliderValue, bSliderValue, aSliderValue); - - // Update Buttons - HandleButtons(); - } + if (m_visible) + GUI.Window(420, new Rect(m_position, m_dimension), RenderFunc, "Crosshair Settings"); } + // Renders the Panel, but also handles Updating the buttons + private static void RenderFunc(int windowID) + { + + // Draw the Length and Thickness Labels + GUI.Label(new Rect(60, 70, 120, 30), "Length: " + Settings.GetValue("crosshairLength")); + GUI.Label(new Rect(60, 110, 120, 30), "Thickness: " + Settings.GetValue("crosshairThickness")); + + // Draw the RGBA Labels and Sliders + GUI.Label(new Rect(m_dimension.x / 2 + 20, 30, 200, 30), "R: " + rSliderValue); + GUI.Label(new Rect(m_dimension.x / 2 + 20, 70, 200, 30), "G: " + gSliderValue); + GUI.Label(new Rect(m_dimension.x / 2 + 20, 110, 200, 30), "B: " + bSliderValue); + GUI.Label(new Rect(m_dimension.x / 2 + 20, 150, 200, 30), "A: " + aSliderValue); + + // Set crosshair Colour after getting slider values + IEnumerable it = m_inputs.OfType(); + rSliderValue = (int)it.First(slider => slider.ID == "red").Value; + gSliderValue = (int)it.First(slider => slider.ID == "green").Value; + bSliderValue = (int)it.First(slider => slider.ID == "blue").Value; + aSliderValue = (int)it.First(slider => slider.ID == "alpha").Value; + + Crosshair.SetColor(rSliderValue, gSliderValue, bSliderValue, aSliderValue); + + // Update Buttons + HandleButtons(); + + } + + // Calls the Update function on all Buttons to check if they were pressed, and execute their Action private static void HandleButtons() { - foreach(KeyValuePair pair in m_buttons) + foreach(InputObject obj in m_inputs) { - pair.Value.Update(); + obj.Update(); } } } diff --git a/CrosshairMod/Interface/Button.cs b/CrosshairMod/Interface/Button.cs new file mode 100644 index 0000000..895da89 --- /dev/null +++ b/CrosshairMod/Interface/Button.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + + +using UnityEngine; + +namespace CrosshairMod +{ + /* + * A button wrapper class that is used right now as I don't have access to + * the games buttons. Since UnityEngine.GUI only has a function to draw Buttons, + * I made this class for easy handling. + * + */ + class GUIButton : InputObject + { + // da_google thinks this Button Wrapper is stupid, so let's see what ths Button Wrapper thinks about him + private const bool IS_DA_GOOGLE_STUPID = true; + // Interesting. + + // OnClick event + public event EventHandler OnClick; + + // Label of the Button + public string label { get; set; } = ""; + + // Initialize Button + public GUIButton(float x, float y, float width, float height, string label, string ID, params EventHandler[] OnClickEvent) + : base(x, y, width, height, ID) + { + Logging.Debug.Log("Button Constructor"); + + // Assign position, dimension and label + this.label = label; + + // Push OnClickEvents + foreach(EventHandler e in OnClickEvent) + OnClick += e; + } + + public GUIButton(string ID) + : base(0, 0, 0, 0, ID) + { + // Empty + } + + // Updates and Draws the Button. + public override float Update() + { + // Get if the Button was pressed and invoke OnClick event accordingly + bool buttonPressed = GUI.Button(new Rect(position, dimensions), label); + if (buttonPressed) + OnClick?.Invoke(this, EventArgs.Empty); + + return (buttonPressed ? 1.0f : 0.0f); + } + } +} diff --git a/CrosshairMod/Interface/InputObject.cs b/CrosshairMod/Interface/InputObject.cs new file mode 100644 index 0000000..7e14d2a --- /dev/null +++ b/CrosshairMod/Interface/InputObject.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + + +using UnityEngine; + +namespace CrosshairMod +{ + /* + * Base of all Input Objects. + * + * Any Input Object that wants to be displayed in the Interface must + * inherit from this class. + */ + abstract class InputObject + { + // position and dimension of the object + public Vector2 position, dimensions; + + // ID of the Object + public readonly string ID; + + // constructor to set position and size + public InputObject(float x, float y, float width, float height, string ID) + { + this.position = new Vector2(x, y); + this.dimensions = new Vector2(width, height); + this.ID = ID; + } + + // the update method (that works as renderer) must be overriden by each object + public abstract float Update(); + } +} diff --git a/CrosshairMod/Interface/Slider.cs b/CrosshairMod/Interface/Slider.cs new file mode 100644 index 0000000..47dbf80 --- /dev/null +++ b/CrosshairMod/Interface/Slider.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + + +using UnityEngine; + +namespace CrosshairMod +{ + class GUISlider : InputObject + { + // Min/Max values for the slider + public float Min { get; set; } = 0; + public float Max { get; set; } = 0; + + // Current slider value + public float Value { get; set; } = 0; + + public GUISlider(float x, float y, float width, float height, float min, float max, float init, string ID) + : base(x, y, width, height, ID) + { + Min = min; + Max = max; + Value = init; + } + + public GUISlider(string ID) + :base (0, 0, 0, 0, ID) + { + + } + + public override float Update() + { + Value = GUI.HorizontalSlider(new Rect(position, dimensions), Value, Min, Max); + return Value; + } + } +} diff --git a/CrosshairMod/Logging.cs b/CrosshairMod/Logging.cs index 2a7864a..db9fd39 100644 --- a/CrosshairMod/Logging.cs +++ b/CrosshairMod/Logging.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; + using UnityEngine; @@ -13,21 +13,53 @@ namespace CrosshairMod // However, I prefer this over Debug.Log() since it doesn't include a stacktrace (Except for Errors) public static class Logging { + // The Prefix that gets put in front of every Log public const string PREFIX = "[CROSSHAIRMOD]"; + // A kind of sub-class that is used to Log messages that will only appear + // when the User installs a Debug build of the Mod. Release versions will + // not log Debug messages this way. + public static class Debug + { + public static void Log(string message) + { +#if DEBUG + Logging.Log(message); +#endif // DEBUG + } + + public static void LogWarning(string message) + { +#if DEBUG + Logging.LogWarning(message); +#endif // DEBUG + } + + public static void LogError(string message) + { +#if DEBUG + Logging.LogError(PREFIX + "Error: " + message); +#endif // DEBUG + } + } + + + // Logs information public static void Log(string message) { Console.WriteLine(PREFIX + "Info: " + message); } + // Logs warnings public static void LogWarning(string message) { Console.WriteLine(PREFIX + "Warning: " + message); } + // Logs errors public static void LogError(string message) { - Debug.Log(PREFIX + "Error: " + message); + UnityEngine.Debug.Log(PREFIX + "Error: " + message); } } } diff --git a/CrosshairMod/Main.cs b/CrosshairMod/Main.cs index f6fb2ea..d0a81da 100644 --- a/CrosshairMod/Main.cs +++ b/CrosshairMod/Main.cs @@ -3,44 +3,60 @@ * the game Blackwake. * * @author Lauchmelder - * @version v0.2 + * @version v0.3 */ + using System; using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; + using UnityEngine; namespace CrosshairMod { + + /* + * This is the Main class that is responsible for + * handling initializing and updating the components + * of the crosshair mod. + */ public class Main : MonoBehaviour { - private const string MENU_OPEN_KEY = "H"; - private const string CH_TOGGLE_KEY = "J"; + // Define Hotkeys for Menu and Crosshair Toggle + private char MENU_OPEN_KEY = 'H'; + private char CH_TOGGLE_KEY = 'J'; // This will be executed first void Start() { + // Update the settings Settings.LoadSettings(".\\Blackwake_Data\\Managed\\Mods\\chSettings.sett"); // Create Crosshair Crosshair.Create(); // Create Panel Interface.Init(); + + // Load Hotkeys + MENU_OPEN_KEY = (char)Settings.GetValue("hotkeyCrosshairToggle", true, MENU_OPEN_KEY); + CH_TOGGLE_KEY = (char)Settings.GetValue("hotkeyGUIToggle", true, CH_TOGGLE_KEY); } + // This gets called on every GUI Update (Can be multiple tiems per Frame) void OnGUI() { - // Check for Key press - if(Event.current.Equals(Event.KeyboardEvent(MENU_OPEN_KEY))) + // Check for Key presses + if (Event.current.Equals(Event.KeyboardEvent(MENU_OPEN_KEY.ToString()))) { + // Toggle Crosshair GUI Interface.Toggle(); } - if (Event.current.Equals(Event.KeyboardEvent(CH_TOGGLE_KEY))) + if (Event.current.Equals(Event.KeyboardEvent(CH_TOGGLE_KEY.ToString()))) { + // Toggle Crosshair Crosshair.Toggle(); } @@ -50,11 +66,12 @@ namespace CrosshairMod Crosshair.Render(); } + // Will be called when the application is closed void OnApplicationQuit() { // Save settings Settings.SaveSettings(".\\Blackwake_Data\\Managed\\Mods\\chSettings.sett"); - Logging.Log("Saved Settings"); + Logging.Debug.Log("Saved Settings"); } } } diff --git a/CrosshairMod/Settings.cs b/CrosshairMod/Settings.cs index 7bf7b2e..795ad70 100644 --- a/CrosshairMod/Settings.cs +++ b/CrosshairMod/Settings.cs @@ -2,29 +2,58 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; + namespace CrosshairMod { + /* + * The class that is responsible for loading and storing all the + * necessary settings. There is much room for improvement. + */ static class Settings { // Initialize Settings dictionary private static Dictionary m_settings = new Dictionary(); + // Load settings from file public static void LoadSettings(string filepath) { - Logging.Log("Accessing Settings at " + filepath); + Logging.Debug.Log("Accessing Settings at " + filepath); // Try to read file contents into string + // If no file exists, create one string settings = ""; + if(!System.IO.File.Exists(filepath)) + { + // No settings file found, create one + Logging.Debug.LogWarning("Settings file not found, creating one..."); + try + { + System.IO.File.Create(filepath); + } + // If that fails then shit just hit the fan. React accordingly + catch(Exception e) + { + Logging.LogError("Something went wrong while creating a settings file... :("); + Logging.LogError(e.Message); + Logging.LogError(e.StackTrace); + + return; + } + } + + // Read file to string try { settings = System.IO.File.ReadAllText(filepath); } + // Something incredibly weird just happened catch (Exception e) { - // Log error and return invalid state + Logging.LogError("Something went wrong while reading a settings file... :("); Logging.LogError(e.Message); + Logging.LogError(e.StackTrace); + return; } @@ -43,7 +72,7 @@ namespace CrosshairMod m_settings.Add(vals[0], Int32.Parse(vals[1])); // Store key and value in settings dictionary } - Logging.Log("Successfully loaded settings!"); + Logging.Log("Settings loaded."); } // Converts the dictionary to a sett file @@ -67,21 +96,21 @@ namespace CrosshairMod m_settings.Add(key, value); } - // Changes a settings value + // Changes a settings value, and adds it if specified public static void SetSetting(string key, int newVal, bool addIfDoesntExist = false) { - + // If the setting doesn't exist, either add and set it, or print a Debug.Warning if(!m_settings.ContainsKey(key)) { if (!addIfDoesntExist) { - Logging.LogError("Tried to change a setting with key \"" + key + "\" that doesn't exist."); + Logging.Debug.LogError("Tried to change a setting with key \"" + key + "\" that doesn't exist."); return; } else { AddSetting(key, newVal); - Logging.LogWarning("Tried to change a setting with key \"" + key + "\" that doesn't exist. It has been added now."); + Logging.Debug.LogWarning("Tried to change a setting with key \"" + key + "\" that doesn't exist. It has been added now."); } } @@ -100,12 +129,12 @@ namespace CrosshairMod { if (!addIfDoesntExist) { - Logging.LogError("Tried to access unknown setting: \"" + key + "\". Check your chSettings.sett for errors."); + Logging.Debug.LogError("Tried to access unknown setting: \"" + key + "\". Check your chSettings.sett for errors."); } else { AddSetting(key, initialValue); - Logging.LogWarning("Tried to access unknown setting: \"" + key + "\". A new setting with this key was created."); + Logging.Debug.LogWarning("Tried to access unknown setting: \"" + key + "\". A new setting with this key was created."); return initialValue; } } diff --git a/CrosshairMod/bin/Release/CrosshairMod.dll b/CrosshairMod/bin/Release/CrosshairMod.dll deleted file mode 100644 index 1080c7e0adf46aa0f8645a74ac5c34d330599e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13312 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 U+wo|Fv3v2KGJm=L|3%=x0dvWuGXMYp diff --git a/CrosshairMod/chSettings.sett b/CrosshairMod/chSettings.sett deleted file mode 100644 index 55e84e0..0000000 --- a/CrosshairMod/chSettings.sett +++ /dev/null @@ -1,6 +0,0 @@ -crosshairLength=15 -crosshairThickness=3 -crosshairColorRed=255 -crosshairColorGreen=94 -crosshairColorBlue=244 -crosshairColorAlpha=100 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..26abfe3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Lauchmelder + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 11a15c5..836c034 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # CrosshairMod v0.3 A Blackwake Mod that adds a crosshair -Simply copy and paste the *CrosshairMod.dll* and the *chSettings.sett* -files from the *bin/Release* directory into your Blackwake directory under */Blackwake_Data/Managed/Mods* +Simply copy and paste the *CrosshairMod.dll* files from the *bin/Release* directory into your Blackwake directory under */Blackwake_Data/Managed/Mods*. Requires BWModLoader v0.3 or newer to be installed. ## Customization With Version v0.3 you can now toggle the crosshair with *J*, and you can open a customization interface with *H*. This now lets you edit virtually every aspect of the current crosshair design, and even saves it to the settings so that your customization will still be there after restarting the game, @@ -28,3 +27,8 @@ With Version v0.3 you can now toggle the crosshair with *J*, and you can open a * Colour * Added Hotkeys to open GUI (H) and to toggle the Crosshair (J) * Added auto-save, so any editing you do to the crosshair gets saved into the settings file. + +#### v0.3.1 + * Hotkeys can now be changed in the settings + * A missing settings file will no longer crash the mod + * Updated GUI Window. It looks nice now From 002899d9829c3690c689789cffae4817ea354dbe Mon Sep 17 00:00:00 2001 From: Lauchmelder Date: Mon, 5 Aug 2019 15:48:51 +0200 Subject: [PATCH 2/2] Update LICENSE --- LICENSE | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/LICENSE b/LICENSE index cd9e927..f288702 100644 --- a/LICENSE +++ b/LICENSE @@ -1,26 +1,3 @@ -<<<<<<< HEAD -MIT License - -Copyright (c) 2019 Lauchmelder - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -======= GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 @@ -695,4 +672,3 @@ may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ->>>>>>> releaseLicense