This commit is contained in:
kshman 2021-03-18 02:14:48 +09:00
parent caf00e8d86
commit 92067339c8
54 changed files with 11624 additions and 0 deletions

63
.gitattributes vendored Normal file
View file

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

343
.gitignore vendored Normal file
View file

@ -0,0 +1,343 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# ACT
References/ACT/

1778
Data/DcDuty-English.json Normal file

File diff suppressed because it is too large Load diff

1778
Data/DcDuty-Japanese.json Normal file

File diff suppressed because it is too large Load diff

1754
Data/DcDuty-Korean.json Normal file

File diff suppressed because it is too large Load diff

87
Data/DcLang-Japanese.txt Normal file
View file

@ -0,0 +1,87 @@
# 日本語メッセージ
LANG=日本語
0=FFXIV dc
1=レディ
2=FFXIV プラグインが見つからないんです!
3=FFXIV プラグインを見つかりました!
4=FFXIV ドユーティー・コンテンツが起動しました!
5=ACT 情報: {0} ({1})
6=FFXIV プラグイン情報: {0} ({1})
7=データが壊れました: {0}
8=分析できません!
9=アンノウン・コンテンツ: {0}
10=アンノウン・インスタンス: {0}
11=アンノウン・地役: {0}
12=アンノウン・フェイト: {0}
13=データが読めないんです!
14=データ・ファイルが見つからないんです! {0}
20=ドユーティー・コンテンツ情報: {1}({0}) / A:{2} / R:{3} / I:{4} / F:{5} ({6})
21=ルーレット
22=インスタンス
23=フェイト
24=スカーミッシュ
25=クリティカル・エンゲージメント
26=基本
99=ドユーティー・コンテンツ・プラグイン {0}
101=WAVEファイルを選んでください
102=WAVファイル (*.wav)|*.wav|全て (*.*)|*.*
103=お知らせテストです!!
200=設定
201=表示言語
202=FFXIVがアクティブ状態じゃない場合、オーバレイを隠します
300=コンテンツ
301=コンテンツ
302=設定
303=パゲット
304=データ
305=ログフォント
306=オーバレイ・オン
307=透明度
308=サウンド・オン
309=インスタンス
310=フェイト
311=ラインお知らせ
312=トーケン
313=テレグラムお知らせ
314=ID
315=トーケン
316=パゲット探し
317=説明
318=ボズヤ情報
319=機能
320=現在
321=状態
322=探す
323=CEの名前
324=状態
325=人数
326=進行度
10001="{0}" 発生!
10002=待機: {0}
10003=マッチング: {0}
10004=入ります: {0}
10005={0} 発生!
10006=待機: {0}
10007=スタート
10008=キャンセル
10009=適用とセーブ
10010=中央ラノシアリーキまたは南方ボズヤで自動的に探します
10011=皇都イシュガルド防衛戦に解除で入って見てください
10012=マッチング
10013=インスタンス
10014=南方ボズヤでCEをまってください。右のリストにパゲットの候補が表示されたら項目をクリックしてください
10015=項目をクリックすると説明が出ます
10016=確認済
10017=終わり
10018=登録中
10019=入場中
10020=進行中
10021=アンノウン
10022=このパゲットデータを使いますか?セーブします
10023=選択

View file

@ -0,0 +1,87 @@
# 한국말 메시지, 한국어 서비스(액토즈)
LANG=한국어(액토즈)
0=FFXIV dc
1=준비됐습니다
2=FFXIV 플러그인이 없어요!
3=FFXIV 플러그인을 찾았어요!
4=FFXIV 듀티 콘텐츠 시작합니다!
5=ACT 정보: {0} ({1})
6=FFXIV 플러그인 정보: {0} ({1})
7=잘못된 데이터: {0}
8=분석할 수 없어요
9=알수없는 임무: {0}
10=알수없는 인스턴스: {0}
11=알수없는 지역: {0}
12=알수없는 돌발: {0}
13=데이터를 읽을 수가 없어요!
14=데이터 파일이 없어요! {0}
20=듀티 콘텐츠 정보: {1}({0}) / A:{2} / R:{3} / I:{4} / F:{5} ({6})
21=무작위 임무
22=인스턴스
23=돌발
24=돌발 교전
25=비상 교전
26=기본
99=듀티 콘텐츠 플러그인 {0}
101=소리 파일을 선택하세요
102=소리 파일 (*.wav)|*.wav|모든 파일 (*.*)|*.*
103=알림 테스트입니다!!
200=설정
201=표시 언어
202=FFXIV를 보고 있지 않을때 오버레이를 감춥니다
300=임무
301=콘텐츠
302=설정
303=패킷
304=데이터셋
305=로그 글꼴
306=오버레이 보기
307=투명도
308=소리 듣기
309=인스턴스
310=돌발
311=라인 알림
312=라인 토큰
313=텔레그램 알림
314=텔레그램 ID
315=텔레그램 토큰
316=패킷 찾기
317=설명
318=보즈야 찾기
319=기능
320=현재값
321=상태
322=찾은값
323=비상 교전 이름
324=상태
325=사람수
326=진행도
10001="{0}" 발생했어요!
10002=찾습니다: {0}
10003=매칭됐어요: {0}
10004=들어가요: {0}
10005={0} 발생했어요!
10006=대기 갯수: {0}
10007=시작
10008=취소
10009=적용 및 저장
10010=중부 라노시아로 가시면 값이 채워집니다. 또는 남부 보즈야 전선의 교전으로도 알 수 있습니다.
10011=토벌전 "성도 이슈가르드 방어전"에 해제로 입장해보세요.
10012=매치
10013=인스턴스
10014=남부 보즈야 전선으로 가서 비상 교전을 기다리세요. 오른쪽 보즈야 찾기에 후보 데이터가 뜨면 맞는 데이터를 선택하세요.
10015=설명을 볼 항목을 선택하세요
10016=확인됨
10017=끝남
10018=등록중
10019=입장하는중
10020=진행중
10021=알수없어요
10022=패킷 데이터를 적용하고 덮어쓰실거예요?
10023=선택함

305
DcConfig.cs Normal file
View file

@ -0,0 +1,305 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace DutyContent
{
class DcConfig
{
public static bool PluginEnable { get; set; }
public static string PluginPath { get; set; }
public static string DataPath { get; set; }
public static string PacketPath { get; set; }
public static string ConfigPath { get; set; }
//
public static PacketConfig Packet = new PacketConfig();
public static DutyConfig Duty = new DutyConfig();
//
public static ConnectionList Connections = new ConnectionList();
//
public static string Language { get; set; } = "";
//
public static void SaveConfig(string filename = null)
{
if (filename == null)
filename = ConfigPath;
using (var sw = new StreamWriter(filename, false, Encoding.UTF8))
{
sw.WriteLine("# DutyContent configuration: {0}", DateTime.Now.ToString());
sw.WriteLine();
sw.WriteLine("# config");
sw.WriteLine("Language={0}", Language);
sw.WriteLine();
Duty.InternalSaveStream(sw);
}
}
//
public static void LoadConfig(string filename = null)
{
if (filename == null)
filename = ConfigPath;
if (!File.Exists(filename))
SaveConfig(filename);
var db = new ThirdParty.LineDb(filename, Encoding.UTF8, false);
Language = db["Language"];
Duty.InternalReadFromDb(db);
}
//
public static void Load()
{
Packet.Load();
LoadConfig();
}
//
public static void ReadLanguage(bool is_in_init = false)
{
if (string.IsNullOrWhiteSpace(DcConfig.Language))
{
if (!is_in_init)
MesgLog.Initialize(Properties.Resources.DefaultMessage);
}
else
{
string filename = Path.Combine(DcConfig.DataPath, $"DcLang-{DcConfig.Language}.txt");
if (File.Exists(filename))
MesgLog.LoadFile(filename);
else
MesgLog.Initialize(Properties.Resources.DefaultMessage);
}
}
//
public class PacketConfig
{
// Packet
public string Version { get; set; } = "5.45 HotFix";
public ushort OpFate { get; set; } = 0x3D5;
public ushort OpDuty { get; set; } = 0x307;
public ushort OpMatch { get; set; } = 0x26E;
public ushort OpInstance { get; set; } = 0x10C;
public ushort OpSouthernBozja { get; set; } = 0x1F5;
//
public void Save(string filename = null)
{
if (filename == null)
filename = PacketPath;
using (var sw = new StreamWriter(filename, false, Encoding.UTF8))
{
sw.WriteLine("# DutyPacket configuration: {0}", DateTime.Now.ToString());
sw.WriteLine();
sw.WriteLine("# packet");
sw.WriteLine("Version={0}", Version);
sw.WriteLine("OpFate={0}", OpFate);
sw.WriteLine("OpDuty={0}", OpDuty);
sw.WriteLine("OpMatch={0}", OpMatch);
sw.WriteLine("OpInstance={0}", OpInstance);
sw.WriteLine("OpSouthernBozja={0}", OpSouthernBozja);
sw.WriteLine();
}
}
//
public void Load(string filename = null)
{
if (filename == null)
filename = PacketPath;
if (!File.Exists(filename))
Save(filename);
var db = new ThirdParty.LineDb(filename, Encoding.UTF8, false);
Version = db["Version"];
OpFate = ThirdParty.Converter.ToUshort(db["OpFate"], OpFate);
OpDuty = ThirdParty.Converter.ToUshort(db["OpDuty"], OpDuty);
OpMatch = ThirdParty.Converter.ToUshort(db["OpMatch"], OpMatch);
OpInstance = ThirdParty.Converter.ToUshort(db["OpInstance"], OpInstance);
OpSouthernBozja = ThirdParty.Converter.ToUshort(db["OpSouthernBozja"], OpSouthernBozja);
}
}
//
public class DutyConfig
{
public string Language { get; set; } = "English";
public int ActiveFate { get; set; } = 0;
public string LogFontFamily { get; set; } = "Microsoft Sans Serif";
public float LogFontSize { get; set; } = 12.0f;
public bool EnableOverlay { get; set; }
public bool EnableSound { get; set; }
public string SoundInstanceFile { get; set; }
public int SoundInstanceVolume { get; set; } = 100;
public string SoundFateFile { get; set; }
public int SoundFateVolume { get; set; } = 100;
public bool UseNotifyLine { get; set; }
public string NotifyLineToken { get; set; }
public bool UseNotifyTelegram { get; set; }
public string NotifyTelegramId { get; set; }
public string NotifyTelegramToken { get; set; }
public Point OverlayLocation { get; set; } = new Point(0, 0);
//
public bool EnableNotify => UseNotifyLine || UseNotifyTelegram;
//
public FateSelection[] Fates = new FateSelection[4]
{
new FateSelection(0),
new FateSelection(1),
new FateSelection(2),
new FateSelection(3),
};
//
internal void InternalSaveStream(StreamWriter sw)
{
sw.WriteLine("# duty");
sw.WriteLine("DutyLanguage={0}", Language);
sw.WriteLine("DutyActiveFate={0}", ActiveFate);
sw.WriteLine("DutyFate0={0}", Fates[0].Line);
sw.WriteLine("DutyFate1={0}", Fates[1].Line);
sw.WriteLine("DutyFate2={0}", Fates[2].Line);
sw.WriteLine("DutyFate3={0}", Fates[3].Line);
sw.WriteLine("DutyLogFontFamily={0}", LogFontFamily);
sw.WriteLine("DutyLogFontSize={0}", LogFontSize);
sw.WriteLine("DutyEnableOverlay={0}", EnableOverlay);
sw.WriteLine("DutyEnableSound={0}", EnableSound);
sw.WriteLine("DutySoundInstanceFile={0}", SoundInstanceFile);
sw.WriteLine("DutySoundInstanceVolume={0}", SoundInstanceVolume);
sw.WriteLine("DutySoundFateFile={0}", SoundFateFile);
sw.WriteLine("DutySoundFateVolume={0}", SoundFateVolume);
sw.WriteLine("DutyUseNotifyLine={0}", UseNotifyLine);
sw.WriteLine("DutyNotifyLineToken={0}", NotifyLineToken);
sw.WriteLine("DutyUseNotifyTelegram={0}", UseNotifyTelegram);
sw.WriteLine("DutyNotifyTelegramId={0}", NotifyTelegramId);
sw.WriteLine("DutyNotifyTelegramToken={0}", NotifyTelegramToken);
sw.WriteLine("DutyOverlayLocationX={0}", OverlayLocation.X);
sw.WriteLine("DutyOverlayLocationY={0}", OverlayLocation.Y);
sw.WriteLine();
}
//
internal void InternalReadFromDb(ThirdParty.LineDb db)
{
Language = db["DutyLanguage"];
ActiveFate = ThirdParty.Converter.ToInt(db["DutyActiveFate"]);
Fates[0].Line = db["DutyFate0"];
Fates[1].Line = db["DutyFate1"];
Fates[2].Line = db["DutyFate2"];
Fates[3].Line = db["DutyFate3"];
LogFontFamily = db["DutyLogFontFamily"];
LogFontSize = ThirdParty.Converter.ToFloat(db["DutyLogFontSize"], LogFontSize);
EnableOverlay = ThirdParty.Converter.ToBool(db["DutyEnableOverlay"]);
EnableSound = ThirdParty.Converter.ToBool(db["DutyEnableSound"]);
SoundInstanceFile = db["DutySoundInstanceFile"];
SoundFateFile = db["DutySoundFateFile"];
SoundInstanceVolume = ThirdParty.Converter.ToInt(db["DutySoundInstanceVolume"], 100);
SoundFateVolume = ThirdParty.Converter.ToInt(db["DutySoundFateVolume"], 100);
UseNotifyLine = ThirdParty.Converter.ToBool(db["DutyUseNotifyLine"]);
NotifyLineToken = db["DutyNotifyLineToken"];
UseNotifyTelegram = ThirdParty.Converter.ToBool(db["DutyUseNotifyTelegram"]);
NotifyTelegramId = db["DutyNotifyTelegramId"];
NotifyTelegramToken = db["DutyNotifyTelegramToken"];
OverlayLocation = new Point(ThirdParty.Converter.ToInt(db["DutyOverlayLocationX"]), ThirdParty.Converter.ToInt(db["DutyOverlayLocationY"]));
}
}
//
public class FateSelection
{
public HashSet<int> Selected { get; } = new HashSet<int>();
public string Line { get; set; }
public int Index { get; set; }
public FateSelection(int index)
{
Index = index;
}
public void MakeSelects(bool clear = false)
{
if (clear)
Selected.Clear();
var ss = Line.Split('|');
foreach (var s in ss)
{
if (!string.IsNullOrWhiteSpace(s) && ThirdParty.Converter.TryInt(s, out int i))
Selected.Add(i);
}
}
public void MakeLine()
{
Line = string.Join("|", Selected);
}
}
//
public class ConnectionList
{
public List<ThirdParty.NativeMethods.TcpRow> Conns = new List<ThirdParty.NativeMethods.TcpRow>();
public void GetConnections(Process process)
{
Conns.Clear();
var size = 0;
var ret = ThirdParty.NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref size, true, AddressFamily.InterNetwork, 4);
var buff = Marshal.AllocHGlobal(size);
try
{
ret = ThirdParty.NativeMethods.GetExtendedTcpTable(buff, ref size, true, AddressFamily.InterNetwork, 4);
if (ret == 0)
{
var tbl = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpTable>(buff);
var ptr = (IntPtr)((long)buff + Marshal.SizeOf(tbl.entries));
for (var i = 0; i < tbl.entries; i++)
{
var row = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpRow>(ptr);
if (!IPAddress.IsLoopback(row.RemoteAddress) &&
process.Id == row.owningPid)
Conns.Add(row);
ptr = (IntPtr)((long)ptr + Marshal.SizeOf(row));
}
}
}
finally
{
if (buff != null)
Marshal.FreeHGlobal(buff);
}
}
}
}
}

244
DcContent.cs Normal file
View file

