Compare commits

...

54 Commits

Author SHA1 Message Date
8b760e5e9b Fix page order issue 2025-01-13 18:57:09 +08:00
3b2bfbb0e6 Update version to v1.17.0 2025-01-13 18:50:10 +08:00
2c8691e9ae Update resources to 5.3
Include Achievement, Avatar, Cutscene, Dungeon, BannerTitle, Gadget, Item, Monster, Scene, Weapon...
2025-01-13 18:48:24 +08:00
剧毒的KCN
e6a2d26671 Fix ListBox overflow on high DPI (#235) 2024-09-07 21:35:50 +08:00
fafff8090f Fix height issue of nav list items on high dpi 2024-09-07 20:44:23 +08:00
Amireux
b37016a49c Added 5.0 Banners (#232)
Some checks failed
Build project / build (push) Has been cancelled
Added missing event IDs
Added 5.0 Banners in the Prize Pool Editor
2024-08-29 09:54:14 +08:00
6e8c1d4a15 Update version to v1.16.0
Some checks are pending
Build project / build (push) Waiting to run
2024-08-28 23:05:54 +08:00
92f5289576 Update All resources to 5.0 2024-08-28 23:05:06 +08:00
剧毒的KCN
c62b46850c Enable High DPI support (#231) 2024-06-23 22:34:03 +08:00
3d160f9b90 Update version to v1.15.2 2024-06-16 17:06:25 +08:00
79efb9bd51 Update some resources to 4.7 2024-06-16 17:06:25 +08:00
ef3c85c6d3 Fix Quest text 2024-06-09 12:20:06 +08:00
Jtuiii
e61fc45ad2 Update 4.7.0 Quest (#229) 2024-06-09 11:44:22 +08:00
de53f682f0 Add quick finish quest 2024-05-30 23:51:36 +08:00
3ddfa189e9 Update version to 1.15.1 2024-05-30 23:34:49 +08:00
ddc588c792 Update banners from https://github.com/Zhaokugua/Grasscutter_Banners 2024-05-30 23:33:49 +08:00
984afbdf0b Update banner titles to 4.6
Fix benner editor format
Add banner title update tool
2024-05-30 23:33:37 +08:00
56a72ad940 Rename banner resource files 2024-05-30 23:30:38 +08:00
b62c539bdd Update version to v1.15.0 2024-05-23 20:00:55 +08:00
d9272acb44 Update all resource to 4.6 2024-05-23 19:59:39 +08:00
5c89eb5a58 Update artifact set names 2024-03-31 15:49:42 +08:00
583041c295 Update version to v1.14.0 2024-03-25 00:15:04 +08:00
ded10d175f Update All Resources to 4.5.0 2024-03-25 00:14:30 +08:00
380682d175 Fix resource id 0 2024-03-24 23:33:59 +08:00
055bddc22c Fix proxy close issue 2024-03-24 23:33:59 +08:00
5b2442591f Fix include UID space issue 2023-11-12 13:54:49 +08:00
3eb1a08697 Fix #204 2023-10-30 23:35:10 +08:00
79283f4039 Optimize navigation framework 2023-10-21 09:42:00 +08:00
497b828f2d Fix clear button misalignment 2023-10-20 20:02:40 +08:00
41dc3e8fc4 Update weather translation(CHS) 2023-10-20 19:32:24 +08:00
eb1be4cdb8 Add reset all scene tag 2023-10-18 23:17:59 +08:00
d4655c1e50 Update change log 2023-10-18 23:07:12 +08:00
b1debe0aab Add clear button to command box 2023-10-18 23:03:25 +08:00
f5780a4366 Fix UI issues 2023-10-18 22:49:45 +08:00
101e3c5ffc Add clear button to all filter 2023-10-18 22:38:27 +08:00
97b3a57ee1 Add non aggressive AI option to spawn page 2023-10-18 22:19:08 +08:00
0788a32158 Fix command response new line 2023-10-18 22:05:51 +08:00
f553ddddd8 Add weather page translates 2023-10-18 22:05:29 +08:00
07fb477c3a Fix hotkey registration control 2023-10-14 15:55:57 +08:00
f8b920100d Add Weather Page 2023-10-14 11:36:17 +08:00
cfdca6f031 Fix nav error 2023-10-13 23:09:05 +08:00
085669e43a Add proxy page translation 2023-10-13 23:08:43 +08:00
eda70a2aae Add Settings page
Add Page tab order setting
Add Window opacity setting
2023-10-13 22:45:24 +08:00
c2be92c41b Fix hotkey registration issue 2023-10-08 12:23:13 +08:00
4bcd23389d Move stop proxy code 2023-10-08 00:09:25 +08:00
2a51fcb47d Add Proxy page 2023-10-08 00:01:20 +08:00
2c2f05c5b2 Add SceneTag Page 2023-10-07 22:22:35 +08:00
ab92469f11 Fix include uid bug 2023-10-07 21:24:59 +08:00
749f324f7d Add hotkey global switch 2023-09-29 15:04:30 +08:00
1c49c41b71 Update 4.1 resources(Avatar/Dungeon/Item/Weapon ) 2023-09-29 14:13:58 +08:00
1993d3d295 Fix include uid symbol issue 2023-09-24 00:27:55 +08:00
dce7e54675 Add HTTP(S) proxy (#208) 2023-09-23 10:48:24 +08:00
41c644f2af Add Run multiple commands at one time 2023-09-20 12:56:38 +08:00
78be273c7a Add dive prop 2023-08-29 00:12:01 +08:00
222 changed files with 72643 additions and 9408 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -34,6 +34,15 @@ The server require [gc-opencommand-plugin](https://github.com/jie65535/gc-openco
## Update log
### GrasscutterTools-v1.13
![Proxy](Doc/Screenshots-en/22-Proxy.png)
![SceneTag](Doc/Screenshots-en/23-SceneTag.png)
![Weather](Doc/Screenshots-en/24-Weather.png)
![Settings](Doc/Screenshots-en/25-Settings.png)
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots-en/21-HotKey.png)

View File

@@ -35,6 +35,15 @@ GCG поддерживает 简体中文 (китайский упр.), 繁體
## Лог обновлений
### GrasscutterTools-v1.13
![Proxy](Doc/Screenshots-en/22-Proxy.png)
![SceneTag](Doc/Screenshots-en/23-SceneTag.png)
![Weather](Doc/Screenshots-en/24-Weather.png)
![Settings](Doc/Screenshots-en/25-Settings.png)
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots-en/21-HotKey.png)

View File

@@ -35,6 +35,15 @@
## 更新概要
### GrasscutterTools-v1.13
![Proxy](Doc/Screenshots/22-Proxy.png)
![SceneTag](Doc/Screenshots/23-SceneTag.png)
![Weather](Doc/Screenshots/24-Weather.png)
![Settings](Doc/Screenshots/25-Settings.png)
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots/21-HotKey.png)

View File

@@ -34,6 +34,15 @@
## 更新日誌
### GrasscutterTools-v1.13
![Proxy](Doc/Screenshots/22-Proxy.png)
![SceneTag](Doc/Screenshots/23-SceneTag.png)
![Weather](Doc/Screenshots/24-Weather.png)
![Settings](Doc/Screenshots/25-Settings.png)
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots/21-HotKey.png)

View File

@@ -76,6 +76,15 @@
<setting name="IsUpgraded" serializeAs="String">
<value>False</value>
</setting>
<setting name="IsHotkeyEenabled" serializeAs="String">
<value>True</value>
</setting>
<setting name="AutoStartProxy" serializeAs="String">
<value>False</value>
</setting>
<setting name="WindowOpacity" serializeAs="String">
<value>100</value>
</setting>
</GrasscutterTools.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -0,0 +1,202 @@
#nullable enable
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace Eavesdrop;
public sealed class Certifier : IDisposable
{
private readonly X509Store _rootStore, _myStore;
private readonly IDictionary<string, X509Certificate2> _certificateCache;
public string Issuer { get; }
public string CertificateAuthorityName { get; }
public DateTime NotAfter { get; set; }
public DateTime NotBefore { get; set; }
public int KeyLength { get; set; } = 1024;
public bool IsCachingSignedCertificates { get; set; }
public X509Certificate2? Authority { get; private set; }
public Certifier()
: this("Eavesdrop")
{ }
public Certifier(string issuer)
: this(issuer, $"{issuer} Root Certificate Authority", StoreLocation.CurrentUser)
{ }
public Certifier(string issuer, string certificateAuthorityName)
: this(issuer, certificateAuthorityName, StoreLocation.CurrentUser)
{ }
public Certifier(string issuer, string certificateAuthorityName, StoreLocation location)
{
_myStore = new X509Store(StoreName.My, location);
_rootStore = new X509Store(StoreName.Root, location);
_certificateCache = new Dictionary<string, X509Certificate2>();
NotBefore = DateTime.Now;
NotAfter = NotBefore.AddMonths(1);
Issuer = issuer;
CertificateAuthorityName = certificateAuthorityName;
}
public bool CreateTrustedRootCertificate()
{
return (Authority = InstallCertificate(_rootStore, CertificateAuthorityName)) != null;
}
public bool DestroyTrustedRootCertificate()
{
return DestroyCertificates(_rootStore);
}
public bool ExportTrustedRootCertificate(string path)
{
X509Certificate2? rootCertificate = InstallCertificate(_rootStore, CertificateAuthorityName);
path = Path.GetFullPath(path);
if (rootCertificate != null)
{
byte[] data = rootCertificate.Export(X509ContentType.Cert);
File.WriteAllBytes(path, data);
}
return File.Exists(path);
}
public X509Certificate2? GenerateCertificate(string certificateName)
{
return InstallCertificate(_myStore, certificateName);
}
public X509Certificate2 CreateCertificate(string subjectName, string alternateName)
{
using var rsa = RSA.Create(KeyLength);
var certificateRequest = new CertificateRequest(subjectName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
if (Authority == null)
{
certificateRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true));
certificateRequest.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(certificateRequest.PublicKey, false));
using X509Certificate2 certificate = certificateRequest.CreateSelfSigned(NotBefore.ToUniversalTime(), NotAfter.ToUniversalTime());
certificate.FriendlyName = alternateName;
return new X509Certificate2(certificate.Export(X509ContentType.Pfx, string.Empty), string.Empty, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
}
else
{
var sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddDnsName(alternateName);
certificateRequest.CertificateExtensions.Add(sanBuilder.Build());
certificateRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false));
certificateRequest.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(certificateRequest.PublicKey, false));
using X509Certificate2 certificate = certificateRequest.Create(Authority, Authority.NotBefore, Authority.NotAfter, Guid.NewGuid().ToByteArray());
using X509Certificate2 certificateWithPrivateKey = certificate.CopyWithPrivateKey(rsa);
certificateWithPrivateKey.FriendlyName = alternateName;
return new X509Certificate2(certificateWithPrivateKey.Export(X509ContentType.Pfx, string.Empty), string.Empty, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
}
}
private X509Certificate2? InstallCertificate(X509Store store, string certificateName)
{
if (_certificateCache.TryGetValue(certificateName, out X509Certificate2? certificate))
{
if (DateTime.Now >= certificate.NotAfter)
{
_certificateCache.Remove(certificateName);
}
else return certificate;
}
lock (store)
{
try
{
store.Open(OpenFlags.ReadWrite);
string subjectName = $"CN={certificateName}, O={Issuer}";
certificate = FindCertificates(store, subjectName)?[0];
if (certificate != null && DateTime.Now >= certificate.NotAfter)
{
if (Authority == null)
{
DestroyCertificates();
store.Open(OpenFlags.ReadWrite);
}
else
{
store.Remove(certificate);
}
certificate = null;
}
if (certificate == null)
{
certificate = CreateCertificate(subjectName, certificateName);
if (certificate != null)
{
if (store == _rootStore || IsCachingSignedCertificates)
{
store.Add(certificate);
}
}
}
return certificate;
}
catch { return certificate = null; }
finally
{
store.Close();
if (certificate != null && !_certificateCache.ContainsKey(certificateName))
{
_certificateCache.Add(certificateName, certificate);
}
}
}
}
public bool DestroyCertificates(X509Store store)
{
lock (store)
{
try
{
store.Open(OpenFlags.ReadWrite);
X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindByIssuerName, Issuer, false);
store.RemoveRange(certificates);
IEnumerable<string> subjectNames = certificates.Cast<X509Certificate2>().Select(c => c.GetNameInfo(X509NameType.SimpleName, false));
foreach (string subjectName in subjectNames)
{
if (!_certificateCache.ContainsKey(subjectName)) continue;
_certificateCache.Remove(subjectName);
}
return true;
}
catch { return false; }
finally { store.Close(); }
}
}
public bool DestroyCertificates() => DestroyCertificates(_myStore) && DestroyCertificates(_rootStore);
private static X509Certificate2Collection? FindCertificates(X509Store store, string subjectName)
{
X509Certificate2Collection certificates = store.Certificates
.Find(X509FindType.FindBySubjectDistinguishedName, subjectName, false);
return certificates.Count > 0 ? certificates : null;
}
public void Dispose()
{
_myStore.Close();
_rootStore.Close();
_myStore.Dispose();
_rootStore.Dispose();
}
}

View File

@@ -0,0 +1,200 @@
using System;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Collections.Generic;
using Eavesdrop.Network;
namespace Eavesdrop
{
public static class Eavesdropper
{
private static TcpListener _listener;
private static readonly object _stateLock;
public delegate Task AsyncEventHandler<TEventArgs>(object sender, TEventArgs e);
public static event AsyncEventHandler<RequestInterceptedEventArgs> RequestInterceptedAsync;
private static async Task OnRequestInterceptedAsync(RequestInterceptedEventArgs e)
{
Task interceptedTask = RequestInterceptedAsync?.Invoke(null, e);
if (interceptedTask != null)
{
await interceptedTask;
}
}
public static event AsyncEventHandler<ResponseInterceptedEventArgs> ResponseInterceptedAsync;
private static async Task OnResponseInterceptedAsync(ResponseInterceptedEventArgs e)
{
Task interceptedTask = ResponseInterceptedAsync?.Invoke(null, e);
if (interceptedTask != null)
{
await interceptedTask;
}
}
public static List<string> Overrides { get; }
public static bool IsRunning { get; private set; }
public static Certifier Certifier { get; set; }
static Eavesdropper()
{
_stateLock = new object();
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Overrides = new List<string>();
Certifier = new Certifier("Eavesdrop", "Eavesdrop Root Certificate Authority");
}
public static void Terminate()
{
lock (_stateLock)
{
ResetMachineProxy();
IsRunning = false;
if (_listener != null)
{
_listener.Stop();
_listener = null;
}
}
}
public static void Initiate(int port)
{
Initiate(port, Interceptors.Default);
}
public static void Initiate(int port, Interceptors interceptors)
{
Initiate(port, interceptors, true);
}
public static void Initiate(int port, Interceptors interceptors, bool setSystemProxy)
{
lock (_stateLock)
{
Terminate();
_listener = new TcpListener(IPAddress.Any, port);
_listener.Start();
IsRunning = true;
Task.Factory.StartNew(InterceptRequestAsync, TaskCreationOptions.LongRunning);
if (setSystemProxy)
{
SetMachineProxy(port, interceptors);
}
}
}
private static async Task InterceptRequestAsync()
{
while (IsRunning && _listener != null)
{
try
{
TcpClient client = await _listener.AcceptTcpClientAsync().ConfigureAwait(false);
Task handleClientAsync = HandleClientAsync(client);
}
catch (ObjectDisposedException)
{
}
}
}
private static async Task HandleClientAsync(TcpClient client)
{
using var local = new EavesNode(Certifier, client);
WebRequest request = await local.ReadRequestAsync().ConfigureAwait(false);
if (request == null) return;
HttpContent requestContent = null;
var requestArgs = new RequestInterceptedEventArgs(request);
try
{
requestArgs.Content = requestContent = await local.ReadRequestContentAsync(request).ConfigureAwait(false);
await OnRequestInterceptedAsync(requestArgs).ConfigureAwait(false);
if (requestArgs.Cancel) return;
request = requestArgs.Request;
if (requestArgs.Content != null)
{
await local.WriteRequestContentAsync(request, requestArgs.Content).ConfigureAwait(false);
}
}
finally
{
requestContent?.Dispose();
requestArgs.Content?.Dispose();
}
WebResponse response = null;
try { response = await request.GetResponseAsync().ConfigureAwait(false); }
catch (WebException ex) { response = ex.Response; }
catch (ProtocolViolationException)
{
response?.Dispose();
response = null;
}
if (response == null) return;
HttpContent responseContent = null;
var responseArgs = new ResponseInterceptedEventArgs(request, response);
try
{
responseArgs.Content = responseContent = EavesNode.ReadResponseContent(response);
await OnResponseInterceptedAsync(responseArgs).ConfigureAwait(false);
if (responseArgs.Cancel) return;
await local.SendResponseAsync(responseArgs.Response, responseArgs.Content).ConfigureAwait(false);
}
finally
{
response.Dispose();
responseArgs.Response.Dispose();
responseContent?.Dispose();
responseArgs.Content?.Dispose();
}
}
private static void ResetMachineProxy()
{
INETOptions.Overrides.Clear();
INETOptions.IsIgnoringLocalTraffic = false;
INETOptions.HTTPAddress = null;
INETOptions.HTTPSAddress = null;
INETOptions.IsProxyEnabled = false;
INETOptions.Save();
}
private static void SetMachineProxy(int port, Interceptors interceptors)
{
foreach (string @override in Overrides)
{
if (INETOptions.Overrides.Contains(@override)) continue;
INETOptions.Overrides.Add(@override);
}
string address = ("127.0.0.1:" + port);
if (interceptors.HasFlag(Interceptors.HTTP))
{
INETOptions.HTTPAddress = address;
}
if (interceptors.HasFlag(Interceptors.HTTPS))
{
INETOptions.HTTPSAddress = address;
}
INETOptions.IsProxyEnabled = true;
INETOptions.IsIgnoringLocalTraffic = true;
INETOptions.Save();
}
}
}

View File

@@ -0,0 +1,78 @@
using System;
using System.Net;
using System.Net.Http;
using System.ComponentModel;
namespace Eavesdrop
{
public class RequestInterceptedEventArgs : CancelEventArgs
{
private HttpWebRequest _httpRequest;
public HttpContent Content { get; set; }
private WebRequest _request;
public WebRequest Request
{
get => _request;
set
{
_request = value;
_httpRequest = (value as HttpWebRequest);
}
}
public Uri Uri => Request?.RequestUri;
public CookieContainer CookieContainer => _httpRequest?.CookieContainer;
public string Method
{
get => Request?.Method;
set
{
if (Request != null)
{
Request.Method = value;
}
}
}
public IWebProxy Proxy
{
get => Request?.Proxy;
set
{
if (Request != null)
{
Request.Proxy = value;
}
}
}
public string ContentType
{
get => Request?.ContentType;
set
{
if (Request != null)
{
Request.ContentType = value;
}
}
}
public WebHeaderCollection Headers
{
get => Request?.Headers;
set
{
if (Request != null)
{
Request.Headers = value;
}
}
}
public RequestInterceptedEventArgs(WebRequest request)
{
Request = request;
}
}
}

View File

@@ -0,0 +1,65 @@
using System;
using System.Net;
using System.Net.Http;
using System.ComponentModel;
using System.Threading.Tasks;
using Eavesdrop.Network;
namespace Eavesdrop
{
public class ResponseInterceptedEventArgs : CancelEventArgs
{
private WebResponse _response;
public WebResponse Response
{
get => _response;
set
{
_response = value;
if (value is HttpWebResponse httpResponse)
{
CookieContainer = new CookieContainer();
CookieContainer.Add(httpResponse.Cookies);
}
else CookieContainer = null;
}
}
public WebRequest Request { get; }
public Uri Uri => Response?.ResponseUri;
public HttpContent Content { get; set; }
public CookieContainer CookieContainer { get; private set; }
public string ContentType
{
get => Response?.ContentType;
set
{
if (Response != null)
{
Response.ContentType = value;
}
}
}
public WebHeaderCollection Headers
{
get => Response?.Headers;
set
{
if (Response == null) return;
foreach (string header in value.AllKeys)
{
Response.Headers[header] = value[header];
}
}
}
public ResponseInterceptedEventArgs(WebRequest request, WebResponse response)
{
Request = request;
Response = response;
}
}
}

View File

@@ -0,0 +1,14 @@
using System;
namespace Eavesdrop
{
[Flags]
public enum Interceptors
{
None = 0,
HTTP = 1,
HTTPS = 2,
Default = (HTTP | HTTPS)
}
}

View File