@ -0,0 +1,244 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace DutyContent
{
public class DcContent
{
// roulette
public class Roulette
{
public string Name { get; set; }
public static explicit operator Roulette(string name)
{
return new Roulette { Name = name };
}
}
// instance
public class Instance
{
public string Name { get; set; }
public static explicit operator Instance(string name)
{
return new Instance { Name = name };
}
}
// area
public class Area
{
public string Name { get; set; }
public IReadOnlyDictionary<int, Fate> Fates { get; set; }
}
// fate
public class Fate
{
public Area Area { get; set; }
public string Name { get; set; }
public static explicit operator Fate(string name)
{
return new Fate { Name = name };
}
}
// group
public class Group
{
public string Version { get; set; }
public string Language { get; set; }
public Dictionary<int, Roulette> Roulettes { get; set; }
public Dictionary<int, Instance> Instances { get; set; }
public Dictionary<int, Area> Areas { get; set; }
}
//
public static string Version { get; private set; }
public static string Language { get; private set; }
public static IReadOnlyDictionary<int, Roulette> Roulettes { get; private set; } = new Dictionary<int, Roulette>();
public static IReadOnlyDictionary<int, Instance> Instances { get; private set; } = new Dictionary<int, Instance>();
public static IReadOnlyDictionary<int, Area> Areas { get; private set; } = new Dictionary<int, Area>();
public static IReadOnlyDictionary<int, Fate> Fates { get; private set; } = new Dictionary<int, Fate>();
public static Dictionary<int, int> Missions { get; private set; } = new Dictionary<int, int>();
//
public static bool Initialize(string json)
{
if (string.IsNullOrWhiteSpace(json))
return false;
bool ret;
try
{
ret = Fill(json);
}
catch
{
ret = false;
}
return ret;
}
// parse json
private static bool Fill(string json)
{
Group data = JsonConvert.DeserializeObject<Group>(json);
Dictionary<int, Fate> fates = new Dictionary<int, Fate>();
foreach (var area in data.Areas)
{
foreach (var fate in area.Value.Fates)
{
try
{
fate.Value.Area = area.Value;
fates.Add(fate.Key, fate.Value);
}
catch (NullReferenceException /*nex*/)
{
MesgLog.E(7, fate.Key);
return false;
}
catch (Exception ex)
{
MesgLog.Ex(ex, 8);
return false;
}
}
}
Version = data.Version;
Language = data.Language;
Roulettes = data.Roulettes;
Instances = data.Instances;
Areas = data.Areas;
Fates = fates;
return true;
}
//
public static Roulette TryRoulette(int code)
{
return Roulettes.TryGetValue(code, out Roulette roulette) ? roulette : null;
}
//
public static Instance TryInstance(int code)
{
return Instances.TryGetValue(code, out Instance instance) ? instance : null;
}
//
public static Area TryArea(int code)
{
return Areas.TryGetValue(code, out Area area) ? area : null;
}
//
public static Fate TryFate(int code)
{
return Fates.ContainsKey(code) ? Fates[code] : null;
}
//
public static Roulette GetRoulette(int code)
{
return Roulettes.TryGetValue(code, out Roulette roulette) ? roulette :
new Roulette { Name = MesgLog.Text(9, code) };
}
//
public static Instance GetInstance(int code)
{
return Instances.TryGetValue(code, out Instance instance) ? instance :
new Instance { Name = MesgLog.Text(10, code) };
}
//
public static Area GetArea(int code)
{
return Areas.TryGetValue(code, out Area area) ? area :
new Area { Name = MesgLog.Text(11, code) };
}
//
public static Fate GetFate(int code)
{
return Fates.ContainsKey(code) ? Fates[code] :
new Fate { Name = MesgLog.Text(12, code) };
}
//
public static bool ReadContent(string language = null)
{
if (language == null)
language = DcConfig.Duty.Language;
else if (!DcConfig.Duty.Language.Equals(language))
DcConfig.Duty.Language = language;
string filename = Path.Combine(DcConfig.DataPath, $"DcDuty-{language}.json");
if (!File.Exists(filename))
{
language = "English";
filename = Path.Combine(DcConfig.DataPath, $"DcDuty-{language}.json");
if (!File.Exists(filename))
{
MesgLog.E(14, filename);
return false;
}
if (!DcConfig.Duty.Language.Equals(language))
DcConfig.Duty.Language = language;
}
string json = File.ReadAllText(filename, Encoding.UTF8);
if (!Initialize(json))
{
MesgLog.E(13);
return false;
}
else
{
MesgLog.I(20,
Language,
Version,
Areas.Count,
Roulettes.Count,
Instances.Count,
Fates.Count,
filename);
return true;
}
}
public static string CeStatusToString(int s)
{
// 10[1] status 0=end, 1=wait, 2=??, 3=progress
switch (s)
{
case 0: return MesgLog.Text(10017);
case 1: return MesgLog.Text(10018);
case 2: return MesgLog.Text(10019);
case 3: return MesgLog.Text(10020);
default: return MesgLog.Text(10021);
}
}
}
}

148
DcControl.Designer.cs generated Normal file
View file

@ -0,0 +1,148 @@

namespace DutyContent
{
partial class DcControl
{
/// <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()
{
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.tabMain = new System.Windows.Forms.TabControl();
this.tabPageDuty = new System.Windows.Forms.TabPage();
this.tabPageConfig = new System.Windows.Forms.TabPage();
this.txtMesg = new System.Windows.Forms.RichTextBox();
this.btnClearMesg = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.tabMain.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.tabMain);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.txtMesg);
this.splitContainer1.Panel2.Controls.Add(this.btnClearMesg);
this.splitContainer1.Size = new System.Drawing.Size(792, 567);
this.splitContainer1.SplitterDistance = 497;
this.splitContainer1.TabIndex = 0;
//
// tabMain
//
this.tabMain.Alignment = System.Windows.Forms.TabAlignment.Left;
this.tabMain.Controls.Add(this.tabPageDuty);
this.tabMain.Controls.Add(this.tabPageConfig);
this.tabMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabMain.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.tabMain.ItemSize = new System.Drawing.Size(30, 100);
this.tabMain.Location = new System.Drawing.Point(0, 0);
this.tabMain.Multiline = true;
this.tabMain.Name = "tabMain";
this.tabMain.SelectedIndex = 0;
this.tabMain.Size = new System.Drawing.Size(792, 497);
this.tabMain.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.tabMain.TabIndex = 0;
this.tabMain.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TabMain_DrawItem);
//
// tabPageDuty
//
this.tabPageDuty.BackColor = System.Drawing.Color.Transparent;
this.tabPageDuty.Location = new System.Drawing.Point(104, 4);
this.tabPageDuty.Name = "tabPageDuty";
this.tabPageDuty.Padding = new System.Windows.Forms.Padding(3);
this.tabPageDuty.Size = new System.Drawing.Size(684, 489);
this.tabPageDuty.TabIndex = 0;
this.tabPageDuty.Text = "Duty";
//
// tabPageConfig
//
this.tabPageConfig.Location = new System.Drawing.Point(104, 4);
this.tabPageConfig.Name = "tabPageConfig";
this.tabPageConfig.Padding = new System.Windows.Forms.Padding(3);
this.tabPageConfig.Size = new System.Drawing.Size(684, 489);
this.tabPageConfig.TabIndex = 1;
this.tabPageConfig.Text = "Config";
this.tabPageConfig.UseVisualStyleBackColor = true;
//
// txtMesg
//
this.txtMesg.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtMesg.Location = new System.Drawing.Point(104, 3);
this.txtMesg.Name = "txtMesg";
this.txtMesg.ReadOnly = true;
this.txtMesg.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
this.txtMesg.Size = new System.Drawing.Size(685, 60);
this.txtMesg.TabIndex = 1;
this.txtMesg.Text = "";
//
// btnClearMesg
//
this.btnClearMesg.Location = new System.Drawing.Point(3, 3);
this.btnClearMesg.Name = "btnClearMesg";
this.btnClearMesg.Size = new System.Drawing.Size(95, 33);
this.btnClearMesg.TabIndex = 0;
this.btnClearMesg.Text = "Clear Mesg";
this.btnClearMesg.UseVisualStyleBackColor = true;
//
// DcControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.splitContainer1);
this.Name = "DcControl";
this.Size = new System.Drawing.Size(792, 567);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.tabMain.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Button btnClearMesg;
private System.Windows.Forms.TabControl tabMain;
private System.Windows.Forms.TabPage tabPageDuty;
private System.Windows.Forms.TabPage tabPageConfig;
private System.Windows.Forms.RichTextBox txtMesg;
}
}

299
DcControl.cs Normal file
View file

@ -0,0 +1,299 @@
using Advanced_Combat_Tracker;
using System;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace DutyContent
{
public partial class DcControl : UserControl, IActPluginV1
{
public static string PluginName => "DutyContent";
private static DcControl _self;
public static DcControl Self => _self;
//
private ActPluginData _ffxiv_plugin_data;
private bool _is_form_loaded;
private bool _is_plugin_initializing;
private TabPage _act_tab;
private Label _act_label;
private Timer _update_and_check;
private ThirdParty.NativeMethods.ProcessHandle _game_process;
private bool _game_exist;
private bool _game_active;
private string _game_zone;
//
public DcControl()
{
_self = this;
//
RegisterActAssemblies();
InitializeComponent();
foreach (var f in Application.OpenForms)
{
if (f == ActGlobals.oFormActMain)
{
_is_form_loaded = true;
break;
}
}
//
Tab.DutyForm dutyform = new Tab.DutyForm();
tabPageDuty.Controls.Add(dutyform.Controls[0]);
Tab.ConfigForm configform = new Tab.ConfigForm();
tabPageConfig.Controls.Add(configform.Controls[0]);
}
//
public void RegisterActAssemblies()
{
var pin = ActGlobals.oFormActMain.ActPlugins.FirstOrDefault(x => x.pluginFile.Name.Equals("DutyContent.dll"));
DcConfig.PluginPath = pin?.pluginFile.DirectoryName;
DcConfig.DataPath = Path.Combine(DcConfig.PluginPath, "Data");
DcConfig.ConfigPath = Path.Combine(DcConfig.PluginPath, "DutyContent.config");
DcConfig.PacketPath = Path.Combine(DcConfig.PluginPath, "DutyPacket.config");
}
//
public void InitPlugin(TabPage tab, Label label)
{
_act_tab = tab;
_act_label = label;
if (_is_form_loaded)
ActPluginInitialize();
else
ActGlobals.oFormActMain.Shown += OFormActMain_Shown;
var actinfo = System.Reflection.Assembly.GetAssembly(typeof(ActGlobals));
MesgLog.I(5, actinfo.GetName().Version, actinfo.Location);
if (_ffxiv_plugin_data == null)
{
_ffxiv_plugin_data = ActGlobals.oFormActMain.ActPlugins.Where(x =>
x.pluginFile.Name.ToUpper().Contains("FFXIV_ACT_PLUGIN") &&
x.lblPluginStatus.Text.ToUpper().Contains("FFXIV PLUGIN STARTED."))
.Select(x => x)
.FirstOrDefault();
}
if (_ffxiv_plugin_data == null)
MesgLog.E(2); // FFXIV plugin is missing!
else
{
var ids = ((FFXIV_ACT_Plugin.FFXIV_ACT_Plugin)_ffxiv_plugin_data.pluginObj).DataSubscription;
ids.NetworkReceived -= FFXIVPlugin_NetworkReceived;
ids.NetworkReceived += FFXIVPlugin_NetworkReceived;
ids.ZoneChanged -= FFXIVPlugin_ZoneChanged;
ids.ZoneChanged += FFXIVPlugin_ZoneChanged;
MesgLog.I(6, System.Diagnostics.FileVersionInfo.GetVersionInfo(_ffxiv_plugin_data.pluginFile.FullName).FileVersion, _ffxiv_plugin_data.pluginFile.FullName);
}
_update_and_check = new Timer()
{
Interval = 300,
};
_update_and_check.Tick += (sender, e) =>
{
UpdateAndCheckProc();
_update_and_check.Interval = _game_exist ? _game_active ? 50 : 300 : 500;
};
_update_and_check.Start();
}
//
public void DeInitPlugin()
{
_update_and_check.Stop();
DcConfig.PluginEnable = false;
Tab.DutyForm.Self?.PluginDeinitialize();
Tab.ConfigForm.Self?.PluginDeinitialize();
DcConfig.SaveConfig();
MesgLog.SetTextBox(null);
_act_tab = null;
if (_act_label != null)
{
_act_label.Text = "Closed";
_act_label = null;
}
}
private void OFormActMain_Shown(object sender, EventArgs e)
{
_is_form_loaded = true;
ActPluginInitialize();
}
//
private void ActPluginInitialize()
{
if (_is_plugin_initializing)
return;
_is_plugin_initializing = true;
_act_label.Text = "Starting...";
//
MesgLog.SetTextBox(txtMesg);
MesgLog.Initialize(Properties.Resources.DefaultMessage);
DcConfig.Load();
DcConfig.ReadLanguage(true);
DcContent.ReadContent();
UpdateUiLocale();
MesgLog.C(Color.Aquamarine, 4);
//
Dock = DockStyle.Fill;
_act_label.Text = MesgLog.Text(1); // Duty ready
_act_tab.Text = MesgLog.Text(0); // FFXIV dc
_act_tab.Controls.Add(this);
//
Tab.ConfigForm.Self?.PluginInitialize();
Tab.DutyForm.Self?.PluginInitialize();
//
DcConfig.PluginEnable = true;
_is_plugin_initializing = false;
}
//
private void TabMain_DrawItem(object sender, DrawItemEventArgs e)
{
var g = e.Graphics;
TabPage p = tabMain.TabPages[e.Index];
Rectangle r = tabMain.GetTabRect(e.Index);
StringFormat s = new StringFormat()
{
Alignment = StringAlignment.Near,
LineAlignment = StringAlignment.Center,
};
Brush b, h;
Font f;
if (tabMain.SelectedIndex == e.Index)
{
f = new Font(tabMain.Font.FontFamily, 12.0f, FontStyle.Bold, GraphicsUnit.Pixel);
#if false
b = new SolidBrush(Color.Black);
h = SystemBrushes.Window;
#else
b = new SolidBrush(Color.White);
h = SystemBrushes.Highlight;
#endif
}
//else if (p.col)
else
{
f = new Font(tabMain.Font.FontFamily, 12.0f, FontStyle.Regular, GraphicsUnit.Pixel);
b = new SolidBrush(Color.DarkSlateGray);
h = SystemBrushes.Control;
}
g.FillRectangle(h, r);
g.DrawString(p.Text, f, b, r, new StringFormat(s));
}
//
private void UpdateAndCheckProc()
{
if (_game_process == null || _game_process.Process.HasExited)
{
_game_exist = false;
_game_active = false;
// will be update game status next time
var p = (from x in Process.GetProcessesByName("ffxiv_dx11") where !x.HasExited && x.MainModule != null && x.MainModule.ModuleName == "ffxiv_dx11.exe" select x).FirstOrDefault<Process>();
if (p != null && p.HasExited)
p = null;
if (((_game_process == null) != (p == null)) ||
(_game_process != null && p != null && _game_process.Process.Id != p.Id))
{
_game_process = p != null ? new ThirdParty.NativeMethods.ProcessHandle(p) : null;
}
if (_game_process != null)
{
//
DcConfig.Connections.GetConnections(_game_process.Process);
//MesgLog.L("count: {0}", DcConfig.Connections.Conns.Count);
}
}
else
{
_game_exist = true;
var fgw = ThirdParty.NativeMethods.GetForegroundWindow();
ThirdParty.NativeMethods.GetWindowThreadProcessId(fgw, out int id);
_game_active = _game_process.Process.Id == id;
}
var zone = ActGlobals.oFormActMain.CurrentZone;
if (_game_zone == null || !zone.Equals(_game_zone))
{
#if false
if (_game_zone != null)
MesgLog.I(1008, _game_zone);
_game_zone = zone;
MesgLog.I(1007, zone);
#else
_game_zone = zone;
#endif
}
}
//
private void FFXIVPlugin_NetworkReceived(string connection, long epoch, byte[] message)
{
if (message.Length < 32)
return;
Tab.DutyForm.Self?.PacketHandler(connection, message);
}
//
private void FFXIVPlugin_ZoneChanged(uint zone_id, string zone_name)
{
Tab.DutyForm.Self?.ZoneChanged(zone_id, zone_name);
}
//
public void UpdateUiLocale()
{
tabPageDuty.Text = MesgLog.Text(300);
Tab.DutyForm.Self?.UpdateUiLocale();
tabPageConfig.Text= MesgLog.Text(200);
Tab.ConfigForm.Self?.UpdateUiLocale();
}
}
}

120
DcControl.resx Normal file
View file

@ -0,0 +1,120 @@
<?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>
</root>

174
DutyContent.csproj Normal file
View file

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{66572F39-C8FD-4F89-BFA1-811C2A27D563}</ProjectGuid>
<OutputType>library</OutputType>
<RootNamespace>DutyContent</RootNamespace>
<AssemblyName>DutyContent</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<Deterministic>false</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Deterministic>false</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Deterministic>false</Deterministic>
</PropertyGroup>
<ItemGroup>
<Reference Include="Advanced Combat Tracker">
<HintPath>References\ACT\Advanced Combat Tracker.exe</HintPath>
</Reference>
<Reference Include="FFXIV_ACT_Plugin">
<HintPath>References\ACT\FFXIV_ACT_Plugin.dll</HintPath>
</Reference>
<Reference Include="FFXIV_ACT_Plugin.Common">
<HintPath>References\ACT\FFXIV_ACT_Plugin.Common.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<Compile Include="DcConfig.cs" />
<Compile Include="DcControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="DcControl.Designer.cs">
<DependentUpon>DcControl.cs</DependentUpon>
</Compile>
<Compile Include="Tab\ConfigForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Tab\ConfigForm.Designer.cs">
<DependentUpon>ConfigForm.cs</DependentUpon>
</Compile>
<Compile Include="Tab\DutyForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Tab\DutyForm.Designer.cs">
<DependentUpon>DutyForm.cs</DependentUpon>
</Compile>
<Compile Include="DcContent.cs" />
<Compile Include="Interface\IPacketHandler.cs" />
<Compile Include="Interface\ISuppActPlugin.cs" />
<Compile Include="Interface\ISuppLocale.cs" />
<Compile Include="Overlay\DutyOvForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Overlay\DutyOvForm.Designer.cs">
<DependentUpon>DutyOvForm.cs</DependentUpon>
</Compile>
<Compile Include="ThirdParty\Converter.cs" />
<Compile Include="ThirdParty\LineDb.cs" />
<Compile Include="ThirdParty\NativeMethods.cs" />
<Compile Include="WorkerAct.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="MesgLog.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="DcControl.resx">
<DependentUpon>DcControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Tab\ConfigForm.resx">
<DependentUpon>ConfigForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Tab\DutyForm.resx">
<DependentUpon>DutyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Overlay\DutyOvForm.resx">
<DependentUpon>DutyOvForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Data\DcDuty-English.json" />
<None Include="Data\DcDuty-Japanese.json" />
<None Include="Data\DcDuty-Korean.json" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="README.md" />
<None Include="Resources\pix_tab_setting.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_tab_content.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\mesg.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_tab_tool.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_annotation.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_play.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_magnify.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Data\DcLang-Korean%28Actoz%29.txt" />
</ItemGroup>
<ItemGroup>
<Resource Include="Data\DcLang-Japanese.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>if exist "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" copy $(TargetPath) "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" /y
</PostBuildEvent>
</PropertyGroup>
</Project>