@@ -0,0 +1,241 @@
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Eavesdrop
{
public static class INETOptions
{
private static readonly object _stateLock;
private static readonly int _iNetOptionSize;
private static readonly int _iNetPackageSize;
private static readonly RegistryKey _proxyKey;
public static List<string> Overrides { get; }
public static string HTTPAddress { get; set; }
public static string HTTPSAddress { get; set; }
public static bool IsProxyEnabled { get; set; }
public static bool IsIgnoringLocalTraffic { get; set; }
static INETOptions()
{
_stateLock = new object();
_iNetOptionSize = Marshal.SizeOf(typeof(INETOption));
_iNetPackageSize = Marshal.SizeOf(typeof(INETPackage));
_proxyKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
Overrides = new List<string>();
Load();
}
public static void Save()
{
lock (_stateLock)
{
var options = new List<INETOption>(3);
string joinedAddresses = (IsProxyEnabled ? GetJoinedAddresses() : null);
string joinedOverrides = (IsProxyEnabled ? GetJoinedOverrides() : null);
var kind = ProxyKind.PROXY_TYPE_DIRECT;
if (!string.IsNullOrWhiteSpace(joinedAddresses))
{
options.Add(new INETOption(OptionKind.INTERNET_PER_CONN_PROXY_SERVER, joinedAddresses));
if (!string.IsNullOrWhiteSpace(joinedOverrides))
{
options.Add(new INETOption(OptionKind.INTERNET_PER_CONN_PROXY_BYPASS, joinedOverrides));
}
kind |= ProxyKind.PROXY_TYPE_PROXY;
}
options.Insert(0, new INETOption(OptionKind.INTERNET_PER_CONN_FLAGS, (int)kind));
var inetPackage = new INETPackage
{
_optionError = 0,
_size = _iNetPackageSize,
_connection = IntPtr.Zero,
_optionCount = options.Count
};
IntPtr optionsPtr = Marshal.AllocCoTaskMem(_iNetOptionSize * options.Count);
for (int i = 0; i < options.Count; ++i)
{
var optionPtr = new IntPtr((IntPtr.Size == 4 ? optionsPtr.ToInt32() : optionsPtr.ToInt64()) + (i * _iNetOptionSize));
Marshal.StructureToPtr(options[i], optionPtr, false);
}
inetPackage._optionsPtr = optionsPtr;
IntPtr iNetPackagePtr = Marshal.AllocCoTaskMem(_iNetPackageSize);
Marshal.StructureToPtr(inetPackage, iNetPackagePtr, false);
int returnvalue = (NativeMethods.InternetSetOption(IntPtr.Zero, 75, iNetPackagePtr, _iNetPackageSize) ? -1 : 0);
if (returnvalue == 0)
{
returnvalue = Marshal.GetLastWin32Error();
}
Marshal.FreeCoTaskMem(optionsPtr);
Marshal.FreeCoTaskMem(iNetPackagePtr);
if (returnvalue > 0)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
NativeMethods.InternetSetOption(IntPtr.Zero, 39, iNetPackagePtr, _iNetPackageSize);
NativeMethods.InternetSetOption(IntPtr.Zero, 37, iNetPackagePtr, _iNetPackageSize);
}
}
public static void Load()
{
lock (_stateLock)
{
LoadAddresses();
LoadOverrides();
IsProxyEnabled = (_proxyKey.GetValue("ProxyEnable")?.ToString() == "1");
}
}
private static void LoadOverrides()
{
string proxyOverride = _proxyKey.GetValue("ProxyOverride")?.ToString();
if (string.IsNullOrWhiteSpace(proxyOverride)) return;
string[] overrides = proxyOverride.Split(';');
foreach (string @override in overrides)
{
if (@override == "<local>")
{
IsIgnoringLocalTraffic = true;
}
else if (!Overrides.Contains(@override))
{
Overrides.Add(@override);
}
}
}
private static void LoadAddresses()
{
string proxyServer = _proxyKey.GetValue("ProxyServer")?.ToString();
if (string.IsNullOrWhiteSpace(proxyServer)) return;
string[] values = proxyServer.Split(';');
foreach (string value in values)
{
string[] pair = value.Split('=');
if (pair.Length != 2)
{
HTTPAddress = value;
HTTPSAddress = value;
return;
}
string address = pair[1];
string protocol = pair[0];
switch (protocol)
{
case "http": HTTPAddress = address; break;
case "https": HTTPSAddress = address; break;
}
}
}
private static string GetJoinedAddresses()
{
var addresses = new List<string>(2);
if (!string.IsNullOrWhiteSpace(HTTPAddress))
{
addresses.Add("http=" + HTTPAddress);
}
if (!string.IsNullOrWhiteSpace(HTTPSAddress))
{
addresses.Add("https=" + HTTPSAddress);
}
return string.Join(";", addresses);
}
private static string GetJoinedOverrides()
{
var overrides = new List<string>(Overrides);
if (IsIgnoringLocalTraffic)
{
overrides.Add("<local>");
}
return string.Join(";", overrides);
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct INETOption
{
private readonly OptionKind _kind;
private readonly INETOptionValue _value;
public INETOption(OptionKind kind, int value)
{
_kind = kind;
_value = CreateValue(value);
}
public INETOption(OptionKind kind, string value)
{
_kind = kind;
_value = CreateValue(value);
}
private static INETOptionValue CreateValue(int value)
{
return new INETOptionValue
{
_intValue = value
};
}
private static INETOptionValue CreateValue(string value)
{
return new INETOptionValue
{
_stringPointer = Marshal.StringToHGlobalAuto(value)
};
}
[StructLayout(LayoutKind.Explicit)]
private struct INETOptionValue
{
[FieldOffset(0)]
public int _intValue;
[FieldOffset(0)]
public IntPtr _stringPointer;
[FieldOffset(0)]
public System.Runtime.InteropServices.ComTypes.FILETIME _fileTime;
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct INETPackage
{
public int _size;
public IntPtr _connection;
public int _optionCount;
public int _optionError;
public IntPtr _optionsPtr;
}
[Flags]
private enum ProxyKind
{
PROXY_TYPE_DIRECT = 1,
PROXY_TYPE_PROXY = 2,
PROXY_TYPE_AUTO_PROXY_URL = 4,
PROXY_TYPE_AUTO_DETECT = 8
}
private enum OptionKind
{
INTERNET_PER_CONN_FLAGS = 1,
INTERNET_PER_CONN_PROXY_SERVER = 2,
INTERNET_PER_CONN_PROXY_BYPASS = 3,
INTERNET_PER_CONN_AUTOCONFIG_URL = 4
}
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Runtime.InteropServices;
namespace Eavesdrop
{
internal static class NativeMethods
{
[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
}
}

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 ArachisH
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.

View File

@@ -0,0 +1,365 @@
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Http;
using System.Net.Sockets;
using System.Net.Security;
using System.Globalization;
using System.IO.Compression;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Security.Authentication;
using System.Text.RegularExpressions;
using System.Security.Cryptography.X509Certificates;
//using BrotliSharpLib;
namespace Eavesdrop.Network
{
public class EavesNode : IDisposable
{
private SslStream _secureStream;
private readonly TcpClient _client;
private readonly Certifier _certifier;
private static readonly Regex _responseCookieSplitter;
public bool IsSecure => (_secureStream != null);
static EavesNode()
{
_responseCookieSplitter = new Regex(",(?! )");
}
public EavesNode(Certifier certifier, TcpClient client)
{
_client = client;
_certifier = certifier;
_client.NoDelay = true;
}
public Task<HttpWebRequest> ReadRequestAsync()
{
return ReadRequestAsync(null);
}
private async Task<HttpWebRequest> ReadRequestAsync(Uri baseUri)
{
string method = null;
var headers = new List<string>();
string requestUrl = baseUri?.OriginalString;
string command = ReadNonBufferedLine();
if (string.IsNullOrWhiteSpace(command)) return null;
if (string.IsNullOrWhiteSpace(command)) return null;
string[] values = command.Split(' ');
method = values[0];
requestUrl += values[1];
while (_client.Connected)
{
string header = ReadNonBufferedLine();
if (string.IsNullOrWhiteSpace(header)) break;
headers.Add(header);
}
if (method == "CONNECT")
{
baseUri = new Uri("https://" + requestUrl);
await SendResponseAsync(HttpStatusCode.OK).ConfigureAwait(false);
if (!SecureTunnel(baseUri.Host)) return null;
return await ReadRequestAsync(baseUri).ConfigureAwait(false);
}
else return CreateRequest(method, headers, new Uri(requestUrl));
}
public async Task<ByteArrayContent> ReadRequestContentAsync(WebRequest request)
{
byte[] payload = await GetPayload(GetStream(), request.ContentLength).ConfigureAwait(false);
if (payload == null) return null;
//if (request.Headers[HttpRequestHeader.ContentEncoding] == "br")
//{
// request.Headers[HttpRequestHeader.ContentEncoding] = ""; // No longer encoded.
// payload = Brotli.DecompressBuffer(payload, 0, payload.Length);
//}
return new ByteArrayContent(payload);
}
public async Task WriteRequestContentAsync(WebRequest request, HttpContent content)
{
byte[] payload = null;
if (content is StreamContent streamContent)
{
// TODO:
throw new NotSupportedException();
}
else payload = await content.ReadAsByteArrayAsync().ConfigureAwait(false);
//if (request.Headers[HttpRequestHeader.ContentEncoding] == "br")
//{
// payload = Brotli.CompressBuffer(payload, 0, payload.Length);
//}
request.ContentLength = payload.Length;
using (Stream output = await request.GetRequestStreamAsync().ConfigureAwait(false))
{
await output.WriteAsync(payload, 0, payload.Length).ConfigureAwait(false);
}
}
public Task SendResponseAsync(WebResponse response, HttpContent content)
{
string description = "OK";
var status = HttpStatusCode.OK;
if (response is HttpWebResponse httpResponse)
{
status = httpResponse.StatusCode;
description = httpResponse.StatusDescription;
}
return SendResponseAsync(status, description, response.Headers, content);
}
public Task SendResponseAsync(HttpStatusCode status, string description = null)
{
return SendResponseAsync(status, (description ?? status.ToString()), null, null);
}
public async Task SendResponseAsync(HttpStatusCode status, string description, WebHeaderCollection headers, HttpContent content)
{
var headerBuilder = new StringBuilder();
headerBuilder.AppendLine($"HTTP/{HttpVersion.Version10} {(int)status} {description}");
if (headers != null)
{
foreach (string header in headers.AllKeys)
{
if (header == "Transfer-Encoding") continue;
string value = headers[header];
if (string.IsNullOrWhiteSpace(value)) continue;
if (header.Equals("Set-Cookie", StringComparison.OrdinalIgnoreCase))
{
foreach (string setCookie in _responseCookieSplitter.Split(value))
{
headerBuilder.AppendLine($"{header}: {setCookie}");
}
}
else headerBuilder.AppendLine($"{header}: {value}");
}
}
headerBuilder.AppendLine();
byte[] headerData = Encoding.UTF8.GetBytes(headerBuilder.ToString());
await GetStream().WriteAsync(headerData, 0, headerData.Length).ConfigureAwait(false);
if (content != null)
{
// TODO: If the Content-Encoding header has been changed, re-compress while writing?
Stream input = await content.ReadAsStreamAsync().ConfigureAwait(false);
int bytesRead = 0;
var buffer = new byte[8192];
do
{
bytesRead = await input.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
if (_client.Connected && bytesRead > 0)
{
await GetStream().WriteAsync(buffer, 0, bytesRead).ConfigureAwait(false);
}
else return;
}
while (input.CanRead && _client.Connected);
}
}
public Stream GetStream()
{
return ((Stream)_secureStream ?? _client.GetStream());
}
private StreamWriter WrapStreamWriter()
{
return new StreamWriter(GetStream(), Encoding.UTF8, 1024, true);
}
private StreamReader WrapStreamReader(int bufferSize = 1024)
{
return new StreamReader(GetStream(), Encoding.UTF8, true, bufferSize, true);
}
private string ReadNonBufferedLine()
{
string line = string.Empty;
try
{
using (var binaryInput = new BinaryReader(GetStream(), Encoding.UTF8, true))
{
do { line += binaryInput.ReadChar(); }
while (!line.EndsWith("\r\n"));
}
}
catch (EndOfStreamException) { line += "\r\n"; }
return line.Substring(0, line.Length - 2);
}
private bool SecureTunnel(string host)
{
try
{
X509Certificate2 certificate = _certifier.GenerateCertificate(host);
_secureStream = new SslStream(GetStream());
_secureStream.AuthenticateAsServer(certificate, false, SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false);
return true;
}
catch { return false; }
}
private IEnumerable<Cookie> GetCookies(string cookieHeader, string host)
{
foreach (string cookie in cookieHeader.Split(';'))
{
int nameEndIndex = cookie.IndexOf('=');
if (nameEndIndex == -1) continue;
string name = cookie.Substring(0, nameEndIndex).Trim();
string value = cookie.Substring(nameEndIndex + 1).Trim();
yield return new Cookie(name, value, "/", host);
}
}
private HttpWebRequest CreateRequest(string method, List<string> headers, Uri requestUri)
{
HttpWebRequest request = WebRequest.CreateHttp(requestUri);
request.ProtocolVersion = HttpVersion.Version10;
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = false;
request.KeepAlive = false;
request.Method = method;
request.Proxy = null;
foreach (string header in headers)
{
int delimiterIndex = header.IndexOf(':');
if (delimiterIndex == -1) continue;
string name = header.Substring(0, delimiterIndex);
string value = header.Substring(delimiterIndex + 2);
switch (name.ToLower())
{
case "range":
case "expect":
case "keep-alive":
case "connection":
case "proxy-connection": break;
case "host": request.Host = value; break;
case "accept": request.Accept = value; break;
case "referer": request.Referer = value; break;
case "user-agent": request.UserAgent = value; break;
case "content-type": request.ContentType = value; break;
case "content-length":
{
request.ContentLength =
long.Parse(value, CultureInfo.InvariantCulture);
break;
}
case "cookie":
{
foreach (Cookie cookie in GetCookies(value, request.Host))
{
try
{
request.CookieContainer.Add(cookie);
}
catch (CookieException) { }
}
request.Headers[name] = value;
break;
}
case "if-modified-since":
{
request.IfModifiedSince = DateTime.Parse(
value.Split(';')[0], CultureInfo.InvariantCulture);
break;
}
case "date":
if (long.TryParse(value, out var timestamp))
{
request.Date = timestamp > 10_000_000_000L
? DateTimeOffset.FromUnixTimeMilliseconds(timestamp).DateTime
: DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
}
else
{
request.Date = DateTime.Parse(value);
}
break;
default:
request.Headers[name] = value; break;
}
}
return request;
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
GetStream().Dispose();
_client.Dispose();
}
}
public static StreamContent ReadResponseContent(WebResponse response)
{
if (response.ContentLength == 0)
{
response.GetResponseStream().Dispose();
return null;
}
Stream input = response.GetResponseStream();
//if (response is HttpWebResponse httpResponse && !string.IsNullOrWhiteSpace(httpResponse.ContentEncoding))
//{
// switch (httpResponse.ContentEncoding)
// {
// //case "br": input = new BrotliStream(input, CompressionMode.Decompress); break;
// case "gzip": input = new GZipStream(input, CompressionMode.Decompress); break;
// case "deflate": input = new DeflateStream(input, CompressionMode.Decompress); break;
// }
// response.Headers.Remove(HttpResponseHeader.ContentLength);
// response.Headers.Remove(HttpResponseHeader.ContentEncoding);
// response.Headers.Add(HttpResponseHeader.TransferEncoding, "chunked");
//}
return new StreamContent(input, response.ContentLength > 0 ? (int)response.ContentLength : 4096);
}
public static async Task<byte[]> GetPayload(Stream input, long length)
{
if (length < 1) return null;
int totalBytesRead = 0;
int nullBytesReadCount = 0;
var payload = new byte[length];
do
{
int bytesLeft = (payload.Length - totalBytesRead);
int bytesRead = await input.ReadAsync(payload, totalBytesRead, bytesLeft).ConfigureAwait(false);
if (bytesRead > 0)
{
nullBytesReadCount = 0;
totalBytesRead += bytesRead;
}
else if (++nullBytesReadCount >= 2) return null;
}
while (totalBytesRead != payload.Length);
return payload;
}
}
}

View File

@@ -56,7 +56,9 @@
this.LblCountLabel = new System.Windows.Forms.Label();
this.ListItems = new System.Windows.Forms.ListBox();
this.GrpMonsterList = new System.Windows.Forms.GroupBox();
this.LblClearMonsterFilter = new System.Windows.Forms.Label();
this.GrpItemList = new System.Windows.Forms.GroupBox();
this.LblClearItemFilter = new System.Windows.Forms.Label();
this.GrpDropList.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUDMaxWeight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDMinWeight)).BeginInit();
@@ -292,19 +294,37 @@
// GrpMonsterList
//
resources.ApplyResources(this.GrpMonsterList, "GrpMonsterList");
this.GrpMonsterList.Controls.Add(this.LblClearMonsterFilter);
this.GrpMonsterList.Controls.Add(this.ListMonsters);
this.GrpMonsterList.Controls.Add(this.TxtMonsterFilter);
this.GrpMonsterList.Name = "GrpMonsterList";
this.GrpMonsterList.TabStop = false;
//
// LblClearMonsterFilter
//
resources.ApplyResources(this.LblClearMonsterFilter, "LblClearMonsterFilter");
this.LblClearMonsterFilter.BackColor = System.Drawing.Color.White;
this.LblClearMonsterFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearMonsterFilter.Name = "LblClearMonsterFilter";
this.LblClearMonsterFilter.Click += new System.EventHandler(this.LblClearMonsterFilter_Click);
//
// GrpItemList
//
resources.ApplyResources(this.GrpItemList, "GrpItemList");
this.GrpItemList.Controls.Add(this.LblClearItemFilter);
this.GrpItemList.Controls.Add(this.TxtItemFilter);
this.GrpItemList.Controls.Add(this.ListItems);
this.GrpItemList.Name = "GrpItemList";
this.GrpItemList.TabStop = false;
//
// LblClearItemFilter
//
resources.ApplyResources(this.LblClearItemFilter, "LblClearItemFilter");
this.LblClearItemFilter.BackColor = System.Drawing.Color.White;
this.LblClearItemFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearItemFilter.Name = "LblClearItemFilter";
this.LblClearItemFilter.Click += new System.EventHandler(this.LblClearItemFilter_Click);
//
// FormDropEditor
//
resources.ApplyResources(this, "$this");
@@ -362,5 +382,7 @@
private System.Windows.Forms.Button BtnPaste;
private System.Windows.Forms.Button BtnClear;
private System.Windows.Forms.Button BtnCopyAll;
private System.Windows.Forms.Label LblClearMonsterFilter;
private System.Windows.Forms.Label LblClearItemFilter;
}
}

View File

@@ -199,6 +199,15 @@ namespace GrasscutterTools.Forms
private void TxtMonsterFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListMonsters, Monsters, TxtMonsterFilter.Text);
LblClearMonsterFilter.Visible = TxtMonsterFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空怪物过滤器标签时触发
/// </summary>
private void LblClearMonsterFilter_Click(object sender, EventArgs e)
{
TxtMonsterFilter.Clear();
}
/// <summary>
@@ -496,6 +505,15 @@ namespace GrasscutterTools.Forms
private void TxtItemFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListItems, GameData.Items.Lines, TxtItemFilter.Text);
LblClearItemFilter.Visible = TxtItemFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空物品列表过滤器标签时触发
/// </summary>
private void LblClearItemFilter_Click(object sender, EventArgs e)
{
TxtItemFilter.Clear();
}
/// <summary>
@@ -507,5 +525,7 @@ namespace GrasscutterTools.Forms
}
#endregion - -
}
}

View File

@@ -241,7 +241,7 @@
<value>GrpMonsterList</value>
</data>
<data name="&gt;&gt;ListMonsters.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="TxtMonsterFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
@@ -265,7 +265,7 @@
<value>GrpMonsterList</value>
</data>
<data name="&gt;&gt;TxtMonsterFilter.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="TxtItemFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
@@ -289,7 +289,7 @@
<value>GrpItemList</value>
</data>
<data name="&gt;&gt;TxtItemFilter.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="ListDropData.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
@@ -802,11 +802,47 @@
<value>GrpItemList</value>
</data>
<data name="&gt;&gt;ListItems.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="GrpMonsterList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="LblClearMonsterFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearMonsterFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearMonsterFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearMonsterFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>228, 25</value>
</data>
<data name="LblClearMonsterFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearMonsterFilter.TabIndex" type="System.Int32, mscorlib">
<value>23</value>
</data>
<data name="LblClearMonsterFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearMonsterFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearMonsterFilter.Name" xml:space="preserve">
<value>LblClearMonsterFilter</value>
</data>
<data name="&gt;&gt;LblClearMonsterFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearMonsterFilter.Parent" xml:space="preserve">
<value>GrpMonsterList</value>
</data>
<data name="&gt;&gt;LblClearMonsterFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="GrpMonsterList.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 41</value>
</data>
@@ -834,6 +870,42 @@
<data name="GrpItemList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Right</value>
</data>
<data name="LblClearItemFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearItemFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearItemFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearItemFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 25</value>
</data>
<data name="LblClearItemFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearItemFilter.TabIndex" type="System.Int32, mscorlib">
<value>23</value>
</data>
<data name="LblClearItemFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearItemFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearItemFilter.Name" xml:space="preserve">
<value>LblClearItemFilter</value>
</data>
<data name="&gt;&gt;LblClearItemFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearItemFilter.Parent" xml:space="preserve">
<value>GrpItemList</value>
</data>
<data name="&gt;&gt;LblClearItemFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="GrpItemList.Location" type="System.Drawing.Point, System.Drawing">
<value>576, 41</value>
</data>

View File

@@ -50,8 +50,10 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab()
{
CmbPrefab.Items.Clear();
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
CmbPrefab.DisplayMember = "Value";
CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
//CmbPrefab.Items.Clear();
//CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
}
private void InitCheckedListBoxs()
@@ -96,6 +98,11 @@ namespace GrasscutterTools.Forms
#region - UI -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
private void ShowBanner(GachaBanner banner)
{
try
@@ -103,10 +110,17 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int prefabId))
const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbPrefab.SelectedIndex = -1;
}
else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId);
{
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItem == 224;
RbCostItem223.Checked = banner.CostItem == 223;
NUDBeginTime.Value = banner.BeginTime;
@@ -153,15 +167,15 @@ namespace GrasscutterTools.Forms
else
purpleIds = TxtRateUpItems2.Text.Split(',').Select(s => int.Parse(s.Trim())).ToArray();
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex];
var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
GachaBanner banner = new GachaBanner
{
GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{prefabId:000}_TITLE",
PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_{prefabId}_TITLE",
CostItem = RbCostItem224.Checked ? 224 : 223,
BeginTime = (int)NUDBeginTime.Value,
EndTime = (int)NUDEndTime.Value,

View File

@@ -50,8 +50,11 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab()
{
CmbPrefab.Items.Clear();
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
CmbPrefab.DisplayMember = "Value";
CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
//CmbPrefab.Items.Clear();
//CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
}
private void LnkWeightHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
@@ -206,6 +209,10 @@ namespace GrasscutterTools.Forms
#region - -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
private void ShowBanner(GachaBanner2 banner)
{
try
@@ -213,10 +220,17 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int prefabId))
const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbPrefab.SelectedIndex = -1;
}
else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId);
{
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItem == 224;
RbCostItem223.Checked = banner.CostItem == 223;
DTPBeginTime.Value = DateTimeOffset.FromUnixTimeSeconds(banner.BeginTime).DateTime;
@@ -248,16 +262,16 @@ namespace GrasscutterTools.Forms
MessageBox.Show("请选择奖池预制", Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex];
var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
var banner = new GachaBanner2
{
GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{prefabId:000}_TITLE",
PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_{prefabId}_TITLE",
CostItem = RbCostItem224.Checked ? 224 : 223,
BeginTime = (int)new DateTimeOffset(DTPBeginTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(),
EndTime = (int)new DateTimeOffset(DTPEndTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(),

View File

@@ -61,10 +61,10 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab()
{
CmbPrefab.Items.Clear();
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
CmbTitlePath.Items.Clear();
CmbTitlePath.Items.AddRange(GameData.GachaBannerTitles.Names);
CmbPrefab.DisplayMember = "Value";
CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
CmbTitlePath.DisplayMember = "Value";
CmbTitlePath.DataSource = GameData.GachaBannerTitles;
}
protected override void OnLoad(EventArgs e)
@@ -405,6 +405,12 @@ namespace GrasscutterTools.Forms
#region - -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
/// <summary>
/// 显示指定卡池参数
/// </summary>
@@ -416,14 +422,28 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.PrefabPath) || !int.TryParse(banner.PrefabPath.Substring("GachaShowPanel_A".Length, 3), out int prefabId))
const string prefabPrefix = "GachaShowPanel_";
if (string.IsNullOrEmpty(banner.PrefabPath) || banner.PrefabPath.Length <= prefabPrefix.Length)
{
CmbPrefab.SelectedIndex = -1;
}
else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId);
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int titleId))
{
var prefabKey = banner.PrefabPath.Substring(prefabPrefix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerPrefabs.FindIndex(it => it.Key == prefabKey);
}
const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbTitlePath.SelectedIndex = -1;
}
else
CmbTitlePath.SelectedIndex = Array.IndexOf(GameData.GachaBannerTitles.Ids, titleId);
{
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbTitlePath.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItemId == 224;
RbCostItem223.Checked = banner.CostItemId == 223;
NUDCostItemAmount1.Value = banner.CoseItemAmount;
@@ -458,16 +478,16 @@ namespace GrasscutterTools.Forms
return null;
}
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex];
var titleId = GameData.GachaBannerTitles.Ids[CmbTitlePath.SelectedIndex];
var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
var titleId = GameData.GachaBannerTitles[CmbTitlePath.SelectedIndex].Key;
var banner = new GachaBanner3
{
GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{titleId:000}_TITLE",
PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_{titleId}_TITLE",
CostItemId = RbCostItem224.Checked ? 224 : 223,
CoseItemAmount = (int)NUDCostItemAmount1.Value,
CostItemId10 = RbCostItem224.Checked ? 224 : 223,

View File

@@ -32,16 +32,15 @@ namespace GrasscutterTools.Forms
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
this.NavContainer = new System.Windows.Forms.SplitContainer();
this.ListPages = new System.Windows.Forms.ListBox();
this.TCMain = new System.Windows.Forms.TabControl();
this.CmbCommand = new System.Windows.Forms.ComboBox();
this.BtnCopy = new System.Windows.Forms.Button();
this.ChkAutoCopy = new System.Windows.Forms.CheckBox();
this.GrpCommand = new System.Windows.Forms.GroupBox();
this.LblClearFilter = new System.Windows.Forms.Label();
this.BtnInvokeOpenCommand = new System.Windows.Forms.Button();
this.MenuSpawnEntityFilter = new System.Windows.Forms.ContextMenuStrip(this.components);
((System.ComponentModel.ISupportInitialize)(this.NavContainer)).BeginInit();
this.NavContainer.Panel1.SuspendLayout();
this.NavContainer.Panel2.SuspendLayout();
this.NavContainer.SuspendLayout();
this.GrpCommand.SuspendLayout();
this.SuspendLayout();
@@ -55,10 +54,6 @@ namespace GrasscutterTools.Forms
//
this.NavContainer.Panel1.Controls.Add(this.ListPages);
//
// NavContainer.Panel2
//
this.NavContainer.Panel2.Controls.Add(this.TCMain);
//
// ListPages
//
this.ListPages.BackColor = System.Drawing.Color.WhiteSmoke;
@@ -68,23 +63,17 @@ namespace GrasscutterTools.Forms
this.ListPages.FormattingEnabled = true;
this.ListPages.Name = "ListPages";
this.ListPages.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ListPages_DrawItem);
this.ListPages.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListPages_MeasureItem);
this.ListPages.SelectedIndexChanged += new System.EventHandler(this.ListPages_SelectedIndexChanged);
this.ListPages.SizeChanged += new System.EventHandler(this.ListPages_SizeChanged);
//
// TCMain
//
resources.ApplyResources(this.TCMain, "TCMain");
this.TCMain.Multiline = true;
this.TCMain.Name = "TCMain";
this.TCMain.SelectedIndex = 0;
this.TCMain.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
//
// CmbCommand
//
resources.ApplyResources(this.CmbCommand, "CmbCommand");
this.CmbCommand.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.CmbCommand.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.CmbCommand.Name = "CmbCommand";
this.CmbCommand.TextChanged += new System.EventHandler(this.CmbCommand_TextChanged);
this.CmbCommand.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtCommand_KeyDown);
//
// BtnCopy
@@ -103,6 +92,7 @@ namespace GrasscutterTools.Forms
// GrpCommand
//
resources.ApplyResources(this.GrpCommand, "GrpCommand");
this.GrpCommand.Controls.Add(this.LblClearFilter);
this.GrpCommand.Controls.Add(this.BtnInvokeOpenCommand);
this.GrpCommand.Controls.Add(this.BtnCopy);
this.GrpCommand.Controls.Add(this.ChkAutoCopy);
@@ -110,6 +100,14 @@ namespace GrasscutterTools.Forms
this.GrpCommand.Name = "GrpCommand";
this.GrpCommand.TabStop = false;
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// BtnInvokeOpenCommand
//
resources.ApplyResources(this.BtnInvokeOpenCommand, "BtnInvokeOpenCommand");
@@ -119,6 +117,7 @@ namespace GrasscutterTools.Forms
//
// MenuSpawnEntityFilter
//
this.MenuSpawnEntityFilter.ImageScalingSize = new System.Drawing.Size(24, 24);
this.MenuSpawnEntityFilter.Name = "MenuSpawnEntityFilter";
resources.ApplyResources(this.MenuSpawnEntityFilter, "MenuSpawnEntityFilter");
//
@@ -134,7 +133,6 @@ namespace GrasscutterTools.Forms
this.Load += new System.EventHandler(this.FormMain_Load);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormMain_KeyDown);
this.NavContainer.Panel1.ResumeLayout(false);
this.NavContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.NavContainer)).EndInit();
this.NavContainer.ResumeLayout(false);
this.GrpCommand.ResumeLayout(false);
@@ -150,9 +148,9 @@ namespace GrasscutterTools.Forms
private System.Windows.Forms.CheckBox ChkAutoCopy;
private System.Windows.Forms.GroupBox GrpCommand;
private System.Windows.Forms.Button BtnInvokeOpenCommand;
private System.Windows.Forms.TabControl TCMain;
private System.Windows.Forms.ContextMenuStrip MenuSpawnEntityFilter;
private System.Windows.Forms.ListBox ListPages;
private System.Windows.Forms.SplitContainer NavContainer;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -18,6 +18,8 @@
**/
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
@@ -30,15 +32,20 @@ using GrasscutterTools.Utils;
namespace GrasscutterTools.Forms
{
public partial class FormMain : Form
internal partial class FormMain : Form
{
#region - Init -
private const string TAG = nameof(FormMain);
private const string TAG = "FormMain";
public static FormMain Instance { get; private set; }
#region - Init -
public FormMain()
{
Logger.I(TAG, "FormMain ctor enter");
Instance = this;
InitializeComponent();
Icon = Resources.IconGrasscutter;
@@ -85,6 +92,13 @@ namespace GrasscutterTools.Forms
Logger.I(TAG, "Restore NavContainer SplitterDistance: " + NavContainer.SplitterDistance);
}
// 还原窗口的不透明度
if (Settings.Default.WindowOpacity < 100)
{
Opacity = Settings.Default.WindowOpacity / 100.0;
Logger.I(TAG, "Restore window opacity: " + Opacity);
}
// 恢复自动复制选项状态
ChkAutoCopy.Checked = Settings.Default.AutoCopy;
@@ -99,133 +113,13 @@ namespace GrasscutterTools.Forms
Logger.I(TAG, "FormMain ctor completed");
}
/// <summary>
/// 初始化并创建所有页面
/// </summary>
private void InitPages()
{
Logger.I(TAG, "InitPages enter");
TCMain.SuspendLayout();
var ph = CreatePage<PageHome>();
ph.OnLanguageChanged = () => FormMain_Load(this, EventArgs.Empty);
var poc = CreatePage<PageOpenCommand>();
poc.ShowTipInRunButton = msg => ShowTip(msg, BtnInvokeOpenCommand);
var pcc = CreatePage<PageCustomCommands>();
var phk = CreatePage<PageHotKey>();
pcc.OnAddHotKey = tag =>
{
phk.AddNewHotKey(tag);
// 跳转到快捷键界面
for (var i = 0; i < TCMain.Controls.Count; i++)
{
if (TCMain.Controls[i].Controls[0] == phk)
{
ListPages.SelectedIndex = i;
break;
}
}
};
CreatePage<PageGiveArtifact>();
CreatePage<PageSetProp>();
CreatePage<PageSpawn>();
CreatePage<PageGiveItem>();
CreatePage<PageAvatar>();
CreatePage<PageGiveWeapon>();
CreatePage<PageScene>();
CreatePage<PageTasks>();
CreatePage<PageManagement>();
CreatePage<PageMail>();
CreatePage<PageQuest>();
CreatePage<PageAchievement>();
CreatePage<PageAbout>();
#if DEBUG
CreatePage<PageTools>();
#endif
TCMain.ResumeLayout();
Logger.I(TAG, "InitPages completed");
}
/// <summary>
/// 初始化页面导航
/// 重载界面
/// </summary>
private void InitPagesNav()
public void Reload()
{
ListPages.Items.Clear();
ListPages.Items.AddRange(new object[]
{
Resources.PageHomeTitle,
Resources.PageOpenCommandTitle,
Resources.PageCustomCommandsTitle,
Resources.PageHotKey,
Resources.PageGetArtifactTitle,
Resources.PageSetPropTitle,
Resources.PageSpawnTitle,
Resources.PageGiveItemTitle,
Resources.PageAvatarTitle,
Resources.PageGiveWeaponTitle,
Resources.PageSceneTitle,
Resources.PageTasksTitle,
Resources.PageManagementTitle,
Resources.PageMailTitle,
Resources.PageQuestTitle,
Resources.PageAchievementTitle,
Resources.PageAboutTitle,
#if DEBUG
"Tools",
#endif
});
}
/// <summary>
/// 导航列表项居中绘制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListPages_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
var strFmt = new StringFormat
{
Alignment = StringAlignment.Center, //文本垂直居中
LineAlignment = StringAlignment.Center //文本水平居中
};
e.Graphics.DrawString(ListPages.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, strFmt);
}
/// <summary>
/// 导航列表大小改变时触发
/// </summary>
private void ListPages_SizeChanged(object sender, EventArgs e)
{
// 立刻重绘列表项
ListPages.Refresh();
}
/// <summary>
/// 创建指定类型页面
/// </summary>
/// <typeparam name="T">页面类型必须继承BasePage</typeparam>
/// <returns>页面实例</returns>
private T CreatePage<T>() where T : BasePage, new()
{
var page = new T
{
SetCommand = SetCommand,
RunCommands = RunCommands,
GetCommand = () => CmbCommand.Text,
Dock = DockStyle.Fill,
Name = typeof(T).Name,
};
var tp = new TabPage();
TCMain.TabPages.Add(tp);
tp.Controls.Add(page);
return page;
}
private void ListPages_SelectedIndexChanged(object sender, EventArgs e)
{
TCMain.SelectedIndex = ListPages.SelectedIndex;
FormMain_Load(this, null);
}
/// <summary>
@@ -241,21 +135,23 @@ namespace GrasscutterTools.Forms
if (DesignMode) return;
// 加载页面导航
InitPagesNav();
UpdatePagesNav();
// 加载游戏ID资源
GameData.LoadResources();
// 遍历每一个页面重新加载
foreach (TabPage tp in TCMain.Controls)
foreach (var page in Pages.Values)
{
if (tp.Controls.Count > 0 && tp.Controls[0] is BasePage page)
{
Logger.I(TAG, $"{page.Name} OnLoad enter");
page.OnLoad();
Logger.I(TAG, $"{page.Name} OnLoad completed");
}
Logger.I(TAG, $"{page.Name} OnLoad enter");
page.OnLoad();
Logger.I(TAG, $"{page.Name} OnLoad completed");
}
// 默认选中首页
if (ListPages.SelectedIndex == -1)
ListPages.SelectedIndex = 0;
Logger.I(TAG, "FormMain_Load completed");
}
@@ -266,10 +162,11 @@ namespace GrasscutterTools.Forms
{
Logger.I(TAG, "FormMain FormClosed enter");
// 遍历每一个页面,通知关闭
foreach (TabPage tp in TCMain.Controls)
foreach (var page in Pages.Values)
{
if (tp.Controls.Count > 0 && tp.Controls[0] is BasePage page)
page.OnClosed();
Logger.I(TAG, $"{page.Name} OnClosed enter");
page.OnClosed();
Logger.I(TAG, $"{page.Name} OnClosed completed");
}
// 保存当前设置
@@ -305,6 +202,254 @@ namespace GrasscutterTools.Forms
#endregion - Init -
#region - Nav -
public Dictionary<string, BasePage> Pages { get; private set; }
/// <summary>
/// 初始化并创建所有页面
/// </summary>
private void InitPages()
{
Logger.I(TAG, "InitPages enter");
Pages = new Dictionary<string, BasePage>(32);
CreatePage<PageHome>();
var poc = CreatePage<PageOpenCommand>();
poc.ShowTipInRunButton = msg => ShowTip(msg, BtnInvokeOpenCommand);
CreatePage<PageProxy>();
CreatePage<PageCustomCommands>();
CreatePage<PageHotKey>();
CreatePage<PageGiveArtifact>();
CreatePage<PageSetProp>();
CreatePage<PageSpawn>();
CreatePage<PageGiveItem>();
CreatePage<PageAvatar>();
CreatePage<PageGiveWeapon>();
CreatePage<PageScene>();
CreatePage<PageSceneTag>();
CreatePage<PageWeather>();
CreatePage<PageTasks>();
CreatePage<PageManagement>();
CreatePage<PageMail>();
CreatePage<PageQuest>();
CreatePage<PageAchievement>();
CreatePage<PageSettings>();
CreatePage<PageAbout>();
#if DEBUG
CreatePage<PageTools>();
#endif
Logger.I(TAG, "InitPages completed");
}
/// <summary>
/// 当前的页面选项卡顺序
/// string Item1 = Page Name(Key)
/// bool Item2 = IsVisible
/// </summary>
public List<Tuple<string, bool>> PageTabOrders { get; set; }
/// <summary>
/// 加载页面选项卡顺序
/// </summary>
private List<Tuple<string, bool>> LoadPageTabOrders()
{
if (PageTabOrders != null) return PageTabOrders;
List<Tuple<string, bool>> tabOrders;
if (!(Settings.Default.PageOrders?.Count > 0))
{
tabOrders = new List<Tuple<string, bool>>(Pages.Count);
// 默认状态
foreach (var tab in Pages)
tabOrders.Add(new Tuple<string, bool>(tab.Key, true));
}
else
{
tabOrders = new List<Tuple<string, bool>>(Settings.Default.PageOrders.Count);
// 从设置中读取
foreach (var item in Settings.Default.PageOrders)
{
// 冒号分隔的项 "PageHome:1" 0=隐藏 1=显示
var sp = item.IndexOf(':');
if (sp == -1 || !int.TryParse(item.Substring(sp + 1), out var isVisible)) continue;
tabOrders.Add(new Tuple<string, bool>(item.Substring(0, sp), isVisible != 0));
}
}
return tabOrders;
}
/// <summary>
/// 重置页面选项卡顺序
/// </summary>
public void ResetPageTabOrders()
{
PageTabOrders = new List<Tuple<string, bool>>(Pages.Count);
// 默认状态
foreach (var tab in Pages)
PageTabOrders.Add(new Tuple<string, bool>(tab.Key, true));
}
/// <summary>
/// 保存页面选项卡顺序
/// </summary>
public void SavePageTabOrders()
{
if (PageTabOrders == null || PageTabOrders.Count == 0)
{
Settings.Default.PageOrders = null;
return;
}
var setting = new StringCollection();
// 冒号分隔的项 "PageHome:1" 0=隐藏 1=显示
foreach (var pageOrder in PageTabOrders)
setting.Add($"{pageOrder.Item1}:{(pageOrder.Item2?'1':'0')}");
Settings.Default.PageOrders = setting;
}
/// <summary>
/// 初始化页面导航
/// </summary>
public void UpdatePagesNav()
{
ListPages.BeginUpdate();
ListPages.Items.Clear();
// 以下代码主要是为了加载用户自定义顺序的选项卡
var tabOrders = LoadPageTabOrders();
// 程序更新后增加或减少了界面的情况
if (tabOrders.Count != Pages.Count)
{
PageTabOrders = new List<Tuple<string, bool>>(Pages.Count);
var i = 0;
var pageKeys = Pages.Keys.ToList();
foreach (var pageOrder in tabOrders)
{
// 新增页面优先显示
if (i < pageKeys.Count && tabOrders.All(it => it.Item1 != pageKeys[i]))
{
PageTabOrders.Add(new Tuple<string, bool>(pageKeys[i], true));
ListPages.Items.Add(Pages[pageKeys[i]].Text);
}
// 尝试获取页面标题
if (Pages.TryGetValue(pageOrder.Item1, out var page))
{
// 仅设置为可见时添加
if (pageOrder.Item2)
ListPages.Items.Add(page.Text);
PageTabOrders.Add(new Tuple<string, bool>(pageOrder.Item1, pageOrder.Item2));
}
// 如果获取不到页面标题,说明在本次更新中这个页面被删掉了,因此设置项也随之更新
i++;
}
// 加上新增在最后的页面
if (ListPages.Items.Count == i)
{
while (i < Pages.Count)
{
PageTabOrders.Add(new Tuple<string, bool>(pageKeys[i], true));
ListPages.Items.Add(Pages[pageKeys[i]].Text);
i++;
}
}
// 保存页面顺序
SavePageTabOrders();
}
else
{
// 按照设定顺序显示
foreach (var pageOrder in tabOrders)
{
if (pageOrder.Item2)
ListPages.Items.Add(Pages[pageOrder.Item1].Text);
}
PageTabOrders = tabOrders;
}
ListPages.EndUpdate();
}
/// <summary>
/// 导航列表选中项改变时触发
/// </summary>
private void ListPages_SelectedIndexChanged(object sender, EventArgs e)
{
if (ListPages.SelectedIndex == -1) return;
// 根据选中索引反查选中页面Key
var key = PageTabOrders.Where(it => it.Item2)
.ElementAt(ListPages.SelectedIndex)
.Item1;
// 通过Key找到页面的父节点也就是TabPage设置为选中项
ShowPage(Pages[key]);
}
/// <summary>
/// 展示页面
/// </summary>
/// <param name="page">页面实例</param>
private void ShowPage(BasePage page)
{
NavContainer.Panel2.SuspendLayout();
NavContainer.Panel2.Controls.Clear();
NavContainer.Panel2.Controls.Add(page);
NavContainer.Panel2.ResumeLayout();
}
/// <summary>
/// 导航列表项居中绘制
/// </summary>
private void ListPages_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
var strFmt = new StringFormat
{
Alignment = StringAlignment.Center, //文本垂直居中
LineAlignment = StringAlignment.Center //文本水平居中
};
e.Graphics.DrawString(ListPages.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, strFmt);
}
/// <summary>
/// 导航列表高度测量
/// </summary>
private void ListPages_MeasureItem(object sender, MeasureItemEventArgs e)
{
// 列表项高度为字体高度1.5倍
e.ItemHeight = ListPages.Font.Height * 3 / 2;
}
/// <summary>
/// 导航列表大小改变时触发
/// </summary>
private void ListPages_SizeChanged(object sender, EventArgs e)
{
// 立刻重绘列表项
ListPages.Refresh();
}
/// <summary>
/// 创建指定类型页面
/// </summary>
/// <typeparam name="T">页面类型必须继承BasePage</typeparam>
/// <returns>页面实例</returns>
private T CreatePage<T>() where T : BasePage, new()
{
var page = new T
{
SetCommand = SetCommand,
RunCommands = RunCommands,
GetCommand = () => CmbCommand.Text,
Dock = DockStyle.Fill,
Name = typeof(T).Name,
};
Pages.Add(page.Name, page);
return page;
}
#endregion
#region - HotKey -
/// <summary>
@@ -380,9 +525,12 @@ namespace GrasscutterTools.Forms
/// <param name="args">参数</param>
private void SetCommand(string command, string args)
{
SetCommand(Settings.Default.IsIncludeUID
? $"{command} {args.Trim()} @{Settings.Default.Uid}"
: $"{command} {args.Trim()}");
if (!string.IsNullOrEmpty(args))
command = $"{command} {args}";
command = command.Trim();
if (Settings.Default.IsIncludeUID)
command = $"{command} @{Settings.Default.Uid}";
SetCommand(command);
}
/// <summary>
@@ -442,7 +590,7 @@ namespace GrasscutterTools.Forms
/// <returns>是否执行成功</returns>
private async Task<bool> RunRawCommands(string commands)
{
if (commands.IndexOf('|') == -1)
if (commands.IndexOf('|') == -1 || Common.OC?.CanInvokeMultipleCmd == true)
return await RunCommands(FormatCommand(commands));
return await RunCommands(commands.Split('|').Select(FormatCommand).ToArray());
}
@@ -468,16 +616,7 @@ namespace GrasscutterTools.Forms
if (Common.OC == null || !Common.OC.CanInvoke)
{
ShowTip(Resources.RequireOpenCommandTip, BtnInvokeOpenCommand);
//TCMain.SelectedTab = TPRemoteCall;
for (var i = 0; i < TCMain.Controls.Count; i++)
{
if (TCMain.Controls[i].Controls[0] is PageOpenCommand)
{
ListPages.SelectedIndex = i;
break;
}
}
NavigateTo<PageOpenCommand>();
return false;
}
@@ -499,7 +638,7 @@ namespace GrasscutterTools.Forms
{
Logger.I(TAG, "RunCommand:" + cmd);
var msg = await Common.OC.Invoke(cmd);
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg.Replace("\n", "\r\n"));
TxtCommandRunLog.AppendText(Environment.NewLine);
}
catch (Exception ex)
@@ -580,13 +719,42 @@ namespace GrasscutterTools.Forms
// F5 为执行命令
OnOpenCommandInvoke();
}
else if (e.Alt && e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)
else if ((e.Alt || e.Control) && e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)
{
// Alt+数字键 = 跳转到对应页面
// Alt|Ctrl+数字键 = 跳转到对应页面
var i = e.KeyCode == Keys.D0 ? 9 : e.KeyCode - Keys.D1;
if (i < ListPages.Items.Count)
ListPages.SelectedIndex = i;
}
else if (e.Control && e.KeyCode == Keys.Tab)
{
// 切换到下一个页面
ListPages.SelectedIndex = (ListPages.SelectedIndex + 1) % ListPages.Items.Count;
}
else if (Common.KeyGo.IsEnabled == false)
{
foreach (var hotkeyItem in Common.KeyGo.Items)
{
if (!hotkeyItem.IsEnabled) continue;
var t = hotkeyItem.HotKey.LastIndexOf('+');
var key = (t >= 0) ? hotkeyItem.HotKey.Substring(t+1) : hotkeyItem.HotKey;
if (e.KeyCode != (Keys)Enum.Parse(typeof(Keys), key.Trim()))
continue;
if (t >= 0)
{
if (hotkeyItem.HotKey.Contains("Ctrl") && !e.Control)
continue;
if (hotkeyItem.HotKey.Contains("Shift") && !e.Shift)
continue;
if (hotkeyItem.HotKey.Contains("Alt") && !e.Alt)
continue;
}
BeginInvoke(new Func<Task>(() => RunRawCommands(hotkeyItem.Commands)));
break;
}
}
}
/// <summary>
@@ -609,6 +777,46 @@ namespace GrasscutterTools.Forms
TTip.Show(message, control, 0, control.Size.Height, 3000);
}
/// <summary>
/// 导航到目标页面并返回该页面实例
/// </summary>
/// <typeparam name="TPage">页面类型</typeparam>
public TPage NavigateTo<TPage>() where TPage : BasePage
{
var key = typeof(TPage).Name;
var page = Pages[key] as TPage;
var i = 0;
foreach (var it in PageTabOrders.Where(it => it.Item2))
{
if (it.Item1 == key)
{
ListPages.SelectedIndex = i;
return page;
}
i++;
}
ShowPage(page);
return page;
}
#endregion - General -
/// <summary>
/// 命令栏文本改变时触发
/// </summary>
private void CmbCommand_TextChanged(object sender, EventArgs e)
{
LblClearFilter.Visible = CmbCommand.Text.Length > 0;
}
/// <summary>
/// 点击清空命令栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
CmbCommand.Text = "";
}
}
}

View File

@@ -133,7 +133,7 @@
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ListPages.ItemHeight" type="System.Int32, mscorlib">
<value>22</value>
<value>25</value>
</data>
<data name="ListPages.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
@@ -171,39 +171,6 @@
<data name="NavContainer.Panel1MinSize" type="System.Int32, mscorlib">
<value>80</value>
</data>
<data name="TCMain.Appearance" type="System.Windows.Forms.TabAppearance, System.Windows.Forms">
<value>FlatButtons</value>
</data>
<data name="TCMain.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="TCMain.ItemSize" type="System.Drawing.Size, System.Drawing">
<value>0, 1</value>
</data>
<data name="TCMain.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="TCMain.MinimumSize" type="System.Drawing.Size, System.Drawing">
<value>610, 275</value>
</data>
<data name="TCMain.Size" type="System.Drawing.Size, System.Drawing">
<value>656, 275</value>
</data>
<data name="TCMain.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;TCMain.Name" xml:space="preserve">
<value>TCMain</value>
</data>
<data name="&gt;&gt;TCMain.Type" xml:space="preserve">
<value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TCMain.Parent" xml:space="preserve">
<value>NavContainer.Panel2</value>
</data>
<data name="&gt;&gt;TCMain.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;NavContainer.Panel2.Name" xml:space="preserve">
<value>NavContainer.Panel2</value>
</data>
@@ -262,7 +229,7 @@
<value>GrpCommand</value>
</data>
<data name="&gt;&gt;CmbCommand.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="BtnCopy.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
@@ -289,7 +256,7 @@
<value>GrpCommand</value>
</data>
<data name="&gt;&gt;BtnCopy.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="ChkAutoCopy.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -319,11 +286,47 @@
<value>GrpCommand</value>
</data>
<data name="&gt;&gt;ChkAutoCopy.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="GrpCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>680, 26</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>24</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>GrpCommand</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnInvokeOpenCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
@@ -352,7 +355,7 @@
<value>GrpCommand</value>
</data>
<data name="&gt;&gt;BtnInvokeOpenCommand.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="GrpCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 293</value>

View File

@@ -37,6 +37,7 @@
this.BtnClearGoods = new System.Windows.Forms.Button();
this.BtnDeleteGoods = new System.Windows.Forms.Button();
this.GrpItems = new System.Windows.Forms.GroupBox();
this.LblClearItemFilter = new System.Windows.Forms.Label();
this.TxtItemFilter = new System.Windows.Forms.TextBox();
this.GrpGoodsInfo = new System.Windows.Forms.GroupBox();
this.BtnSaveGoods = new System.Windows.Forms.Button();
@@ -132,8 +133,8 @@
//
// GrpShopList
//
resources.ApplyResources(this.GrpShopList, "GrpShopList");
this.GrpShopList.Controls.Add(this.ListShop);
resources.ApplyResources(this.GrpShopList, "GrpShopList");
this.GrpShopList.Name = "GrpShopList";
this.GrpShopList.TabStop = false;
//
@@ -163,11 +164,20 @@
// GrpItems
//
resources.ApplyResources(this.GrpItems, "GrpItems");
this.GrpItems.Controls.Add(this.LblClearItemFilter);
this.GrpItems.Controls.Add(this.TxtItemFilter);
this.GrpItems.Controls.Add(this.ListItems);
this.GrpItems.Name = "GrpItems";
this.GrpItems.TabStop = false;
//
// LblClearItemFilter
//
resources.ApplyResources(this.LblClearItemFilter, "LblClearItemFilter");
this.LblClearItemFilter.BackColor = System.Drawing.Color.White;
this.LblClearItemFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearItemFilter.Name = "LblClearItemFilter";
this.LblClearItemFilter.Click += new System.EventHandler(this.LblClearItemFilter_Click);
//
// TxtItemFilter
//
resources.ApplyResources(this.TxtItemFilter, "TxtItemFilter");
@@ -698,5 +708,6 @@
private System.Windows.Forms.TextBox TxtItemFilter;
private System.Windows.Forms.Button BtnClearGoods;
private System.Windows.Forms.Button BtnDeleteGoods;
private System.Windows.Forms.Label LblClearItemFilter;
}
}

View File

@@ -529,6 +529,15 @@ namespace GrasscutterTools.Forms
private void TxtItemFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListItems, GameData.Items.Lines, TxtItemFilter.Text);
LblClearItemFilter.Visible = TxtItemFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空物品列表过滤器标签时触发
/// </summary>
private void LblClearItemFilter_Click(object sender, EventArgs e)
{
TxtItemFilter.Clear();
}
/// <summary>

File diff suppressed because it is too large Load Diff

View File

@@ -37,9 +37,10 @@
this.LblResourcesPath = new System.Windows.Forms.Label();
this.BtnSearch = new System.Windows.Forms.Button();
this.DGVTextMap = new System.Windows.Forms.DataGridView();
this.LblClearFilter = new System.Windows.Forms.Label();
this.ColumnHash = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnID = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnText = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnID = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.DGVTextMap)).BeginInit();
this.SuspendLayout();
//
@@ -47,6 +48,7 @@
//
resources.ApplyResources(this.TxtTextMapFilter, "TxtTextMapFilter");
this.TxtTextMapFilter.Name = "TxtTextMapFilter";
this.TxtTextMapFilter.TextChanged += new System.EventHandler(this.TxtTextMapFilter_TextChanged);
this.TxtTextMapFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtTextMapFilter_KeyDown);
//
// BtnSelectRecoursePath
@@ -90,42 +92,51 @@
//
// DGVTextMap
//
resources.ApplyResources(this.DGVTextMap, "DGVTextMap");
this.DGVTextMap.AllowUserToAddRows = false;
this.DGVTextMap.AllowUserToDeleteRows = false;
this.DGVTextMap.AllowUserToResizeRows = false;
resources.ApplyResources(this.DGVTextMap, "DGVTextMap");
this.DGVTextMap.BackgroundColor = System.Drawing.Color.White;
this.DGVTextMap.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.DGVTextMap.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColumnHash,
this.ColumnID,
this.ColumnText});
this.ColumnText,
this.ColumnID});
this.DGVTextMap.Name = "DGVTextMap";
this.DGVTextMap.ReadOnly = true;
this.DGVTextMap.RowTemplate.Height = 23;
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// ColumnHash
//
resources.ApplyResources(this.ColumnHash, "ColumnHash");
this.ColumnHash.Name = "ColumnHash";
this.ColumnHash.ReadOnly = true;
//
// ColumnID
//
resources.ApplyResources(this.ColumnID, "ColumnID");
this.ColumnID.Name = "ColumnID";
this.ColumnID.ReadOnly = true;
//
// ColumnText
//
resources.ApplyResources(this.ColumnText, "ColumnText");
this.ColumnText.Name = "ColumnText";
this.ColumnText.ReadOnly = true;
//
// ColumnID
//
resources.ApplyResources(this.ColumnID, "ColumnID");
this.ColumnID.Name = "ColumnID";
this.ColumnID.ReadOnly = true;
//
// FormTextMapBrowser
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.DGVTextMap);
this.Controls.Add(this.BtnSearch);
this.Controls.Add(this.ChkTopMost);
@@ -151,8 +162,9 @@
private System.Windows.Forms.Label LblResourcesPath;
private System.Windows.Forms.Button BtnSearch;
private System.Windows.Forms.DataGridView DGVTextMap;
private System.Windows.Forms.Label LblClearFilter;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnHash;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnID;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnText;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnID;
}
}

View File

@@ -119,13 +119,12 @@ namespace GrasscutterTools.Forms
private void GenLines()
{
List<ListViewItem> items = new List<ListViewItem>(data.TextMap.Count);
var items = new List<ListViewItem>(data.TextMap.Count);
foreach (var kv in data.TextMap)
{
if (data.ManualTextMap.TryGetValue(kv.Key, out string id))
items.Add(new ListViewItem(new string[] { kv.Key, id, kv.Value }));
else
items.Add(new ListViewItem(new string[] { kv.Key, "", kv.Value }));
items.Add(data.ManualTextMap?.TryGetValue(kv.Key, out var id) == true
? new ListViewItem(new[] { kv.Key, id, kv.Value })
: new ListViewItem(new[] { kv.Key, "", kv.Value }));
}
Items = items;
}
@@ -161,26 +160,25 @@ namespace GrasscutterTools.Forms
Cursor = Cursors.WaitCursor;
Application.DoEvents();
var result = data.ManualTextMap.Where(kv => r.Match(kv.Value).Success)
.Select(kv => new { Hash = kv.Key, Id = kv.Value, Text = data.TextMap[kv.Key] })
.Concat(
data.TextMap.Where(kv => r.Match(kv.Key).Success || r.Match(kv.Value).Success)
.Select(kv => new
{
Hash = kv.Key,
Id = data.ManualTextMap.TryGetValue(kv.Key, out string id) ? id : "",
Text = kv.Value
})
).ToList();
var manualResult = data.ManualTextMap?.Where(kv => r.Match(kv.Value).Success)
.Select(kv => new { Hash = kv.Key, Text = data.TextMap[kv.Key], Id = kv.Value, });
var textMapResult = data.TextMap.Where(kv => r.Match(kv.Key).Success || r.Match(kv.Value).Success)
.Select(kv => new
{
Hash = kv.Key,
Text = kv.Value,
Id = data.ManualTextMap?.TryGetValue(kv.Key, out var id) == true ? id : "",
});
var result = manualResult == null ? textMapResult.ToList() : textMapResult.Concat(manualResult).ToList();
DGVTextMap.SuspendLayout();
DGVTextMap.Rows.Clear();
for (int i = 0; i < result.Count; i++)
for (var i = 0; i < result.Count; i++)
{
DGVTextMap.Rows.Add();
DGVTextMap.Rows[i].Cells[0].Value = result[i].Hash;
DGVTextMap.Rows[i].Cells[1].Value = result[i].Id;
DGVTextMap.Rows[i].Cells[2].Value = result[i].Text;
DGVTextMap.Rows[i].Cells[1].Value = result[i].Text;
DGVTextMap.Rows[i].Cells[2].Value = result[i].Id;
}
DGVTextMap.ResumeLayout();
}
@@ -195,5 +193,15 @@ namespace GrasscutterTools.Forms
if (e.KeyCode == Keys.Enter)
BtnSearch_Click(sender, e);
}
private void TxtTextMapFilter_TextChanged(object sender, EventArgs e)
{
LblClearFilter.Visible = TxtTextMapFilter.Text.Length > 0;
}
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtTextMapFilter.Clear();
}
}
}

View File

@@ -117,289 +117,325 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="&gt;&gt;BtnSelectRecoursePath.Name" xml:space="preserve">
<value>BtnSelectRecoursePath</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LblLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LblResourcesPath.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
<data name="TxtTextMapFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblResourcesPath.Location" type="System.Drawing.Point, System.Drawing">
<value>177, 15</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnSearch.Name" xml:space="preserve">
<value>BtnSearch</value>
</data>
<data name="&gt;&gt;LblLanguage.Name" xml:space="preserve">
<value>LblLanguage</value>
</data>
<data name="ColumnText.HeaderText" xml:space="preserve">
<value>Text</value>
</data>
<data name="BtnSearch.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="LblLanguage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="TxtTextMapFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 41</value>
</data>
<data name="&gt;&gt;DGVTextMap.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="BtnSelectRecoursePath.Location" type="System.Drawing.Point, System.Drawing">
<value>96, 12</value>
</data>
<data name="ColumnHash.Width" type="System.Int32, mscorlib">
<value>80</value>
</data>
<data name="DGVTextMap.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="ColumnID.Width" type="System.Int32, mscorlib">
<value>240</value>
</data>
<data name="LblResourcesPath.Text" xml:space="preserve">
<value>请选择Resources路径</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="&gt;&gt;LblLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblResourcesPath.Size" type="System.Drawing.Size, System.Drawing">
<value>327, 17</value>
</data>
<data name="TxtTextMapFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>555, 23</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>文本映射表浏览器</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="DGVTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>636, 379</value>
</data>
<data name="&gt;&gt;BtnSearch.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblResourcesPath.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="CmbLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="ChkTopMost.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Name" xml:space="preserve">
<value>LblResourcesPath</value>
</data>
<data name="ChkTopMost.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TxtTextMapFilter.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;ColumnText.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtTextMapFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ColumnHash.HeaderText" xml:space="preserve">
<value>Hash</value>
</data>
<data name="ColumnText.Width" type="System.Int32, mscorlib">
<value>250</value>
</data>
<data name="CmbLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>548, 12</value>
</data>
<data name="&gt;&gt;TxtTextMapFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;DGVTextMap.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="CmbLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 25</value>
</data>
<data name="BtnSearch.Text" xml:space="preserve">
<value>搜索</value>
</data>
<data name="CmbLanguage.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;DGVTextMap.Name" xml:space="preserve">
<value>DGVTextMap</value>
</data>
<data name="LblResourcesPath.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="&gt;&gt;ColumnHash.Name" xml:space="preserve">
<value>ColumnHash</value>
</data>
<data name="&gt;&gt;BtnSearch.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="DGVTextMap.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnSelectRecoursePath.Text" xml:space="preserve">
<value>浏览</value>
</data>
<data name="LblLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>510, 15</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbLanguage.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="&gt;&gt;ChkTopMost.Name" xml:space="preserve">
<value>ChkTopMost</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 9pt</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>660, 461</value>
</data>
<data name="&gt;&gt;CmbLanguage.Name" xml:space="preserve">
<value>CmbLanguage</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;BtnSearch.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;ColumnID.Name" xml:space="preserve">
<value>ColumnID</value>
</data>
<data name="TxtTextMapFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="&gt;&gt;ChkTopMost.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="LblLanguage.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="ColumnID.HeaderText" xml:space="preserve">
<value>ID</value>
</data>
<data name="BtnSearch.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="&gt;&gt;ChkTopMost.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColumnText.Name" xml:space="preserve">
<value>ColumnText</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>FormTextMapBrowser</value>
</data>
<data name="&gt;&gt;CmbLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;DGVTextMap.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnSearch.Location" type="System.Drawing.Point, System.Drawing">
<value>573, 41</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ChkTopMost.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ColumnHash.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtTextMapFilter.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;TxtTextMapFilter.Name" xml:space="preserve">
<value>TxtTextMapFilter</value>
</data>
<data name="DGVTextMap.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 70</value>
<data name="&gt;&gt;TxtTextMapFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.Parent" xml:space="preserve">
<data name="&gt;&gt;TxtTextMapFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblLanguage.Text" xml:space="preserve">
<value>语言</value>
<data name="&gt;&gt;TxtTextMapFilter.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="ChkTopMost.Size" type="System.Drawing.Size, System.Drawing">
<value>51, 21</value>
</data>
<data name="BtnSelectRecoursePath.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;CmbLanguage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>置顶</value>
</data>
<data name="BtnSearch.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="&gt;&gt;ColumnID.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="BtnSelectRecoursePath.Location" type="System.Drawing.Point, System.Drawing">
<value>96, 12</value>
</data>
<data name="BtnSelectRecoursePath.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
<value>600, 400</value>
<data name="BtnSelectRecoursePath.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="BtnSelectRecoursePath.Text" xml:space="preserve">
<value>浏览</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.Name" xml:space="preserve">
<value>BtnSelectRecoursePath</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSelectRecoursePath.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="CmbLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="CmbLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>548, 12</value>
</data>
<data name="CmbLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 25</value>
</data>
<data name="CmbLanguage.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;CmbLanguage.Name" xml:space="preserve">
<value>CmbLanguage</value>
</data>
<data name="&gt;&gt;CmbLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbLanguage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;CmbLanguage.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="LblLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblLanguage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>510, 15</value>
</data>
<data name="LblLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="LblLanguage.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="LblLanguage.Text" xml:space="preserve">
<value>语言</value>
</data>
<data name="&gt;&gt;LblLanguage.Name" xml:space="preserve">
<value>LblLanguage</value>
</data>
<data name="&gt;&gt;LblLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblLanguage.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="ChkTopMost.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkTopMost.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 14</value>
</data>
<metadata name="ColumnText.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnID.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ChkTopMost.Size" type="System.Drawing.Size, System.Drawing">
<value>51, 21</value>
</data>
<data name="ChkTopMost.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>置顶</value>
</data>
<data name="&gt;&gt;ChkTopMost.Name" xml:space="preserve">
<value>ChkTopMost</value>
</data>
<data name="&gt;&gt;ChkTopMost.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkTopMost.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ChkTopMost.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblResourcesPath.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="LblResourcesPath.Location" type="System.Drawing.Point, System.Drawing">
<value>177, 15</value>
</data>
<data name="LblResourcesPath.Size" type="System.Drawing.Size, System.Drawing">
<value>327, 17</value>
</data>
<data name="LblResourcesPath.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="LblResourcesPath.Text" xml:space="preserve">
<value>请选择Resources路径</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Name" xml:space="preserve">
<value>LblResourcesPath</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblResourcesPath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblResourcesPath.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="BtnSearch.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="BtnSearch.Location" type="System.Drawing.Point, System.Drawing">
<value>573, 41</value>
</data>
<data name="BtnSearch.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="BtnSearch.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="BtnSearch.Text" xml:space="preserve">
<value>搜索</value>
</data>
<data name="&gt;&gt;BtnSearch.Name" xml:space="preserve">
<value>BtnSearch</value>
</data>
<data name="&gt;&gt;BtnSearch.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnSearch.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSearch.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="DGVTextMap.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<metadata name="ColumnHash.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnHash.HeaderText" xml:space="preserve">
<value>Hash</value>
</data>
<data name="ColumnHash.Width" type="System.Int32, mscorlib">
<value>80</value>
</data>
<metadata name="ColumnText.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnText.HeaderText" xml:space="preserve">
<value>Text</value>
</data>
<data name="ColumnText.Width" type="System.Int32, mscorlib">
<value>250</value>
</data>
<metadata name="ColumnID.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnID.HeaderText" xml:space="preserve">
<value>ID</value>
</data>
<data name="ColumnID.Width" type="System.Int32, mscorlib">
<value>240</value>
</data>
<data name="DGVTextMap.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 70</value>
</data>
<data name="DGVTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>636, 379</value>
</data>
<data name="DGVTextMap.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;DGVTextMap.Name" xml:space="preserve">
<value>DGVTextMap</value>
</data>
<data name="&gt;&gt;DGVTextMap.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;DGVTextMap.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;DGVTextMap.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>545, 44</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>18</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>660, 461</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 9pt</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
<value>600, 400</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>文本映射表浏览器</value>
</data>
<data name="&gt;&gt;ColumnHash.Name" xml:space="preserve">
<value>ColumnHash</value>
</data>
<data name="&gt;&gt;ColumnHash.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColumnText.Name" xml:space="preserve">
<value>ColumnText</value>
</data>
<data name="&gt;&gt;ColumnText.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColumnID.Name" xml:space="preserve">
<value>ColumnID</value>
</data>
<data name="&gt;&gt;ColumnID.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>FormTextMapBrowser</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -163,10 +163,20 @@ namespace GrasscutterTools.Game
public static readonly Version V1_6_3 = new Version(1, 6, 3);
/// <summary>
/// 2023/??
/// 2023/9/1
/// </summary>
public static readonly Version V1_7_0 = new Version(1, 7, 0);
/// <summary>
/// 2023/9/3
/// </summary>
public static readonly Version V1_7_1 = new Version(1, 7, 1);
/// <summary>
/// 2023/10/1
/// </summary>
public static readonly Version V1_7_2 = new Version(1, 7, 2);
// More...
/// <summary>
/// Date
@@ -190,6 +200,8 @@ namespace GrasscutterTools.Game
V1_6_2,
V1_6_3,
V1_7_0,
V1_7_1,
V1_7_2,
};
#endregion - Version List -