25
DutyContent.sln Normal file
View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DutyContent", "DutyContent.csproj", "{66572F39-C8FD-4F89-BFA1-811C2A27D563}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{66572F39-C8FD-4F89-BFA1-811C2A27D563}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66572F39-C8FD-4F89-BFA1-811C2A27D563}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66572F39-C8FD-4F89-BFA1-811C2A27D563}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66572F39-C8FD-4F89-BFA1-811C2A27D563}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A81E51A1-CA63-4713-A000-69BCC7E3F0F8}
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DutyContent.Interface
{
interface IPacketHandler
{
void PacketHandler(string pid, byte[] message);
void ZoneChanged(uint zone_id, string zone_name);
}
}

View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DutyContent.Interface
{
interface ISuppActPlugin
{
void PluginInitialize();
void PluginDeinitialize();
}
}

14
Interface/ISuppLocale.cs Normal file
View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DutyContent.Interface
{
interface ISuppLocale
{
void RefreshLocale();
void UpdateUiLocale();
}
}

127
MesgLog.cs Normal file
View file

@ -0,0 +1,127 @@
using System;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace DutyContent
{
class MesgLog
{
private static ThirdParty.LineDb _lines;
private static RichTextBox _logs;
private static readonly Regex ExceptionPattern = new Regex(@"\{(.+?)\}");
public static string Language { get; private set; }
public static void Initialize(string text)
{
_lines = new ThirdParty.LineDb(text, true);
}
public static bool LoadFile(string filename, Encoding enc)
{
if (_lines == null)
return false;
else
{
_lines.LoadFile(filename, enc, true);
return true;
}
}
public static bool LoadFile(string filename)
{
return LoadFile(filename, Encoding.UTF8);
}
public static void SetTextBox(RichTextBox textbox)
{
_logs = textbox;
}
public static string Text(string text)
{
return _lines == null || !_lines.Try(text, out string v) ? $"<{text}>" : v;
}
public static string Text(string text, params object[] prms)
{
return _lines == null || !_lines.Try(text, out string v) ? $"<{text}>" : string.Format(v, prms);
}
public static string Text(int key)
{
return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : v;
}
public static string Text(int key, params object[] prms)
{
return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : string.Format(v, prms);
}
public static void Write(Color color, string format, params object[] prms)
{
if (_logs == null || _logs.IsDisposed || format == null)
return;
var text = string.Format(format, prms);
var dt = DateTime.Now.ToString("HH:mm:ss");
var ms = $"[{dt}] {text}{Environment.NewLine}";
WorkerAct.Invoker(() =>
{
_logs.SelectionColor = color;
_logs.SelectionStart = _logs.TextLength;
_logs.SelectionLength = 0;
_logs.AppendText(ms);
_logs.SelectionColor = _logs.ForeColor;
ThirdParty.NativeMethods.ScrollToBottom(_logs);
});
}
public static void Write(string format, params object[] prms)
{
Write(Color.White, format, prms);
}
public static void L(string format, params object[] prms)
{
Write(Color.DarkBlue, format, prms);
}
// color
public static void C(Color color, int key, params object[] prms)
{
Write(color, Text(key, prms));
}
// info / black
public static void I(int key, params object[] prms)
{
Write(Color.Black, Text(key, prms));
}
// error / red
public static void E(int key, params object[] prms)
{
Write(Color.Red, Text(key, prms));
}
// gray
public static void Y(int key, params object[] prms)
{
Write(Color.Gray, Text(key, prms));
}
// exception
public static void Ex(Exception ex, int key, params object[] prms)
{
string text = Text(key, prms);
string msg = ExceptionPattern.Replace(ex.Message, "{{$1}}");
Write(Color.Red, $"{text}: {msg}");
}
}
}

72
Overlay/DutyOvForm.Designer.cs generated Normal file
View file

@ -0,0 +1,72 @@

namespace DutyContent.Overlay
{
partial class DutyOvForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.lblText = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// lblText
//
this.lblText.AutoEllipsis = true;
this.lblText.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblText.ForeColor = System.Drawing.Color.White;
this.lblText.Location = new System.Drawing.Point(0, 0);
this.lblText.Name = "lblText";
this.lblText.Size = new System.Drawing.Size(300, 20);
this.lblText.TabIndex = 0;
this.lblText.Text = "Duty Content";
this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblText.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseDown);
//
// DutyOvForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(300, 25);
this.ControlBox = false;
this.Controls.Add(this.lblText);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "DutyOvForm";
this.Opacity = 0.5D;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "DutyOvForm";
this.TopMost = true;
this.Load += new System.EventHandler(this.DutyOvForm_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label lblText;
}
}

145
Overlay/DutyOvForm.cs Normal file
View file

@ -0,0 +1,145 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DutyContent.Overlay
{
public partial class DutyOvForm : Form
{
private const int BlinkTime = 300;
private const int BlinkCount = 20;
private static readonly Color ColorFate = Color.DarkOrange;
private static readonly Color ColorMatch = Color.Red;
private static readonly Color ColorNone = Color.Black;
//
private Timer _timer;
private int _blink;
private Color _accent;
//
public DutyOvForm()
{
InitializeComponent();
Location = DcConfig.Duty.OverlayLocation;
_timer = new Timer { Interval = BlinkTime };
_timer.Tick += (sender, e) =>
{
if (++_blink > BlinkCount)
{
StopBlink();
}
else
{
BackColor = (BackColor == ColorNone) ? _accent : ColorNone;
}
};
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x80/*WS_EX_TOOLWINDOW*/ | 0x80000/*WS_EX_LAYERED*/;
return cp;
}
}
private void DutyOvForm_Load(object sender, EventArgs e)
{
}
private void DoMoveDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ThirdParty.NativeMethods.ReleaseCapture();
ThirdParty.NativeMethods.SendMessage(Handle, 0xA1/*WM_NCLBUTTONDOWN*/, new IntPtr(0x2/*HT_CAPTION*/), IntPtr.Zero);
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
DoMoveDown(e);
}
protected override void OnLocationChanged(EventArgs e)
{
base.OnLocationChanged(e);
DcConfig.Duty.OverlayLocation = Location;
}
private void lblText_MouseDown(object sender, MouseEventArgs e)
{
DoMoveDown(e);
}
public void SetText(string text)
{
lblText.Text = text;
}
public void StartBlink()
{
_blink = 0;
_timer.Enabled = false;
_timer.Start();
}
public void StopBlink()
{
_timer.Stop();
BackColor = ColorNone;
_accent = ColorNone;
lblText.Text = string.Empty;
}
public void PlayNone()
{
Invoke((MethodInvoker)(() =>
{
_accent = ColorNone;
lblText.Text = string.Empty;
StopBlink();
}));
}
public void PlayFate(DcContent.Fate f)
{
Invoke((MethodInvoker)(() =>
{
_accent = ColorFate;
lblText.Text = f.Name;
StartBlink();
}));
}
public void PlayQueue(string name)
{
Invoke((MethodInvoker)(() =>
{
_accent = ColorNone;
lblText.Text = name;
}));
}
public void PlayMatch(string name, bool blink = true) // PlayEnter
{
Invoke((MethodInvoker)(() =>
{
_accent = ColorMatch;
lblText.Text = name;
if (blink)
StartBlink();
}));
}
}
}

120
Overlay/DutyOvForm.resx Normal file
View file

@ -0,0 +1,120 @@
<?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>
</root>

View file

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("DutyContent")]
[assembly: AssemblyDescription("Duty Content for FFXIV")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DutyContent")]
[assembly: AssemblyCopyright("Copyright © ksh 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
//지역화 가능 애플리케이션 빌드를 시작하려면 다음을 설정하세요.
//.csproj 파일에서 <PropertyGroup> 내에 <UICulture>CultureYouAreCodingWith</UICulture>를
//설정하십시오. 예를 들어 소스 파일에서 영어(미국)를
//사용하는 경우 <UICulture>를 en-US로 설정합니다. 그런 다음 아래
//NeutralResourceLanguage 특성의 주석 처리를 제거합니다. 아래 줄의 "en-US"를 업데이트하여
//프로젝트 파일의 UICulture 설정과 일치시킵니다.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly:ThemeInfo(
ResourceDictionaryLocation.None, //테마별 리소스 사전의 위치
//(페이지 또는 응용 프로그램 리소스 사진에
// 리소스가 없는 경우에 사용됨)
ResourceDictionaryLocation.SourceAssembly //제네릭 리소스 사전의 위치
//(페이지 또는 응용 프로그램 리소스 사진에
// 리소스가 없는 경우에 사용됨)
)]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]

155
Properties/Resources.Designer.cs generated Normal file
View file