View File

@@ -17,10 +17,12 @@
*
**/
using GrasscutterTools.Game.Data;
using Newtonsoft.Json;
namespace GrasscutterTools.Game.CutScene
{
[ResourceType("CutsceneExcelConfigData.json")]
internal class CutSceneItem
{
[JsonProperty("id")]

View File

@@ -0,0 +1,39 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("SceneTagConfigData.json")]
internal class SceneTagData
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("sceneTagName")]
public string SceneTagName { get; set; }
[JsonProperty("sceneId")]
public int SceneId { get; set; }
[JsonProperty("isDefaultValid")]
public bool IsDefaultValid { get; set; }
}
}

View File

@@ -0,0 +1,42 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("WeatherExcelConfigData.json")]
internal class WeatherData
{
[JsonProperty("areaID")]
public int AreaId { get; set; }
[JsonProperty("weatherAreaId")]
public int WeatherAreaId { get; set; }
[JsonProperty("profileName")]
public string ProfileName { get; set; }
[JsonProperty("defaultClimate")]
public string DefaultClimate { get; set; }
[JsonProperty("sceneID")]
public int SceneId { get; set; }
}
}

View File

@@ -25,7 +25,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using GrasscutterTools.Game.CutScene;
using GrasscutterTools.Game.Data.Excels;
using GrasscutterTools.Game.Inventory;
using GrasscutterTools.Game.Props;
@@ -63,10 +63,15 @@ namespace GrasscutterTools.Game.Data
public Dictionary<int, SceneData> SceneData { get; set; }
public List<SceneTagData> SceneTagData { get; set; }
public Dictionary<int, WeaponData> WeaponData { get; set; }
public TextMapData TextMapData { get; set; }
public List<WeatherData> WeatherData { get; set; }
public List<CutSceneItem> CutSceneData { get; set; }
public GameResources(string resourcesDirPath, TextMapData textMapData)
{
TextMapData = textMapData;
@@ -123,16 +128,35 @@ namespace GrasscutterTools.Game.Data
private static object LoadDataFile(Type type, string path)
{
var list = (IList)JsonConvert.DeserializeObject(File.ReadAllText(path), typeof(List<>).MakeGenericType(type));
if (list == null) return null;
if (!type.IsSubclassOf(typeof(GameResource))) return list;
var dicType = typeof(Dictionary<,>).MakeGenericType(typeof(int), type);
var dic = (IDictionary)Activator.CreateInstance(dicType);
foreach (GameResource gameResource in list)
dic.Add(gameResource.Id, gameResource);
return dic;
IList list = null;
try
{
list = (IList)JsonConvert.DeserializeObject(File.ReadAllText(path), typeof(List<>).MakeGenericType(type));
}
catch (Exception ex)
{
Console.WriteLine($"Failed to load \"{path}\", Exception={ex}");
}
if (type.IsSubclassOf(typeof(GameResource)))
{
var dicType = typeof(Dictionary<,>).MakeGenericType(typeof(int), type);
var dic = (IDictionary)Activator.CreateInstance(dicType);
if (list != null)
{
foreach (GameResource gameResource in list)
{
if (gameResource.Id == 0) continue;
dic.Add(gameResource.Id, gameResource);
}
}
return dic;
}
else
{
if (list == null)
list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
return list;
}
}
private Dictionary<string, string> Languages = new Dictionary<string, string>
@@ -191,12 +215,28 @@ namespace GrasscutterTools.Game.Data
#endregion Avatar
#region Dungeon
// Dungeon
File.WriteAllLines(
sb.Clear();
foreach (var it in DungeonData.Values)
{
if (!TextMapData.TryGetText(it.NameTextMapHash.ToString(), out var name))
{
var temp = GameData.Dungeons[it.Id];
if (temp != ItemMap.EmptyName)
name = temp;
}
sb.AppendFormat("{0}:{1}", it.Id, name).AppendLine();
}
File.WriteAllText(
Path.Combine(dir, "Dungeon.txt"),
DungeonData.Values.Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
sb.ToString(),
Encoding.UTF8);
//File.WriteAllLines(
// Path.Combine(dir, "Dungeon.txt"),
// DungeonData.Values.Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
// Encoding.UTF8);
#endregion Dungeon
@@ -286,11 +326,16 @@ namespace GrasscutterTools.Game.Data
if (m.Key == MaterialType.MATERIAL_BGM)
{
foreach (var materialData in m)
{
var param = int.Parse(materialData.ItemUse[0].UseParam[0]);
var name = HomeWorldBgmData.ContainsKey(param) ? TextMapData.GetText(
HomeWorldBgmData[param].BgmNameTextMapHash.ToString()) : string.Empty;
sb.AppendFormat("{0}:{1} - {2}",
materialData.Id,
TextMapData.GetText(materialData.NameTextMapHash.ToString()),
TextMapData.GetText(HomeWorldBgmData[int.Parse(materialData.ItemUse[0].UseParam[0])].BgmNameTextMapHash.ToString())
).AppendLine();
name);
sb.AppendLine();
}
}
else
{
@@ -403,6 +448,21 @@ namespace GrasscutterTools.Game.Data
#endregion Scene
#region CutScene
// CutScene
File.WriteAllLines(
Path.Combine(dir, "Cutscene.txt"),
CutSceneData.Select(it =>
{
var text = GameData.CutScenes[it.Id];
return text == ItemMap.EmptyName
? $"{it.Id}:{it.Path.Substring(it.Path.IndexOf('/') + 1)}"
: $"{it.Id}:{text}";
}), Encoding.UTF8);
#endregion CutScene
#region Weapon
// Weapon
@@ -414,6 +474,56 @@ namespace GrasscutterTools.Game.Data
#endregion Weapon
}
#region SceneTag
// SceneTag
sb.Clear();
foreach (var scene in SceneTagData
.GroupBy(it => it.SceneId))
{
sb.Append("// ").AppendLine(scene.Key.ToString());
foreach (var sceneTag in scene)
{
sb.Append($"{sceneTag.Id}:{sceneTag.SceneTagName}");
if (sceneTag.IsDefaultValid)
sb.Append(" (Default)");
sb.AppendLine();
}
}
File.WriteAllText(
Path.Combine(projectResourcesDir, "SceneTag.txt"),
sb.ToString(),
Encoding.UTF8);
#endregion
#region Weather
// Weather
sb.Clear();
foreach (var scene in WeatherData
.GroupBy(it => it.SceneId)
.OrderBy(it => it.Key))
{
sb.Append("// ").AppendLine(scene.Key.ToString());
foreach (var weather in scene)
{
var profileName = weather.ProfileName.Substring(weather.ProfileName.LastIndexOf('/') + 1)
.Replace("ESP_", "");
sb.AppendLine($"{weather.AreaId}:{profileName}");
}
}
File.WriteAllText(
Path.Combine(projectResourcesDir, "Weather.txt"),
sb.ToString(),
Encoding.UTF8);
#endregion
File.WriteAllLines(
Path.Combine(projectResourcesDir, "AvatarColor.txt"),
AvatarData.Values.Select(it => $"{it.Id % 1000 + 1000}:{(int)it.QualityType}"),

View File

@@ -17,6 +17,7 @@
*
**/
using System.Collections.Generic;
using GrasscutterTools.Properties;
namespace GrasscutterTools.Game
@@ -38,13 +39,30 @@ namespace GrasscutterTools.Game
Monsters = new ItemMapGroup(Resources.Monsters);
Gadgets = new ItemMapGroup(Resources.Gadget);
Scenes = new ItemMap(Resources.Scene);
SceneTags = new ItemMapGroup(Resources.SceneTag);
Dungeons = new ItemMap(Resources.Dungeon);
Weapons = new ItemMap(Resources.Weapon);
WeaponColors = new ItemMap(Resources.WeaponColor);
GachaBannerPrefabs = new ItemMap(Resources.GachaBennerPrefab);
GachaBannerTitles = new ItemMap(Resources.GachaBannerTitle);
GachaBannerPrefabs = ToDictionary(Resources.GachaBannerPrefab);
GachaBannerTitles = ToDictionary(Resources.GachaBannerTitle);
Quests = new ItemMap(Resources.Quest);
ShopType = new ItemMap(Resources.ShopType);
Weathers = new ItemMapGroup(Resources.Weather);
}
private static List<KeyValuePair<string, string>> ToDictionary(string file)
{
var lines = file.Split('\n');
var dic = new List<KeyValuePair<string, string>>(lines.Length);
foreach (var line in lines)
{
var i = line.IndexOf(':');
if (i <= 0) continue;
var key = line.Substring(0, i).Trim();
var value = line.Substring(i + 1).Trim();
dic.Add(new KeyValuePair<string, string>(key, value));
}
return dic;
}
public static ItemMap Achievements { get; private set; }
@@ -73,18 +91,22 @@ namespace GrasscutterTools.Game
public static ItemMap Scenes { get; private set; }
public static ItemMapGroup SceneTags { get; private set; }
public static ItemMap Dungeons { get; private set; }
public static ItemMap Weapons { get; private set; }
public static ItemMap WeaponColors { get; private set; }
public static ItemMap GachaBannerPrefabs { get; private set; }
public static List<KeyValuePair<string, string>> GachaBannerPrefabs { get; private set; }
public static ItemMap GachaBannerTitles { get; private set; }
public static List<KeyValuePair<string, string>> GachaBannerTitles { get; private set; }
public static ItemMap Quests { get; private set; }
public static ItemMap ShopType { get; private set; }
public static ItemMapGroup Weathers { get; private set; }
}
}

View File

@@ -2,7 +2,6 @@
// ReSharper disable InconsistentNaming
// ReSharper disable IdentifierTypo
using System;
using System.Collections.Generic;
namespace GrasscutterTools.Game.Inventory
@@ -12,54 +11,70 @@ namespace GrasscutterTools.Game.Inventory
/// </summary>
internal enum MaterialType
{
MATERIAL_NONE = 0,
MATERIAL_FOOD = 1,
MATERIAL_QUEST = 2,
MATERIAL_EXCHANGE = 4,
MATERIAL_CONSUME = 5,
MATERIAL_EXP_FRUIT = 6,
MATERIAL_AVATAR = 7,
MATERIAL_ADSORBATE = 8,
MATERIAL_CRICKET = 9,
MATERIAL_ELEM_CRYSTAL = 10,
MATERIAL_WEAPON_EXP_STONE = 11,
MATERIAL_CHEST = 12,
MATERIAL_RELIQUARY_MATERIAL = 13,
MATERIAL_AVATAR_MATERIAL = 14,
MATERIAL_NOTICE_ADD_HP = 15,
MATERIAL_SEA_LAMP = 16,
MATERIAL_SELECTABLE_CHEST = 17,
MATERIAL_FLYCLOAK = 18,
MATERIAL_NAMECARD = 19,
MATERIAL_TALENT = 20,
MATERIAL_WIDGET = 21,
MATERIAL_CHEST_BATCH_USE = 22,
MATERIAL_FAKE_ABSORBATE = 23,
MATERIAL_CONSUME_BATCH_USE = 24,
MATERIAL_WOOD = 25,
MATERIAL_FURNITURE_FORMULA = 27,
MATERIAL_CHANNELLER_SLAB_BUFF = 28,
MATERIAL_FURNITURE_SUITE_FORMULA = 29,
MATERIAL_COSTUME = 30,
MATERIAL_HOME_SEED = 31,
MATERIAL_FISH_BAIT = 32,
MATERIAL_FISH_ROD = 33,
MATERIAL_SUMO_BUFF = 34, // sumo 活动道具never appear
MATERIAL_FIREWORKS = 35,
MATERIAL_BGM = 36,
MATERIAL_SPICE_FOOD = 37,
MATERIAL_ACTIVITY_ROBOT = 38,
MATERIAL_ACTIVITY_GEAR = 39,
MATERIAL_ACTIVITY_JIGSAW = 40,
MATERIAL_ARANARA = 41,
MATERIAL_GCG_CARD = 42,
MATERIAL_GCG_CARD_FACE = 43, // 影幻卡面
MATERIAL_GCG_CARD_BACK = 44,
MATERIAL_GCG_FIELD = 45,
MATERIAL_DESHRET_MANUAL = 46,
MATERIAL_RENAME_ITEM = 47,
MATERIAL_GCG_EXCHANGE_ITEM = 48,
MATERIAL_QUEST_EVENT_BOOK = 49,
MATERIAL_NONE,
MATERIAL_FOOD,
MATERIAL_QUEST,
MATERIAL_EXCHANGE,
MATERIAL_CONSUME,
MATERIAL_EXP_FRUIT,
MATERIAL_AVATAR,
MATERIAL_ADSORBATE,
MATERIAL_CRICKET,
MATERIAL_ELEM_CRYSTAL,
MATERIAL_WEAPON_EXP_STONE,
MATERIAL_CHEST,
MATERIAL_RELIQUARY_MATERIAL,
MATERIAL_AVATAR_MATERIAL,
MATERIAL_NOTICE_ADD_HP,
MATERIAL_SEA_LAMP,
MATERIAL_SELECTABLE_CHEST,
MATERIAL_FLYCLOAK,
MATERIAL_NAMECARD,
MATERIAL_TALENT,
MATERIAL_WIDGET,
MATERIAL_CHEST_BATCH_USE,
MATERIAL_FAKE_ABSORBATE,
MATERIAL_CONSUME_BATCH_USE,
MATERIAL_WOOD,
MATERIAL_FURNITURE_FORMULA,
MATERIAL_CHANNELLER_SLAB_BUFF,
MATERIAL_FURNITURE_SUITE_FORMULA,
MATERIAL_COSTUME,
MATERIAL_HOME_SEED,
MATERIAL_FISH_BAIT,
MATERIAL_FISH_ROD,
MATERIAL_SUMO_BUFF, // sumo 活动道具never appear
MATERIAL_FIREWORKS,
MATERIAL_BGM,
MATERIAL_SPICE_FOOD,
MATERIAL_ACTIVITY_ROBOT,
MATERIAL_ACTIVITY_GEAR,
MATERIAL_ACTIVITY_JIGSAW,
MATERIAL_ARANARA,
MATERIAL_GCG_CARD,
MATERIAL_GCG_CARD_FACE, // 影幻卡面
MATERIAL_GCG_CARD_BACK,
MATERIAL_GCG_FIELD,
MATERIAL_DESHRET_MANUAL,
MATERIAL_RENAME_ITEM,
MATERIAL_GCG_EXCHANGE_ITEM,
MATERIAL_QUEST_EVENT_BOOK,
MATERIAL_PROFILE_PICTURE,
MATERIAL_RAINBOW_PRINCE_HAND_BOOK,
MATERIAL_PHOTO_DISPLAY_BOOK,
MATERIAL_REMUS_MUSIC_BOX,
MATERIAL_GREATEFESTIVALV2_INVITE,
MATERIAL_PHOTOGRAPH_POSE,
MATERIAL_FIRE_MASTER_AVATAR_TALENT_ITEM,
MATERIAL_PHOTOV5_HAND_BOOK,
MATERIAL_AVATAR_TRACE,
MATERIAL_CHEST_BATCH_USE_WITH_GROUP,
MATERIAL_NATLAN_RELATION_A,
MATERIAL_NATLAN_RELATION_B,
MATERIAL_LANV5_PAIMON_GREETING_CARD,
MATERIAL_NATLAN_RACE_ALBUM,
MATERIAL_NATLAN_RACE_ENVELOPE,
MATERIAL_MUSIC_GAME_BOOK_THEME,
}
internal static class MaterialTypeExtension
@@ -114,6 +129,22 @@ namespace GrasscutterTools.Game.Inventory
[MaterialType.MATERIAL_RENAME_ITEM] = "改名卡",
[MaterialType.MATERIAL_GCG_EXCHANGE_ITEM] = "七圣召唤-特殊卡",
[MaterialType.MATERIAL_QUEST_EVENT_BOOK] = "案件记录册",
[MaterialType.MATERIAL_PROFILE_PICTURE] = "头像道具",
[MaterialType.MATERIAL_RAINBOW_PRINCE_HAND_BOOK] = "特尔克西的奇幻历险",
[MaterialType.MATERIAL_PHOTO_DISPLAY_BOOK] = "纪念册",
[MaterialType.MATERIAL_REMUS_MUSIC_BOX] = "音乐盒",
[MaterialType.MATERIAL_GREATEFESTIVALV2_INVITE] = "邀请函",
[MaterialType.MATERIAL_PHOTOGRAPH_POSE] = "照相姿势",
[MaterialType.MATERIAL_FIRE_MASTER_AVATAR_TALENT_ITEM] = "燧原矿",
[MaterialType.MATERIAL_PHOTOV5_HAND_BOOK] = "回忆相册",
[MaterialType.MATERIAL_AVATAR_TRACE] = "游迹",
[MaterialType.MATERIAL_CHEST_BATCH_USE_WITH_GROUP] = "分享包",
[MaterialType.MATERIAL_NATLAN_RELATION_A] = "圣夜旅织A",
[MaterialType.MATERIAL_NATLAN_RELATION_B] = "圣夜旅织B",
[MaterialType.MATERIAL_LANV5_PAIMON_GREETING_CARD] = "祝柬",
[MaterialType.MATERIAL_NATLAN_RACE_ALBUM] = "砥砺之证",
[MaterialType.MATERIAL_NATLAN_RACE_ENVELOPE] = "纪念信件",
[MaterialType.MATERIAL_MUSIC_GAME_BOOK_THEME] = "音乐游戏书主题",
};
private static readonly Dictionary<MaterialType, string> TextMapEN = new Dictionary<MaterialType, string>
{
@@ -165,10 +196,28 @@ namespace GrasscutterTools.Game.Inventory
[MaterialType.MATERIAL_RENAME_ITEM] = "Rename_item",
[MaterialType.MATERIAL_GCG_EXCHANGE_ITEM] = "Gcg_exchange_item",
[MaterialType.MATERIAL_QUEST_EVENT_BOOK] = "Quest_event_book",
[MaterialType.MATERIAL_PROFILE_PICTURE] = "Profile_picture",
[MaterialType.MATERIAL_RAINBOW_PRINCE_HAND_BOOK] = "Thelxie's Fantastic Adventures",
[MaterialType.MATERIAL_PHOTO_DISPLAY_BOOK] = "Album",
[MaterialType.MATERIAL_REMUS_MUSIC_BOX] = "MusicBox",
[MaterialType.MATERIAL_GREATEFESTIVALV2_INVITE] = "Invitation",
[MaterialType.MATERIAL_PHOTOGRAPH_POSE] = "Photograph_pose",
[MaterialType.MATERIAL_FIRE_MASTER_AVATAR_TALENT_ITEM] = "Fire_master_avatar_talent_item",
[MaterialType.MATERIAL_PHOTOV5_HAND_BOOK] = "Photov5_hand_book",
[MaterialType.MATERIAL_AVATAR_TRACE] = "Avatar_trace",
[MaterialType.MATERIAL_CHEST_BATCH_USE_WITH_GROUP] = "Chest_batch_use_with_group",
[MaterialType.MATERIAL_NATLAN_RELATION_A] = "Natlan_relation_a",
[MaterialType.MATERIAL_NATLAN_RELATION_B] = "Natlan_relation_b",
[MaterialType.MATERIAL_LANV5_PAIMON_GREETING_CARD] = "Lanv5_paimon_greeting_card",
[MaterialType.MATERIAL_NATLAN_RACE_ALBUM] = "Natlan_race_album",
[MaterialType.MATERIAL_NATLAN_RACE_ENVELOPE] = "Natlan_race_envelope",
[MaterialType.MATERIAL_MUSIC_GAME_BOOK_THEME] = "Music_game_book_theme",
};
public static string ToTranslatedString(this MaterialType materialType, string language)
{
if (!TextMapCHS.ContainsKey(materialType))
return materialType.ToString();
return language.StartsWith("zh") ? TextMapCHS[materialType] : TextMapEN[materialType];
}
}

View File

@@ -70,7 +70,7 @@ namespace GrasscutterTools.Game
public IEnumerable<int> AllIds => Values.SelectMany(it => it.Ids);
private string[] lines;
public string[] Lines => lines ?? (lines = AllLines.ToArray());
public string[] Lines => lines ??= AllLines.ToArray();
public string this[int id]
{

View File

@@ -25,6 +25,7 @@ namespace GrasscutterTools.Game.Props
{
private static readonly Dictionary<string, string> TextMapCHS = new Dictionary<string, string>
{
["Avatar"] = "角色",
["Gear"] = "机关装置",
["Field"] = "领域",
["Bullet"] = "技能/飞弹",

View File

@@ -40,6 +40,8 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>11</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -49,6 +51,8 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>11</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Resources\IconGrasscutter.ico</ApplicationIcon>
@@ -87,6 +91,14 @@
<ItemGroup>
<Compile Include="DispatchServer\DispatchServerAPI.cs" />
<Compile Include="DispatchServer\Model\ServerStatus.cs" />
<Compile Include="Eavesdrop\Certifier.cs" />
<Compile Include="Eavesdrop\Eavesdropper.cs" />
<Compile Include="Eavesdrop\Event Args\RequestInterceptedEventArgs.cs" />
<Compile Include="Eavesdrop\Event Args\ResponseInterceptedEventArgs.cs" />
<Compile Include="Eavesdrop\Interceptors.cs" />
<Compile Include="Eavesdrop\Internals\INETOptions.cs" />
<Compile Include="Eavesdrop\Internals\NativeMethods.cs" />
<Compile Include="Eavesdrop\Network\EavesNode.cs" />
<Compile Include="Forms\FormActivityEditor.cs">
<SubType>Form</SubType>
</Compile>
@@ -152,6 +164,8 @@
<Compile Include="Game\Data\Excels\ReliquaryData.cs" />
<Compile Include="Game\Data\Excels\MonsterData.cs" />
<Compile Include="Game\Data\Excels\SceneData.cs" />
<Compile Include="Game\Data\Excels\SceneTagData.cs" />
<Compile Include="Game\Data\Excels\WeatherData.cs" />
<Compile Include="Game\Data\GameResource.cs" />
<Compile Include="Game\Data\GameResources.cs" />
<Compile Include="Game\Data\ResourceTypeAttribute.cs" />
@@ -267,6 +281,12 @@
<Compile Include="Pages\PageOpenCommand.Designer.cs">
<DependentUpon>PageOpenCommand.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageProxy.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageProxy.Designer.cs">
<DependentUpon>PageProxy.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageQuest.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -279,12 +299,24 @@
<Compile Include="Pages\PageScene.Designer.cs">
<DependentUpon>PageScene.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageSceneTag.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageSceneTag.Designer.cs">
<DependentUpon>PageSceneTag.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageSetProp.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageSetProp.Designer.cs">
<DependentUpon>PageSetProp.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageSettings.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageSettings.Designer.cs">
<DependentUpon>PageSettings.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageSpawn.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -303,6 +335,12 @@
<Compile Include="Pages\PageTools.Designer.cs">
<DependentUpon>PageTools.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageWeather.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageWeather.Designer.cs">
<DependentUpon>PageWeather.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.zh-TW.Designer.cs">
@@ -314,11 +352,13 @@
<Compile Include="Utils\ArtifactUtils.cs" />
<Compile Include="Utils\Common.cs" />
<Compile Include="Utils\GuiRedirect.cs" />
<Compile Include="Utils\HighDPIUtil.cs" />
<Compile Include="Utils\KeyGo.cs" />
<Compile Include="Utils\HotKeyItem.cs" />
<Compile Include="Utils\HttpHelper.cs" />
<Compile Include="Utils\Logger.cs" />
<Compile Include="Utils\GithubHelper.cs" />
<Compile Include="Utils\ProxyHelper.cs" />
<Compile Include="Utils\SparseSet.cs" />
<Compile Include="Utils\ToggleParser.cs" />
<Compile Include="Utils\UIUtil.cs" />
@@ -570,6 +610,18 @@
<EmbeddedResource Include="Pages\PageOpenCommand.zh-TW.resx">
<DependentUpon>PageOpenCommand.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageProxy.en-US.resx">
<DependentUpon>PageProxy.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageProxy.resx">
<DependentUpon>PageProxy.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageProxy.ru-RU.resx">
<DependentUpon>PageProxy.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageProxy.zh-TW.resx">
<DependentUpon>PageProxy.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageQuest.en-US.resx">
<DependentUpon>PageQuest.cs</DependentUpon>
</EmbeddedResource>
@@ -594,6 +646,18 @@
<EmbeddedResource Include="Pages\PageScene.zh-TW.resx">
<DependentUpon>PageScene.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSceneTag.en-US.resx">
<DependentUpon>PageSceneTag.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSceneTag.resx">
<DependentUpon>PageSceneTag.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSceneTag.ru-RU.resx">
<DependentUpon>PageSceneTag.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSceneTag.zh-TW.resx">
<DependentUpon>PageSceneTag.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSetProp.en-US.resx">
<DependentUpon>PageSetProp.cs</DependentUpon>
</EmbeddedResource>
@@ -606,6 +670,18 @@
<EmbeddedResource Include="Pages\PageSetProp.zh-TW.resx">
<DependentUpon>PageSetProp.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSettings.en-US.resx">
<DependentUpon>PageSettings.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSettings.resx">
<DependentUpon>PageSettings.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSettings.ru-RU.resx">
<DependentUpon>PageSettings.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSettings.zh-TW.resx">
<DependentUpon>PageSettings.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageSpawn.en-US.resx">
<DependentUpon>PageSpawn.cs</DependentUpon>
</EmbeddedResource>
@@ -634,6 +710,18 @@
<EmbeddedResource Include="Pages\PageTools.resx">
<DependentUpon>PageTools.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageWeather.en-US.resx">
<DependentUpon>PageWeather.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageWeather.resx">
<DependentUpon>PageWeather.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageWeather.ru-RU.resx">
<DependentUpon>PageWeather.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageWeather.zh-TW.resx">
<DependentUpon>PageWeather.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.zh-TW.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.zh-TW.Designer.cs</LastGenOutput>
@@ -669,6 +757,7 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Eavesdrop\LICENSE.md" />
<None Include="GrasscutterTools.licenseheader" />
<None Include="GrasscutterTools.snk" />
<None Include="Properties\Settings.settings">
@@ -699,8 +788,8 @@
<Content Include="Resources\en-us\CustomCommands.txt" />
<None Include="Resources\en-us\Dungeon.txt" />
<Content Include="Resources\en-us\Cutscene.txt" />
<Content Include="Resources\en-us\GachaBennerTitle.txt" />
<Content Include="Resources\en-us\GachaBennerPrefab.txt" />
<Content Include="Resources\en-us\GachaBannerTitle.txt" />
<Content Include="Resources\en-us\GachaBannerPrefab.txt" />
<Content Include="Resources\en-us\Gadget.txt" />
<Content Include="Resources\en-us\Item.txt" />
<Content Include="Resources\en-us\Monsters.txt" />
@@ -710,6 +799,7 @@
<Content Include="Resources\en-us\ShopType.txt" />
<Content Include="Resources\en-us\Weapon.txt" />
<None Include="Resources\Newtonsoft.Json.dll" />
<Content Include="Resources\en-us\Weather.txt" />
<Content Include="Resources\MyTools.java" />
<Content Include="Resources\ru-ru\Achievement.txt" />
<Content Include="Resources\ru-ru\Activity.txt" />
@@ -721,8 +811,8 @@
<Content Include="Resources\ru-ru\CustomCommands.txt" />
<None Include="Resources\ru-ru\Dungeon.txt" />
<Content Include="Resources\ru-ru\Cutscene.txt" />
<Content Include="Resources\ru-ru\GachaBennerTitle.txt" />
<Content Include="Resources\ru-ru\GachaBennerPrefab.txt" />
<Content Include="Resources\ru-ru\GachaBannerTitle.txt" />
<Content Include="Resources\ru-ru\GachaBannerPrefab.txt" />
<Content Include="Resources\ru-ru\Gadget.txt" />
<Content Include="Resources\ru-ru\Item.txt" />
<Content Include="Resources\ru-ru\Monsters.txt" />
@@ -735,7 +825,9 @@
<Content Include="Resources\IconGrasscutter.png" />
<None Include="Resources\ImgSupport.png" />
<Content Include="Resources\Permissions.txt" />
<Content Include="Resources\SceneTag.txt" />
<Content Include="Resources\WeaponColor.txt" />
<Content Include="Resources\zh-cn\Weather.txt" />
<Content Include="Resources\zh-cn\Achievement.txt" />
<Content Include="Resources\zh-cn\Activity.txt" />
<Content Include="Resources\zh-cn\ArtifactCat.txt" />
@@ -748,7 +840,7 @@
<None Include="Resources\zh-cn\Dungeon.txt" />
<Content Include="Resources\zh-cn\Cutscene.txt" />
<Content Include="Resources\zh-cn\GachaBannerTitle.txt" />
<Content Include="Resources\zh-cn\GachaBennerPrefab.txt" />
<Content Include="Resources\zh-cn\GachaBannerPrefab.txt" />
<Content Include="Resources\zh-cn\Gadget.txt" />
<Content Include="Resources\zh-cn\Item.txt" />
<Content Include="Resources\zh-cn\Monsters.txt" />
@@ -767,8 +859,8 @@
<Content Include="Resources\zh-tw\CustomCommands.txt" />
<None Include="Resources\zh-tw\Dungeon.txt" />
<Content Include="Resources\zh-tw\Cutscene.txt" />
<Content Include="Resources\zh-tw\GachaBennerTitle.txt" />
<Content Include="Resources\zh-tw\GachaBennerPrefab.txt" />
<Content Include="Resources\zh-tw\GachaBannerTitle.txt" />
<Content Include="Resources\zh-tw\GachaBannerPrefab.txt" />
<None Include="Resources\zh-tw\Gadget.txt" />
<Content Include="Resources\zh-tw\Item.txt" />
<Content Include="Resources\zh-tw\Monsters.txt" />

View File

@@ -44,11 +44,28 @@ namespace GrasscutterTools.OpenCommand
public bool CanInvoke { get; private set; }
private Version version = new Version(1, 6, 1);
public Version Version
{
get => version;
private set
{
version = value;
CanInvokeMultipleCmd = version >= new Version(1, 7);
}
}
public bool CanInvokeMultipleCmd { get; private set; }
public async Task<bool> Ping()
{
//try
//{
var response = await DoRequest("ping");
if (response.Data is string str && Version.TryParse(str, out var version))
Version = version;
return response.RetCode == 200;
//}
//catch (Exception)

View File

@@ -18,13 +18,15 @@
**/
using System.Windows.Forms;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
namespace GrasscutterTools.Pages
{
internal partial class PageAbout : BasePage
{
public override string Text => Resources.PageAboutTitle;
public PageAbout()
{
InitializeComponent();

View File

@@ -126,10 +126,10 @@
<data name="&gt;&gt;LblSupportDescription.Parent" xml:space="preserve">
<value>$this</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LnkGithub.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<data name="&gt;&gt;LblSupportDescription.Name" xml:space="preserve">
<value>LblSupportDescription</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LnkOpenChat.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom</value>
</data>
@@ -149,16 +149,10 @@
<data name="&gt;&gt;LnkGithub.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LnkOpenChat.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="LblSupportDescription.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="GrasscutterToolsSupport.Location" type="System.Drawing.Point, System.Drawing">
<value>498, 86</value>
</data>
@@ -194,13 +188,19 @@
<value>$this</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.8.1.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
<data name="GrasscutterToolsSupport.MaximumSize" type="System.Drawing.Size, System.Drawing">
<value>280, 280</value>
</data>
<data name="&gt;&gt;LnkOpenChat.Name" xml:space="preserve">
<value>LnkOpenChat</value>
</data>
<data name="&gt;&gt;LblSupportDescription.Name" xml:space="preserve">
<value>LblSupportDescription</value>
<data name="GrasscutterToolsSupport.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 140</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;LnkGithub.Name" xml:space="preserve">
<value>LnkGithub</value>
@@ -217,8 +217,8 @@
<data name="LnkOpenChat.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="GrasscutterToolsSupport.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 140</value>
<data name="LnkGithub.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="GrasscutterToolsSupport.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
@@ -226,8 +226,8 @@
<data name="&gt;&gt;GrasscutterToolsSupport.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GrasscutterToolsSupport.MaximumSize" type="System.Drawing.Size, System.Drawing">
<value>280, 280</value>
<data name="LnkOpenChat.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="LnkGithub.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -265,7 +265,4 @@
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>ru-RU</value>
</metadata>
</root>
</root>

View File

@@ -31,6 +31,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PageAchievement));
this.ListAchievements = new System.Windows.Forms.ListBox();
this.GrpAchievements = new System.Windows.Forms.GroupBox();
this.LblClearFilter = new System.Windows.Forms.Label();
this.TxtAchievementFilter = new System.Windows.Forms.TextBox();
this.LnkRevokeAll = new System.Windows.Forms.LinkLabel();
this.LnkGrantAll = new System.Windows.Forms.LinkLabel();
@@ -50,10 +51,12 @@
this.ListAchievements.FormattingEnabled = true;
this.ListAchievements.Name = "ListAchievements";
this.ListAchievements.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.ListAchievements.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListAchievements_MeasureItem);
//
// GrpAchievements
//
resources.ApplyResources(this.GrpAchievements, "GrpAchievements");
this.GrpAchievements.Controls.Add(this.LblClearFilter);
this.GrpAchievements.Controls.Add(this.TxtAchievementFilter);
this.GrpAchievements.Controls.Add(this.LnkRevokeAll);
this.GrpAchievements.Controls.Add(this.ListAchievements);
@@ -61,6 +64,14 @@
this.GrpAchievements.Name = "GrpAchievements";
this.GrpAchievements.TabStop = false;
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// TxtAchievementFilter
//
resources.ApplyResources(this.TxtAchievementFilter, "TxtAchievementFilter");
@@ -154,5 +165,6 @@
private System.Windows.Forms.TextBox TxtAchievementFilter;
private System.Windows.Forms.LinkLabel LnkRevokeAll;
private System.Windows.Forms.LinkLabel LnkGrantAll;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -10,6 +10,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageAchievement : BasePage
{
public override string Text => Resources.PageAchievementTitle;
public PageAchievement()
{
InitializeComponent();
@@ -52,6 +54,15 @@ namespace GrasscutterTools.Pages
private void TxtAchievementFilter_TextChanged(object sender, EventArgs e)
{
UpdateList();
LblClearFilter.Visible = TxtAchievementFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤器标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtAchievementFilter.Clear();
}
/// <summary>
@@ -98,5 +109,10 @@ namespace GrasscutterTools.Pages
{
GenSelected("/achievement progress", NUDProgress.Text);
}
private void ListAchievements_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = ListAchievements.Font.Height * 3 / 2;
}
}
}

View File

@@ -145,11 +145,47 @@
<value>GrpAchievements</value>
</data>
<data name="&gt;&gt;ListAchievements.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="GrpAchievements.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>617, 25</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>18</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>GrpAchievements</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="TxtAchievementFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
@@ -172,7 +208,7 @@
<value>GrpAchievements</value>
</data>
<data name="&gt;&gt;TxtAchievementFilter.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="LnkRevokeAll.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
@@ -202,7 +238,7 @@
<value>GrpAchievements</value>
</data>
<data name="&gt;&gt;LnkRevokeAll.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="LnkGrantAll.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
@@ -232,7 +268,7 @@
<value>GrpAchievements</value>
</data>
<data name="&gt;&gt;LnkGrantAll.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="GrpAchievements.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
@@ -394,6 +430,6 @@
<value>PageAchievement</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.9.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -22,12 +22,15 @@ using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
namespace GrasscutterTools.Pages
{
internal partial class PageAvatar : BasePage
{
public override string Text => Resources.PageAvatarTitle;
public PageAvatar()
{
InitializeComponent();

View File

@@ -39,6 +39,7 @@
this.BtnSaveCustomCommand = new System.Windows.Forms.Button();
this.TxtCustomName = new System.Windows.Forms.TextBox();
this.BtnAddHotKey = new System.Windows.Forms.Button();
this.LblClearFilter = new System.Windows.Forms.Label();
this.GrpCustomCommands.SuspendLayout();
this.SuspendLayout();
//
@@ -99,6 +100,7 @@
//
resources.ApplyResources(this.TxtCustomName, "TxtCustomName");
this.TxtCustomName.Name = "TxtCustomName";
this.TxtCustomName.TextChanged += new System.EventHandler(this.TxtCustomName_TextChanged);
this.TxtCustomName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtCustomName_KeyDown);
//
// BtnAddHotKey
@@ -108,10 +110,19 @@
this.BtnAddHotKey.UseVisualStyleBackColor = true;
this.BtnAddHotKey.Click += new System.EventHandler(this.BtnAddHotKey_Click);
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// PageCustomCommands
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.BtnAddHotKey);
this.Controls.Add(this.BtnExportCustomCommands);
this.Controls.Add(this.BtnLoadCustomCommands);
@@ -140,5 +151,6 @@
private System.Windows.Forms.Button BtnSaveCustomCommand;
private System.Windows.Forms.TextBox TxtCustomName;
private System.Windows.Forms.Button BtnAddHotKey;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -21,7 +21,7 @@ using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using GrasscutterTools.Forms;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
@@ -30,6 +30,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageCustomCommands : BasePage
{
public override string Text => Resources.PageCustomCommandsTitle;
public PageCustomCommands()
{
InitializeComponent();
@@ -249,8 +251,9 @@ namespace GrasscutterTools.Pages
}
}
public Action<string> OnAddHotKey;
/// <summary>
/// 点击添加快捷键时触发
/// </summary>
private void BtnAddHotKey_Click(object sender, EventArgs e)
{
var name = TxtCustomName.Text.Trim();
@@ -259,7 +262,27 @@ namespace GrasscutterTools.Pages
MessageBox.Show(Resources.CommandTagCannotBeEmpty, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
OnAddHotKey?.Invoke(name);
// 跳转到快捷键界面
FormMain.Instance.NavigateTo<PageHotKey>()?
.AddNewHotKey(name); // 设置标签
}
/// <summary>
/// 标签栏文本改变时触发
/// </summary>
private void TxtCustomName_TextChanged(object sender, EventArgs e)
{
LblClearFilter.Visible = TxtCustomName.Text.Length > 0;
}
/// <summary>
/// 点击清空标签栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtCustomName.Clear();
}
}
}

View File

@@ -148,7 +148,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="BtnLoadCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -178,7 +178,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="LblCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -211,7 +211,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblCustomName.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="GrpCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
@@ -301,7 +301,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="BtnRemoveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -331,7 +331,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="BtnSaveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -361,7 +361,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.ZOrder" xml:space="preserve">
<value>6</value>
<value>7</value>
</data>
<data name="TxtCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
@@ -385,7 +385,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;TxtCustomName.ZOrder" xml:space="preserve">
<value>7</value>
<value>8</value>
</data>
<data name="BtnAddHotKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -412,6 +412,42 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnAddHotKey.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>301, 213</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>19</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -424,6 +460,6 @@
<value>PageCustomCommands</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.12.2.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -154,6 +154,7 @@
resources.ApplyResources(this.ListSubAttributionChecked, "ListSubAttributionChecked");
this.ListSubAttributionChecked.FormattingEnabled = true;
this.ListSubAttributionChecked.Name = "ListSubAttributionChecked";
this.ListSubAttributionChecked.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListSubAttributionChecked_MeasureItem);
this.ListSubAttributionChecked.SelectedIndexChanged += new System.EventHandler(this.ListSubAttributionChecked_SelectedIndexChanged);
//
// LblArtifactLevel

View File

@@ -30,6 +30,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageGiveArtifact : BasePage
{
public override string Text => Resources.PageGetArtifactTitle;
public PageGiveArtifact()
{
InitializeComponent();
@@ -263,5 +265,10 @@ namespace GrasscutterTools.Pages
{
UIUtil.OpenURL("https://github.com/Penelopeep/CharacterBuilder");
}
private void ListSubAttributionChecked_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = ListSubAttributionChecked.Font.Height * 3 / 2;
}
}
}

View File

@@ -45,6 +45,7 @@
this.LblGiveCommandDescription = new System.Windows.Forms.Label();
this.CmbFilterItem = new System.Windows.Forms.ComboBox();
this.MenuItemFilter = new System.Windows.Forms.ContextMenuStrip(this.components);
this.LblClearFilter = new System.Windows.Forms.Label();
this.GrpGiveItemRecord.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUDGameItemAmout)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDGameItemLevel)).BeginInit();
@@ -103,6 +104,7 @@
resources.ApplyResources(this.ListGameItems, "ListGameItems");
this.ListGameItems.FormattingEnabled = true;
this.ListGameItems.Name = "ListGameItems";
this.ListGameItems.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListGameItems_MeasureItem);
this.ListGameItems.SelectedIndexChanged += new System.EventHandler(this.GiveItemsInputChanged);
//
// LblGameItemAmount
@@ -171,13 +173,23 @@
//
// MenuItemFilter
//
this.MenuItemFilter.ImageScalingSize = new System.Drawing.Size(24, 24);
this.MenuItemFilter.Name = "MenuSpawnEntityFilter";
resources.ApplyResources(this.MenuItemFilter, "MenuItemFilter");
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// PageGiveItem
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.CmbFilterItem);
this.Controls.Add(this.LblClearGiveItemLogs);
this.Controls.Add(this.BtnSaveGiveItemLog);
@@ -217,5 +229,6 @@
private System.Windows.Forms.Label LblGiveCommandDescription;
private System.Windows.Forms.ComboBox CmbFilterItem;
private System.Windows.Forms.ContextMenuStrip MenuItemFilter;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -33,6 +33,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageGiveItem : BasePage
{
public override string Text => Resources.PageGiveItemTitle;
public PageGiveItem()
{
InitializeComponent();
@@ -97,6 +99,15 @@ namespace GrasscutterTools.Pages
private void TxtGameItemFilter_TextChanged(object sender, EventArgs e)
{
LoadItemList();
LblClearFilter.Visible = TxtGameItemFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤器标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtGameItemFilter.Clear();
}
/// <summary>
@@ -238,5 +249,10 @@ namespace GrasscutterTools.Pages
}
#endregion -- --
private void ListGameItems_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = ListGameItems.Font.Height * 3 / 2;
}
}
}

View File

@@ -151,7 +151,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearGiveItemLogs.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="BtnSaveGiveItemLog.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
@@ -178,7 +178,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSaveGiveItemLog.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="BtnRemoveGiveItemLog.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
@@ -208,7 +208,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnRemoveGiveItemLog.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="GrpGiveItemRecord.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
@@ -262,7 +262,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;GrpGiveItemRecord.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="ChkDrop.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -295,7 +295,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;ChkDrop.ZOrder" xml:space="preserve">
<value>6</value>
<value>7</value>
</data>
<data name="TxtGameItemFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
@@ -319,7 +319,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;TxtGameItemFilter.ZOrder" xml:space="preserve">
<value>7</value>
<value>8</value>
</data>
<data name="ListGameItems.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
@@ -346,7 +346,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;ListGameItems.ZOrder" xml:space="preserve">
<value>8</value>
<value>9</value>
</data>
<data name="LblGameItemAmount.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -379,7 +379,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblGameItemAmount.ZOrder" xml:space="preserve">
<value>9</value>
<value>10</value>
</data>
<data name="LblGameItemLevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -412,7 +412,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblGameItemLevel.ZOrder" xml:space="preserve">
<value>10</value>
<value>11</value>
</data>
<data name="NUDGameItemAmout.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -436,7 +436,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;NUDGameItemAmout.ZOrder" xml:space="preserve">
<value>11</value>
<value>12</value>
</data>
<data name="NUDGameItemLevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -460,7 +460,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;NUDGameItemLevel.ZOrder" xml:space="preserve">
<value>12</value>
<value>13</value>
</data>
<data name="LblGiveCommandDescription.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -491,7 +491,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblGiveCommandDescription.ZOrder" xml:space="preserve">
<value>13</value>
<value>14</value>
</data>
<data name="CmbFilterItem.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
@@ -515,7 +515,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;CmbFilterItem.ZOrder" xml:space="preserve">
<value>0</value>
<value>2</value>
</data>
<metadata name="MenuItemFilter.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
@@ -529,6 +529,42 @@
<data name="&gt;&gt;MenuItemFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>626, 6</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
@@ -539,6 +575,6 @@
<value>PageGiveItem</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.12.1.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -39,6 +39,7 @@
this.NUDWeaponAmout = new System.Windows.Forms.NumericUpDown();
this.NUDWeaponLevel = new System.Windows.Forms.NumericUpDown();
this.ListWeapons = new System.Windows.Forms.ListBox();
this.LblClearFilter = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.NUDWeaponRefinement)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDWeaponAmout)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDWeaponLevel)).BeginInit();
@@ -140,12 +141,22 @@
resources.ApplyResources(this.ListWeapons, "ListWeapons");
this.ListWeapons.FormattingEnabled = true;
this.ListWeapons.Name = "ListWeapons";
this.ListWeapons.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListWeapons_MeasureItem);
this.ListWeapons.SelectedIndexChanged += new System.EventHandler(this.WeaponValueChanged);
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// PageGiveWeapon
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.ListWeapons);
this.Controls.Add(this.TxtWeaponFilter);
this.Controls.Add(this.NUDWeaponRefinement);
@@ -177,5 +188,6 @@
private System.Windows.Forms.NumericUpDown NUDWeaponAmout;
private System.Windows.Forms.NumericUpDown NUDWeaponLevel;
private System.Windows.Forms.ListBox ListWeapons;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -20,12 +20,15 @@
using System;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
namespace GrasscutterTools.Pages
{
internal partial class PageGiveWeapon : BasePage
{
public override string Text => Resources.PageGiveWeaponTitle;
public PageGiveWeapon()
{
InitializeComponent();
@@ -45,6 +48,15 @@ namespace GrasscutterTools.Pages
private void TxtWeaponFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListWeapons, GameData.Weapons.Lines, TxtWeaponFilter.Text);
LblClearFilter.Visible = TxtWeaponFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤器标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtWeaponFilter.Clear();
}
/// <summary>
@@ -70,5 +82,10 @@ namespace GrasscutterTools.Pages
{
SetCommand("/give", $"weapons x{NUDWeaponAmout.Value} lv{NUDWeaponLevel.Value} r{NUDWeaponRefinement.Value}");
}
private void ListWeapons_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
e.ItemHeight = ListWeapons.Font.Height * 3 / 2;
}
}
}

View File

@@ -151,7 +151,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnGiveAllWeapons.ZOrder" xml:space="preserve">
<value>8</value>
<value>9</value>
</data>
<data name="TxtWeaponFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
@@ -175,7 +175,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;TxtWeaponFilter.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="LblWeaponDescription.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
@@ -216,7 +216,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblWeaponDescription.ZOrder" xml:space="preserve">
<value>9</value>
<value>10</value>
</data>
<data name="LblWeaponRefinement.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -249,7 +249,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblWeaponRefinement.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="LblWeaponAmount.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -282,7 +282,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblWeaponAmount.ZOrder" xml:space="preserve">
<value>7</value>
<value>8</value>
</data>
<data name="LblWeaponLevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -315,7 +315,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblWeaponLevel.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="NUDWeaponRefinement.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -339,7 +339,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;NUDWeaponRefinement.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="NUDWeaponAmout.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -363,7 +363,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;NUDWeaponAmout.ZOrder" xml:space="preserve">
<value>6</value>
<value>7</value>
</data>
<data name="NUDWeaponLevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -387,7 +387,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;NUDWeaponLevel.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="ListWeapons.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Right</value>
@@ -414,6 +414,42 @@
<value>$this</value>
</data>
<data name="&gt;&gt;ListWeapons.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>626, 6</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>20</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -426,6 +462,6 @@
<value>PageGiveWeapon</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -36,19 +36,15 @@
this.BtnOpenTextMap = new System.Windows.Forms.Button();
this.BtnOpenGachaBannerEditor = new System.Windows.Forms.Button();
this.GrasscutterToolsIcon = new System.Windows.Forms.PictureBox();
this.GrpSettings = new System.Windows.Forms.GroupBox();
this.LblGCVersion = new System.Windows.Forms.Label();
this.CmbGcVersions = new System.Windows.Forms.ComboBox();
this.ChkTopMost = new System.Windows.Forms.CheckBox();
this.BtnActivityEditor = new System.Windows.Forms.Button();
this.LblTip1 = new System.Windows.Forms.Label();
this.LblTip2 = new System.Windows.Forms.Label();
this.LblTip3 = new System.Windows.Forms.Label();
this.LblTip4 = new System.Windows.Forms.Label();
this.LblTip5 = new System.Windows.Forms.Label();
this.CmbLanguage = new System.Windows.Forms.ComboBox();
this.LblLanguage = new System.Windows.Forms.Label();
this.NUDUid = new System.Windows.Forms.NumericUpDown();
this.ChkIncludeUID = new System.Windows.Forms.CheckBox();
this.LblDefaultUid = new System.Windows.Forms.Label();
this.BtnActivityEditor = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.GrasscutterToolsIcon)).BeginInit();
this.GrpSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUDUid)).BeginInit();
this.SuspendLayout();
//
// BtnOpenShopEditor
@@ -98,37 +94,42 @@
this.GrasscutterToolsIcon.Name = "GrasscutterToolsIcon";
this.GrasscutterToolsIcon.TabStop = false;
//
// GrpSettings
// BtnActivityEditor
//
resources.ApplyResources(this.GrpSettings, "GrpSettings");
this.GrpSettings.Controls.Add(this.LblGCVersion);
this.GrpSettings.Controls.Add(this.CmbGcVersions);
this.GrpSettings.Controls.Add(this.ChkTopMost);
this.GrpSettings.Controls.Add(this.CmbLanguage);
this.GrpSettings.Controls.Add(this.LblLanguage);
this.GrpSettings.Controls.Add(this.NUDUid);
this.GrpSettings.Controls.Add(this.ChkIncludeUID);
this.GrpSettings.Controls.Add(this.LblDefaultUid);
this.GrpSettings.Name = "GrpSettings";
this.GrpSettings.TabStop = false;
resources.ApplyResources(this.BtnActivityEditor, "BtnActivityEditor");
this.BtnActivityEditor.Name = "BtnActivityEditor";
this.BtnActivityEditor.UseVisualStyleBackColor = true;
this.BtnActivityEditor.Click += new System.EventHandler(this.BtnActivityEditor_Click);
//
// LblGCVersion
// LblTip1
//
resources.ApplyResources(this.LblGCVersion, "LblGCVersion");
this.LblGCVersion.Name = "LblGCVersion";
resources.ApplyResources(this.LblTip1, "LblTip1");
this.LblTip1.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblTip1.Name = "LblTip1";
//
// CmbGcVersions
// LblTip2
//
resources.ApplyResources(this.CmbGcVersions, "CmbGcVersions");
this.CmbGcVersions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CmbGcVersions.FormattingEnabled = true;
this.CmbGcVersions.Name = "CmbGcVersions";
resources.ApplyResources(this.LblTip2, "LblTip2");
this.LblTip2.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblTip2.Name = "LblTip2";
//
// ChkTopMost
// LblTip3
//
resources.ApplyResources(this.ChkTopMost, "ChkTopMost");
this.ChkTopMost.Name = "ChkTopMost";
this.ChkTopMost.UseVisualStyleBackColor = true;
resources.ApplyResources(this.LblTip3, "LblTip3");
this.LblTip3.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblTip3.Name = "LblTip3";
//
// LblTip4
//
resources.ApplyResources(this.LblTip4, "LblTip4");
this.LblTip4.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblTip4.Name = "LblTip4";
//
// LblTip5
//
resources.ApplyResources(this.LblTip5, "LblTip5");
this.LblTip5.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblTip5.Name = "LblTip5";
//
// CmbLanguage
//
@@ -140,59 +141,30 @@
// LblLanguage
//
resources.ApplyResources(this.LblLanguage, "LblLanguage");
this.LblLanguage.ForeColor = System.Drawing.SystemColors.GrayText;
this.LblLanguage.Name = "LblLanguage";
//
// NUDUid
//
resources.ApplyResources(this.NUDUid, "NUDUid");
this.NUDUid.Maximum = new decimal(new int[] {
2147483647,
0,
0,
0});
this.NUDUid.Name = "NUDUid";
this.NUDUid.Value = new decimal(new int[] {
10001,
0,
0,
0});
//
// ChkIncludeUID
//
resources.ApplyResources(this.ChkIncludeUID, "ChkIncludeUID");
this.ChkIncludeUID.Name = "ChkIncludeUID";
this.ChkIncludeUID.UseVisualStyleBackColor = true;
//
// LblDefaultUid
//
resources.ApplyResources(this.LblDefaultUid, "LblDefaultUid");
this.LblDefaultUid.Name = "LblDefaultUid";
//
// BtnActivityEditor
//
resources.ApplyResources(this.BtnActivityEditor, "BtnActivityEditor");
this.BtnActivityEditor.Name = "BtnActivityEditor";
this.BtnActivityEditor.UseVisualStyleBackColor = true;
this.BtnActivityEditor.Click += new System.EventHandler(this.BtnActivityEditor_Click);
//
// PageHome
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.CmbLanguage);
this.Controls.Add(this.LblLanguage);
this.Controls.Add(this.LblTip5);
this.Controls.Add(this.LblTip4);
this.Controls.Add(this.LblTip3);
this.Controls.Add(this.LblTip2);
this.Controls.Add(this.LblTip1);
this.Controls.Add(this.LnkNewVersion);
this.Controls.Add(this.BtnActivityEditor);
this.Controls.Add(this.LblAbout);
this.Controls.Add(this.BtnOpenTextMap);
this.Controls.Add(this.BtnOpenGachaBannerEditor);
this.Controls.Add(this.BtnOpenDropEditor);
this.Controls.Add(this.BtnOpenShopEditor);
this.Controls.Add(this.GrasscutterToolsIcon);
this.Controls.Add(this.GrpSettings);
this.Controls.Add(this.LnkNewVersion);
this.Controls.Add(this.LblAbout);
this.Name = "PageHome";
((System.ComponentModel.ISupportInitialize)(this.GrasscutterToolsIcon)).EndInit();
this.GrpSettings.ResumeLayout(false);
this.GrpSettings.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.NUDUid)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -207,15 +179,13 @@
private System.Windows.Forms.Button BtnOpenTextMap;
private System.Windows.Forms.Button BtnOpenGachaBannerEditor;
private System.Windows.Forms.PictureBox GrasscutterToolsIcon;
private System.Windows.Forms.GroupBox GrpSettings;
private System.Windows.Forms.Label LblGCVersion;
private System.Windows.Forms.ComboBox CmbGcVersions;
private System.Windows.Forms.CheckBox ChkTopMost;
private System.Windows.Forms.Button BtnActivityEditor;
private System.Windows.Forms.Label LblTip1;
private System.Windows.Forms.Label LblTip2;
private System.Windows.Forms.Label LblTip3;
private System.Windows.Forms.Label LblTip4;
private System.Windows.Forms.Label LblTip5;
private System.Windows.Forms.ComboBox CmbLanguage;
private System.Windows.Forms.Label LblLanguage;
private System.Windows.Forms.NumericUpDown NUDUid;
private System.Windows.Forms.CheckBox ChkIncludeUID;
private System.Windows.Forms.Label LblDefaultUid;
private System.Windows.Forms.Button BtnActivityEditor;
}
}