@ -0,0 +1,155 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DutyContent.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DutyContent.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// # Default English message
///LANG=English
///
///0=FFXIV dc
///1=Duty ready
///2=FFXIV plugin is missing!
///3=FFXIV plugin found!
///4=FFXIV Duty Content starting!
///5=ACT info: {0} ({1})
///6=FFXIV plugin info {0} ({1})
///7=Invalid data: {0}
///8=Parsing error
///9=Unknown roulette: {0}
///10=Unknown instance: {0}
///11=Unknown area: {0}
///12=Unknown FATE: {0}
///13=Data reading failed!
///14=Data file not found! {0}
///20=Duty contents info: {0}({1}) / A:{2} / R:{3} / I:{4} / F:{5} ({6})
///21=Roulette
///22=Instance
///23=FATE
///24=Skirmish
///[나머지 문자열은 잘림]&quot;;과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
internal static string DefaultMessage {
get {
return ResourceManager.GetString("DefaultMessage", resourceCulture);
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_annotation {
get {
object obj = ResourceManager.GetObject("pix_annotation", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_magnify {
get {
object obj = ResourceManager.GetObject("pix_magnify", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_play {
get {
object obj = ResourceManager.GetObject("pix_play", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_tab_content {
get {
object obj = ResourceManager.GetObject("pix_tab_content", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_tab_setting {
get {
object obj = ResourceManager.GetObject("pix_tab_setting", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_tab_tool {
get {
object obj = ResourceManager.GetObject("pix_tab_tool", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

142
Properties/Resources.resx Normal file
View file

@ -0,0 +1,142 @@
<?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="DefaultMessage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\mesg.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="pix_annotation" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_annotation.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_magnify" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_magnify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_play" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_content" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\pix_tab_content.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_setting" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_tool" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_tool.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

30
Properties/Settings.Designer.cs generated Normal file
View file

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DutyContent.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View file

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

87
Resources/mesg.txt Normal file
View file

@ -0,0 +1,87 @@
# Default English message
LANG=English
0=FFXIV dc
1=Duty ready
2=FFXIV plugin is missing!
3=FFXIV plugin found!
4=FFXIV Duty Content starting!
5=ACT info: {0} ({1})
6=FFXIV plugin info {0} ({1})
7=Invalid data: {0}
8=Parsing error
9=Unknown roulette: {0}
10=Unknown instance: {0}
11=Unknown area: {0}
12=Unknown FATE: {0}
13=Data reading failed!
14=Data file not found! {0}
20=Duty contents info: {1}({0}) / A:{2} / R:{3} / I:{4} / F:{5} ({6})
21=Roulette
22=Instance
23=FATE
24=Skirmish
25=CE
26=Default
99=DutyContent Plugin {0}
101=Select wave file
102=Wave (*.wav)|*.wav|All (*.*)|*.*
103=Notify test!!
200=Config
201=Display Language
202=Hide overlays when FFXIV client is in the background
300=Duty
301=Contents
302=Setting
303=Packet
304=Dataset
305=Log font
306=Enable overlay
307=Transparent
308=Enable sound
309=Instance
310=FATE
311=Use LINE notify
312=Token
313=Use Telegram notify
314=ID
315=Token
316=Packet finder
317=Description
318=Bozja Finder
319=Function
320=Current
321=Status
322=Found
323=Name
324=Status
325=Member
326=Progress
10001="{0}" spawned!
10002=Entry: {0}
10003=Matched: {0}
10004=Enter: {0}
10005={0} spawned!
10006=Duty entries: {0}
10007=Start
10008=Cancel
10009=Apply && Save
10010=Go to Middle La Noscea. Wait for FATEs appear. Also skirmishes in "The Bozjan Southern Front" can be use.
10011=Enter tial "The Steps of Faith" with undersize option.
10012=Match
10013=Instance
10014=Go to "The Bozjan Southern Front" and wait Critical Engagements. Candidates will be appear at right side Bozja finder.
10015=Select item to show description
10016=Ok
10017=End
10018=Register
10019=Entry
10020=Progress
10021=Unknown
10022=Apply and overwrite packet data?
10023=Selected

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
Resources/pix_magnify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

BIN
Resources/pix_play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

BIN
Resources/pix_tab_tool.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

103
Tab/ConfigForm.Designer.cs generated Normal file
View file

@ -0,0 +1,103 @@

namespace DutyContent.Tab
{
partial class ConfigForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.lblCurrentLang = new System.Windows.Forms.Label();
this.cboDispLang = new System.Windows.Forms.ComboBox();
this.lblDispLang = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.lblCurrentLang);
this.panel1.Controls.Add(this.cboDispLang);
this.panel1.Controls.Add(this.lblDispLang);
this.panel1.Location = new System.Drawing.Point(12, 12);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(776, 158);
this.panel1.TabIndex = 0;
//
// lblCurrentLang
//
this.lblCurrentLang.Location = new System.Drawing.Point(237, 37);
this.lblCurrentLang.Name = "lblCurrentLang";
this.lblCurrentLang.Size = new System.Drawing.Size(150, 15);
this.lblCurrentLang.TabIndex = 4;
this.lblCurrentLang.Text = "--";
this.lblCurrentLang.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// cboDispLang
//
this.cboDispLang.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboDispLang.FormattingEnabled = true;
this.cboDispLang.Location = new System.Drawing.Point(170, 13);
this.cboDispLang.Name = "cboDispLang";
this.cboDispLang.Size = new System.Drawing.Size(217, 21);
this.cboDispLang.TabIndex = 1;
this.cboDispLang.SelectedIndexChanged += new System.EventHandler(this.CboDispLang_SelectedIndexChanged);
//
// lblDispLang
//
this.lblDispLang.AutoSize = true;
this.lblDispLang.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblDispLang.Location = new System.Drawing.Point(12, 11);
this.lblDispLang.Name = "lblDispLang";
this.lblDispLang.Size = new System.Drawing.Size(39, 20);
this.lblDispLang.TabIndex = 0;
this.lblDispLang.Text = "201";
//
// ConfigForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.panel1);
this.Name = "ConfigForm";
this.Text = "Config";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label lblDispLang;
private System.Windows.Forms.ComboBox cboDispLang;
private System.Windows.Forms.Label lblCurrentLang;
}
}

106
Tab/ConfigForm.cs Normal file
View file

@ -0,0 +1,106 @@
using DutyContent.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DutyContent.Tab
{
public partial class ConfigForm : Form, Interface.ISuppLocale, Interface.ISuppActPlugin
{
private static ConfigForm _self;
public static ConfigForm Self => _self;
public ConfigForm()
{
_self = this;
InitializeComponent();
}
public void PluginDeinitialize()
{
}
public void PluginInitialize()
{
//
lblCurrentLang.Text = MesgLog.Text("LANG");
//
var lang = MakeConfigLangList();
foreach (var i in lang)
{
var n = cboDispLang.Items.Add(i);
if (i.Equals(DcConfig.Language))
cboDispLang.SelectedIndex = n;
}
if (cboDispLang.SelectedIndex < 0)
cboDispLang.SelectedIndex = 0;
}
public void RefreshLocale()
{
}
public void UpdateUiLocale()
{
lblDispLang.Text = MesgLog.Text(201);
}
public static List<string> MakeConfigLangList()
{
List<string> lst = new List<string>();
lst.Add($"<{MesgLog.Text(26)}>");
DirectoryInfo di = new DirectoryInfo(DcConfig.DataPath);
foreach (var fi in di.GetFiles("DcLang-*.txt"))
{
var s = fi.Name.Substring(7, fi.Name.Length - 7 - 4);
lst.Add(s);
}
return lst;
}
private void CboDispLang_SelectedIndexChanged(object sender, EventArgs e)
{
if (!DcConfig.PluginEnable)
return;
if (cboDispLang.SelectedIndex == 0)
{
// default
DcConfig.Language = string.Empty;
}
else
{
var l = (string)cboDispLang.SelectedItem;
if (string.IsNullOrWhiteSpace(l) || l.Equals(DcConfig.Language))
return;
DcConfig.Language = l;
}
//
DcConfig.ReadLanguage();
DcControl.Self?.UpdateUiLocale();
DcConfig.SaveConfig();
lblCurrentLang.Text = MesgLog.Text("LANG");
}
}
}

120
Tab/ConfigForm.resx Normal file
View file

@ -0,0 +1,120 @@
<?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>
</root>

935
Tab/DutyForm.Designer.cs generated Normal file
View file

@ -0,0 +1,935 @@

namespace DutyContent.Tab
{
partial class DutyForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
"FATE",
"",
"",
""}, -1);
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(new string[] {
"Duty",
"",
"",
""}, -1);
System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(new string[] {
"Match",
"",
"",
""}, -1);
System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem(new string[] {
"Instance",
"",
"",
""}, -1);
System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(new string[] {
"Southern Bozja",
"",
"",
""}, -1);
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DutyForm));
this.tabContent = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.rdoFatePreset4 = new System.Windows.Forms.RadioButton();
this.rdoFatePreset3 = new System.Windows.Forms.RadioButton();
this.rdoFatePreset2 = new System.Windows.Forms.RadioButton();
this.rdoFatePreset1 = new System.Windows.Forms.RadioButton();
this.treeFates = new System.Windows.Forms.TreeView();
this.txtContentLog = new System.Windows.Forms.RichTextBox();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.panel4 = new System.Windows.Forms.Panel();
this.lblTelegramToken = new System.Windows.Forms.Label();
this.txtTelegramToken = new System.Windows.Forms.TextBox();
this.lblTelegramId = new System.Windows.Forms.Label();
this.txtTelegramId = new System.Windows.Forms.TextBox();
this.chkUseNotifyTelegram = new System.Windows.Forms.CheckBox();
this.btnTestNotify = new System.Windows.Forms.Button();
this.lblLineNotifyBotLink = new System.Windows.Forms.LinkLabel();
this.lblLineToken = new System.Windows.Forms.Label();
this.txtLineToken = new System.Windows.Forms.TextBox();
this.chkUseNotifyLine = new System.Windows.Forms.CheckBox();
this.panel3 = new System.Windows.Forms.Panel();
this.lblCurrentDataSet = new System.Windows.Forms.Label();
this.cboDataset = new System.Windows.Forms.ComboBox();
this.lblDataSet = new System.Windows.Forms.Label();
this.btnLogFont = new System.Windows.Forms.Button();
this.lblLogFont = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.btnSoundPlayFate = new System.Windows.Forms.Button();
this.btnSoundPlayInstance = new System.Windows.Forms.Button();
this.btnSoundFindFate = new System.Windows.Forms.Button();
this.btnSoundFindInstance = new System.Windows.Forms.Button();
this.lblSoundFate = new System.Windows.Forms.Label();
this.txtSoundFate = new System.Windows.Forms.TextBox();
this.txtSoundInstance = new System.Windows.Forms.TextBox();
this.chkEnableSound = new System.Windows.Forms.CheckBox();
this.lblSoundInstance = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.progbOverlayTransparent = new System.Windows.Forms.ProgressBar();
this.btnOverlayDimming = new System.Windows.Forms.Button();
this.lblOverlayTransparent = new System.Windows.Forms.Label();
this.chkEnableOverlay = new System.Windows.Forms.CheckBox();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.panel5 = new System.Windows.Forms.Panel();
this.txtPacketDescription = new System.Windows.Forms.TextBox();
this.lblPacketDesc = new System.Windows.Forms.Label();
this.btnPacketApply = new System.Windows.Forms.Button();
this.btnPacketStart = new System.Windows.Forms.Button();
this.lstBozjaInfo = new System.Windows.Forms.ListView();
this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.lblPacketBozja = new System.Windows.Forms.Label();
this.txtPacketInfo = new System.Windows.Forms.TextBox();
this.lstPacketInfo = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.lblPacketFinder = new System.Windows.Forms.Label();
this.ilTabContent = new System.Windows.Forms.ImageList(this.components);
this.tabContent.SuspendLayout();
this.tabPage1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.panel4.SuspendLayout();
this.panel3.SuspendLayout();
this.panel2.SuspendLayout();
this.panel1.SuspendLayout();
this.tabPage3.SuspendLayout();
this.panel5.SuspendLayout();
this.SuspendLayout();
//
// tabContent
//
this.tabContent.Controls.Add(this.tabPage1);
this.tabContent.Controls.Add(this.tabPage2);
this.tabContent.Controls.Add(this.tabPage3);
this.tabContent.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabContent.ImageList = this.ilTabContent;
this.tabContent.Location = new System.Drawing.Point(0, 0);
this.tabContent.Name = "tabContent";
this.tabContent.SelectedIndex = 0;
this.tabContent.Size = new System.Drawing.Size(800, 502);
this.tabContent.TabIndex = 0;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.splitContainer1);
this.tabPage1.ImageIndex = 0;
this.tabPage1.Location = new System.Drawing.Point(4, 39);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(792, 459);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "301";
this.tabPage1.UseVisualStyleBackColor = true;
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(3, 3);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.rdoFatePreset4);
this.splitContainer1.Panel1.Controls.Add(this.rdoFatePreset3);
this.splitContainer1.Panel1.Controls.Add(this.rdoFatePreset2);
this.splitContainer1.Panel1.Controls.Add(this.rdoFatePreset1);
this.splitContainer1.Panel1.Controls.Add(this.treeFates);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.txtContentLog);
this.splitContainer1.Size = new System.Drawing.Size(786, 453);
this.splitContainer1.SplitterDistance = 262;
this.splitContainer1.TabIndex = 0;
//
// rdoFatePreset4
//
this.rdoFatePreset4.AutoSize = true;
this.rdoFatePreset4.Location = new System.Drawing.Point(116, 6);
this.rdoFatePreset4.Name = "rdoFatePreset4";
this.rdoFatePreset4.Size = new System.Drawing.Size(31, 17);
this.rdoFatePreset4.TabIndex = 4;
this.rdoFatePreset4.TabStop = true;
this.rdoFatePreset4.Tag = "3";
this.rdoFatePreset4.Text = "4";
this.rdoFatePreset4.UseVisualStyleBackColor = true;
this.rdoFatePreset4.CheckedChanged += new System.EventHandler(this.RdoFatePreset4_CheckedChanged);
//
// rdoFatePreset3
//
this.rdoFatePreset3.AutoSize = true;
this.rdoFatePreset3.Location = new System.Drawing.Point(79, 6);
this.rdoFatePreset3.Name = "rdoFatePreset3";
this.rdoFatePreset3.Size = new System.Drawing.Size(31, 17);
this.rdoFatePreset3.TabIndex = 3;
this.rdoFatePreset3.TabStop = true;
this.rdoFatePreset3.Tag = "2";
this.rdoFatePreset3.Text = "3";
this.rdoFatePreset3.UseVisualStyleBackColor = true;
this.rdoFatePreset3.CheckedChanged += new System.EventHandler(this.RdoFatePreset3_CheckedChanged);
//
// rdoFatePreset2
//
this.rdoFatePreset2.AutoSize = true;
this.rdoFatePreset2.Location = new System.Drawing.Point(42, 6);
this.rdoFatePreset2.Name = "rdoFatePreset2";
this.rdoFatePreset2.Size = new System.Drawing.Size(31, 17);
this.rdoFatePreset2.TabIndex = 2;
this.rdoFatePreset2.TabStop = true;
this.rdoFatePreset2.Tag = "1";
this.rdoFatePreset2.Text = "2";
this.rdoFatePreset2.UseVisualStyleBackColor = true;
this.rdoFatePreset2.CheckedChanged += new System.EventHandler(this.RdoFatePreset2_CheckedChanged);
//
// rdoFatePreset1
//
this.rdoFatePreset1.AutoSize = true;
this.rdoFatePreset1.Checked = true;
this.rdoFatePreset1.Location = new System.Drawing.Point(5, 6);
this.rdoFatePreset1.Name = "rdoFatePreset1";
this.rdoFatePreset1.Size = new System.Drawing.Size(31, 17);
this.rdoFatePreset1.TabIndex = 1;
this.rdoFatePreset1.TabStop = true;
this.rdoFatePreset1.Tag = "0";
this.rdoFatePreset1.Text = "1";
this.rdoFatePreset1.UseVisualStyleBackColor = true;
this.rdoFatePreset1.CheckedChanged += new System.EventHandler(this.RdoFatePreset1_CheckedChanged);
//
// treeFates
//
this.treeFates.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeFates.CheckBoxes = true;
this.treeFates.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.treeFates.Location = new System.Drawing.Point(0, 29);
this.treeFates.Name = "treeFates";
this.treeFates.Size = new System.Drawing.Size(260, 424);
this.treeFates.TabIndex = 0;
this.treeFates.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.TreeFates_AfterCheck);
//
// txtContentLog
//
this.txtContentLog.BackColor = System.Drawing.Color.AliceBlue;
this.txtContentLog.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtContentLog.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtContentLog.Location = new System.Drawing.Point(0, 0);
this.txtContentLog.Name = "txtContentLog";
this.txtContentLog.ReadOnly = true;
this.txtContentLog.Size = new System.Drawing.Size(520, 453);
this.txtContentLog.TabIndex = 0;
this.txtContentLog.Text = "";
//
// tabPage2
//
this.tabPage2.Controls.Add(this.panel4);
this.tabPage2.Controls.Add(this.panel3);
this.tabPage2.Controls.Add(this.panel2);
this.tabPage2.Controls.Add(this.panel1);
this.tabPage2.ImageIndex = 1;
this.tabPage2.Location = new System.Drawing.Point(4, 39);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(792, 459);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "302";
this.tabPage2.UseVisualStyleBackColor = true;
//
// panel4
//
this.panel4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel4.Controls.Add(this.lblTelegramToken);
this.panel4.Controls.Add(this.txtTelegramToken);
this.panel4.Controls.Add(this.lblTelegramId);
this.panel4.Controls.Add(this.txtTelegramId);
this.panel4.Controls.Add(this.chkUseNotifyTelegram);
this.panel4.Controls.Add(this.btnTestNotify);
this.panel4.Controls.Add(this.lblLineNotifyBotLink);
this.panel4.Controls.Add(this.lblLineToken);
this.panel4.Controls.Add(this.txtLineToken);
this.panel4.Controls.Add(this.chkUseNotifyLine);
this.panel4.Location = new System.Drawing.Point(6, 273);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(778, 143);
this.panel4.TabIndex = 3;
//
// lblTelegramToken
//
this.lblTelegramToken.AutoSize = true;
this.lblTelegramToken.Location = new System.Drawing.Point(22, 118);
this.lblTelegramToken.Name = "lblTelegramToken";
this.lblTelegramToken.Size = new System.Drawing.Size(25, 13);
this.lblTelegramToken.TabIndex = 15;
this.lblTelegramToken.Text = "315";
//
// txtTelegramToken
//
this.txtTelegramToken.Location = new System.Drawing.Point(108, 115);
this.txtTelegramToken.Name = "txtTelegramToken";
this.txtTelegramToken.Size = new System.Drawing.Size(515, 20);
this.txtTelegramToken.TabIndex = 14;
this.txtTelegramToken.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtTelegramToken_KeyDown);
//
// lblTelegramId
//
this.lblTelegramId.AutoSize = true;
this.lblTelegramId.Location = new System.Drawing.Point(23, 92);
this.lblTelegramId.Name = "lblTelegramId";
this.lblTelegramId.Size = new System.Drawing.Size(25, 13);
this.lblTelegramId.TabIndex = 13;
this.lblTelegramId.Text = "314";
//
// txtTelegramId
//
this.txtTelegramId.Location = new System.Drawing.Point(108, 89);
this.txtTelegramId.Name = "txtTelegramId";
this.txtTelegramId.Size = new System.Drawing.Size(515, 20);
this.txtTelegramId.TabIndex = 12;
this.txtTelegramId.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtTelegramId_KeyDown);
//
// chkUseNotifyTelegram
//
this.chkUseNotifyTelegram.AutoSize = true;
this.chkUseNotifyTelegram.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkUseNotifyTelegram.Location = new System.Drawing.Point(3, 59);
this.chkUseNotifyTelegram.Name = "chkUseNotifyTelegram";
this.chkUseNotifyTelegram.Size = new System.Drawing.Size(58, 24);
this.chkUseNotifyTelegram.TabIndex = 11;
this.chkUseNotifyTelegram.Text = "313";
this.chkUseNotifyTelegram.UseVisualStyleBackColor = true;
this.chkUseNotifyTelegram.CheckedChanged += new System.EventHandler(this.ChkUseNotifyTelegram_CheckedChanged);
//
// btnTestNotify
//
this.btnTestNotify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnTestNotify.BackgroundImage = global::DutyContent.Properties.Resources.pix_annotation;
this.btnTestNotify.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.btnTestNotify.Enabled = false;
this.btnTestNotify.Location = new System.Drawing.Point(722, 84);
this.btnTestNotify.Name = "btnTestNotify";
this.btnTestNotify.Size = new System.Drawing.Size(51, 51);
this.btnTestNotify.TabIndex = 4;
this.btnTestNotify.UseVisualStyleBackColor = true;
this.btnTestNotify.Click += new System.EventHandler(this.BtnTestNotify_Click);
//
// lblLineNotifyBotLink
//
this.lblLineNotifyBotLink.AutoSize = true;
this.lblLineNotifyBotLink.Location = new System.Drawing.Point(496, 9);
this.lblLineNotifyBotLink.Name = "lblLineNotifyBotLink";
this.lblLineNotifyBotLink.Size = new System.Drawing.Size(127, 13);
this.lblLineNotifyBotLink.TabIndex = 10;
this.lblLineNotifyBotLink.TabStop = true;
this.lblLineNotifyBotLink.Text = "https://notify-bot.line.me/";
this.lblLineNotifyBotLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LblLineNotifyBotLink_LinkClicked);
//
// lblLineToken
//
this.lblLineToken.AutoSize = true;
this.lblLineToken.Location = new System.Drawing.Point(22, 36);
this.lblLineToken.Name = "lblLineToken";
this.lblLineToken.Size = new System.Drawing.Size(25, 13);
this.lblLineToken.TabIndex = 9;
this.lblLineToken.Text = "312";
//
// txtLineToken
//
this.txtLineToken.Location = new System.Drawing.Point(108, 33);
this.txtLineToken.Name = "txtLineToken";
this.txtLineToken.Size = new System.Drawing.Size(515, 20);
this.txtLineToken.TabIndex = 1;
this.txtLineToken.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtLineToken_KeyDown);
//
// chkUseNotifyLine
//
this.chkUseNotifyLine.AutoSize = true;
this.chkUseNotifyLine.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkUseNotifyLine.Location = new System.Drawing.Point(3, 3);
this.chkUseNotifyLine.Name = "chkUseNotifyLine";
this.chkUseNotifyLine.Size = new System.Drawing.Size(58, 24);
this.chkUseNotifyLine.TabIndex = 0;
this.chkUseNotifyLine.Text = "311";
this.chkUseNotifyLine.UseVisualStyleBackColor = true;
this.chkUseNotifyLine.CheckedChanged += new System.EventHandler(this.ChkUseNotifyLine_CheckedChanged);
//
// panel3
//
this.panel3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel3.Controls.Add(this.lblCurrentDataSet);
this.panel3.Controls.Add(this.cboDataset);
this.panel3.Controls.Add(this.lblDataSet);
this.panel3.Controls.Add(this.btnLogFont);
this.panel3.Controls.Add(this.lblLogFont);
this.panel3.Location = new System.Drawing.Point(6, 6);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(778, 56);
this.panel3.TabIndex = 2;
//
// lblCurrentDataSet
//
this.lblCurrentDataSet.Location = new System.Drawing.Point(203, 30);
this.lblCurrentDataSet.Name = "lblCurrentDataSet";
this.lblCurrentDataSet.Size = new System.Drawing.Size(150, 15);
this.lblCurrentDataSet.TabIndex = 3;
this.lblCurrentDataSet.Text = "--";
this.lblCurrentDataSet.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// cboDataset
//
this.cboDataset.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboDataset.FormattingEnabled = true;
this.cboDataset.Location = new System.Drawing.Point(110, 6);
this.cboDataset.Name = "cboDataset";
this.cboDataset.Size = new System.Drawing.Size(243, 21);
this.cboDataset.TabIndex = 11;
this.cboDataset.SelectedIndexChanged += new System.EventHandler(this.CboDataset_SelectedIndexChanged);
//
// lblDataSet
//
this.lblDataSet.AutoSize = true;
this.lblDataSet.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblDataSet.Location = new System.Drawing.Point(22, 4);
this.lblDataSet.Name = "lblDataSet";
this.lblDataSet.Size = new System.Drawing.Size(39, 20);
this.lblDataSet.TabIndex = 10;
this.lblDataSet.Text = "304";
//
// btnLogFont
//
this.btnLogFont.Location = new System.Drawing.Point(515, 1);
this.btnLogFont.Name = "btnLogFont";
this.btnLogFont.Size = new System.Drawing.Size(243, 48);
this.btnLogFont.TabIndex = 3;
this.btnLogFont.Text = "--";
this.btnLogFont.UseVisualStyleBackColor = true;
this.btnLogFont.Click += new System.EventHandler(this.BtnLogFont_Click);
//
// lblLogFont
//
this.lblLogFont.AutoSize = true;
this.lblLogFont.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblLogFont.Location = new System.Drawing.Point(381, 4);
this.lblLogFont.Name = "lblLogFont";
this.lblLogFont.Size = new System.Drawing.Size(39, 20);
this.lblLogFont.TabIndex = 9;
this.lblLogFont.Text = "305";
//
// panel2
//
this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel2.Controls.Add(this.btnSoundPlayFate);
this.panel2.Controls.Add(this.btnSoundPlayInstance);
this.panel2.Controls.Add(this.btnSoundFindFate);
this.panel2.Controls.Add(this.btnSoundFindInstance);
this.panel2.Controls.Add(this.lblSoundFate);
this.panel2.Controls.Add(this.txtSoundFate);
this.panel2.Controls.Add(this.txtSoundInstance);
this.panel2.Controls.Add(this.chkEnableSound);
this.panel2.Controls.Add(this.lblSoundInstance);
this.panel2.Location = new System.Drawing.Point(6, 135);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(778, 132);
this.panel2.TabIndex = 1;
//
// btnSoundPlayFate
//
this.btnSoundPlayFate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSoundPlayFate.Enabled = false;
this.btnSoundPlayFate.Image = global::DutyContent.Properties.Resources.pix_play;
this.btnSoundPlayFate.Location = new System.Drawing.Point(743, 55);
this.btnSoundPlayFate.Name = "btnSoundPlayFate";
this.btnSoundPlayFate.Size = new System.Drawing.Size(30, 30);
this.btnSoundPlayFate.TabIndex = 8;
this.btnSoundPlayFate.UseVisualStyleBackColor = true;
this.btnSoundPlayFate.Click += new System.EventHandler(this.BtnSoundPlayFate_Click);
//
// btnSoundPlayInstance
//
this.btnSoundPlayInstance.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSoundPlayInstance.Enabled = false;
this.btnSoundPlayInstance.Image = global::DutyContent.Properties.Resources.pix_play;
this.btnSoundPlayInstance.Location = new System.Drawing.Point(743, 24);
this.btnSoundPlayInstance.Name = "btnSoundPlayInstance";
this.btnSoundPlayInstance.Size = new System.Drawing.Size(30, 30);
this.btnSoundPlayInstance.TabIndex = 7;
this.btnSoundPlayInstance.UseVisualStyleBackColor = true;
this.btnSoundPlayInstance.Click += new System.EventHandler(this.BtnSoundPlayInstance_Click);
//
// btnSoundFindFate
//
this.btnSoundFindFate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSoundFindFate.Enabled = false;
this.btnSoundFindFate.Image = global::DutyContent.Properties.Resources.pix_magnify;
this.btnSoundFindFate.Location = new System.Drawing.Point(709, 55);
this.btnSoundFindFate.Name = "btnSoundFindFate";
this.btnSoundFindFate.Size = new System.Drawing.Size(30, 30);
this.btnSoundFindFate.TabIndex = 6;
this.btnSoundFindFate.UseVisualStyleBackColor = true;
this.btnSoundFindFate.Click += new System.EventHandler(this.BtnSoundFindFate_Click);
//
// btnSoundFindInstance
//
this.btnSoundFindInstance.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSoundFindInstance.Enabled = false;
this.btnSoundFindInstance.Image = global::DutyContent.Properties.Resources.pix_magnify;
this.btnSoundFindInstance.Location = new System.Drawing.Point(709, 24);
this.btnSoundFindInstance.Name = "btnSoundFindInstance";
this.btnSoundFindInstance.Size = new System.Drawing.Size(30, 30);
this.btnSoundFindInstance.TabIndex = 2;
this.btnSoundFindInstance.UseVisualStyleBackColor = true;
this.btnSoundFindInstance.Click += new System.EventHandler(this.BtnSoundFindInstance_Click);
//
// lblSoundFate
//
this.lblSoundFate.AutoSize = true;
this.lblSoundFate.Location = new System.Drawing.Point(22, 64);
this.lblSoundFate.Name = "lblSoundFate";
this.lblSoundFate.Size = new System.Drawing.Size(25, 13);
this.lblSoundFate.TabIndex = 3;
this.lblSoundFate.Text = "310";
//
// txtSoundFate
//
this.txtSoundFate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtSoundFate.Enabled = false;
this.txtSoundFate.Location = new System.Drawing.Point(110, 61);
this.txtSoundFate.Name = "txtSoundFate";
this.txtSoundFate.ReadOnly = true;
this.txtSoundFate.Size = new System.Drawing.Size(593, 20);
this.txtSoundFate.TabIndex = 4;
//
// txtSoundInstance
//
this.txtSoundInstance.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtSoundInstance.Enabled = false;
this.txtSoundInstance.Location = new System.Drawing.Point(110, 30);
this.txtSoundInstance.Name = "txtSoundInstance";
this.txtSoundInstance.ReadOnly = true;
this.txtSoundInstance.Size = new System.Drawing.Size(593, 20);
this.txtSoundInstance.TabIndex = 5;
//
// chkEnableSound
//
this.chkEnableSound.AutoSize = true;
this.chkEnableSound.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkEnableSound.Location = new System.Drawing.Point(5, 3);
this.chkEnableSound.Name = "chkEnableSound";
this.chkEnableSound.Size = new System.Drawing.Size(58, 24);
this.chkEnableSound.TabIndex = 4;
this.chkEnableSound.Text = "308";
this.chkEnableSound.UseVisualStyleBackColor = true;
this.chkEnableSound.CheckedChanged += new System.EventHandler(this.ChkEnableSound_CheckedChanged);
//
// lblSoundInstance
//
this.lblSoundInstance.AutoSize = true;
this.lblSoundInstance.Location = new System.Drawing.Point(22, 33);
this.lblSoundInstance.Name = "lblSoundInstance";
this.lblSoundInstance.Size = new System.Drawing.Size(25, 13);
this.lblSoundInstance.TabIndex = 2;
this.lblSoundInstance.Text = "309";
//
// panel1
//
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.progbOverlayTransparent);
this.panel1.Controls.Add(this.btnOverlayDimming);
this.panel1.Controls.Add(this.lblOverlayTransparent);
this.panel1.Controls.Add(this.chkEnableOverlay);
this.panel1.Location = new System.Drawing.Point(6, 68);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(778, 61);
this.panel1.TabIndex = 0;
//
// progbOverlayTransparent
//
this.progbOverlayTransparent.Enabled = false;
this.progbOverlayTransparent.Location = new System.Drawing.Point(108, 30);
this.progbOverlayTransparent.Maximum = 255;
this.progbOverlayTransparent.Name = "progbOverlayTransparent";
this.progbOverlayTransparent.Size = new System.Drawing.Size(243, 23);
this.progbOverlayTransparent.TabIndex = 1;
this.progbOverlayTransparent.Click += new System.EventHandler(this.ProgbOverlayTransparent_Click);
//
// btnOverlayDimming
//
this.btnOverlayDimming.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnOverlayDimming.BackgroundImage = global::DutyContent.Properties.Resources.pix_annotation;
this.btnOverlayDimming.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.btnOverlayDimming.Enabled = false;
this.btnOverlayDimming.Location = new System.Drawing.Point(722, 3);
this.btnOverlayDimming.Name = "btnOverlayDimming";
this.btnOverlayDimming.Size = new System.Drawing.Size(51, 51);
this.btnOverlayDimming.TabIndex = 3;
this.btnOverlayDimming.UseVisualStyleBackColor = true;
this.btnOverlayDimming.Click += new System.EventHandler(this.BtnOverlayDimming_Click);
//
// lblOverlayTransparent
//
this.lblOverlayTransparent.AutoSize = true;
this.lblOverlayTransparent.Location = new System.Drawing.Point(23, 35);
this.lblOverlayTransparent.Name = "lblOverlayTransparent";
this.lblOverlayTransparent.Size = new System.Drawing.Size(25, 13);
this.lblOverlayTransparent.TabIndex = 2;
this.lblOverlayTransparent.Text = "307";
//
// chkEnableOverlay
//
this.chkEnableOverlay.AutoSize = true;
this.chkEnableOverlay.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkEnableOverlay.Location = new System.Drawing.Point(3, 3);
this.chkEnableOverlay.Name = "chkEnableOverlay";
this.chkEnableOverlay.Size = new System.Drawing.Size(58, 24);
this.chkEnableOverlay.TabIndex = 0;
this.chkEnableOverlay.Text = "306";
this.chkEnableOverlay.UseVisualStyleBackColor = true;
this.chkEnableOverlay.CheckedChanged += new System.EventHandler(this.ChkEnableOverlay_CheckedChanged);
//
// tabPage3
//
this.tabPage3.Controls.Add(this.panel5);
this.tabPage3.ImageIndex = 2;
this.tabPage3.Location = new System.Drawing.Point(4, 39);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(792, 459);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "303";
this.tabPage3.UseVisualStyleBackColor = true;
//
// panel5
//
this.panel5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel5.Controls.Add(this.txtPacketDescription);
this.panel5.Controls.Add(this.lblPacketDesc);
this.panel5.Controls.Add(this.btnPacketApply);
this.panel5.Controls.Add(this.btnPacketStart);
this.panel5.Controls.Add(this.lstBozjaInfo);
this.panel5.Controls.Add(this.lblPacketBozja);
this.panel5.Controls.Add(this.txtPacketInfo);
this.panel5.Controls.Add(this.lstPacketInfo);
this.panel5.Controls.Add(this.lblPacketFinder);
this.panel5.Location = new System.Drawing.Point(6, 6);
this.panel5.Name = "panel5";
this.panel5.Size = new System.Drawing.Size(780, 261);
this.panel5.TabIndex = 0;
//
// txtPacketDescription
//
this.txtPacketDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPacketDescription.Enabled = false;
this.txtPacketDescription.Location = new System.Drawing.Point(336, 58);
this.txtPacketDescription.Name = "txtPacketDescription";
this.txtPacketDescription.Size = new System.Drawing.Size(439, 20);
this.txtPacketDescription.TabIndex = 8;
//
// lblPacketDesc
//
this.lblPacketDesc.AutoSize = true;
this.lblPacketDesc.Location = new System.Drawing.Point(333, 42);
this.lblPacketDesc.Name = "lblPacketDesc";
this.lblPacketDesc.Size = new System.Drawing.Size(25, 13);
this.lblPacketDesc.TabIndex = 7;
this.lblPacketDesc.Text = "317";
//
// btnPacketApply
//
this.btnPacketApply.Enabled = false;
this.btnPacketApply.Location = new System.Drawing.Point(287, 6);
this.btnPacketApply.Name = "btnPacketApply";
this.btnPacketApply.Size = new System.Drawing.Size(123, 30);
this.btnPacketApply.TabIndex = 6;
this.btnPacketApply.Text = "10009";
this.btnPacketApply.UseVisualStyleBackColor = true;
this.btnPacketApply.Visible = false;
this.btnPacketApply.Click += new System.EventHandler(this.BtnPacketApply_Click);
//
// btnPacketStart
//
this.btnPacketStart.Location = new System.Drawing.Point(158, 5);
this.btnPacketStart.Name = "btnPacketStart";
this.btnPacketStart.Size = new System.Drawing.Size(123, 30);
this.btnPacketStart.TabIndex = 5;
this.btnPacketStart.Text = "10007";
this.btnPacketStart.UseVisualStyleBackColor = true;
this.btnPacketStart.Click += new System.EventHandler(this.BtnPacketStart_Click);
//
// lstBozjaInfo
//
this.lstBozjaInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lstBozjaInfo.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader5,
this.columnHeader6,
this.columnHeader7,
this.columnHeader8});
this.lstBozjaInfo.Enabled = false;
this.lstBozjaInfo.FullRowSelect = true;
this.lstBozjaInfo.GridLines = true;
this.lstBozjaInfo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lstBozjaInfo.HideSelection = false;
this.lstBozjaInfo.Location = new System.Drawing.Point(333, 107);
this.lstBozjaInfo.MultiSelect = false;
this.lstBozjaInfo.Name = "lstBozjaInfo";
this.lstBozjaInfo.Size = new System.Drawing.Size(442, 148);
this.lstBozjaInfo.TabIndex = 4;
this.lstBozjaInfo.UseCompatibleStateImageBehavior = false;
this.lstBozjaInfo.View = System.Windows.Forms.View.Details;
this.lstBozjaInfo.SelectedIndexChanged += new System.EventHandler(this.LstBozjaInfo_SelectedIndexChanged);
this.lstBozjaInfo.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.LstBozjaInfo_MouseDoubleClick);
//
// columnHeader5
//
this.columnHeader5.Text = "Name";
this.columnHeader5.Width = 233;
//
// columnHeader6
//
this.columnHeader6.Text = "Status";
this.columnHeader6.Width = 67;
//
// columnHeader7
//
this.columnHeader7.Text = "Member";
this.columnHeader7.Width = 55;
//
// columnHeader8
//
this.columnHeader8.Text = "Progress";
this.columnHeader8.Width = 56;
//
// lblPacketBozja
//
this.lblPacketBozja.AutoSize = true;
this.lblPacketBozja.Location = new System.Drawing.Point(333, 91);
this.lblPacketBozja.Name = "lblPacketBozja";
this.lblPacketBozja.Size = new System.Drawing.Size(25, 13);
this.lblPacketBozja.TabIndex = 3;
this.lblPacketBozja.Text = "318";
//
// txtPacketInfo
//
this.txtPacketInfo.BackColor = System.Drawing.SystemColors.Window;
this.txtPacketInfo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtPacketInfo.Enabled = false;
this.txtPacketInfo.Location = new System.Drawing.Point(3, 166);
this.txtPacketInfo.Multiline = true;
this.txtPacketInfo.Name = "txtPacketInfo";
this.txtPacketInfo.ReadOnly = true;
this.txtPacketInfo.Size = new System.Drawing.Size(324, 89);
this.txtPacketInfo.TabIndex = 2;
//
// lstPacketInfo
//
this.lstPacketInfo.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4});
this.lstPacketInfo.Enabled = false;
this.lstPacketInfo.FullRowSelect = true;
this.lstPacketInfo.GridLines = true;
this.lstPacketInfo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lstPacketInfo.HideSelection = false;
this.lstPacketInfo.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1,
listViewItem2,
listViewItem3,
listViewItem4,
listViewItem5});
this.lstPacketInfo.Location = new System.Drawing.Point(3, 42);
this.lstPacketInfo.MultiSelect = false;
this.lstPacketInfo.Name = "lstPacketInfo";
this.lstPacketInfo.Size = new System.Drawing.Size(324, 118);
this.lstPacketInfo.TabIndex = 1;
this.lstPacketInfo.UseCompatibleStateImageBehavior = false;
this.lstPacketInfo.View = System.Windows.Forms.View.Details;
this.lstPacketInfo.SelectedIndexChanged += new System.EventHandler(this.LstPacketInfo_SelectedIndexChanged);
//
// columnHeader1
//
this.columnHeader1.Text = "Function";
this.columnHeader1.Width = 100;
//
// columnHeader2
//
this.columnHeader2.Text = "Current";
this.columnHeader2.Width = 70;
//
// columnHeader3
//
this.columnHeader3.Text = "Status";
this.columnHeader3.Width = 80;
//
// columnHeader4
//
this.columnHeader4.Text = "Found";
this.columnHeader4.Width = 70;
//
// lblPacketFinder
//
this.lblPacketFinder.AutoSize = true;
this.lblPacketFinder.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblPacketFinder.Location = new System.Drawing.Point(3, -1);
this.lblPacketFinder.Name = "lblPacketFinder";
this.lblPacketFinder.Size = new System.Drawing.Size(43, 24);
this.lblPacketFinder.TabIndex = 0;
this.lblPacketFinder.Text = "316";
//
// ilTabContent
//
this.ilTabContent.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilTabContent.ImageStream")));
this.ilTabContent.TransparentColor = System.Drawing.Color.Transparent;
this.ilTabContent.Images.SetKeyName(0, "pix_tab_content.png");
this.ilTabContent.Images.SetKeyName(1, "pix_tab_setting.png");
this.ilTabContent.Images.SetKeyName(2, "pix_tab_tool.png");
//
// DutyForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(800, 502);
this.Controls.Add(this.tabContent);
this.Name = "DutyForm";
this.Text = "Duty";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DutyTabForm_FormClosing);
this.tabContent.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.panel4.ResumeLayout(false);
this.panel4.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.tabPage3.ResumeLayout(false);
this.panel5.ResumeLayout(false);
this.panel5.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TabControl tabContent;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.ImageList ilTabContent;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeFates;
private System.Windows.Forms.RichTextBox txtContentLog;
private System.Windows.Forms.RadioButton rdoFatePreset4;
private System.Windows.Forms.RadioButton rdoFatePreset3;
private System.Windows.Forms.RadioButton rdoFatePreset2;
private System.Windows.Forms.RadioButton rdoFatePreset1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button btnOverlayDimming;
private System.Windows.Forms.Label lblOverlayTransparent;
private System.Windows.Forms.CheckBox chkEnableOverlay;
private System.Windows.Forms.ProgressBar progbOverlayTransparent;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label lblSoundFate;
private System.Windows.Forms.TextBox txtSoundFate;
private System.Windows.Forms.TextBox txtSoundInstance;
private System.Windows.Forms.CheckBox chkEnableSound;
private System.Windows.Forms.Label lblSoundInstance;
private System.Windows.Forms.Button btnSoundPlayFate;
private System.Windows.Forms.Button btnSoundPlayInstance;
private System.Windows.Forms.Button btnSoundFindFate;
private System.Windows.Forms.Button btnSoundFindInstance;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Button btnLogFont;
private System.Windows.Forms.Label lblLogFont;
private System.Windows.Forms.ComboBox cboDataset;
private System.Windows.Forms.Label lblDataSet;
private System.Windows.Forms.Label lblCurrentDataSet;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.LinkLabel lblLineNotifyBotLink;
private System.Windows.Forms.Label lblLineToken;
private System.Windows.Forms.TextBox txtLineToken;
private System.Windows.Forms.CheckBox chkUseNotifyLine;
private System.Windows.Forms.Button btnTestNotify;
private System.Windows.Forms.Label lblTelegramToken;
private System.Windows.Forms.TextBox txtTelegramToken;
private System.Windows.Forms.Label lblTelegramId;
private System.Windows.Forms.TextBox txtTelegramId;
private System.Windows.Forms.CheckBox chkUseNotifyTelegram;
private System.Windows.Forms.Panel panel5;
private System.Windows.Forms.ListView lstBozjaInfo;
private System.Windows.Forms.Label lblPacketBozja;
private System.Windows.Forms.TextBox txtPacketInfo;
private System.Windows.Forms.ListView lstPacketInfo;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.Label lblPacketFinder;
private System.Windows.Forms.Button btnPacketApply;
private System.Windows.Forms.Button btnPacketStart;
private System.Windows.Forms.ColumnHeader columnHeader5;
private System.Windows.Forms.ColumnHeader columnHeader6;
private System.Windows.Forms.ColumnHeader columnHeader7;
private System.Windows.Forms.TextBox txtPacketDescription;
private System.Windows.Forms.Label lblPacketDesc;
private System.Windows.Forms.ColumnHeader columnHeader8;
}
}

1283
Tab/DutyForm.cs Normal file

File diff suppressed because it is too large Load diff

408
Tab/DutyForm.resx Normal file
View file

@ -0,0 +1,408 @@
<?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>
<metadata name="ilTabContent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="ilTabContent.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAA
QQAAAk1TRnQBSQFMAgEBAwEAAdABAAHQAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
AwABIAMAAQEBAAEgBgABQBoAAzYEWQHEA1UB6gMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DXQHi
A1QBrgMpAT8IAAMHAQoDSAGFAh0BqgH/AhgBqgH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/
AhcBpAH/AhcBowH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/
AhcBogH/AhcBogH/AhcBowH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhgBqgH/
Ah0BqgH/A0gBhQMHAQr/AAUAA04BlwM+Af8DsgH/A80B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd
Af8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd
Af8DyAH/A6IB/wMvAf8DRgGBBAADSAGFAhcBpAH/AhcBogH/AhcBoQH/AhcBoQH/AhcBoQH/AhcBoQH/
AhcBoQH/AhQBoAH/AhQBngH/AhQBmwH/AhQBmQH/AhQBmQH/AhQBlwH/AhQBlQH/AhQBlQH/AhQBlQH/
AhQBlQH/AhQBlwH/AhQBmQH/AhQBmQH/AhQBmwH/AhQBngH/AhQBoAH/AhcBoQH/AhcBoQH/AhcBoQH/
AhcBoQH/AhcBoQH/AhcBogH/AhcBpAH/A0gBhVcAAQEDAgQDBAQBBgMEAQYDAwEEAwEBAgMAAQGMAAM3
AVoDSgH/A9sB/wOLAf8DNAH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd
Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wM0Af8DhwH/A80B/wM2
Af8DKwFCAhcBpAH/AhcBogH/AhQBnQH/AhIBmAH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/Ag8BkQH/
Ag8BjwH/Ag8BjAH/Ag8BigH/Ag8BigH/Ag0BiAH/AgoBhgH/AgoBhgH/AgoBhgH/AgwBhgH/Ag8BiAH/
Ag8BigH/Ag8BigH/Ag8BjAH/Ag8BjwH/Ag8BlQH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBmAH/
AhQBnQH/AhcBogH/AhcBpAH/UAADAgEDAwYBCAMNARIDGgEkAyMBMwMhATADFgEeAwoBDgMEAQYDAAEB
iAADWQHDA7IB/wOKAf8BWgFIAS4B/wG5AZMBQAH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG
Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BvQGVAT4B/wGj
AYABMgH/Ab0BlQE+Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG
Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BuQGTAUAB/wFlAVABMQH/A4UB/wOjAf8DVAGrAhcBowH/
AhQBmgH/AhABkQH/AgkBjQH/AggBjQH/AggBigH/AggBhgH/AggBgQH/AggBZAH/AggBYgH/AggBXQH/
AggBXAH/AggBXAH/AgcBXAH/AgYBWAH/AgYBVQH/AgYBVQH/AgcBWAH/AggBXAH/AggBXAH/AggBXAH/
AggBXQH/AggBYgH/AggBgAH/AggBhgH/AggBhgH/AggBigH/AggBjQH/AgkBjQH/AhABkQH/AhQBmgH/
AhcBowH/TAADAgEDAwcBCgMXASADMAFMAUUCRgF+AU8CUQGcAU0CTgGWA0EBcgMqAUEDEgEZAwUBBwMA
AQGEAANBAfkDygH/AzIB/wG5AY8BPwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi
AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8BxAGVAT8B/wGJAVEBKwH/
ASYBNQE7Af8BlAFWASoB/wHTAaEBRgH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi
AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AcABkwFBAf8DKwH/A8UB/wNOAfACFQGZ
Af8CCwGLAf8CBgFiAf8CBgFeAf8CBgFWAf8CBgFWAf8CBgFRAf8CBgFOAf8CBgFNAf8CBgFKAf8CBgFG
Af8CBgFGAf8CBgFFAf8CBgFCAf8CBgE+Af8CBgE+Af8CBgE+Af8CBgE+Af8CBgFCAf8CBgFFAf8CBgFG
Af8CBgFGAf8CBgFKAf8CBgFNAf8CBgFQAf8CBgFWAf8CBgFWAf8CBgFWAf8CBgFeAf8CBgFiAf8CCwGL
Af8CFQGZAf9IAAMBAQIDBwEJAxgBIgM4AV4BUwJVAa0BXQJhAeIBbQF/AYIB9wJlAWYB9AFeAmEB2gNQ
AZoDLQFGAw4BEwMDAQSEAAMdAf8DwgH/Ax8B/wHMAZUBRAH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/
AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/Ab8BiwE8Af8BkwFR
ASkB/wElATMBPAH/AQABOwGOAf8BVAFBAS0B/wGVAVIBKQH/Ac8BlwFDAf8B1QGbAUYB/wHVAZsBRgH/
AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AcUBkAFCAf8DJQH/
A8IB/wMdAf8CEwGRAf8BDQESAYIB/wENASkBhAH/ARMBMgGFAf8BEwEyAYAB/wETATQBgwH/ARMBNAGD
Af8BEwE0AYMB/wETATQBZAH/ARMBNAFkAf8BEwE0AWQB/wETATQBZAH/ARMBNAFfAf8BEwExAVwB/wET
ATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBYQH/ARMBMQFh
Af8BEwExAWEB/wETATEBYQH/ARMBMgGDAf8BEwE0AYMB/wETATQBgwH/ARMBNAGDAf8BEwE0AYgB/wEP
ASkBhwH/AQ0BEgGDAf8CEwGRAf9HAAEBAwYBCAMWAR4DOAFdA1UBtQNkAfEB8wH4AfwB/wHtA/8B8wP/
AagBuAHCAf4DXwHgA0gBhQMfASwDBQEHhAADHQH/A7QB/wMdAf8BzgGQAUMB/wHVAZQBRQH/AdUBlAFF
Af8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHUAZMBRQH/AdABkQFDAf8BtAFjATYB/wGK
AUkBKQH/ARsBMQFBAf8BAAEfAV4B/wEAAR8BWQH/AQABJgFfAf8BPgE3ATEB/wGSAUwBKAH/AbkBgAE4
Af8B0gGSAUQB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHF
AYsBQQH/AyQB/wO0Af8DHQH/Ag4BigH/ARIBKwGHAf8BJAGFAakB/wE7AasB1AH/AVQB0QHeAf8BWQHU
AeEB/wFcAdQB4QH/AV4B1AHhAf8BXgHUAeEB/wFcAdQB4QH/AVkB1AHhAf8BWQHUAeEB/wFZAdMB4AH/
AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHR
Ad4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB4QH/AVkB1AHhAf8BWQHUAeEB/wFUAdQB4QH/
ATwBsgHYAf8BJgGFAa8B/wESASsBiwH/Ag4BigH/QwABAQMFAQcDFAEbAzUBVgNUAa8BWgJdAfAB8wH4
AfwB/wHUA/8BxAH8Av8BxgH+Av8B6AP/AYcBjwGTAfsBVQJWAbEDLQFFAwcBCoQAAx0B/wOnAf8DHQH/
Ac4BhwFCAf8B1QGLAUQB/wHVAYsBRAH/AcsBhAFAAf8BvQFhATkB/wHEAYABPQH/AcABYwE7Af8BlQFH
ASgB/wGNAUQBKQH/AUIBNQExAf8BAAEpAVYB/wEAAQ4BTAH/ASQBkQGyAf8BWQHVAeYB/wEBAUIBiQH/
AQABFAFSAf8BBwEtAU0B/wFYATsBLAH/AZIBRgEoAf8BsQFaATQB/wHDAYABPAH/AcMBgAE8Af8BugFg
ATgB/wHTAYoBQwH/AdUBiwFEAf8BxQGCAUAB/wMkAf8DpwH/Ax0B/wINAYEB/wEWATcBkAH/ATcBoQHC
Af8BKAFhAaQB/wEcATMBYgH/AR0BMwGEAf8BHgEzAYgB/wEfATMBiAH/AR8BMwGBAf8BHgEzAYEB/wEd
ATMBgQH/AR0BMwFiAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFhAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFh
Af8BHQEzAWEB/wEdATMBYQH/AR0BMwGBAf8BHQEzAYEB/wEdATMBgQH/AR0BMwGBAf8BHwE0AYgB/wEi
ATcBiAH/AR0BMwGEAf8BHAEzAWIB/wEoAWMBpAH/ATcBoQHDAf8BFgE3AZEB/wINAYEB/z8AAQEDBAEG
AxIBGAMyAVADUgGpAVkCZAHsAagBuAHCAf4B2QP/AcQB/AL/AcMB+wL/AcMB+wL/AdcD/wGrAbIBtgH9
AVcCWQG/AzIBUAMIAQuEAAMdAf8DmwH/Ax0B/wHOAWUBQAH/AdUBgwFCAf8BywFjAT4B/wGDATwBKQH/
AU4BNAEsAf8BXAE3ASoB/wFUATUBKwH/ASUBMgE9Af8BAAEsAVoB/wEAARQBVgH/AQABMQFgAf8BUwHQ
AecB/wFeAd0B8QH/AUMBpwGxAf8BZAHhAfcB/wE6AakBxQH/AQABFQFMAf8BAAEgAV0B/wEAAS8BUgH/
ATYBMgE0Af8BWgE2ASoB/wFbATYBKgH/AUkBNAEwAf8BlAFBASYB/wHTAYIBQQH/AcUBYQE+Af8DIwH/
A5sB/wMdAf8CDQFkAf8BFwE4AYsB/wEwAZwBvQH/AQ4BHwFPAf8BCQESAVsB/wETATkBmAH/ARIBPAGd
Af8BEgE6AZ0B/wESATkBnAH/ARIBOQGWAf8BEQE4AZUB/wEUATYBkQH/AQYBEAFbAf8CCAFSAf8CCAFS
Af8CCAFSAf8CCAFSAf8CCAFSAf8BBwEOAVkB/wETATIBkgH/ARIBNAGUAf8BDAEqAY0B/wEWAUABmAH/
AQgBIwGOAf8BFgFAAZ8B/wESATABkwH/AQ4BEwFbAf8CCAFMAf8BDgEdAU0B/wEwAZcBtAH/ARcBNwGI
Af8CDQFkAf87AAEBAwQBBgMQARUDLAFDAU8CUAGbAVgCYgHpAagBuAHCAf4B3gP/AcYB/gL/AcMB+wL/
AcMB+wL/AcgD/wHsA/8BhwGQAZMB+wFVAlYBsQMtAUUDBwEKhAADHQH/A5MB/wMdAf8BzAFdAT4B/wHT
AWABQAH/Ac4BXQE+Af8BigE5ASYB/wEGAUEBhAH/AQABOQGNAf8BAAExAYgB/wEAAScBgQH/ARUBXAGf
Af8BVwHVAeYB/wGQAe8B/gH/AToBmwG8Af8BRgEcATMB/wGRARgBMQH/ATUBMgFKAf8BUQHKAeYB/wGQ
Ae0B+gH/AUEBtAHKAf8BAQFCAZIB/wEAASkBgQH/AQABMgGHAf8BAAFDAZYB/wEjATMBRgH/AZMBOwEl
Af8B0gFgAUAB/wHDAVkBPAH/AyIB/wOTAf8DHQH/Ag0BZAH/ARcBOQGLAf8BMAGdAb0B/wEOAR8BVgH/
AREBOAGVAf8BTQHWAekB/wFOAdcB8AH/AU0B0gHwAf8BTQHRAfAB/wFNAdEB7gH/AUoBzQHrAf8BRwHF
AecB/wEIARwBigH/Ag8BXAH/Ag8BXAH/Ag8BXAH/Ag8BXAH/AQ4BEAFdAf8BBgEeAYwB/wFIAcEB4gH/
AUIBxAHoAf8BIAGKAc8B/wFWAeEB9QH/AQ0BVgHDAf8BWAHhAfUB/wEzAaIB1QH/AQgBHQGSAf8BBwEM
AVgB/wEOAR0BVQH/AS4BlAG0Af8BFwE0AYgB/wINAWQB/zgAAwQBBQMNARIDKAE8A0oBigFeAmEB2gGo
Aa8BtQH9AeID/wHGAf4C/wHDAfsC/wHDAfsC/wHJA/8B6QP/AagBrwG1Af0BXAJhAdwDRwGCAx0BKgMF
AQeEAAMdAf8DjwH/Ax0B/wHJAVoBPQH/AdABXQE/Af8B0AFdAT8B/wGmAUUBLQH/ASsBLwE9Af8BEQFb
AaMB/wFDAasB0gH/AZIB6wH4Af8BiQHqAfcB/wFCAaIBvAH/AUIBLwFIAf8BmgEjAUkB/wG/ATYBiwH/
AcEBOwGTAf8BuwE0AYIB/wGCARwBOwH/AToBSwFlAf8BUQHDAdsB/wGTAfAB/AH/AYYB4QHzAf8BMAGR
AbkB/wEKAVYBnwH/AVgBMAEoAf8BvAFSATcB/wHQAV0BPwH/AcABVgE7Af8DIgH/A48B/wMdAf8CDQFk
Af8BFwE5AYsB/wEwAZ0BvQH/AQ4BHwFaAf8BDgE6AZ8B/wFUAeIB9QH/AVsB7AL/AWAB7gL/AWEB7gL/
AWEB7gL/AWEB7gL/AUABwAHrAf8BCAEcAY8B/wIPAWEB/wIPAV4B/wIPAVwB/wIPAV0B/wELARQBggH/
ASIBYAG+Af8BUgHaAfgB/wEiAZgB3wH/AUEBxAHxAf8BNQG2AeoB/wEtAawB5QH/AU0B1gH5Af8BJwGf
AeEB/wEwAZ8B0wH/AQ4BKQGMAf8BDQEdAVgB/wErAZQBtAH/ARcBNAGIAf8CDQFkAf8kAAMBAQIDAwQE
BAYECAELAw8BFAMkATYBRgJHAYABWAJcAdEBhwGQAZQB+wHpA/8ByAP/AcMB+wL/AcMB+wL/AcwD/wHw
A/8BhwGQAZQB+wFZAl0B1wNMAZIDKwFCAw0BEgMDAQSEAAMdAf8DjwH/Ax0B/wHHAVgBPQH/Ac4BWwE/
Af8BzgFbAT8B/wGmAUUBLgH/AisBOQH/AQcBSwGQAf8BKgGHAakB/wEdATIBSgH/AVEBFQEsAf8BpQEk
AUwB/wHCATcBjAH/AcsBRgGkAf8B0gFOAbEB/wHUAU8BtAH/AdEBTAGwAf8BygFFAaIB/wG+ATUBhAH/
AZIBHgFCAf8BQwEaASwB/wEVAUUBYwH/AS8BigGsAf8BAAFAAYgB/wFXATABKAH/Ab0BUQE4Af8BzgFb
AT8B/wG/AVUBOwH/AyIB/wOPAf8DHQH/Ag0BZAH/ARcBOAGLAf8BMAGcAbkB/wEOAR8BVAH/AQ4BOgGf
Af8BVAHhAfUB/wFZAecC/wFaAegC/wFbAegC/wFdAeoC/wFhAe4C/wFAAcAB6wH/AQgBHAGOAf8CDwFb
Af8CDwFaAf8CDwFZAf8CDwFZAf8BCwEVAYEB/wE4AaEB1AH/AVkB5gL/AQ8BUgHBAf8BWQHmAv8BIQGP
AdQB/wFGAckB8QH/AUYByQHxAf8BIQGPAdUB/wFPAdwB9QH/ARMBOAGYAf8BDgEdAVMB/wEvAZQBtAH/
ARcBNAGIAf8CDQFkAf8cAAMCAQMDBgEIAw0BEQMXASADIgEyAyoBQAMsAUMDMQFOA0cBggFZAlwBzAF2
AYABjAH6Ae0D/wHJA/8BwwH7Av8BwwH7Av8BzQP/AfgD/wFtAXoBfgH4AVwCXgHOAUgCSQGHAysBQgMR
ARcDBAEGAwABAYQAAx0B/wOQAf8DHQH/AcUBVgE8Af8BzAFZAT4B/wHMAVkBPgH/AaQBQgEtAf8BKAEr
ATsB/wEDAUUBiQH/AQUBSgGNAf8BNAEkAT4B/wG8AS0BYgH/AcQBPQGcAf8B0QFNAa8B/wHcAVkBwQH/
AeYBYgHNAf8B6QFlAdIB/wHmAWMBzQH/Ad0BWgHBAf8B0AFNAa8B/wHFAT4BmwH/AbMBKQFRAf8BBAEy
AVMB/wEWAVEBkAH/AQABOgGDAf8BVgEvASgB/wG7AVABNwH/AcwBWQE+Af8BvQFTAToB/wMiAf8DkAH/
Ax0B/wINAWQB/wEXATgBiwH/ATABmwG4Af8BDgEeAVIB/wERATIBkgH/AT0BuwHgAf8BQQG8AeYB/wFB
Ab8B5gH/AUgBvwHkAf8BSAHBAecB/wFIAcUB6wH/AUMBvwHkAf8BCAEZAYQB/wIOAVkB/wINAVkB/wIH
AVkB/wIHAVkB/wEKAQ0BXAH/AQcBFgGFAf8BCAEcAY0B/wEIARcBiAH/AQgBHAGPAf8BCAEYAYsB/wEI
ARsBlAH/AQkBHAGWAf8BDAEcAZMB/wEIARwBkgH/AQYBEAFdAf8BDgEdAVIB/wEwAZQBtAH/ARcBNAGI
Af8CDQFkAf8XAAEBAwQBBQMKAQ4DGgElAzEBTQNEAXkBTwJQAZsBUwJUAawDVAGuA1UBtQFaAl4B2AFt
AXoBggH3AfQD/wHKA/8BwwH7Av8BxAH8Av8B0Qf/AW0BegGCAfcBWAJbAcYDQwF4AyYBOAMQARUDBAEG
AwABAYgAAx0B/wOSAf8DHQH/AcMBUwE7Af8BygFWAT0B/wHIAVUBPAH/AYwBNAEjAf8BEQEqAUcB/wEM
AUoBjAH/AQwBVgGdAf8BUQEiAT4B/wHCATcBkAH/Ac0BSAGrAf8B3gFcAcQB/wHvAYcB2gH/AfsBkwHs
Af8B/QGYAfQB/wH7AZMB7AH/Ae8BhwHaAf8B3gFcAcQB/wHOAUgBrAH/Ab0BNAGEAf8BIAE0AVQB/wEe
AV0BnQH/AQABOQGEAf8BRAErAS0B/wGwAUgBMgH/AcoBVgE9Af8BuwFQATkB/wMiAf8DkgH/Ax0B/wIN
AWQB/wEXATgBigH/ATABlwG2Af8BDgEdAVIB/wEHAQ4BWwH/AQoBGwGPAf8BCgEdAZcB/wEKAR0BlwH/
AQoBHQGPAf8BCgEdAY8B/wEKAR0BjwH/AQoBGgGIAf8BCgEOAV0B/wIJAVkB/wIGAVkB/wIGAVkB/wIG
AVkB/wIGAVkB/wIJAVkB/wIOAVkB/wIPAVsB/wIPAWEB/wIPAWEB/wIPAWUB/wIPAYMB/wIPAYMB/wIP
AWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wINAWQB/xMAAQEDBAEGAw8BFAMkATUBPwJA
AW8DVgGzAVsCYQHhAmUBZgH0AXEBfQGKAfoBbQF6AX4B+AFZAWYBawH1AWgBegGGAvoD/wHNA/8BwwH7
Av8BxAH8Av8B1AP/AfMB+AH8Af8BWQFnAWwB9QFWAlgBwQNAAXADIAEuAwsBDwMEAQUDAAEBjAADHQH/
A5YB/wMdAf8BwQFQATsB/wHIAVMBPAH/AcQBUQE6Af8BhwExASMB/wEAATABWgH/AR4BWAGXAf8BEAFT
AZcB/wGAASEBQgH/AcYBPQGaAf8B1QFRAbcB/wHqAYAB0gH/AfwBlgHxAv8BqAH+Av8BrwP/AagB/gH/
AfwBlgHxAf8B6gGAAdIB/wHWAVEBtwH/AcUBOwGTAf8BNwEtAUkB/wEcAV8BoAH/AQQBRQGNAf8BIgEq
AT4B/wGMATIBIgH/AccBUwE8Af8BuQFNATkB/wMjAf8DlgH/Ax0B/wINAWMB/wEXATYBhQH/AS0BlQG0
Af8BDQEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAV4B/wIPAVoB/wIJ
AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wINAVkB/wIPAVsB/wIPAWEB/wIP
AWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wIN
AWQB/xAAAwIBAwMLAQ8DIwE0AUQCRQF8AVcCWgHFAW0BfQGDAfcB8wH4AfwB/wHxA/8B5wP/AeoD/wHv
A/8B5AP/Ac0D/wHDAfsC/wHGAf4C/wHaA/8B8wH4AfwB/wFkAWUBZgH0AVYCWAG8Az0BaQMdASoDCgEN
AwMBBJQAAx0B/wOaAf8DHQH/Ab4BTwE6Af8BxQFRATsB/wGvAUUBMgH/AVEBKwEmAf8BAAE6AYsB/wE1
AYkBqwH/AQ4BQgFlAf8BqQEpAVMB/wHIAUEBoQH/AdoBVgG8Af8B8AGIAdwB/wH+AZ8B+gL/AbQD/wHC
A/8BtAL/Af4BnwH6Af8B8AGIAdwB/wHbAVYBvQH/AckBQAGdAf8BXQEiAUEB/wEYAVwBnQH/ASQBYQGi
Af8BAAEvAVoB/wGGATABIgH/AcMBUAE6Af8BtgFMATgB/wMjAf8DmgH/Ax0B/wINAWIB/wEXATQBgwH/
AS8BlAG0Af8BDgEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAVwB/wIP
AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIHAVkB/wIPAVkB/wIP
AV0B/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0
AYgB/wINAWQB/xAAAwMBBAMYASEDPQFpAVcCWQG/AXkBgQGMAfoB8QP/Ac4D/wHEAfwC/wHDAfsC/wHD
AfsC/wHDAfsC/wHDAfsC/wHDAfsC/wHGAf4C/wHeA/8BqAG4AcIB/gFOAl0B8AFVAlcBtwM7AWMDGgEl
AwkBDAMDAQSYAAMdAf8DnwH/Ax0B/wG7AUwBOQH/AcABTQE5Af8BhgEvASEB/wEUASkBQgH/AQUBSAGU
Af8BPAGVAbkB/wEsATMBTgH/AbgBLAFgAf8BxwFBAaAB/wHZAVUBuwH/Ae8BhQHaAf8B/gGdAfoC/wGx
A/8BvAP/AbEC/wH+AZ0B+gH/Ae8BhQHaAf8B2QFVAbwB/wHHAUABnwH/AaQBJgFPAf8BFwFMAYkB/wFC
AZcBuAH/AQABOAGKAf8BUAEqAScB/wGtAUMBMQH/AbMBSQE3Af8DIwH/A58B/wMdAf8CDQFiAf8BFwE0
AYMB/wEwAZQBtAH/AQ4BHQFSAf8BCQEaAWQB/wEWAUQBrAH/ARcBSQG2Af8BFQFHAbAB/wEPATYBogH/
AQsBIAGOAf8BDAETAWQB/wIPAVsB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIG
AVkB/wIHAVkB/wIPAVkB/wIPAVwB/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEO
AR0BUgH/AS8BlAG0Af8BFwE0AYgB/wINAWQB/xAAAwQBBgMjATMBTQJOAZUCZQFmAfQE/wHaA/8B2QP/
AeAD/wHdA/8BzwP/AcUB/QL/AcMB+wL/AcMB+wL/AdMD/wGoAbgBwgH+AU4CXQHwAVUCVwG3AzoBYAMY
ASIDCAELAwIBA5wAAx0B/wOkAf8DHQH/AbkBSQE3Af8BoAE7ASsB/wFLAScBJQH/AQABKQFhAf8BKwFg
AaIB/wETAVEBkgH/AVkBGQEqAf8BtwEsAWMB/wHCAT0BmwH/AdMBTwGzAf8B5gFkAc8B/wH6AZEB6wL/
AaAB/AL/AagB/gL/AaAB/AH/AfoBkQHrAf8B5gFkAc8B/wHTAU8BtAH/AcMBPAGaAf8BtgEqAVcB/wEt
ASUBOQH/AScBYgGkAf8BCAFGAZEB/wEPASEBPQH/AYQBLQEfAf8BqQFCATIB/wMjAf8DpAH/Ax0B/wIN
AWMB/wEXATQBhQH/ATABlAG0Af8BDgEdAVIB/wEVAToBkgH/AVQB5AH1Af8BWQHpAv8BUgHgAfgB/wE1
AbEB3wH/AR0BUgG1Af8BDwEhAYoB/wEPAREBWwH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/
AgYBWQH/AgYBWQH/Ag0BWQH/Ag8BWgH/Ag8BXgH/Ag8BYwH/AQwBFAGEAf8BCwEZAY0B/wELARcBjAH/
AQ4BEgGDAf8CCAFUAf8BDQEdAVIB/wEtAZUBtAH/ARcBNgGIAf8CDQFkAf8QAAMEAQYDIgEyAUwCTQGR
AmQBZQHxAasBsQG0Af0BnAGxAb8B/gGoAa8BtQH9AYEBjQGTAfsBcAGIAZoB/AHnAfEB+AH/AdUD/wHD
AfsC/wHDAfsC/wHgA/8BXwGIAZEB+wFaAl0B0wNCAXQDGgElAwYBCAMBAQKgAAMdAf8DqgH/Ax0B/wGp
AT8BMAH/AVMBKAElAf8BRAGWAbUB/wFdAcEB5AH/AZQB2AHrAf8BAAE3AYgB/wEGASoBSwH/AaEBIgFK
Af8BvwE1AY4B/wHKAUUBpgH/AdoBVgG8Af8B6AGBAdIB/wH0AYoB4QH/AfkBkAHoAf8B9AGKAeEB/wHo
AYEB0gH/AdoBVgG9Af8BywFFAaUB/wHAATQBigH/AWMBIQE+Af8BAAEoAVgB/wEkAWIBqQH/AZwB4QHv
Af8BTwGwAdYB/wE3ATABOAH/AZABNAEnAf8DJAH/A6oB/wMdAf8CDQFkAf8BFwE0AYgB/wEwAZQBtAH/
AQ4BHQFSAf8BCwEkAYoB/wEeAYwBzwH/AR4BkwHcAf8BHwGPAdUB/wEVAVwBwwH/AQ8BNgGlAf8BCgEa
AYkB/wEKARABYAH/Ag4BWQH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgkBWQH/Ag4BWQH/
Ag8BWwH/Ag8BYwH/AQ8BHgGOAf8BHAFUAbgB/wEyAZoB0gH/ASkBjQHLAf8BEwE7AaUB/wEIARABXAH/
AQ4BHQFSAf8BMAGXAbYB/wEXATgBigH/Ag0BZAH/EAADAwEEAxYBHgM2AVkBTwJRAZwBVwJZAb8BWQJc
AckBWgJdAcoBXAJeAc4BWAJfAeMBVwFiAWUB9gHwA/8BwwH7Av8BwwH7Av8B3QP/AXoBlAGgAfwDWQHH
AzcBWwMPARQDAAEBpAADHQH/A7AB/wMdAf8BrwFAATMB/wFiAScBHwH/AUUBIgEkAf8BQAFcAYUB/wGw
Ae4B9wH/AZsB4wHvAf8BAAE6AZEB/wEPATYBTwH/AaUBJgFSAf8BwAE5AZUB/wHLAUcBqQH/AdYBUgG3
Af8B3gFcAcIB/wHhAV4BxgH/Ad4BXAHCAf8B1gFSAbcB/wHLAUcBqAH/AcMBOAGRAf8BgQEiAUQB/wEA
AUABgAH/ARcBWgGlAf8BtwHzAfoB/wGWAdoB5AH/ATgBLQE1Af8BWAEmASEB/wGjATsBMAH/AyQB/wOw
Af8DHQH/Ag0BZAH/ARcBNAGIAf8BMAGUAbQB/wEOAR0BUgH/AQsBMgGPAf8BPgHHAegB/wFFAdAB8wH/
AUYBywHyAf8BPAG7AeYB/wEmAY0BzAH/ARIBPQGlAf8BDQEZAYEB/wEIAQ4BWQH/AgcBWQH/AgYBWQH/
AgYBWQH/AgYBWQH/AgYBWQH/AgcBWQH/AggBWQH/Ag8BWQH/AQwBEgFjAf8BGAFSAbUB/wFHAdAB8QH/
AVcB6QH9Af8BVAHlAfsB/wEwAakB3AH/AQoBIQGEAf8BDgEeAVIB/wEwAZsBuAH/ARcBOAGLAf8CDQFk
Af8QAAMCAQMDCgENAxwBJwMvAUkDPAFmA0QBegNIAYQBTgJPAZcBWQJcAcwBUwJkAfEE/wHDAfsC/wHD
AfsC/wHXA/8BqwGyAbYB/QNbAcgDNwFaAwsBD6gAAx0B/wO2Af8DHQH/AbABPwEzAf8BsgE/ATIB/wGf
ATYBKgH/AWMBJgEdAf8BKgEiATEB/wGTAdQB6AH/AZYB3gHvAf8BAAFJAZYB/wEiAS0BRAH/AbgBKgFd
Af8BvwE3AZMB/wHGAUABoAH/AcsBRgGmAf8BzQFIAaoB/wHLAUYBpgH/AcYBQAGgAf8BwAE3AZEB/wGd
ASUBTgH/AQUBQgFcAf8BFwFZAagB/wGvAesB+AH/AVYBoAHDAf8BSAIhAf8BZQEmARwB/wGtAT0BMAH/
AakBPQEyAf8DJAH/A7YB/wMdAf8CDQFkAf8BFwE0AYgB/wEvAZQBtAH/AQ4BHQFSAf8BCQEtAY4B/wE3
AcMB5wH/AT4BzgHyAf8BPgHIAfIB/wE0AbQB5gH/ASEBigHKAf8BEQE7AZ8B/wEHARUBXwH/AgYBUAH/
AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTwH/AQUBDwFdAf8BKAGV
AcsB/wFMAekB/QH/AU4B7gL/AU4B7gL/AUAB1QHwAf8BCQEuAZAB/wEOAR8BUgH/ATABnAG5Af8BFwE4
AYsB/wINAWQB/xMAAQEDBwEJAxYBHwMvAUkBQQJCAXMBTAJNAZEBUAJSAaMBVQJXAboDXwHgAUkBYgFl
AfYB8wP/AcMB+wL/AcMB+wL/Ad0D/wF6AZQBoAH8AVcCWgG9AzEBTwMJAQyoAAMdAf8DuwH/Ax0B/wGt
ATwBMgH/AbMBPgEzAf8BswE+ATMB/wGoATkBLgH/AWIBIwEcAf8BKgEiATEB/wGRAdEB6gH/AWEBugHd
Af8BAgFSAZMB/wFLAR8BOgH/AbgBKAFgAf8BvAEwAYcB/wHAATIBigH/Ab8BMwGMAf8BwAEyAYoB/wG8
AS8BhgH/AbQBJwFYAf8BHgEwAUUB/wEMAVgBogH/AZ0B3gHxAf8BVgGgAcYB/wFKASABIQH/AZYBMAEn
Af8BsgE+ATMB/wGzAT4BMwH/AaYBOgExAf8DJQH/A7sB/wMdAf8CDQFkAf8BFwE0AYgB/wErAZQBtAH/
AQ0BHQFSAf8BAwEfAYUB/wEVAYIBygH/ARQBjgHXAf8BFAGKAdcB/wEUAYYBzwH/ARQBXAHAAf8BDgFD
AaoB/wEKASQBjAH/AgYBSwH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRwH/
AgYBSQH/AQMBDAFZAf8BHgGAAcEB/wFBAeMB+wH/AUUB7gL/AUUB7gL/ATIBxgHqAf8BBgEmAYwB/wEO
AR8BVAH/ATABnQG9Af8BFwE5AYsB/wINAWQB/xMAAQEDCgENAyoBQAFOAk8BlwFYAlwB0QNcAeoDZwHy
AVkBZwFsAfUBgQGNAZMB+wHaAeoB9QH/AdgD/wHDAfsC/wHFAf0C/wHvA/8CYgFoAfYBUAJSAaMDJwE6
AwcBCagAAx0B/wPAAf8DHQH/AakBOgEwAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BpQE2AS0B/wFe
ASEBGgH/ASsBNAFJAf8BmAHaAfEB/wE3AY8BvAH/AQgBPQFZAf8BWgEVASsB/wFOASEBPAH/AT0BJwFC
Af8BPQEnAUIB/wFBASYBQQH/AVYBHQE4Af8BRAEYASkB/wECAU0BkAH/AWUBvAHgAf8BhAG7AeEB/wE8
AR4BJAH/AZEBLQEkAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BogE4AS8B/wMlAf8DwAH/Ax0B/wIN
AWUB/wEXATQBiwH/AS4BlAG0Af8BCgEZAU4B/wEJAS0BjAH/ATYB2gHrAf8BOwHkAfUB/wE7AeIB9QH/
ATYB2QHzAf8BMAHCAekB/wEhAZMB0QH/AREBPQGjAf8BAQEFAUIB/wIBATsB/wIBATsB/wIBATsB/wIB
ATsB/wIBATsB/wIBATsB/wIBAT4B/wIBAT4B/wEAAQUBRgH/AQYBLAGQAf8BIgGeAdYB/wE2AdEB8AH/
ATABwwHqAf8BFwFdAb0B/wEBARABWwH/AQsBGwFUAf8BMAGdAb0B/wEXATkBjgH/Ag0BZQH/EwABAQMP
ARQDOwFjA14B2AT/AfsD/wHzA/8B7gP/AeID/wHRA/8BxgH+Av8BxAH8Av8B1gP/AecB8QH4Af8BVwJc
Ad8DRAF5AxgBIgMEAQaoAAMdAf8DxwH/Ax0B/wGmATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/
AawBNwEwAf8BmgEvASgB/wFVAR8BHQH/AUgBkAGyAf8BlgHSAfEB/wENAVABogH/AQIBSQGLAf8BBQFR
AZMB/wELAVcBmgH/AQ0BWQGcAf8BCgFWAZcB/wEEAVEBkwH/AQEBRAGLAf8BMgGJAbsB/wGYAdgB8wH/
ASwBOgFQAf8BXQEfARoB/wGrATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/AZ8BNQEuAf8DJQH/
A8cB/wMdAf8CDwGFAf8BGwE7AY0B/wEwAZcBtAH/AQgBFwFMAf8BAAEOAU0B/wEJATEBjAH/AQoBMwGS
Af8BCgEzAZIB/wEIATEBkAH/AQcBLAGGAf8BBAEfAV8B/wECARABTwH/AgABOAH/AgABMgH/AgABMgH/
AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABOAH/AQABAQE5Af8BAAEJAUQB/wECARcBXwH/
AQgBLQGKAf8BBgElAYUB/wEFARABWAH/AQUBBwFFAf8BCAEYAU0B/wEwAZwBuQH/ARsBPAGRAf8CDwGF
Af8TAAEBAw0BEgM4AVwBWAJbAcsBqAG1Ab4B/gHqA/8BzQP/AcQB/AL/AcMB+wL/AcMB+wL/AcYB/gL/
AdgD/wHzAfgB/AH/A10B8ANSAakDLgFHAwwBEAMCAQOoAAMdAf8DzwH/Ax0B/wGjATMBLQH/AagBNAEu
Af8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BqAE0AS4B/wGNAScBIgH/ATABIgEtAf8BjAHSAfMB/wHD
AfAB+AH/AdUB7gH3Af8B4AH3AfwB/wHnA/8B6AP/AeYB/gL/Ad0B8gH6Af8BzQHtAfcB/wG1Ae8B+wH/
AVYBqwHPAf8BSwEbAR0B/wGWASwBJgH/AagBNAEuAf8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BnQEy
ASwB/wMmAf8DzwH/Ax0B/wIVAYoB/wEcAT4BmAH/ATEBlQG2Af8BGwFCAYgB/wENARsBSwH/AQ0BGwFQ
Af8BDQEbAVAB/wENARsBUAH/AQ0BGwFKAf8BDQEbAUoB/wENARsBSgH/AQ0BGwFFAf8BBgEVAUQB/wEG
ARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQ0BGwFF
Af8BDQEcAUsB/wENAR0BTAH/AQ0BHQFMAf8BDQEdAVIB/wENAR0BUgH/AQ0BHAFRAf8BDQEbAUsB/wEZ
AUIBhwH/ATABlAG1Af8BHAE+AZgB/wIVAYoB/xMAAQEDBwEKAyYBOANKAYsBWQJcAc8BcgF6AX4B+AHz
AfgB/AH/AfID/wHmA/8B6AP/AfoD/wGoAbgBwgH+A2EB7gNVAbIDOAFcAxUBHQMFAQcDAAEBqAADHQH/
A9cB/wMdAf8BnwEwASwB/wGkATEBLQH/AaQBMQEtAf8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEs
ASgB/wFFARkBHQH/Aa8B3AHkAf8B4gHwAfIB/wGNAaQBrwH/AUkBTwFbAf8BNwEzAUEB/wE4ATQBQgH/
AToBNwFEAf8BVAFgAYYB/wGlAcABxQH/Ae8C+wH/AUABggGXAf8BVgEaARkB/wGjATABLAH/AaQBMQEt
Af8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEvASsB/wMmAf8D1wH/Ax0B/wIWAZQB/wEbATkBmwH/
ATwBogHDAf8BTwG3Ac0B/wFLAbkBzQH/AUsBuQHNAf8BSQG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5
Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/
AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUsBuQHNAf8BSwG8Ac8B/wFLAb8B0gH/AUsBvwHSAf8BSwG/
AdIB/wFLAb8B0gH/AUkBvAHPAf8BSAG5Ac0B/wFHAbYByAH/ATcBngHAAf8BGwE4AZsB/wIWAZQB/xQA
AwQBBQMRARcDKQE/A0QBeQFVAlYBtAFcAmEB3AFfAWQBagHzAXEBfQGKAfoBcQF9AYoB+gJdAV8B7QFb
Al4B0AFQAlEBnwM2AVkDGAEhAwcBCgMBAQKsAAMdAf8D3wH/Ax0B/wGcAS0BKwH/AaEBLgEsAf8BoQEu
ASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGbASsBKQH/AUsBGAEbAf8BjwGWAaEB/wE5ARYBHgH/
AVMCGAH/AVYBGAEXAf8BgQEgAR4B/wGBASABHgH/AYEBIAEeAf8BVQEYARcB/wFQARgBGQH/AS0BIQEw
Af8BXQFhAYgB/wFVARgBFwH/AaABLQErAf8BoQEuASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGW
ASwBKgH/AycB/wPfAf8DHQH/AhcBngH/ARgBHwGUAf8BJwFBAZ8B/wE6AWEBrgH/AT0BZQGrAf8BPQFl
AasB/wE7AWUBqwH/AToBZQGnAf8BOgFlAaYB/wE4AWIBpgH/ATQBXwGmAf8BNAFfAaIB/wE0AV8BoQH/
ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BOAFf
AaIB/wE4AV8BpgH/ATsBYgGmAf8BPQFlAaYB/wE9AWUBpwH/AT0BZQGrAf8BOwFlAasB/wE6AWUBqwH/
ATcBYQGuAf8BJQFBAZ8B/wEYAR8BlAH/AhcBngH/FwABAQMEAQYDDAEQAxwBKAMxAU0DQgF1A04BmQFT
AlUBrQNSAakDSwGOATwCPQFnAykBPgMUARsDBwEJAwIBA7AAA0wB8wPfAf8DNAH/AYoCJwH/AZsBKQEq
Af8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGaASgBKQH/AVABFQEWAf8BSgEVARgB/wFS
AhUB/wGZASgBKQH/AZoBKQEqAf8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmgEoASkB/wGSASUBJgH/
AVECFQH/AUcBFQEZAf8BUgIVAf8BmgEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGbASkBKgH/
AWIBJQEmAf8DPAH/A90B/wNOAfACHAGkAf8CFwGeAf8CFgGUAf8CFQGPAf8CFQGMAf8CFQGGAf8CFQGC
Af8CEAFkAf8CDwFkAf8CDgFhAf8CDQFeAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFc
Af8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFeAf8CDgFhAf8CDwFkAf8CEAFkAf8CFQGCAf8CFQGG
Af8CFQGMAf8CFQGPAf8CFgGUAf8CFwGeAf8CHAGkAf8bAAEBAwIBAwMGAQgDDAEQAxYBHgMiATIDKgFA
AykBPgMfASwDEgEZAwoBDQMEAQYDAQECtAADVwG9A78B/wOUAf8BSAEmASgB/wGKASUBKwH/AZMBIwEq
Af8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGSASMBKQH/AY4BIQEoAf8BkgEjASoB/wGT
ASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZIBIwEp
Af8BjQEhAScB/wGSASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BgAEmASsB/wE9
ASUBJwH/A7QB/wO0Af8DVAGuAh8BrAH/Ah8BqQH/Ah8BpgH/AhoBpgH/AhkBpgH/AhkBowH/AhkBnwH/
AhcBngH/AhcBlwH/AhcBlwH/AhcBlgH/AhcBlgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/
AhcBjgH/AhcBjgH/AhcBjgH/AhcBlgH/AhcBlgH/AhcBlwH/AhcBlwH/AhcBngH/AhkBnwH/AhkBowH/
AhkBpgH/AhoBpgH/Ah8BpgH/Ah8BqQH/Ah8BrAH/JAADAQECAwMEBAQGAQgDBgEIAwQBBgMDAQQDAAEB
vAADNAFUA0wB/wPuAf8DkwH/AzMB/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd
Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DPAH/A7IB/wPq
Af8DPAH/Ay0BRQIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIbAagB/wIa
AaQB/wIXAaIB/wIXAZ8B/wIXAZ8B/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIX
AZwB/wIXAZwB/wIXAZ8B/wIXAZ8B/wIXAaIB/wIaAacB/wIbAagB/wIfAawB/wIfAawB/wIfAawB/wIf
AawB/wIfAawB/wIfAawB/wIfAawB//8ABQADSgGNA0sB/wPNAf8D+QH/A/sB/wP7Af8D+wH/A/sB/wP7
Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7
Af8D+wH/A/sB/wPrAf8DvQH/AzYB/wNIAYcEAANIAYUCHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGs
Af8CHwGsAf8CHwGsAf8CHgGpAf8CHAGpAf8CHAGmAf8CGAGkAf8CFwGhAf8CFwGhAf8CFwGhAf8CFwGh
Af8CFwGhAf8CFwGhAf8CFwGhAf8CFwGhAf8CGAGkAf8CHAGmAf8CHAGpAf8CHgGrAf8CHwGsAf8CHwGs
Af8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8DSAGF/wAJAAM3AVoDWQHDAysB/AMdAf8DHQH/
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DVQHqA1QBrgMtAUUIAAMHAQoDSAGFAh8BrAH/Ah8BrAH/Ah8BrAH/
Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BqwH/Ah4BqgH/Ah0BqgH/Ah0BqAH/Ah0BpAH/
Ah0BpAH/Ah0BpAH/Ah0BpAH/Ah0BqAH/Ah0BqgH/Ah4BqgH/Ah8BqwH/Ah8BrAH/Ah8BrAH/Ah8BrAH/
Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/A0gBhQMHAQr/AAEAAUIBTQE+BwABPgMAASgDAAGA
AwABIAMAAQEBAAEBBgABAhYAA/8BAAHAAgABAwQABP8EAAGAAgABAQQAAv8B+AEHDAAC/wHwAQMMAAL/
AeABAQwAAv8BwAEBDAAC/wGAAQEMAAL/AQABAQwAAf8B/gEAAQEMAAH/AfwBAAEBDAAB/wH8AQABAQwA
Af8BgAEAAQEMAAH+AgABAQwAAfgCAAEDDAAB8AIAAQcMAAHwAgABHwwAAfACAAE/DAAB8AIAAX8MAAHw
AgAB/wwAAfABAAEBAf8MAAHwAQABAwH/DAAB8AEAAQMB/wwAAfABAAEDAf8MAAHwAQABAwH/DAAB8AEA
AQMB/wwAAfABAAEDAf8MAAH4AQABBwH/DAAB+AEAAQ8B/wwAAfwBAAEfAf8MAAH/AYABfwH/DAAE/wQA
AYACAAEBBAAE/wQAAcACAAEDBAAE/wQACw==
</value>
</data>
</root>