View File

@@ -19,14 +19,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using GrasscutterTools.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
@@ -34,6 +31,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageHome : BasePage
{
public override string Text => Resources.PageHomeTitle;
/// <summary>
/// 初始化首页设置
/// </summary>
@@ -42,26 +41,6 @@ namespace GrasscutterTools.Pages
InitializeComponent();
if (DesignMode) return;
// 玩家UID
NUDUid.Value = Settings.Default.Uid;
NUDUid.ValueChanged += (o, e) => Settings.Default.Uid = NUDUid.Value;
// 是否包含UID
ChkIncludeUID.Checked = Settings.Default.IsIncludeUID;
ChkIncludeUID.CheckedChanged += (o, e) => Settings.Default.IsIncludeUID = ChkIncludeUID.Checked;
// 置顶
ChkTopMost.Checked = Settings.Default.IsTopMost;
ChkTopMost.CheckedChanged += (o, e) => Settings.Default.IsTopMost = ParentForm.TopMost = ChkTopMost.Checked;
// 命令版本初始化
if (Version.TryParse(Settings.Default.CommandVersion, out Version current))
CommandVersion.Current = current;
CmbGcVersions.DataSource = CommandVersion.List.Select(it => it.ToString(3)).ToList();
CmbGcVersions.SelectedIndex = Array.IndexOf(CommandVersion.List, CommandVersion.Current);
CmbGcVersions.SelectedIndexChanged += (o, e) => CommandVersion.Current = CommandVersion.List[CmbGcVersions.SelectedIndex];
CommandVersion.VersionChanged += (o, e) => Settings.Default.CommandVersion = CommandVersion.Current.ToString(3);
// 初始化多语言
CmbLanguage.DataSource = MultiLanguage.LanguageNames;
if (string.IsNullOrEmpty(Settings.Default.DefaultLanguage))
@@ -76,7 +55,6 @@ namespace GrasscutterTools.Pages
CmbLanguage.SelectedIndex = Array.IndexOf(MultiLanguage.Languages, Settings.Default.DefaultLanguage);
}
CmbLanguage.SelectedIndexChanged += CmbLanguage_SelectedIndexChanged;
#if !DEBUG // 仅正式版
// 检查更新,但不要弹窗
Task.Run(async () => { try { await LoadUpdate(); } catch { /* 启动时检查更新,忽略异常 */ }});
@@ -115,7 +93,7 @@ namespace GrasscutterTools.Pages
form.TopMost = false;
}
private readonly Dictionary<string, Form> MyForms = new Dictionary<string, Form>();
private readonly Dictionary<string, Form> MyForms = new();
private void ShowForm<T>(string tag) where T : Form, new()
{
@@ -157,12 +135,7 @@ namespace GrasscutterTools.Pages
/// </summary>
private void BtnActivityEditor_Click(object sender, EventArgs e)
=> ShowForm<FormActivityEditor>("ActivityEditor");
/// <summary>
/// 当选中语言改变时触发
/// </summary>
public Action OnLanguageChanged { get; set; }
/// <summary>
/// 语言选中项改变时触发
/// </summary>
@@ -173,8 +146,8 @@ namespace GrasscutterTools.Pages
MultiLanguage.SetDefaultLanguage(MultiLanguage.Languages[CmbLanguage.SelectedIndex]);
// 动态更改语言
MultiLanguage.LoadLanguage(ParentForm, ParentForm.GetType());
// 通知语言改变
OnLanguageChanged?.Invoke();
// 重载界面
FormMain.Instance.Reload();
}
/// <summary>

View File

@@ -127,33 +127,12 @@
<value>Have a nice time!</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnOpenTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 23</value>
</data>
<data name="BtnOpenTextMap.Text" xml:space="preserve">
<value>TextMapBrowser</value>
</data>
<data name="BtnOpenGachaBannerEditor.Text" xml:space="preserve">
<value>Gacha Editor</value>
</data>
<data name="ChkTopMost.Size" type="System.Drawing.Size, System.Drawing">
<value>109, 21</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>Always on top</value>
</data>
<data name="ChkIncludeUID.Size" type="System.Drawing.Size, System.Drawing">
<value>95, 21</value>
</data>
<data name="ChkIncludeUID.Text" xml:space="preserve">
<value>Include UID</value>
</data>
<data name="GrpSettings.Text" xml:space="preserve">
<value>Settings</value>
</data>
<data name="BtnActivityEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>542, 213</value>
</data>
<data name="BtnActivityEditor.Text" xml:space="preserve">
<value>Activity Editor</value>
</data>

View File

@@ -117,508 +117,475 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnOpenShopEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnOpenShopEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblAbout.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
<data name="BtnOpenShopEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 118</value>
</data>
<data name="&gt;&gt;ChkTopMost.Name" xml:space="preserve">
<value>ChkTopMost</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Name" xml:space="preserve">
<value>GrasscutterToolsIcon</value>
<data name="BtnOpenShopEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 25</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LblLanguage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnOpenTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblGCVersion.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;LblGCVersion.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="&gt;&gt;NUDUid.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblDefaultUid.Text" xml:space="preserve">
<value>UID</value>
</data>
<data name="LblGCVersion.Text" xml:space="preserve">
<value>GC</value>
</data>
<data name="LblLanguage.Text" xml:space="preserve">
<value>语言/Language/язык</value>
</data>
<data name="ChkIncludeUID.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnOpenGachaBannerEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>310, 213</value>
</data>
<data name="&gt;&gt;CmbLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblLanguage.TabIndex" type="System.Int32, mscorlib">
<data name="BtnOpenShopEditor.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;LblLanguage.Name" xml:space="preserve">
<value>LblLanguage</value>
</data>
<data name="GrasscutterToolsIcon.Size" type="System.Drawing.Size, System.Drawing">
<value>333, 175</value>
</data>
<data name="&gt;&gt;ChkIncludeUID.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="BtnOpenTextMap.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="CmbGcVersions.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="LblAbout.Text" xml:space="preserve">
<value>祝你玩得愉快!</value>
</data>
<data name="&gt;&gt;LblDefaultUid.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="BtnActivityEditor.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnOpenDropEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>320, 102</value>
</data>
<data name="GrpSettings.Size" type="System.Drawing.Size, System.Drawing">
<value>301, 111</value>
</data>
<data name="LblDefaultUid.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblAbout.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="GrpSettings.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;BtnOpenShopEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblDefaultUid.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="GrasscutterToolsIcon.Location" type="System.Drawing.Point, System.Drawing">
<value>310, 3</value>
</data>
<data name="ChkIncludeUID.Text" xml:space="preserve">
<value>生成的命令包含UID</value>
</data>
<data name="LnkNewVersion.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageHome</value>
</data>
<data name="ChkIncludeUID.Location" type="System.Drawing.Point, System.Drawing">
<value>147, 23</value>
</data>
<data name="BtnOpenDropEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnOpenGachaBannerEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblDefaultUid.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;ChkIncludeUID.Name" xml:space="preserve">
<value>ChkIncludeUID</value>
</data>
<data name="GrasscutterToolsIcon.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>CenterImage</value>
<data name="BtnOpenShopEditor.Text" xml:space="preserve">
<value>商店编辑器</value>
</data>
<data name="&gt;&gt;BtnOpenShopEditor.Name" xml:space="preserve">
<value>BtnOpenShopEditor</value>
</data>
<data name="CmbLanguage.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="BtnOpenTextMap.Location" type="System.Drawing.Point, System.Drawing">
<value>416, 213</value>
</data>
<data name="&gt;&gt;LblAbout.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblAbout.Name" xml:space="preserve">
<value>LblAbout</value>
</data>
<data name="BtnOpenShopEditor.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;LblGCVersion.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;GrpSettings.Name" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="&gt;&gt;CmbGcVersions.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="BtnOpenGachaBannerEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="&gt;&gt;BtnOpenDropEditor.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnOpenDropEditor.Name" xml:space="preserve">
<value>BtnOpenDropEditor</value>
</data>
<data name="BtnOpenShopEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="ChkTopMost.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblDefaultUid.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnOpenDropEditor.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblAbout.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 13pt</value>
</data>
<data name="&gt;&gt;LblLanguage.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>窗口置顶</value>
</data>
<data name="GrpSettings.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 125</value>
<data name="&gt;&gt;BtnOpenShopEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnOpenShopEditor.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnOpenGachaBannerEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="&gt;&gt;BtnOpenShopEditor.ZOrder" xml:space="preserve">
<value>12</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="NUDUid.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="GrpSettings.Text" xml:space="preserve">
<value>设置</value>
</data>
<data name="BtnOpenTextMap.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="ChkIncludeUID.Size" type="System.Drawing.Size, System.Drawing">
<value>133, 21</value>
</data>
<data name="BtnOpenTextMap.Text" xml:space="preserve">
<value>文本浏览器</value>
</data>
<data name="LnkNewVersion.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<data name="BtnOpenDropEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;GrpSettings.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="NUDUid.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="LblDefaultUid.Size" type="System.Drawing.Size, System.Drawing">
<value>30, 17</value>
</data>
<data name="&gt;&gt;LblDefaultUid.Name" xml:space="preserve">
<value>LblDefaultUid</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Name" xml:space="preserve">
<value>BtnOpenTextMap</value>
</data>
<data name="LblAbout.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.9.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
<data name="LnkNewVersion.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="LnkNewVersion.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkTopMost.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="BtnOpenDropEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnActivityEditor.Text" xml:space="preserve">
<value>活动编辑器</value>
<data name="BtnOpenDropEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 149</value>
</data>
<data name="&gt;&gt;LblGCVersion.Name" xml:space="preserve">
<value>LblGCVersion</value>
<data name="BtnOpenDropEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 25</value>
</data>
<data name="&gt;&gt;ChkIncludeUID.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDUid.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="BtnOpenDropEditor.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="BtnOpenDropEditor.Text" xml:space="preserve">
<value>掉落物编辑器</value>
</data>
<data name="&gt;&gt;ChkTopMost.Parent" xml:space="preserve">
<value>GrpSettings</value>
<data name="&gt;&gt;BtnOpenDropEditor.Name" xml:space="preserve">
<value>BtnOpenDropEditor</value>
</data>
<data name="&gt;&gt;LblAbout.Parent" xml:space="preserve">
<data name="&gt;&gt;BtnOpenDropEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnOpenDropEditor.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;BtnOpenDropEditor.ZOrder" xml:space="preserve">
<value>11</value>
</data>
<data name="LblAbout.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
<data name="LnkNewVersion.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblGCVersion.AutoSize" type="System.Boolean, mscorlib">
<data name="LnkNewVersion.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;ChkTopMost.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblDefaultUid.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbLanguage.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblGCVersion.Size" type="System.Drawing.Size, System.Drawing">
<value>25, 17</value>
</data>
<data name="LblGCVersion.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="LnkNewVersion.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="CmbGcVersions.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 80</value>
<data name="LnkNewVersion.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 3</value>
</data>
<data name="CmbGcVersions.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 25</value>
<data name="LnkNewVersion.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 17</value>
</data>
<data name="&gt;&gt;GrpSettings.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="CmbLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 51</value>
</data>
<data name="&gt;&gt;CmbGcVersions.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="NUDUid.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 22</value>
</data>
<data name="&gt;&gt;CmbLanguage.Name" xml:space="preserve">
<value>CmbLanguage</value>
</data>
<data name="ChkTopMost.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 21</value>
</data>
<data name="&gt;&gt;CmbGcVersions.Name" xml:space="preserve">
<value>CmbGcVersions</value>
</data>
<data name="&gt;&gt;ChkTopMost.ZOrder" xml:space="preserve">
<value>2</value>
<data name="LnkNewVersion.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="LnkNewVersion.Text" xml:space="preserve">
<value>New Version Tip</value>
</data>
<data name="LnkNewVersion.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Name" xml:space="preserve">
<value>LnkNewVersion</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LnkNewVersion.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="LblAbout.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="LblAbout.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 13pt</value>
</data>
<data name="LblAbout.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblAbout.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="LblAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>320, 102</value>
</data>
<data name="LblAbout.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblAbout.Text" xml:space="preserve">
<value>祝你玩得愉快!</value>
</data>
<data name="LblAbout.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;LblAbout.Name" xml:space="preserve">
<value>LblAbout</value>
</data>
<data name="&gt;&gt;LblAbout.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblAbout.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblAbout.ZOrder" xml:space="preserve">
<value>14</value>
</data>
<data name="BtnOpenTextMap.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnOpenTextMap.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnOpenTextMap.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 211</value>
</data>
<data name="BtnOpenTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 25</value>
</data>
<data name="BtnOpenTextMap.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="BtnOpenTextMap.Text" xml:space="preserve">
<value>文本浏览器</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Name" xml:space="preserve">
<value>BtnOpenTextMap</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="BtnOpenGachaBannerEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnOpenGachaBannerEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnOpenGachaBannerEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 90</value>
</data>
<data name="BtnOpenGachaBannerEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 25</value>
</data>
<data name="BtnOpenGachaBannerEditor.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="BtnOpenGachaBannerEditor.Text" xml:space="preserve">
<value>奖池编辑器</value>
</data>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.Name" xml:space="preserve">
<value>BtnOpenGachaBannerEditor</value>
</data>
<data name="GrpSettings.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="LblLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>147, 54</value>
</data>
<data name="BtnOpenShopEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="GrasscutterToolsIcon.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="&gt;&gt;ChkIncludeUID.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;LnkNewVersion.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="LblLanguage.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnOpenDropEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnOpenDropEditor.ZOrder" xml:space="preserve">
<value>4</value>
<data name="&gt;&gt;BtnOpenGachaBannerEditor.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Type" xml:space="preserve">
<data name="GrasscutterToolsIcon.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="GrasscutterToolsIcon.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="GrasscutterToolsIcon.Location" type="System.Drawing.Point, System.Drawing">
<value>310, 3</value>
</data>
<data name="GrasscutterToolsIcon.Size" type="System.Drawing.Size, System.Drawing">
<value>333, 202</value>
</data>
<data name="GrasscutterToolsIcon.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>CenterImage</value>
</data>
<data name="GrasscutterToolsIcon.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Name" xml:space="preserve">
<value>GrasscutterToolsIcon</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.ZOrder" xml:space="preserve">
<value>13</value>
</data>
<data name="BtnActivityEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnActivityEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 180</value>
</data>
<data name="BtnActivityEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 25</value>
</data>
<data name="BtnActivityEditor.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="BtnActivityEditor.Text" xml:space="preserve">
<value>活动编辑器</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.Name" xml:space="preserve">
<value>BtnActivityEditor</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnOpenGachaBannerEditor.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
<data name="&gt;&gt;BtnActivityEditor.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="ChkIncludeUID.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
<data name="LblTip1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnActivityEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>522, 213</value>
<data name="LblTip1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnActivityEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
<data name="LblTip1.Location" type="System.Drawing.Point, System.Drawing">
<value>159, 94</value>
</data>
<data name="BtnOpenDropEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>416, 184</value>
<data name="LblTip1.Size" type="System.Drawing.Size, System.Drawing">
<value>118, 17</value>
</data>
<data name="ChkTopMost.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
<data name="LblTip1.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;NUDUid.ZOrder" xml:space="preserve">
<value>5</value>
<data name="LblTip1.Text" xml:space="preserve">
<value>/data/Banners.json</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.ZOrder" xml:space="preserve">
<value>2</value>
<data name="&gt;&gt;LblTip1.Name" xml:space="preserve">
<value>LblTip1</value>
</data>
<data name="&gt;&gt;NUDUid.Name" xml:space="preserve">
<value>NUDUid</value>
<data name="&gt;&gt;LblTip1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LnkNewVersion.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 17</value>
</data>
<data name="LblLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>128, 17</value>
</data>
<data name="&gt;&gt;BtnOpenTextMap.Parent" xml:space="preserve">
<data name="&gt;&gt;LblTip1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnOpenShopEditor.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnActivityEditor.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;CmbLanguage.Parent" xml:space="preserve">
<value>GrpSettings</value>
</data>
<data name="BtnOpenGachaBannerEditor.Text" xml:space="preserve">
<value>奖池编辑器</value>
</data>
<data name="LblAbout.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="&gt;&gt;GrasscutterToolsIcon.ZOrder" xml:space="preserve">
<data name="&gt;&gt;LblTip1.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;LblAbout.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LnkNewVersion.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;BtnOpenDropEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnOpenTextMap.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<data name="LblTip2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="ChkIncludeUID.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="LblTip2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;LnkNewVersion.Name" xml:space="preserve">
<value>LnkNewVersion</value>
<data name="LblTip2.Location" type="System.Drawing.Point, System.Drawing">
<value>159, 122</value>
</data>
<data name="LblTip2.Size" type="System.Drawing.Size, System.Drawing">
<value>101, 17</value>
</data>
<data name="LblTip2.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="LblTip2.Text" xml:space="preserve">
<value>/data/Shop.json</value>
</data>
<data name="&gt;&gt;LblTip2.Name" xml:space="preserve">
<value>LblTip2</value>
</data>
<data name="&gt;&gt;LblTip2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTip2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTip2.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="LblTip3.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTip3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTip3.Location" type="System.Drawing.Point, System.Drawing">
<value>159, 153</value>
</data>
<data name="LblTip3.Size" type="System.Drawing.Size, System.Drawing">
<value>101, 17</value>
</data>
<data name="LblTip3.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="LblTip3.Text" xml:space="preserve">
<value>/data/Drop.json</value>
</data>
<data name="&gt;&gt;LblTip3.Name" xml:space="preserve">
<value>LblTip3</value>
</data>
<data name="&gt;&gt;LblTip3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTip3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTip3.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="LblTip4.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTip4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTip4.Location" type="System.Drawing.Point, System.Drawing">
<value>159, 184</value>
</data>
<data name="LblTip4.Size" type="System.Drawing.Size, System.Drawing">
<value>149, 17</value>
</data>
<data name="LblTip4.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="LblTip4.Text" xml:space="preserve">
<value>/data/ActivityConfig.json</value>
</data>
<data name="&gt;&gt;LblTip4.Name" xml:space="preserve">
<value>LblTip4</value>
</data>
<data name="&gt;&gt;LblTip4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTip4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTip4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblTip5.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTip5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTip5.Location" type="System.Drawing.Point, System.Drawing">
<value>159, 215</value>
</data>
<data name="LblTip5.Size" type="System.Drawing.Size, System.Drawing">
<value>96, 17</value>
</data>
<data name="LblTip5.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="LblTip5.Text" xml:space="preserve">
<value>/Res/TextMaps</value>
</data>
<data name="&gt;&gt;LblTip5.Name" xml:space="preserve">
<value>LblTip5</value>
</data>
<data name="&gt;&gt;LblTip5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTip5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTip5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="CmbLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="CmbLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>543, 211</value>
</data>
<data name="CmbLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 25</value>
</data>
<data name="BtnOpenShopEditor.Text" xml:space="preserve">
<value>商店编辑器</value>
<data name="CmbLanguage.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
</data>
<data name="ChkTopMost.Location" type="System.Drawing.Point, System.Drawing">
<value>147, 82</value>
<data name="&gt;&gt;CmbLanguage.Name" xml:space="preserve">
<value>CmbLanguage</value>
</data>
<data name="&gt;&gt;BtnOpenShopEditor.ZOrder" xml:space="preserve">
<value>5</value>
<data name="&gt;&gt;CmbLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblGCVersion.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;CmbLanguage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="GrasscutterToolsIcon.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.ZOrder" xml:space="preserve">
<data name="&gt;&gt;CmbLanguage.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnOpenShopEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>310, 184</value>
<data name="LblLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="&gt;&gt;GrpSettings.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="LblLanguage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;CmbGcVersions.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnActivityEditor.Name" xml:space="preserve">
<value>BtnActivityEditor</value>
</data>
<data name="LblGCVersion.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 83</value>
</data>
<data name="LnkNewVersion.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 105</value>
</data>
<data name="LblDefaultUid.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 24</value>
</data>
<data name="GrasscutterToolsIcon.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="LblLanguage.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>409, 215</value>
</data>
<data name="LblLanguage.Size" type="System.Drawing.Size, System.Drawing">
<value>128, 17</value>
</data>
<data name="LblLanguage.TabIndex" type="System.Int32, mscorlib">
<value>16</value>
</data>
<data name="LblLanguage.Text" xml:space="preserve">
<value>语言/Language/язык</value>
</data>
<data name="&gt;&gt;LblLanguage.Name" xml:space="preserve">
<value>LblLanguage</value>
</data>
<data name="&gt;&gt;LblLanguage.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblLanguage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblLanguage.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageHome</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -117,84 +117,21 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnOpenShopEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 23</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnOpenShopEditor.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="BtnOpenShopEditor.Text" xml:space="preserve">
<value>Редактор магазина</value>
</data>
<data name="BtnOpenDropEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>456, 184</value>
</data>
<data name="BtnOpenDropEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 23</value>
</data>
<data name="BtnOpenDropEditor.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="BtnOpenDropEditor.Text" xml:space="preserve">
<value>Редактор дропа</value>
</data>
<data name="LblAbout.Text" xml:space="preserve">
<value>Желаем приятно провести время!</value>
</data>
<data name="BtnOpenTextMap.Location" type="System.Drawing.Point, System.Drawing">
<value>456, 213</value>
</data>
<data name="BtnOpenTextMap.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 23</value>
</data>
<data name="BtnOpenTextMap.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="BtnOpenTextMap.Text" xml:space="preserve">
<value>Браузер карт</value>
</data>
<data name="BtnOpenGachaBannerEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 23</value>
</data>
<data name="BtnOpenGachaBannerEditor.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="BtnOpenGachaBannerEditor.Text" xml:space="preserve">
<value>Редактор баннеров</value>
</data>
<data name="GrasscutterToolsIcon.Size" type="System.Drawing.Size, System.Drawing">
<value>333, 146</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="GrasscutterToolsIcon.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>Zoom</value>
</data>
<data name="GrpSettings.Text" xml:space="preserve">
<value>Настройки</value>
</data>
<data name="ChkTopMost.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 21</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>Последняя версия</value>
</data>
<data name="ChkIncludeUID.Size" type="System.Drawing.Size, System.Drawing">
<value>113, 21</value>
</data>
<data name="ChkIncludeUID.Text" xml:space="preserve">
<value>Включить UID</value>
</data>
<data name="BtnActivityEditor.Location" type="System.Drawing.Point, System.Drawing">
<value>310, 155</value>
</data>
<data name="BtnActivityEditor.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 23</value>
</data>
<data name="BtnActivityEditor.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="BtnActivityEditor.Text" xml:space="preserve">
<value>Редактор активности</value>
</data>

View File

@@ -129,12 +129,6 @@
<data name="BtnOpenGachaBannerEditor.Text" xml:space="preserve">
<value>獎池編輯器</value>
</data>
<data name="GrpSettings.Text" xml:space="preserve">
<value>設置</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>窗口置頂</value>
</data>
<data name="BtnActivityEditor.Text" xml:space="preserve">
<value>活動編輯器</value>
</data>

View File