79
ThirdParty/Converter.cs vendored Normal file
View file

@ -0,0 +1,79 @@
namespace DutyContent.ThirdParty
{
static class Converter
{
public static bool TryInt(string s, out int ret)
{
ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return false;
ret = ret * 10 + n;
}
return true;
}
public static int ToInt(string s, int failret = 0)
{
int ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return failret;
ret = ret * 10 + n;
}
return ret;
}
public static bool TryUshort(string s, out ushort ret)
{
ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return false;
ret = (ushort)(ret * 10 + n);
}
return true;
}
public static ushort ToUshort(string s, ushort failret=0)
{
int ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return failret;
ret = ret * 10 + n;
}
return (ushort)ret;
}
public static bool ToBool(string s)
{
return s.ToUpper().Equals("TRUE");
}
public static float ToFloat(string s, float failret=0.0f)
{
return float.TryParse(s, out float v) ? v : failret;
}
}
}

223
ThirdParty/LineDb.cs vendored Normal file
View file

@ -0,0 +1,223 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace DutyContent.ThirdParty
{
class LineDb
{
private Dictionary<string, string> _dbstr = new Dictionary<string, string>();
private Dictionary<int, string> _dbint = new Dictionary<int, string>();
public static string InvalidKey = "<invalid>";
public LineDb(string ctx, bool useintdb)
{
LoadString(ctx, useintdb, false);
}
public LineDb(string filename, Encoding enc, bool useintdb)
{
LoadFile(filename, enc, useintdb, false);
}
public void LoadString(string ctx, bool useintdb, bool reset = false)
{
if (reset)
{
_dbstr.Clear();
_dbint.Clear();
}
ParseLines(ctx, useintdb);
}
public void LoadFile(string filename, Encoding enc, bool useintdb, bool reset = false)
{
try
{
var ctx = File.ReadAllText(filename, enc);
LoadString(ctx, useintdb, reset);
}
catch { }
}
public bool SaveFile(string filename, Encoding enc, string header = null)
{
if (string.IsNullOrEmpty(filename))
return false;
using (var sw = new StreamWriter(filename, false, enc))
{
if (!string.IsNullOrEmpty(header))
{
sw.WriteLine(header);
sw.WriteLine();
}
foreach (var l in _dbstr)
{
if (l.Key.IndexOf('=') < 0)
sw.WriteLine($"{l.Key}={l.Value}");
else
sw.WriteLine($"\"{l.Key}\"={l.Value}");
}
foreach (var l in _dbint)
sw.WriteLine($"{l.Key}={l.Value}");
}
return true;
}
private void ParseLines(string ctx, bool useintdb)
{
_dbstr.Clear();
var ss = ctx.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var v in ss)
{
string name, value, l = v.TrimStart();
if (l[0] == '#' || l.StartsWith("//"))
continue;
if (l[0] == '"')
{
var qt = l.IndexOf('"', 1);
if (qt < 0)
{
// no end quote?
continue;
}
value = l.Substring(qt + 1).TrimStart();
if (value.Length == 0 || value[0] != '=')
{
// no value
continue;
}
name = l.Substring(1, qt - 1).Trim();
value = value.Substring(1).Trim();
}
else
{
var div = l.IndexOf('=');
if (div <= 0)
continue;
name = l.Substring(0, div).Trim();
value = l.Substring(div + 1).Trim();
}
if (!useintdb)
{
if (_dbstr.TryGetValue(name, out _))
_dbstr.Remove(name);
_dbstr.Add(name, value);
}
else
{
if (!Converter.TryInt(name, out int nkey))
{
if (_dbstr.TryGetValue(name, out _))
_dbstr.Remove(name);
_dbstr.Add(name, value);
}
else
{
if (_dbint.TryGetValue(nkey, out _))
_dbint.Remove(nkey);
_dbint.Add(nkey, value);
}
}
}
}
public string Get(string name)
{
if (!_dbstr.TryGetValue(name, out string value))
return name;
return value;
}
public string Get(int key)
{
if (!_dbint.TryGetValue(key, out string value))
return InvalidKey;
return value;
}
public bool Try(string name, out string value)
{
return _dbstr.TryGetValue(name, out value);
}
public bool Try(int key, out string value)
{
return _dbint.TryGetValue(key, out value);
}
public bool Try(string name, out int value)
{
if (!_dbstr.TryGetValue(name, out string v))
{
value = 0;
return false;
}
else
{
if (!ThirdParty.Converter.TryInt(v, out value))
return false;
return true;
}
}
public bool Try(string name, out ushort value)
{
if (!_dbstr.TryGetValue(name, out string v))
{
value = 0;
return false;
}
else
{
if (!ThirdParty.Converter.TryUshort(v, out value))
return false;
return true;
}
}
public IEnumerator<KeyValuePair<string, string>> GetStringDb()
{
return (IEnumerator<KeyValuePair<string, string>>)_dbstr;
}
public IEnumerator<KeyValuePair<int, string>> GetIntDb()
{
return (IEnumerator<KeyValuePair<int, string>>)_dbint;
}
public int Count { get { return _dbstr.Count + _dbint.Count; } }
public string this[string index]
{
get
{
return Try(index, out string v) ? v : "";
}
}
public string this[int key]
{
get
{
return Try(key, out string v) ? v : "";
}
}
}
}

114
ThirdParty/NativeMethods.cs vendored Normal file
View file

@ -0,0 +1,114 @@
using System;
using System.Diagnostics;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DutyContent.ThirdParty
{
class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
public static void ScrollToBottom(RichTextBox richTextBox)
{
SendMessage(richTextBox.Handle, 277, (IntPtr)7, IntPtr.Zero);
richTextBox.SelectionStart = richTextBox.Text.Length;
}
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint access_flag, bool inherit_handle, int process_id);
[DllImport("kernel32.dll")]
public static extern int CloseHandle(IntPtr handle);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowThreadProcessId(IntPtr handle, out int process_id);
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
public class ProcessHandle
{
public Process Process { get; private set; }
public IntPtr Handle { get; private set; }
public System.Net.IPEndPoint EndPoint { get; set; }
public ProcessHandle(Process p)
{
Process = p;
if (p != null && !p.HasExited)
Handle = OpenProcess(16, false, p.Id);
}
~ProcessHandle()
{
if (Handle != IntPtr.Zero)
CloseHandle(Handle);
}
}
[DllImport("Iphlpapi.dll", SetLastError = true)]
public static extern uint GetExtendedTcpTable(IntPtr tcpTable, ref int tcpTableLength, bool sort, AddressFamily ipVersion, int tcpTableType, int reserved = 0);
[StructLayout(LayoutKind.Sequential)]
public struct TcpTable
{
public uint entries;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
public TcpRow[] row;
}
[StructLayout(LayoutKind.Sequential)]
public struct TcpRow : IEquatable<TcpRow>
{
public TcpState state;
public uint __localAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] __localPort;
public uint __remoteAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] __remotePort;
public uint owningPid;
public IPAddress LocalAddress => new IPAddress(__localAddr);
public ushort LocalPort => BitConverter.ToUInt16(new byte[2] { __localPort[1], __localPort[0] }, 0);
public IPAddress RemoteAddress => new IPAddress(__remoteAddr);
public ushort RemotePort => BitConverter.ToUInt16(new byte[2] { __remotePort[1], __remotePort[0] }, 0);
public bool Equals(TcpRow right)
{
return
__localAddr == right.__localAddr && LocalPort == right.LocalPort &&
__remoteAddr == right.__remoteAddr && RemotePort == right.RemotePort &&
owningPid == right.owningPid;
}
public override bool Equals(object obj)
{
return !(obj is null) && obj is TcpRow && Equals((TcpRow)obj);
}
public override int GetHashCode()
{
unchecked
{
var h = (int)__localAddr;
h = (h * 397) ^ LocalPort;
h = (h * 397) ^ (int)__remoteAddr;
h = (h * 397) ^ RemotePort;
h = (h * 397) ^ (int)owningPid;
return h;
}
}
}
}
}