@@ -34,12 +34,14 @@
this.ColHotKey = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.ColCommand = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.GrpHotKeyList = new System.Windows.Forms.GroupBox();
this.ChkEnableGlobal = new System.Windows.Forms.CheckBox();
this.BtnRemove = new System.Windows.Forms.Button();
this.BtnAddOrUpdate = new System.Windows.Forms.Button();
this.TxtHotKey = new System.Windows.Forms.TextBox();
this.LblHotKeyLabel = new System.Windows.Forms.Label();
this.TxtTag = new System.Windows.Forms.TextBox();
this.LblTagLabel = new System.Windows.Forms.Label();
this.LblClearFilter = new System.Windows.Forms.Label();
this.GrpHotKeyList.SuspendLayout();
this.SuspendLayout();
//
@@ -73,10 +75,20 @@
// GrpHotKeyList
//
resources.ApplyResources(this.GrpHotKeyList, "GrpHotKeyList");
this.GrpHotKeyList.Controls.Add(this.ChkEnableGlobal);
this.GrpHotKeyList.Controls.Add(this.LvHotKeyList);
this.GrpHotKeyList.Name = "GrpHotKeyList";
this.GrpHotKeyList.TabStop = false;
//
// ChkEnableGlobal
//
resources.ApplyResources(this.ChkEnableGlobal, "ChkEnableGlobal");
this.ChkEnableGlobal.Checked = true;
this.ChkEnableGlobal.CheckState = System.Windows.Forms.CheckState.Checked;
this.ChkEnableGlobal.Name = "ChkEnableGlobal";
this.ChkEnableGlobal.UseVisualStyleBackColor = true;
this.ChkEnableGlobal.CheckedChanged += new System.EventHandler(this.ChkEnableGlobal_CheckedChanged);
//
// BtnRemove
//
resources.ApplyResources(this.BtnRemove, "BtnRemove");
@@ -108,16 +120,26 @@
//
resources.ApplyResources(this.TxtTag, "TxtTag");
this.TxtTag.Name = "TxtTag";
this.TxtTag.TextChanged += new System.EventHandler(this.TxtTag_TextChanged);
//
// LblTagLabel
//
resources.ApplyResources(this.LblTagLabel, "LblTagLabel");
this.LblTagLabel.Name = "LblTagLabel";
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// PageHotKey
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.BtnRemove);
this.Controls.Add(this.BtnAddOrUpdate);
this.Controls.Add(this.GrpHotKeyList);
@@ -127,6 +149,7 @@
this.Controls.Add(this.LblTagLabel);
this.Name = "PageHotKey";
this.GrpHotKeyList.ResumeLayout(false);
this.GrpHotKeyList.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -145,5 +168,7 @@
private System.Windows.Forms.Label LblHotKeyLabel;
private System.Windows.Forms.TextBox TxtTag;
private System.Windows.Forms.Label LblTagLabel;
private System.Windows.Forms.CheckBox ChkEnableGlobal;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -32,6 +32,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageHotKey : BasePage
{
public override string Text => Resources.PageHotKey;
private const string TAG = nameof(PageHotKey);
public PageHotKey()
@@ -53,6 +55,38 @@ namespace GrasscutterTools.Pages
/// </summary>
private bool HotKeysChanged;
/// <summary>
/// 加载用户热键列表
/// </summary>
private List<HotKeyItem> LoadKeyItems()
{
List<HotKeyItem> list = null;
try
{
Logger.I(TAG, "Loading HotKey json file from: " + HotKeysFilePath);
list = JsonConvert.DeserializeObject<List<HotKeyItem>>(File.ReadAllText(HotKeysFilePath));
}
catch (Exception ex)
{
Logger.E(TAG, "Parsing HotKeys.json failed", ex);
}
if (list == null || list.Count == 0)
{
// 默认把移动命令加到列表
list = new List<HotKeyItem>
{
new("↑", "/tp ^ ^ ^10", "NumPad8", false),
new("↓", "/tp ^ ^ ^-10", "NumPad5", false),
new("←", "/tp ^-10 ^ ^", "NumPad4", false),
new("→", "/tp ^10 ^ ^", "NumPad6", false),
new("↑^↑", "/tp ~ ~10 ~", "NumPad0", false),
};
}
return list;
}
/// <summary>
/// 初始化快捷键
/// </summary>
@@ -62,15 +96,16 @@ namespace GrasscutterTools.Pages
return;
try
{
Logger.I(TAG, "Loading HotKey json file from: " + HotKeysFilePath);
Common.KeyGo.Items = JsonConvert.DeserializeObject<List<HotKeyItem>>(File.ReadAllText(HotKeysFilePath));
// 还原设置
Common.KeyGo.IsEnabled = ChkEnableGlobal.Checked = Settings.Default.IsHotkeyEenabled;
Common.KeyGo.Items = LoadKeyItems();
LvHotKeyList.Items.AddRange(Common.KeyGo.Items.Select(HotKeyItemToViewItem).ToArray());
Logger.I(TAG, "Start Register All HotKeys");
Common.KeyGo.RegAllKey();
}
catch (Exception ex)
{
Logger.W(TAG, "Parsing HotKeys.json failed.", ex);
Logger.W(TAG, "Failed to InitHotKeys", ex);
}
}
@@ -79,6 +114,8 @@ namespace GrasscutterTools.Pages
/// </summary>
public override void OnClosed()
{
Settings.Default.IsHotkeyEenabled = Common.KeyGo.IsEnabled;
Logger.I(TAG, "Cancel all HotKeys");
Common.KeyGo.UnRegAllKey();
@@ -90,7 +127,7 @@ namespace GrasscutterTools.Pages
/// <summary>
/// 将实体转为视图对象
/// </summary>
private static ListViewItem HotKeyItemToViewItem(HotKeyItem item) => new ListViewItem(new[]
private static ListViewItem HotKeyItemToViewItem(HotKeyItem item) => new(new[]
{
item.Tag,
item.HotKey,
@@ -130,12 +167,7 @@ namespace GrasscutterTools.Pages
var i = Common.KeyGo.Items.FindIndex(it => it.Tag == tag);
if (i == -1)
{
var item = new HotKeyItem
{
Tag = tag,
Commands = commands,
HotKey = hotKey
};
var item = new HotKeyItem(tag, commands, hotKey);
Logger.I(TAG, $"New HotKey item [{hotKey}]");
Common.KeyGo.AddHotKey(item);
LvHotKeyList.Items.Add(HotKeyItemToViewItem(item));
@@ -260,5 +292,38 @@ namespace GrasscutterTools.Pages
TxtHotKey.Tag = "";
TxtTag.Text = tag;
}
/// <summary>
/// 切换启用全局快捷键时触发
/// </summary>
private void ChkEnableGlobal_CheckedChanged(object sender, EventArgs e)
{
try
{
Common.KeyGo.IsEnabled = ChkEnableGlobal.Checked;
}
catch (Exception ex)
{
Logger.E(TAG, "Failed to switch global hotkeys", ex);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
/// <summary>
/// 标签输入栏改变时触发
/// </summary>
private void TxtTag_TextChanged(object sender, EventArgs e)
{
LblClearFilter.Visible = TxtTag.Text.Length > 0;
}
/// <summary>
/// 点击清空标签输入栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtTag.Clear();
}
}
}

View File

@@ -126,6 +126,16 @@
<data name="ColCommand.Text" xml:space="preserve">
<value>Commands</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ChkEnableGlobal.Location" type="System.Drawing.Point, System.Drawing">
<value>523, -2</value>
</data>
<data name="ChkEnableGlobal.Size" type="System.Drawing.Size, System.Drawing">
<value>111, 21</value>
</data>
<data name="ChkEnableGlobal.Text" xml:space="preserve">
<value>Global HotKey</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>HotKeys</value>
</data>
@@ -135,7 +145,6 @@
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ AddOrUpdate</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblHotKeyLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
</data>

View File

@@ -160,11 +160,41 @@
<value>GrpHotKeyList</value>
</data>
<data name="&gt;&gt;LvHotKeyList.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="GrpHotKeyList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="ChkEnableGlobal.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="ChkEnableGlobal.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkEnableGlobal.Location" type="System.Drawing.Point, System.Drawing">
<value>547, -2</value>
</data>
<data name="ChkEnableGlobal.Size" type="System.Drawing.Size, System.Drawing">
<value>87, 21</value>
</data>
<data name="ChkEnableGlobal.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="ChkEnableGlobal.Text" xml:space="preserve">
<value>全局快捷键</value>
</data>
<data name="&gt;&gt;ChkEnableGlobal.Name" xml:space="preserve">
<value>ChkEnableGlobal</value>
</data>
<data name="&gt;&gt;ChkEnableGlobal.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkEnableGlobal.Parent" xml:space="preserve">
<value>GrpHotKeyList</value>
</data>
<data name="&gt;&gt;ChkEnableGlobal.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="GrpHotKeyList.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
@@ -187,7 +217,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;GrpHotKeyList.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="BtnRemove.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -214,7 +244,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnRemove.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="BtnAddOrUpdate.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
@@ -241,10 +271,10 @@
<value>$this</value>
</data>
<data name="&gt;&gt;BtnAddOrUpdate.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="TxtHotKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
<value>Bottom, Right</value>
</data>
<data name="TxtHotKey.Location" type="System.Drawing.Point, System.Drawing">
<value>262, 210</value>
@@ -268,10 +298,10 @@
<value>$this</value>
</data>
<data name="&gt;&gt;TxtHotKey.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="LblHotKeyLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
<value>Bottom, Right</value>
</data>
<data name="LblHotKeyLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -298,7 +328,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblHotKeyLabel.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="TxtTag.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
@@ -322,7 +352,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;TxtTag.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="LblTagLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
@@ -352,7 +382,43 @@
<value>$this</value>
</data>
<data name="&gt;&gt;LblTagLabel.ZOrder" xml:space="preserve">
<value>6</value>
<value>7</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>189, 213</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>21</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
@@ -382,6 +448,6 @@
<value>PageHotKey</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.11.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -126,6 +126,16 @@
<data name="ColCommand.Text" xml:space="preserve">
<value>Commands</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ChkEnableGlobal.Location" type="System.Drawing.Point, System.Drawing">
<value>523, -2</value>
</data>
<data name="ChkEnableGlobal.Size" type="System.Drawing.Size, System.Drawing">
<value>111, 21</value>
</data>
<data name="ChkEnableGlobal.Text" xml:space="preserve">
<value>Global HotKey</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>HotKeys</value>
</data>
@@ -135,7 +145,6 @@
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ AddOrUpdate</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblHotKeyLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
</data>

View File

@@ -123,6 +123,9 @@
<data name="ColHotKey.Text" xml:space="preserve">
<value>快捷鍵</value>
</data>
<data name="ChkEnableGlobal.Text" xml:space="preserve">
<value>全域快速鍵</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>快捷執行列表</value>
</data>

View File

@@ -34,6 +34,7 @@
this.BtnDeleteMailItem = new System.Windows.Forms.Button();
this.TCMailRight = new System.Windows.Forms.TabControl();
this.TPMailSelectableItemList = new System.Windows.Forms.TabPage();
this.LblClearFilter = new System.Windows.Forms.Label();
this.ListMailSelectableItems = new System.Windows.Forms.ListBox();
this.TxtMailSelectableItemFilter = new System.Windows.Forms.TextBox();
this.PanelMailItemArgs = new System.Windows.Forms.Panel();
@@ -100,6 +101,7 @@
//
// TPMailSelectableItemList
//
this.TPMailSelectableItemList.Controls.Add(this.LblClearFilter);
this.TPMailSelectableItemList.Controls.Add(this.ListMailSelectableItems);
this.TPMailSelectableItemList.Controls.Add(this.TxtMailSelectableItemFilter);
this.TPMailSelectableItemList.Controls.Add(this.PanelMailItemArgs);
@@ -107,6 +109,14 @@
this.TPMailSelectableItemList.Name = "TPMailSelectableItemList";
this.TPMailSelectableItemList.UseVisualStyleBackColor = true;
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// ListMailSelectableItems
//
resources.ApplyResources(this.ListMailSelectableItems, "ListMailSelectableItems");
@@ -226,6 +236,7 @@
resources.ApplyResources(this.ListMailItems, "ListMailItems");
this.ListMailItems.FormattingEnabled = true;
this.ListMailItems.Name = "ListMailItems";
this.ListMailItems.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListMailItems_MeasureItem);
//
// LblMailItemsLabel
//
@@ -365,5 +376,6 @@
private System.Windows.Forms.Label LblMailTitleLabel;
private System.Windows.Forms.TextBox TxtMailSender;
private System.Windows.Forms.Label LblMailSenderLabel;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -34,6 +34,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageMail : BasePage
{
public override string Text => Resources.PageMailTitle;
public PageMail()
{
InitializeComponent();
@@ -199,6 +201,15 @@ namespace GrasscutterTools.Pages
private void TxtMailSelectableItemFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListMailSelectableItems, MailSelectableItems, TxtMailSelectableItemFilter.Text);
LblClearFilter.Visible = TxtMailSelectableItemFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtMailSelectableItemFilter.Clear();
}
#endregion -- Mail item selectable list --
@@ -287,5 +298,10 @@ namespace GrasscutterTools.Pages
}
#endregion -- Mail list --
private void ListMailItems_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = ListMailItems.Font.Height * 3 / 2;
}
}
}

View File

@@ -213,6 +213,60 @@
<data name="TCMailRight.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>206, 6</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>22</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="ListMailSelectableItems.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="ListMailSelectableItems.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="ListMailSelectableItems.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 26</value>
</data>
<data name="ListMailSelectableItems.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="ListMailSelectableItems.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 141</value>
</data>
<data name="ListMailSelectableItems.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.Name" xml:space="preserve">
<value>ListMailSelectableItems</value>
</data>
@@ -223,6 +277,18 @@
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="TxtMailSelectableItemFilter.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="TxtMailSelectableItemFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="TxtMailSelectableItemFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 23</value>
</data>
<data name="TxtMailSelectableItemFilter.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.Name" xml:space="preserve">
@@ -235,8 +301,122 @@
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="NUDMailItemLevel.Location" type="System.Drawing.Point, System.Drawing">
<value>171, 5</value>
</data>
<data name="NUDMailItemLevel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 23</value>
</data>
<data name="NUDMailItemLevel.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Name" xml:space="preserve">
<value>NUDMailItemLevel</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="NUDMailItemCount.Location" type="System.Drawing.Point, System.Drawing">
<value>47, 5</value>
</data>
<data name="NUDMailItemCount.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 23</value>
</data>
<data name="NUDMailItemCount.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Name" xml:space="preserve">
<value>NUDMailItemCount</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblMailItemCount.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblMailItemCount.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblMailItemCount.Location" type="System.Drawing.Point, System.Drawing">
<value>-3, 7</value>
</data>
<data name="LblMailItemCount.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="LblMailItemCount.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblMailItemCount.Text" xml:space="preserve">
<value>数量:</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Name" xml:space="preserve">
<value>LblMailItemCount</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemCount.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="LblMailItemLevel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblMailItemLevel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblMailItemLevel.Location" type="System.Drawing.Point, System.Drawing">
<value>123, 7</value>
</data>
<data name="LblMailItemLevel.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="LblMailItemLevel.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="LblMailItemLevel.Text" xml:space="preserve">
<value>等级:</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Name" xml:space="preserve">
<value>LblMailItemLevel</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="PanelMailItemArgs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="PanelMailItemArgs.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 167</value>
</data>
<data name="PanelMailItemArgs.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 30</value>
</data>
<data name="PanelMailItemArgs.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.Name" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
@@ -247,7 +427,7 @@
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="TPMailSelectableItemList.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 26</value>
@@ -432,234 +612,6 @@
<data name="&gt;&gt;TCMailRight.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="ListMailSelectableItems.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="ListMailSelectableItems.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="ListMailSelectableItems.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 26</value>
</data>
<data name="ListMailSelectableItems.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="ListMailSelectableItems.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 141</value>
</data>
<data name="ListMailSelectableItems.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.Name" xml:space="preserve">
<value>ListMailSelectableItems</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.Parent" xml:space="preserve">
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;ListMailSelectableItems.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="TxtMailSelectableItemFilter.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="TxtMailSelectableItemFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="TxtMailSelectableItemFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 23</value>
</data>
<data name="TxtMailSelectableItemFilter.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.Name" xml:space="preserve">
<value>TxtMailSelectableItemFilter</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.Parent" xml:space="preserve">
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;TxtMailSelectableItemFilter.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Name" xml:space="preserve">
<value>NUDMailItemLevel</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Name" xml:space="preserve">
<value>NUDMailItemCount</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Name" xml:space="preserve">
<value>LblMailItemCount</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemCount.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Name" xml:space="preserve">
<value>LblMailItemLevel</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="PanelMailItemArgs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="PanelMailItemArgs.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 167</value>
</data>
<data name="PanelMailItemArgs.Size" type="System.Drawing.Size, System.Drawing">
<value>222, 30</value>
</data>
<data name="PanelMailItemArgs.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.Name" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.Parent" xml:space="preserve">
<value>TPMailSelectableItemList</value>
</data>
<data name="&gt;&gt;PanelMailItemArgs.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="NUDMailItemLevel.Location" type="System.Drawing.Point, System.Drawing">
<value>171, 5</value>
</data>
<data name="NUDMailItemLevel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 23</value>
</data>
<data name="NUDMailItemLevel.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Name" xml:space="preserve">
<value>NUDMailItemLevel</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemLevel.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="NUDMailItemCount.Location" type="System.Drawing.Point, System.Drawing">
<value>47, 5</value>
</data>
<data name="NUDMailItemCount.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 23</value>
</data>
<data name="NUDMailItemCount.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Name" xml:space="preserve">
<value>NUDMailItemCount</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;NUDMailItemCount.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblMailItemCount.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblMailItemCount.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblMailItemCount.Location" type="System.Drawing.Point, System.Drawing">
<value>-3, 7</value>
</data>
<data name="LblMailItemCount.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="LblMailItemCount.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblMailItemCount.Text" xml:space="preserve">
<value>数量:</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Name" xml:space="preserve">
<value>LblMailItemCount</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemCount.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemCount.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="LblMailItemLevel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblMailItemLevel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblMailItemLevel.Location" type="System.Drawing.Point, System.Drawing">
<value>123, 7</value>
</data>
<data name="LblMailItemLevel.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="LblMailItemLevel.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="LblMailItemLevel.Text" xml:space="preserve">
<value>等级:</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Name" xml:space="preserve">
<value>LblMailItemLevel</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.Parent" xml:space="preserve">
<value>PanelMailItemArgs</value>
</data>
<data name="&gt;&gt;LblMailItemLevel.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="BtnSendMail.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
@@ -1033,6 +985,6 @@
<value>PageMail</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -28,6 +28,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageManagement : BasePage
{
public override string Text => Resources.PageManagementTitle;
public PageManagement()
{
InitializeComponent();

View File

@@ -286,8 +286,8 @@
//
resources.ApplyResources(this.TxtHost, "TxtHost");
this.TxtHost.Name = "TxtHost";
this.TxtHost.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtHost_KeyDown);
this.TxtHost.SelectedIndexChanged += new System.EventHandler(this.TxtHost_SelectedIndexChanged);
this.TxtHost.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtHost_KeyDown);
//
// BtnQueryServerStatus
//

View File

@@ -24,7 +24,6 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using GrasscutterTools.DispatchServer;
using GrasscutterTools.DispatchServer.Model;
using GrasscutterTools.Game;
@@ -39,6 +38,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageOpenCommand : BasePage
{
public override string Text => Resources.PageOpenCommandTitle;
private const string TAG = nameof(PageOpenCommand);
public PageOpenCommand()
@@ -47,6 +48,8 @@ namespace GrasscutterTools.Pages
if (DesignMode) return;
InitServerRecords();
if (!string.IsNullOrEmpty(Settings.Default.Host))
TxtHost.Items.Add(Settings.Default.Host);
TxtHost.Items.AddRange(ServerRecords.Select(it => it.Host).ToArray());
NUDRemotePlayerId.Value = Settings.Default.RemoteUid;
@@ -57,6 +60,12 @@ namespace GrasscutterTools.Pages
TxtToken.Text = Settings.Default.TokenCache;
Task.Delay(1000).ContinueWith(_ => ShowTipInRunButton?.Invoke(Resources.TokenRestoredFromCache));
}
if (string.IsNullOrEmpty(TxtHost.Text))
{
TxtHost.Items.Add("http://127.0.0.1:443");
TxtHost.SelectedIndex = 0;
}
}
#region - -
@@ -226,6 +235,8 @@ namespace GrasscutterTools.Pages
return;
}
Settings.Default.Host = host;
var isOcEnabled = false;
try
{
@@ -240,6 +251,7 @@ namespace GrasscutterTools.Pages
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
}
if (isOcEnabled)
{
LblOpenCommandSupport.Text = "√";

View File

@@ -932,7 +932,7 @@
<value>136, 34</value>
</data>
<data name="TxtHost.Size" type="System.Drawing.Size, System.Drawing">
<value>182, 23</value>
<value>182, 25</value>
</data>
<data name="TxtHost.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
@@ -941,7 +941,7 @@
<value>TxtHost</value>
</data>
<data name="&gt;&gt;TxtHost.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtHost.Parent" xml:space="preserve">
<value>$this</value>
@@ -959,7 +959,7 @@
<value>324, 34</value>
</data>
<data name="BtnQueryServerStatus.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 23</value>
<value>50, 25</value>
</data>
<data name="BtnQueryServerStatus.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
@@ -1022,6 +1022,6 @@
<value>PageOpenCommand</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -0,0 +1,148 @@
namespace GrasscutterTools.Pages
{
partial class PageProxy
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PageProxy));
this.TxtHost = new System.Windows.Forms.TextBox();
this.LblServerAddress = new System.Windows.Forms.Label();
this.BtnStartProxy = new System.Windows.Forms.Button();
this.ChkAutoStart = new System.Windows.Forms.CheckBox();
this.LblProxyIntroduction = new System.Windows.Forms.TextBox();
this.BtnDestroyCert = new System.Windows.Forms.Button();
this.LnkEavesdrop = new System.Windows.Forms.LinkLabel();
this.LnkAbout = new System.Windows.Forms.LinkLabel();
this.LblGcJarPath = new System.Windows.Forms.Label();
this.TxtGcJarPath = new System.Windows.Forms.TextBox();
this.BtnStartGc = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// TxtHost
//
resources.ApplyResources(this.TxtHost, "TxtHost");
this.TxtHost.Name = "TxtHost";
//
// LblServerAddress
//
resources.ApplyResources(this.LblServerAddress, "LblServerAddress");
this.LblServerAddress.Name = "LblServerAddress";
//
// BtnStartProxy
//
resources.ApplyResources(this.BtnStartProxy, "BtnStartProxy");
this.BtnStartProxy.Name = "BtnStartProxy";
this.BtnStartProxy.UseVisualStyleBackColor = true;
this.BtnStartProxy.Click += new System.EventHandler(this.BtnStartProxy_Click);
//
// ChkAutoStart
//
resources.ApplyResources(this.ChkAutoStart, "ChkAutoStart");
this.ChkAutoStart.Name = "ChkAutoStart";
this.ChkAutoStart.UseVisualStyleBackColor = true;
this.ChkAutoStart.CheckedChanged += new System.EventHandler(this.ChkAutoStart_CheckedChanged);
//
// LblProxyIntroduction
//
resources.ApplyResources(this.LblProxyIntroduction, "LblProxyIntroduction");
this.LblProxyIntroduction.Name = "LblProxyIntroduction";
this.LblProxyIntroduction.ReadOnly = true;
//
// BtnDestroyCert
//
resources.ApplyResources(this.BtnDestroyCert, "BtnDestroyCert");
this.BtnDestroyCert.Name = "BtnDestroyCert";
this.BtnDestroyCert.UseVisualStyleBackColor = true;
this.BtnDestroyCert.Click += new System.EventHandler(this.BtnDestroyCert_Click);
//
// LnkEavesdrop
//
resources.ApplyResources(this.LnkEavesdrop, "LnkEavesdrop");
this.LnkEavesdrop.Name = "LnkEavesdrop";
this.LnkEavesdrop.TabStop = true;
this.LnkEavesdrop.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkEavesdrop_LinkClicked);
//
// LnkAbout
//
resources.ApplyResources(this.LnkAbout, "LnkAbout");
this.LnkAbout.Name = "LnkAbout";
this.LnkAbout.TabStop = true;
this.LnkAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkAbout_LinkClicked);
//
// LblGcJarPath
//
resources.ApplyResources(this.LblGcJarPath, "LblGcJarPath");
this.LblGcJarPath.Name = "LblGcJarPath";
//
// TxtGcJarPath
//
resources.ApplyResources(this.TxtGcJarPath, "TxtGcJarPath");
this.TxtGcJarPath.Name = "TxtGcJarPath";
//
// BtnStartGc
//
resources.ApplyResources(this.BtnStartGc, "BtnStartGc");
this.BtnStartGc.Name = "BtnStartGc";
this.BtnStartGc.UseVisualStyleBackColor = true;
this.BtnStartGc.Click += new System.EventHandler(this.BtnStartGc_Click);
//
// PageProxy
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.BtnStartGc);
this.Controls.Add(this.TxtGcJarPath);
this.Controls.Add(this.LblGcJarPath);
this.Controls.Add(this.LnkAbout);
this.Controls.Add(this.LnkEavesdrop);
this.Controls.Add(this.BtnDestroyCert);
this.Controls.Add(this.LblProxyIntroduction);
this.Controls.Add(this.ChkAutoStart);
this.Controls.Add(this.BtnStartProxy);
this.Controls.Add(this.LblServerAddress);
this.Controls.Add(this.TxtHost);
this.Name = "PageProxy";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox TxtHost;
private System.Windows.Forms.Label LblServerAddress;
private System.Windows.Forms.Button BtnStartProxy;
private System.Windows.Forms.CheckBox ChkAutoStart;
private System.Windows.Forms.TextBox LblProxyIntroduction;
private System.Windows.Forms.Button BtnDestroyCert;
private System.Windows.Forms.LinkLabel LnkEavesdrop;
private System.Windows.Forms.LinkLabel LnkAbout;
private System.Windows.Forms.Label LblGcJarPath;
private System.Windows.Forms.TextBox TxtGcJarPath;
private System.Windows.Forms.Button BtnStartGc;
}
}

View File

@@ -0,0 +1,171 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using System;
using System.Windows.Forms;
using GrasscutterTools.Forms;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
namespace GrasscutterTools.Pages
{
internal partial class PageProxy : BasePage
{
public override string Text => Resources.PageProxyTitle;
public PageProxy()
{
InitializeComponent();
}
public override void OnLoad()
{
if (!string.IsNullOrEmpty(Settings.Default.Host))
TxtHost.Text = Settings.Default.Host;
ChkAutoStart.Checked = Settings.Default.AutoStartProxy;
Application.ApplicationExit += OnApplicationExit;
if (Settings.Default.AutoStartProxy && !ProxyHelper.IsRunning)
{
Logger.I(Name, "Auto start proxy!");
BtnStartProxy_Click(BtnStartProxy, EventArgs.Empty);
}
}
/// <summary>
/// 当应用程序退出时触发
/// </summary>
private void OnApplicationExit(object sender, EventArgs e)
{
if (!ProxyHelper.IsRunning) return;
Logger.I(Name, "OnApplicationExit: StopProxy...");
// 停止代理
StopProxy();
}
/// <summary>
/// 当页面被关闭时触发
/// </summary>
public override void OnClosed()
{
if (!ProxyHelper.IsRunning) return;
Logger.I(Name, "OnPageClosed: StopProxy...");
// 停止代理
StopProxy();
}
/// <summary>
/// 停止代理
/// </summary>
private static void StopProxy()
{
try
{
Logger.I("PageProxy", "Stop Proxy");
ProxyHelper.StopProxy();
}
catch (Exception ex)
{
#if DEBUG
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
Logger.E("PageProxy", "Stop Proxy Failed.", ex);
}
}
/// <summary>
/// 点击启动GC服务器时触发
/// </summary>
private void BtnStartGc_Click(object sender, EventArgs e)
{
// TODO Run java -jar grasscutter.jar
}
/// <summary>
/// 点击代理按钮时触发
/// </summary>
private void BtnStartProxy_Click(object sender, EventArgs e)
{
try
{
// 正在运行则关闭
if (ProxyHelper.IsRunning)
{
ProxyHelper.StopProxy();
BtnStartProxy.Text = Resources.StartProxy;
TxtHost.Enabled = true;
}
else
{
// 创建根证书并检查信任
if (!ProxyHelper.CheckAndCreateCertificate())
{
MessageBox.Show(Resources.TrustedBeforeContinuing, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// 启动代理
ProxyHelper.StartProxy(TxtHost.Text);
BtnStartProxy.Text = Resources.StopProxy;
TxtHost.Enabled = false;
}
}
catch (Exception ex)
{
Logger.E(Name, "Start Proxy failed.", ex);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 点击 Eavesdrop 标签时触发
/// </summary>
private void LnkEavesdrop_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
UIUtil.OpenURL("https://github.com/ArachisH/Eavesdrop");
}
/// <summary>
/// 点击关于标签时触发
/// </summary>
private void LnkAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
FormMain.Instance.NavigateTo<PageAbout>();
}
/// <summary>
/// 点击卸载证书时触发
/// </summary>
private void BtnDestroyCert_Click(object sender, EventArgs e)
{
Logger.I(Name, "DestroyCertificate");
ProxyHelper.DestroyCertificate();
MessageBox.Show("OK", Resources.Tips);
}
/// <summary>
/// 自动启动代理选项更改时触发
/// </summary>
private void ChkAutoStart_CheckedChanged(object sender, EventArgs e)
{
Settings.Default.AutoStartProxy = ChkAutoStart.Checked;
}
}
}

View File

@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblServerAddress.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 17</value>
</data>
<data name="LblServerAddress.Text" xml:space="preserve">
<value>Target HTTP (s) server</value>
</data>
<data name="BtnStartProxy.Text" xml:space="preserve">
<value>Start proxy</value>
</data>
<data name="ChkAutoStart.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 21</value>
</data>
<data name="ChkAutoStart.Text" xml:space="preserve">
<value>Auto start</value>
</data>
<data name="LblProxyIntroduction.Text" xml:space="preserve">
<value> To start the proxy, you need to trust the temporary root certificate of this application, which is only used for proxying requests related to anime games. The certificate is valid for one month, and you can uninstall it by clicking the lower right corner at any time.
The proxy functionality code comes from the open-source project Eavesdrop, following the MIT open-source license and has been modified to match the application's requirements.
This proxy bypasses non-anime game requests through a large number of filtering rules, reducing the impact. Feel free to give it a try!
The proxy will automatically close when the program exits, so you can use it with peace of mind :)</value>
</data>
<data name="BtnDestroyCert.Text" xml:space="preserve">
<value>Uninstall cert</value>
</data>
<data name="LnkAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>43, 17</value>
</data>
<data name="LnkAbout.Text" xml:space="preserve">
<value>About</value>
</data>
<data name="LblGcJarPath.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 17</value>
</data>
<data name="LblGcJarPath.Text" xml:space="preserve">
<value>GrasscutterJar Path</value>
</data>
<data name="BtnStartGc.Text" xml:space="preserve">
<value>Start Grasscutter</value>
</data>
</root>

View File

@@ -0,0 +1,459 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TxtHost.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="TxtHost.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 40</value>
</data>
<data name="TxtHost.Size" type="System.Drawing.Size, System.Drawing">
<value>160, 23</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TxtHost.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="TxtHost.Text" xml:space="preserve">
<value>http://127.0.0.1:443</value>
</data>
<data name="&gt;&gt;TxtHost.Name" xml:space="preserve">
<value>TxtHost</value>
</data>
<data name="&gt;&gt;TxtHost.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtHost.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtHost.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="LblServerAddress.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblServerAddress.Location" type="System.Drawing.Point, System.Drawing">
<value>84, 43</value>
</data>
<data name="LblServerAddress.Size" type="System.Drawing.Size, System.Drawing">
<value>137, 17</value>
</data>
<data name="LblServerAddress.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="LblServerAddress.Text" xml:space="preserve">
<value>目标 http(s) 服务器地址</value>
</data>
<data name="&gt;&gt;LblServerAddress.Name" xml:space="preserve">
<value>LblServerAddress</value>
</data>
<data name="&gt;&gt;LblServerAddress.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblServerAddress.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblServerAddress.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="BtnStartProxy.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="BtnStartProxy.Location" type="System.Drawing.Point, System.Drawing">
<value>393, 40</value>
</data>
<data name="BtnStartProxy.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 25</value>
</data>
<data name="BtnStartProxy.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="BtnStartProxy.Text" xml:space="preserve">
<value>启动代理</value>
</data>
<data name="&gt;&gt;BtnStartProxy.Name" xml:space="preserve">
<value>BtnStartProxy</value>
</data>
<data name="&gt;&gt;BtnStartProxy.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnStartProxy.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnStartProxy.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="ChkAutoStart.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="ChkAutoStart.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkAutoStart.Location" type="System.Drawing.Point, System.Drawing">
<value>519, 42</value>
</data>
<data name="ChkAutoStart.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 21</value>
</data>
<data name="ChkAutoStart.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="ChkAutoStart.Text" xml:space="preserve">
<value>自动开启</value>
</data>
<data name="&gt;&gt;ChkAutoStart.Name" xml:space="preserve">
<value>ChkAutoStart</value>
</data>
<data name="&gt;&gt;ChkAutoStart.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkAutoStart.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ChkAutoStart.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="LblProxyIntroduction.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="LblProxyIntroduction.Location" type="System.Drawing.Point, System.Drawing">
<value>48, 72</value>
</data>
<data name="LblProxyIntroduction.Multiline" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblProxyIntroduction.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Vertical</value>
</data>
<data name="LblProxyIntroduction.Size" type="System.Drawing.Size, System.Drawing">
<value>550, 120</value>
</data>
<data name="LblProxyIntroduction.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="LblProxyIntroduction.Text" xml:space="preserve">
<value> 启动代理需要信任本应用的临时根证书该证书仅用于代理动漫游戏相关请求有效期1月你可以随时点击右下角卸载证书。
代理功能代码来自开源项目 Eavesdrop遵循MIT开源协议经过魔改以匹配应用需求。
本代理通过大量过滤规则来规避非动漫游戏的请求经过应用,减小影响,欢迎体验!
程序退出时会自动关闭代理,放心使用 :)</value>
</data>
<data name="&gt;&gt;LblProxyIntroduction.Name" xml:space="preserve">
<value>LblProxyIntroduction</value>
</data>
<data name="&gt;&gt;LblProxyIntroduction.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblProxyIntroduction.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblProxyIntroduction.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="BtnDestroyCert.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnDestroyCert.Location" type="System.Drawing.Point, System.Drawing">
<value>529, 207</value>
</data>
<data name="BtnDestroyCert.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 25</value>
</data>
<data name="BtnDestroyCert.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="BtnDestroyCert.Text" xml:space="preserve">
<value>卸载证书</value>
</data>
<data name="&gt;&gt;BtnDestroyCert.Name" xml:space="preserve">
<value>BtnDestroyCert</value>
</data>
<data name="&gt;&gt;BtnDestroyCert.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnDestroyCert.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnDestroyCert.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="LnkEavesdrop.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LnkEavesdrop.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LnkEavesdrop.Location" type="System.Drawing.Point, System.Drawing">
<value>15, 211</value>
</data>
<data name="LnkEavesdrop.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 17</value>
</data>
<data name="LnkEavesdrop.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="LnkEavesdrop.Text" xml:space="preserve">
<value>Eavesdrop</value>
</data>
<data name="&gt;&gt;LnkEavesdrop.Name" xml:space="preserve">
<value>LnkEavesdrop</value>
</data>
<data name="&gt;&gt;LnkEavesdrop.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkEavesdrop.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LnkEavesdrop.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="LnkAbout.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="LnkAbout.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LnkAbout.Location" type="System.Drawing.Point, System.Drawing">
<value>482, 211</value>
</data>
<data name="LnkAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="LnkAbout.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="LnkAbout.Text" xml:space="preserve">
<value>关于</value>
</data>
<data name="&gt;&gt;LnkAbout.Name" xml:space="preserve">
<value>LnkAbout</value>
</data>
<data name="&gt;&gt;LnkAbout.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkAbout.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LnkAbout.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblGcJarPath.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblGcJarPath.Location" type="System.Drawing.Point, System.Drawing">
<value>102, 14</value>
</data>
<data name="LblGcJarPath.Size" type="System.Drawing.Size, System.Drawing">
<value>119, 17</value>
</data>
<data name="LblGcJarPath.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblGcJarPath.Text" xml:space="preserve">
<value>GrasscutterJar 路径</value>
</data>
<data name="LblGcJarPath.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;LblGcJarPath.Name" xml:space="preserve">
<value>LblGcJarPath</value>
</data>
<data name="&gt;&gt;LblGcJarPath.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblGcJarPath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblGcJarPath.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="TxtGcJarPath.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="TxtGcJarPath.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 11</value>
</data>
<data name="TxtGcJarPath.Size" type="System.Drawing.Size, System.Drawing">
<value>160, 23</value>
</data>
<data name="TxtGcJarPath.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="TxtGcJarPath.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;TxtGcJarPath.Name" xml:space="preserve">
<value>TxtGcJarPath</value>
</data>
<data name="&gt;&gt;TxtGcJarPath.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtGcJarPath.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtGcJarPath.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="BtnStartGc.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="BtnStartGc.Location" type="System.Drawing.Point, System.Drawing">
<value>393, 11</value>
</data>
<data name="BtnStartGc.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 25</value>
</data>
<data name="BtnStartGc.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="BtnStartGc.Text" xml:space="preserve">
<value>启动服务器</value>
</data>
<data name="BtnStartGc.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;BtnStartGc.Name" xml:space="preserve">
<value>BtnStartGc</value>
</data>
<data name="&gt;&gt;BtnStartGc.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnStartGc.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnStartGc.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="$this.AutoScroll" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageProxy</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.13.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblServerAddress.Location" type="System.Drawing.Point, System.Drawing">
<value>72, 44</value>
</data>
<data name="LblServerAddress.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 17</value>
</data>
<data name="LblServerAddress.Text" xml:space="preserve">
<value>Целевой сервер http(s)</value>
</data>
<data name="BtnStartProxy.Size" type="System.Drawing.Size, System.Drawing">
<value>130, 25</value>
</data>
<data name="BtnStartProxy.Text" xml:space="preserve">
<value>Запустить прокси</value>
</data>
<data name="ChkAutoStart.Location" type="System.Drawing.Point, System.Drawing">
<value>529, 34</value>
</data>
<data name="ChkAutoStart.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 38</value>
</data>
<data name="ChkAutoStart.Text" xml:space="preserve">
<value>Автоматическое
открытие </value>
</data>
<data name="LblProxyIntroduction.Text" xml:space="preserve">
<value> Для запуска прокси необходимо доверять временному корневому сертификату этого приложения, который используется только для проксирования запросов, связанных с аниме-играми. Срок действия сертификата составляет один месяц, и вы можете удалить его в любое время, нажав правый нижний угол.
Код функционала прокси взят из открытого проекта Eavesdrop и выпущен под лицензией MIT с изменениями в соответствии с требованиями приложения.
Этот прокси обходит запросы, не относящиеся к аниме-играм, с помощью большого количества фильтрующих правил, что уменьшает воздействие на систему. Приглашаем вас попробовать!
Прокси автоматически закроется при выходе из программы, так что можете использовать его спокойно :)</value>
</data>
<data name="BtnDestroyCert.Text" xml:space="preserve">
<value>Удалить сертификат </value>
</data>
<data name="LnkAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>18, 17</value>
</data>
<data name="LnkAbout.Text" xml:space="preserve">
<value>О</value>
</data>
<data name="LblGcJarPath.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 17</value>
</data>
<data name="LblGcJarPath.Text" xml:space="preserve">
<value>GrasscutterJar Path</value>
</data>
<data name="BtnStartGc.Size" type="System.Drawing.Size, System.Drawing">
<value>130, 25</value>
</data>
<data name="BtnStartGc.Text" xml:space="preserve">
<value> Запустить сервер </value>
</data>
</root>

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="LblServerAddress.Text" xml:space="preserve">
<value>目標 http(s) 伺服器地址</value>
</data>
<data name="BtnStartProxy.Text" xml:space="preserve">
<value>啟動代理</value>
</data>
<data name="ChkAutoStart.Text" xml:space="preserve">
<value>自動開啟</value>
</data>
<data name="LblProxyIntroduction.Text" xml:space="preserve">
<value> 啟動代理需要信任本應用的臨時根證書該證書僅用於代理動漫遊戲相關請求有效期1月你可以隨時點擊右下角卸載證書。
代理功能程式碼來自開源項目 Eavesdrop遵循MIT開源協議經過魔改以匹配應用需求。
本代理通過大量過濾規則來規避非動漫遊戲的請求經過應用,減小影響,歡迎體驗!
程式退出時會自動關閉代理,放心使用 :)</value>
</data>
<data name="BtnDestroyCert.Text" xml:space="preserve">
<value>卸載證書</value>
</data>
<data name="LnkAbout.Text" xml:space="preserve">
<value>關於</value>
</data>
<data name="LblGcJarPath.Text" xml:space="preserve">
<value>GrasscutterJar 路徑</value>
</data>
<data name="BtnStartGc.Text" xml:space="preserve">
<value>啟動伺服器</value>
</data>
</root>

View File

@@ -38,6 +38,8 @@
this.LblQuestDescription = new System.Windows.Forms.Label();
this.TxtQuestFilter = new System.Windows.Forms.TextBox();
this.ListQuest = new System.Windows.Forms.ListBox();
this.LblClearFilter = new System.Windows.Forms.Label();
this.ChkAddAndFinishQuest = new System.Windows.Forms.CheckBox();
this.GrpQuestFilters.SuspendLayout();
this.SuspendLayout();
//
@@ -106,11 +108,29 @@
resources.ApplyResources(this.ListQuest, "ListQuest");
this.ListQuest.FormattingEnabled = true;
this.ListQuest.Name = "ListQuest";
this.ListQuest.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListQuest_MeasureItem);
this.ListQuest.SelectedIndexChanged += new System.EventHandler(this.ListQuest_SelectedIndexChanged);
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// ChkAddAndFinishQuest
//
resources.ApplyResources(this.ChkAddAndFinishQuest, "ChkAddAndFinishQuest");
this.ChkAddAndFinishQuest.Name = "ChkAddAndFinishQuest";
this.ChkAddAndFinishQuest.UseVisualStyleBackColor = true;
//
// PageQuest
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.ChkAddAndFinishQuest);
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.GrpQuestFilters);
this.Controls.Add(this.BtnFinishQuest);
this.Controls.Add(this.BtnAddQuest);
@@ -136,5 +156,7 @@
private System.Windows.Forms.Label LblQuestDescription;
private System.Windows.Forms.TextBox TxtQuestFilter;
private System.Windows.Forms.ListBox ListQuest;
private System.Windows.Forms.Label LblClearFilter;
private System.Windows.Forms.CheckBox ChkAddAndFinishQuest;
}
}

View File

@@ -22,11 +22,14 @@ using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
namespace GrasscutterTools.Pages
{
internal partial class PageQuest : BasePage
{
public override string Text => Resources.PageQuestTitle;
public PageQuest()
{
InitializeComponent();
@@ -60,6 +63,16 @@ namespace GrasscutterTools.Pages
return true;
}).ToArray());
ListQuest.EndUpdate();
LblClearFilter.Visible = TxtQuestFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtQuestFilter.Clear();
}
/// <summary>
@@ -71,7 +84,24 @@ namespace GrasscutterTools.Pages
return;
var item = ListQuest.SelectedItem as string;
var id = ItemMap.ToId(item);
SetCommand("/quest", $"{(sender as Button).Tag} {id}");
SetCommand("/quest", $"{(sender == BtnAddQuest ? "add" : "finish")} {id}");
}
/// <summary>
/// 列表选中项改变时触发
/// </summary>
private void ListQuest_SelectedIndexChanged(object sender, EventArgs e)
{
if (!ChkAddAndFinishQuest.Checked || ListQuest.SelectedIndex == -1) return;
var item = ListQuest.SelectedItem as string;
var id = ItemMap.ToId(item);
SetCommand($"/quest add {id} | /quest finish {id}");
}
private void ListQuest_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = ListQuest.Font.Height * 3 / 2;
}
}
}

View File

@@ -151,4 +151,10 @@ Tip: Many quest require server-side scripting support
Therefore, the quest can be added and finished, but not necessarily work.
</value>
</data>
<data name="ChkAddAndFinishQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 21</value>
</data>
<data name="ChkAddAndFinishQuest.Text" xml:space="preserve">
<value>Add &amp;&amp; Finish when selected</value>
</data>
</root>

View File

@@ -117,279 +117,345 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="GrpQuestFilters.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ChkQuestFilterTEST.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkQuestFilterTEST.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ChkQuestFilterTEST.Location" type="System.Drawing.Point, System.Drawing">
<value>26, 82</value>
</data>
<data name="ChkQuestFilterTEST.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 21</value>
</data>
<data name="ChkQuestFilterTEST.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="ChkQuestFilterTEST.Text" xml:space="preserve">
<value>测试任务</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.Name" xml:space="preserve">
<value>ChkQuestFilterTEST</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.Parent" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="ChkQuestFilterUNRELEASED.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkQuestFilterUNRELEASED.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="ChkQuestFilterUNRELEASED.Location" type="System.Drawing.Point, System.Drawing">
<value>26, 55</value>
</data>
<data name="ChkQuestFilterUNRELEASED.Size" type="System.Drawing.Size, System.Drawing">
<value>99, 21</value>
</data>
<data name="ChkQuestFilterUNRELEASED.TabIndex" type="System.Int32, mscorlib">
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TxtQuestFilter.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="ChkQuestFilterUNRELEASED.Text" xml:space="preserve">
<value>未发布的任务</value>
<data name="&gt;&gt;BtnAddQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnAddQuest.Text" xml:space="preserve">
<value>添加任务</value>
</data>
<data name="TxtQuestFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>288, 23</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.15.1.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.Name" xml:space="preserve">
<value>ChkQuestFilterUNRELEASED</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.Parent" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="ChkQuestFilterHIDDEN.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkQuestFilterHIDDEN.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="ChkQuestFilterUNRELEASED.Size" type="System.Drawing.Size, System.Drawing">
<value>99, 21</value>
</data>
<data name="ChkQuestFilterHIDDEN.Location" type="System.Drawing.Point, System.Drawing">
<value>26, 28</value>
</data>
<data name="ChkQuestFilterHIDDEN.Size" type="System.Drawing.Size, System.Drawing">
<value>87, 21</value>
<data name="&gt;&gt;TxtQuestFilter.Name" xml:space="preserve">
<value>TxtQuestFilter</value>
</data>
<data name="ChkQuestFilterHIDDEN.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
<data name="LblClearFilter.TabIndex" type="System.Int32, mscorlib">
<value>22</value>
</data>
<data name="ChkQuestFilterHIDDEN.Text" xml:space="preserve">
<value>隐藏的任务</value>
<data name="LblQuestDescription.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.Name" xml:space="preserve">
<value>ChkQuestFilterHIDDEN</value>
<data name="LblClearFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>626, 5</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.Type" xml:space="preserve">
<data name="&gt;&gt;ChkQuestFilterTEST.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ListQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ListQuest.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="BtnFinishQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 23</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LblQuestDescription.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="ChkQuestFilterTEST.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;LblQuestDescription.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="ChkQuestFilterTEST.Location" type="System.Drawing.Point, System.Drawing">
<value>26, 82</value>
</data>
<data name="GrpQuestFilters.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;BtnAddQuest.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ChkQuestFilterTEST.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 21</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblClearFilter.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="ChkAddAndFinishQuest.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;LblClearFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.Parent" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.ZOrder" xml:space="preserve">
<data name="BtnAddQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;ListQuest.Name" xml:space="preserve">
<value>ListQuest</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.Parent" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.Name" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="BtnFinishQuest.Text" xml:space="preserve">
<value>完成任务</value>
</data>
<data name="GrpQuestFilters.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GrpQuestFilters.Text" xml:space="preserve">
<value>列表过滤</value>
</data>
<data name="BtnFinishQuest.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;ChkAddAndFinishQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="ChkQuestFilterUNRELEASED.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="ChkAddAndFinishQuest.Text" xml:space="preserve">
<value>选中时添加并完成</value>
</data>
<data name="ListQuest.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="GrpQuestFilters.Location" type="System.Drawing.Point, System.Drawing">
<value>199, 106</value>
</data>
<data name="GrpQuestFilters.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 130</value>
<data name="ChkQuestFilterHIDDEN.Size" type="System.Drawing.Size, System.Drawing">
<value>87, 21</value>
</data>
<data name="GrpQuestFilters.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
<data name="ChkAddAndFinishQuest.TabIndex" type="System.Int32, mscorlib">
<value>23</value>
</data>
<data name="GrpQuestFilters.Text" xml:space="preserve">
<value>列表过滤</value>
<data name="&gt;&gt;ChkAddAndFinishQuest.Name" xml:space="preserve">
<value>ChkAddAndFinishQuest</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.Name" xml:space="preserve">
<value>GrpQuestFilters</value>
<data name="ChkAddAndFinishQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>123, 21</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.Name" xml:space="preserve">
<value>ChkQuestFilterTEST</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;GrpQuestFilters.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnFinishQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnFinishQuest.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnFinishQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>99, 213</value>
</data>
<data name="BtnFinishQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 23</value>
</data>
<data name="BtnFinishQuest.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="BtnFinishQuest.Text" xml:space="preserve">
<value>完成任务</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Name" xml:space="preserve">
<value>BtnFinishQuest</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="BtnAddQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnAddQuest.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnAddQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 213</value>
</data>
<data name="BtnAddQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 23</value>
<data name="ChkQuestFilterHIDDEN.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnAddQuest.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="BtnAddQuest.Text" xml:space="preserve">
<value>添加任务</value>
</data>
<data name="&gt;&gt;BtnAddQuest.Name" xml:space="preserve">
<value>BtnAddQuest</value>
</data>
<data name="&gt;&gt;BtnAddQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnAddQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnAddQuest.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="LblQuestDescription.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
<data name="ListQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="LblQuestDescription.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblQuestDescription.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
<data name="&gt;&gt;LblQuestDescription.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ChkQuestFilterTEST.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="LblQuestDescription.Size" type="System.Drawing.Size, System.Drawing">
<value>346, 100</value>
</data>
<data name="LblQuestDescription.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
<data name="ChkQuestFilterTEST.Text" xml:space="preserve">
<value>测试任务</value>
</data>
<data name="ChkAddAndFinishQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 186</value>
</data>
<data name="LblClearFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 17</value>
</data>
<data name="ChkQuestFilterTEST.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ListQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>288, 208</value>
</data>
<data name="GrpQuestFilters.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 130</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Name" xml:space="preserve">
<value>BtnFinishQuest</value>
</data>
<data name="LblClearFilter.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;BtnAddQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="ChkQuestFilterHIDDEN.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClearFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="BtnFinishQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>99, 213</value>
</data>
<data name="LblClearFilter.Text" xml:space="preserve">
<value>X</value>
</data>
<data name="&gt;&gt;BtnAddQuest.Name" xml:space="preserve">
<value>BtnAddQuest</value>
</data>
<data name="ChkAddAndFinishQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.Name" xml:space="preserve">
<value>ChkQuestFilterHIDDEN</value>
</data>
<data name="ChkQuestFilterUNRELEASED.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="ChkQuestFilterUNRELEASED.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="BtnAddQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 213</value>
</data>
<data name="&gt;&gt;BtnFinishQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ChkAddAndFinishQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblQuestDescription.Text" xml:space="preserve">
<value>添加或完成任务
提示:许多任务需要服务端脚本支持
因此任务可以接,可以完成,但是不一定可以做</value>
</data>
<data name="&gt;&gt;LblQuestDescription.Name" xml:space="preserve">
<value>LblQuestDescription</value>
</data>
<data name="&gt;&gt;LblQuestDescription.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblQuestDescription.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblQuestDescription.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="TxtQuestFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="TxtQuestFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>355, 2</value>
</data>
<data name="TxtQuestFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>288, 23</value>
</data>
<data name="TxtQuestFilter.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.Name" xml:space="preserve">
<value>TxtQuestFilter</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="ListQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="ListQuest.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="ListQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>355, 28</value>
</data>
<data name="ListQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>288, 208</value>
</data>
<data name="ListQuest.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;ListQuest.Name" xml:space="preserve">
<value>ListQuest</value>
</data>
<data name="&gt;&gt;ListQuest.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ListQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ListQuest.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageQuest</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<data name="&gt;&gt;LblClearFilter.Name" xml:space="preserve">
<value>LblClearFilter</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClearFilter.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;LblClearFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtQuestFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblClearFilter.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;ChkQuestFilterUNRELEASED.Parent" xml:space="preserve">
<value>GrpQuestFilters</value>
</data>
<data name="LblQuestDescription.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="BtnAddQuest.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="TxtQuestFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>355, 2</value>
</data>
<data name="BtnFinishQuest.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="ChkQuestFilterHIDDEN.Text" xml:space="preserve">
<value>隐藏的任务</value>
</data>
<data name="ListQuest.Location" type="System.Drawing.Point, System.Drawing">
<value>355, 28</value>
</data>
<data name="BtnAddQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>90, 23</value>
</data>
<data name="&gt;&gt;LblQuestDescription.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="&gt;&gt;ChkQuestFilterTEST.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnFinishQuest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;ListQuest.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;ChkQuestFilterHIDDEN.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;ListQuest.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="ChkQuestFilterUNRELEASED.Text" xml:space="preserve">
<value>未发布的任务</value>
</data>
<data name="&gt;&gt;LblQuestDescription.Name" xml:space="preserve">
<value>LblQuestDescription</value>
</data>
<data name="ChkQuestFilterHIDDEN.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;ChkAddAndFinishQuest.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -151,4 +151,10 @@
Поэтому квест может быть добавлен или отозван через консоль, но завершён игроком - вряд ли.
</value>
</data>
<data name="ChkAddAndFinishQuest.Size" type="System.Drawing.Size, System.Drawing">
<value>167, 21</value>
</data>
<data name="ChkAddAndFinishQuest.Text" xml:space="preserve">
<value>Добавить и завершить</value>
</data>
</root>

View File

@@ -141,4 +141,7 @@
囙此任務可以接,可以完成,但是不一定可以做
</value>
</data>
<data name="ChkAddAndFinishQuest.Text" xml:space="preserve">
<value>選中時添加並完成</value>
</data>
</root>

View File

@@ -40,14 +40,12 @@
this.NUDTpZ = new System.Windows.Forms.NumericUpDown();
this.NUDTpY = new System.Windows.Forms.NumericUpDown();
this.NUDTpX = new System.Windows.Forms.NumericUpDown();
this.CmbClimateType = new System.Windows.Forms.ComboBox();
this.LblClimateType = new System.Windows.Forms.Label();
this.LblSceneDescription = new System.Windows.Forms.Label();
this.ListScenes = new System.Windows.Forms.ListBox();
this.LblTp = new System.Windows.Forms.Label();
this.RbListCutScene = new System.Windows.Forms.RadioButton();
this.ChkLockClimate = new System.Windows.Forms.CheckBox();
this.BtnFreezeTime = new System.Windows.Forms.Button();
this.LblClearFilter = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.NUDTpZ)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDTpY)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDTpX)).BeginInit();
@@ -168,19 +166,6 @@
-2147483648});
this.NUDTpX.Name = "NUDTpX";
//
// CmbClimateType
//
resources.ApplyResources(this.CmbClimateType, "CmbClimateType");
this.CmbClimateType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CmbClimateType.FormattingEnabled = true;
this.CmbClimateType.Name = "CmbClimateType";
this.CmbClimateType.SelectedIndexChanged += new System.EventHandler(this.CmbClimateType_SelectedIndexChanged);
//
// LblClimateType
//
resources.ApplyResources(this.LblClimateType, "LblClimateType");
this.LblClimateType.Name = "LblClimateType";
//
// LblSceneDescription
//
resources.ApplyResources(this.LblSceneDescription, "LblSceneDescription");
@@ -191,6 +176,7 @@
resources.ApplyResources(this.ListScenes, "ListScenes");
this.ListScenes.FormattingEnabled = true;
this.ListScenes.Name = "ListScenes";
this.ListScenes.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.ListScenes_MeasureItem);
this.ListScenes.SelectedIndexChanged += new System.EventHandler(this.ListScenes_SelectedIndexChanged);
//
// LblTp
@@ -205,13 +191,6 @@
this.RbListCutScene.UseVisualStyleBackColor = true;
this.RbListCutScene.CheckedChanged += new System.EventHandler(this.RbListCutScene_CheckedChanged);
//
// ChkLockClimate
//
resources.ApplyResources(this.ChkLockClimate, "ChkLockClimate");
this.ChkLockClimate.Name = "ChkLockClimate";
this.ChkLockClimate.UseVisualStyleBackColor = true;
this.ChkLockClimate.CheckedChanged += new System.EventHandler(this.ChkLockClimate_CheckedChanged);
//
// BtnFreezeTime
//
resources.ApplyResources(this.BtnFreezeTime, "BtnFreezeTime");
@@ -219,12 +198,20 @@
this.BtnFreezeTime.UseVisualStyleBackColor = true;
this.BtnFreezeTime.Click += new System.EventHandler(this.BtnFreezeTime_Click);
//
// LblClearFilter
//
resources.ApplyResources(this.LblClearFilter, "LblClearFilter");
this.LblClearFilter.BackColor = System.Drawing.Color.White;
this.LblClearFilter.Cursor = System.Windows.Forms.Cursors.Hand;
this.LblClearFilter.Name = "LblClearFilter";
this.LblClearFilter.Click += new System.EventHandler(this.LblClearFilter_Click);
//
// PageScene
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.LblClearFilter);
this.Controls.Add(this.BtnFreezeTime);
this.Controls.Add(this.ChkLockClimate);
this.Controls.Add(this.RbListCutScene);
this.Controls.Add(this.RbListDungeons);
this.Controls.Add(this.RbListScene);
@@ -237,8 +224,6 @@
this.Controls.Add(this.NUDTpZ);
this.Controls.Add(this.NUDTpY);
this.Controls.Add(this.NUDTpX);
this.Controls.Add(this.CmbClimateType);
this.Controls.Add(this.LblClimateType);
this.Controls.Add(this.LblSceneDescription);
this.Controls.Add(this.ListScenes);
this.Controls.Add(this.LblTp);
@@ -264,13 +249,11 @@
private System.Windows.Forms.NumericUpDown NUDTpZ;
private System.Windows.Forms.NumericUpDown NUDTpY;
private System.Windows.Forms.NumericUpDown NUDTpX;
private System.Windows.Forms.ComboBox CmbClimateType;
private System.Windows.Forms.Label LblClimateType;
private System.Windows.Forms.Label LblSceneDescription;
private System.Windows.Forms.ListBox ListScenes;
private System.Windows.Forms.Label LblTp;
private System.Windows.Forms.RadioButton RbListCutScene;
private System.Windows.Forms.CheckBox ChkLockClimate;
private System.Windows.Forms.Button BtnFreezeTime;
private System.Windows.Forms.Label LblClearFilter;
}
}

View File

@@ -27,6 +27,8 @@ namespace GrasscutterTools.Pages
{
internal partial class PageScene : BasePage
{
public override string Text => Resources.PageSceneTitle;
public PageScene()
{
InitializeComponent();
@@ -53,8 +55,6 @@ namespace GrasscutterTools.Pages
public override void OnLoad()
{
Scenes = GameData.Scenes.Lines;
CmbClimateType.Items.Clear();
CmbClimateType.Items.AddRange(Resources.ClimateType.Split(','));
}
/// <summary>
@@ -90,6 +90,15 @@ namespace GrasscutterTools.Pages
private void TxtSceneFilter_TextChanged(object sender, EventArgs e)
{
UIUtil.ListBoxFilter(ListScenes, Scenes, TxtSceneFilter.Text);
LblClearFilter.Visible = TxtSceneFilter.Text.Length > 0;
}
/// <summary>
/// 点击清空过滤栏标签时触发
/// </summary>
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtSceneFilter.Clear();
}
/// <summary>
@@ -128,24 +137,6 @@ namespace GrasscutterTools.Pages
}
}
/// <summary>
/// 气候类型列表
/// </summary>
private static readonly string[] climateTypes = { "none", "sunny", "cloudy", "rain", "thunderstorm", "snow", "mist" };
/// <summary>
/// 气候类型下拉框选中项改变时触发
/// </summary>
private void CmbClimateType_SelectedIndexChanged(object sender, EventArgs e)
{
if (CmbClimateType.SelectedIndex < 0)
return;
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/weather", CmbClimateType.SelectedIndex < climateTypes.Length ? climateTypes[CmbClimateType.SelectedIndex] : "none");
else
SetCommand("/weather", $"0 {CmbClimateType.SelectedIndex}");
}
/// <summary>
/// 点击传送按钮时触发
/// </summary>
@@ -157,14 +148,6 @@ namespace GrasscutterTools.Pages
SetCommand("/tp", args);
}
/// <summary>
/// 锁定天气
/// </summary>
private void ChkLockClimate_CheckedChanged(object sender, EventArgs e)
{
SetCommand("/prop", $"is_weather_locked {(ChkLockClimate.Checked ? "on" : "off")}");
}
/// <summary>
/// 冻结游戏时间
/// </summary>
@@ -172,5 +155,10 @@ namespace GrasscutterTools.Pages
{
SetCommand("/prop", "is_game_time_locked on");
}
private void ListScenes_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
e.ItemHeight = ListScenes.Font.Height * 3 / 2;
}
}
}

Some files were not shown because too many files have changed in this diff Show More