62
WorkerAct.cs Normal file
View file

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Advanced_Combat_Tracker;
namespace DutyContent
{
static class WorkerAct
{
public delegate object ObjectReturnerDelegate();
private static object _lock_effect_sound = new object();
private static long _last_effect_sound;
// main invoker
public static object Invoker(ObjectReturnerDelegate dgt)
{
return ActGlobals.oFormActMain.Invoke(dgt);
}
//
public static void Invoker(Action dgt)
{
ActGlobals.oFormActMain.Invoke(dgt);
}
//
public static void Tts(string msg)
{
ActGlobals.oFormActMain.TTS(msg);
}
//
public static void PlaySound(string filename, int volume_percent = 100)
{
ActGlobals.oFormActMain.PlaySoundWinApi(filename, volume_percent);
}
//
public static void PlayEffectSound(string filename, int volume_percent = 100)
{
if (string.IsNullOrWhiteSpace(filename) || !File.Exists(filename))
return;
lock (_lock_effect_sound)
{
long now = DateTime.Now.Ticks;
long delta = now - _last_effect_sound;
TimeSpan span = new TimeSpan(delta);
if (span.TotalSeconds > 2)
{
_last_effect_sound = now;
PlaySound(filename, volume_percent);
}
}
}
}
}

4
packages.config Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
</packages>