KO UO Topic trade - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ํ๋ ์ด์ด ๊ฐ ์์ ํ ๊ตํ์ ์ํ ์ฐฝ: ์ฐธ๊ฐ์, ์ปจํ ์ด๋, ์ํ, ํ์ธ ๋ฐ ์ทจ์.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| IsTrade | UO.IsTrade |
| ๋ฌด์ญ ๋ฐ๋์ | UO.GetTradeOpponent ยท UO.GetTradeOpponentName |
| ๋ฌด์ญ ์ปจํ ์ด๋ | UO.GetTradeContainer |
| ConfirmTrade | UO.ConfirmTrade |
| CancelTrade | UO.CancelTrade |
UO.IsTrade ยท UO.TradeCount ยท UO.TradeCheck ยท UO.TradeContainer ยท UO.GetTradeContainer ยท UO.TradeOpponent ยท UO.GetTradeOpponent ยท UO.TradeName ยท UO.GetTradeOpponentName ยท UO.ConfirmTrade ยท UO.CancelTrade
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var value = UO.GetTradeContainer(1, 1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var result = UO.ConfirmTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.CancelTrade(object? tradeNum);์ ํํ ๊ฑฐ๋์๋ฅผ ์ทจ์ํ๊ณ ์ฐฝ์ ๋ซ์ต๋๋ค.
-
tradeNumโ ์ ์: 1๋ถํฐ TradeCount()๊น์ง์ ํ์ฌ ์ฐฝ ๋ฒํธ. 0 ๋ฐ ์์ ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ์ฐฝ์ด ๋ฐ๊ฒฌ๋์ด ๋ซํ๊ณ ๋ซ๊ธฐ๋ฅผ ํตํด ์ทจ์ ์์ฒญ์ด ์ ์ก๋ฉ๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์ฐฝ์ด ์์ต๋๋ค. ์ด๋ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋ซํ ์ฐฝ์ ๋ค์ ์ทจ์ํ๋ฉด ๋ ๋ฒ์งธ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.CancelTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var result = UO.CancelTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var tradeNumber = 2;
if (Truth(UO.TradeCount() >= tradeNumber))
{
var result = UO.CancelTrade(tradeNumber);
UO.Print(Convert.ToString(result));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var expectedPartner = UO.GetTradeOpponent(1);
var result = ApplyToPartner(1, expectedPartner);
UO.Print(Convert.ToString(result));
return null;
}
dynamic ApplyToPartner(dynamic tradeNumber, dynamic expectedPartner)
{
if (Truth(expectedPartner == 0))
{
return false;
}
if (Truth(UO.GetTradeOpponent(tradeNumber) != expectedPartner))
{
return false;
}
return UO.CancelTrade(tradeNumber);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tradeNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelTrade:bridge.CancelTrade(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "canceltrade": return new InjectionValue(bridge.CancelTrade(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ConfirmTrade(object? tradeNum);์ ํํ ๊ตํ์ ๋ํ ์ฌ์ฉ์ ์ ์ ๋์ ํ๋๊ทธ๋ฅผ ์ค์ ํฉ๋๋ค.
-
tradeNumโ ์ ์: 1๋ถํฐ TradeCount()๊น์ง์ ํ์ฌ ์ฐฝ ๋ฒํธ. 0 ๋ฐ ์์ ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ์ฐฝ์ด ๋ฐ๊ฒฌ๋๊ณ ์์ฒด ๊ณ์ฝ์ด ์ผ์ ธ ์์ต๋๋ค(๋๋ ์ด๋ฏธ ์ผ์ ธ ์์ต๋๋ค). 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์ฐฝ์ด ์์ต๋๋ค. ์๋ฒ์ ์ํ ์์ดํ ์ ์ก์ ํ์ธํ์ง ์์ต๋๋ค. ๋ค์ ์ ํํด๋ ๋์๊ฐ ์ญ์ ๋์ง๋ ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ConfirmTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var result = UO.ConfirmTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var tradeNumber = 2;
if (Truth(UO.TradeCount() >= tradeNumber))
{
var result = UO.ConfirmTrade(tradeNumber);
UO.Print(Convert.ToString(result));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var expectedPartner = UO.GetTradeOpponent(1);
var result = ApplyToPartner(1, expectedPartner);
UO.Print(Convert.ToString(result));
return null;
}
dynamic ApplyToPartner(dynamic tradeNumber, dynamic expectedPartner)
{
if (Truth(expectedPartner == 0))
{
return false;
}
if (Truth(UO.GetTradeOpponent(tradeNumber) != expectedPartner))
{
return false;
}
return UO.ConfirmTrade(tradeNumber);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tradeNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConfirmTrade:bridge.ConfirmTrade(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "confirmtrade": return new InjectionValue(bridge.ConfirmTrade(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetTradeContainer(object? tradeNum, object? num);๋ ๊ตํ ์ปจํ ์ด๋ ์ค ํ๋์ ์ซ์ serial๋ฅผ ๋ฐํํฉ๋๋ค.
-
tradeNumโ ์ ์: 1๋ถํฐ TradeCount()๊น์ง์ ํ์ฌ ์ฐฝ ๋ฒํธ. 0 ๋ฐ ์์ ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค. -
num- 1 - ์์ฒด ์ปจํ ์ด๋, 2 - ํํธ๋ ์ปจํ ์ด๋. ๋๋จธ์ง ๊ฐ์ 0๋ฅผ ๋ฐํํฉ๋๋ค.
int: 32 ๋นํธ serial ์ปจํ ์ด๋; 0 ์ฐฝ์ด ์๊ฑฐ๋ Num.์ด ์๋ชป๋ ๊ฒฝ์ฐ ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๊ฐ์ฅ ์ค์ํ ๋นํธ๋ ๋ณด์กด๋ฉ๋๋ค. != 0๋ฅผ ํ์ธํ๊ณ , > 0 ๋๋ == true์ด ์๋์ง ํ์ธํ์ธ์.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTradeContainer(1, 1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.GetTradeContainer(1, 1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var ours = UO.GetTradeContainer(1, 1);
var theirs = UO.GetTradeContainer(1, 2);
UO.Print(Hex(ours) + " / " + Hex(theirs));
return null;
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Hex(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return 0;
}
return UO.GetTradeContainer(index, 1);
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tradeNum (Any), num (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeContainer:bridge.GetTradeContainer(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gettradecontainer": return new InjectionValue(bridge.GetTradeContainer(Arg(0), Arg(1)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetTradeOpponent(object? tradeNum);ํํธ๋ ์บ๋ฆญํฐ์ ์ซ์ serial๋ฅผ ๋ฐํํฉ๋๋ค.
-
tradeNumโ ์ ์: 1๋ถํฐ TradeCount()๊น์ง์ ํ์ฌ ์ฐฝ ๋ฒํธ. 0 ๋ฐ ์์ ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
int: LocalSerial ์ฐฝ์ serial ๋ฌธ์; 0 ์ฐฝ์ด ์๋ ๊ฒฝ์ฐ. ์ปจํ ์ด๋๋ ์๋๊ณ bool๋ ์๋๋๋ค. != 0๋ฅผ ํ์ธํ์ธ์.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTradeOpponent(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.GetTradeOpponent(1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(1); index <= total - 0; index += (int)(1))
{
var value = UO.GetTradeOpponent(index);
UO.Print(Convert.ToString(index) + ": " + Hex(value));
}
return null;
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Hex(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return 0;
}
return UO.GetTradeOpponent(index);
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tradeNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeOpponent:bridge.GetTradeOpponent(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gettradeopponent": return new InjectionValue(bridge.GetTradeOpponent(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetTradeOpponentName(object? tradeNum);๊ตํ์ฐฝ๊ณผ ํจ๊ป ๋ฐ์ ํํธ๋๋ช ์ ๋ฐํํฉ๋๋ค.
-
tradeNumโ ์ ์: 1๋ถํฐ TradeCount()๊น์ง์ ํ์ฌ ์ฐฝ ๋ฒํธ. 0 ๋ฐ ์์ ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
string: ๊ฑฐ๋์ ๊ฐ์ค ํจํค์ง์ ์ด๋ฆ; ์ฐฝ์ด๋ ์ด๋ฆ์ด ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ ๋๋ค. ๋ค์๋ ์ด๋ฆ์ ๋ฌป์ง ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTradeOpponentName(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.GetTradeOpponentName(1);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(1); index <= total - 0; index += (int)(1))
{
var value = UO.GetTradeOpponentName(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return "";
}
return UO.GetTradeOpponentName(index);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tradeNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeOpponentName:bridge.GetTradeOpponentName(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gettradeopponentname": return new InjectionValue(bridge.GetTradeOpponentName(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsTrade();๋ณด์ ๊ตํ ์ฐฝ์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๊ณต๊ฐ ๊ตํ์ด ์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์๋์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsTrade();
UO.Print("IsTrade: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.IsTrade();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ /์ดํ - 500 ๋ฐ๋ฆฌ์ด ๊ฐ๊ฒฉ์ ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท์ ๋๋ค. ์ผ์์ ์ง๋ ํน์ ๊ตํ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ๋ ํ๋ ์ฌ์ด์ ์ํ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.IsTrade();
await Delay(500);
var after = UO.IsTrade();
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeState();
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeState()
{
return UO.IsTrade();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTrade:bridge.IsTrade().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "istrade": return new InjectionValue(bridge.IsTrade());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TradeCheck(object? windowIndex);
dynamic UO.TradeCheck(object? tradeNum, object? num);
int UO.TradeCheck(object? windowIndex, object? checkbox, object? stateValue);๋์ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. 3๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์์ ์์ฒด ํ์ธ๋๋ ์์ ํฉ๋๋ค.
-
windowIndexโ ์ ์: 0๋ถํฐ TradeCount()-1๊น์ง์ ํ์ฌ ์ฐฝ ์ธ๋ฑ์ค. ์์ ๋๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค. -
tradeNumโ ์ ์: 0๋ถํฐ TradeCount()-1๊น์ง์ ํ์ฌ ์ฐฝ ์ธ๋ฑ์ค. ์์ ๋๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค. -
numโ 2๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์๋ง ํด๋น: 1 โ ์์ฒด ํ๋๊ทธ, 2 โ ํํธ๋์ ํ๋๊ทธ ๋ค๋ฅธ ์๋ฏธ๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. TradeNum ์ฌ๊ธฐ์๋ 0๋ก ์์ํฉ๋๋ค. -
checkboxโ 3๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์๋ง ํด๋น: 0 โ ์์ ์ ํ๋๊ทธ, 1 โ ํํธ๋์ ํ๋๊ทธ. ๋ค๋ฅธ ์ฌ๋์ ํ๋๊ทธ๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํฉ๋๋ค. 0์๋ ๋ ๋ค๋ฅธ ์๋ฏธ๊ฐ ์์ต๋๋ค. -
stateValueโ ํ์ธ๋=0์ธ ๊ฒฝ์ฐ์๋ง: 0/false๋ ๋์๋ฅผ ์ ๊ฑฐํ๊ณ 0์ด ์๋ ์ซ์/true์๋ ๋์๊ฐ ํฌํจ๋ฉ๋๋ค. checkbox=1์ธ ๊ฒฝ์ฐ ๊ฐ์ด ๋ฌด์๋ฉ๋๋ค.
int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ์ ํํ ํ์ธ๋์ด ์ ํ๋์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์ ๊ฑฐ๋์๊ฑฐ๋, ์ฐฝ์ด ์๊ฑฐ๋ ์ธก๋ฉด์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๊ธฐ๋ก ์์์ ๊ฑฐ๋ ์ฑ๊ณต ํ์๊ฐ ์๋ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ธ๋์ ์ ํ ์ทจ์ํ๋ฉด 0๊ฐ ๋ฐํ๋ฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TradeCheck(0);
UO.Print("TradeCheck: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.TradeCheck(0) ๋ฐ UO.TradeCheck(0,1)๋ ์ฒซ ๋ฒ์งธ ์ฐฝ์ ๋์์๋ฅผ ์ฝ์ต๋๋ค. UO.TradeCheck(0,2) - ๋ค๋ฅธ ์ฌ๋์ ๊ฒ. ๋ น์๋ ์๊ณ ์๋ ํ์ธ๋ ์์ต๋๋ค.
var own = UO.TradeCheck(0);
var sameOwn = UO.TradeCheck(0, 1);
var other = UO.TradeCheck(0, 2);
UO.Print(Convert.ToString(own) + "/" + Convert.ToString(sameOwn) + "/" + Convert.ToString(other));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.TradeCheck(0,0,false) ๋์๋ฅผ ์ฒ ํํฉ๋๋ค. UO.TradeCheck(0,1,false)๋ ์๋๋ฐฉ์ ๋์๋ง ์ฝ์ต๋๋ค. false๋ ์๋๋ฐฉ์ ์ ์ฅ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํํด ํ 0 ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var cleared = UO.TradeCheck(0, 0, false);
var other = UO.TradeCheck(0, 1, false);
UO.Print(Convert.ToString(cleared) + "/" + Convert.ToString(other));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var accepted = BothAccepted(0);
if (Truth(Truth(accepted) == true))
{
UO.Print("Both boxes are checked; server completion is not known");
}
return null;
}
dynamic BothAccepted(dynamic index)
{
if (Truth(index < 0) || Truth(index >= UO.TradeCount()))
{
return false;
}
var own = UO.TradeCheck(index, 1);
var other = UO.TradeCheck(index, 2);
return Truth(Truth(own) == true) && Truth(Truth(other) == true);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: windowIndex (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeCheck. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(NumberConversions.ToInt(windowIndex), 0, 0, false). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TradeCheck(InjectionValue windowIndex)
=> bridge.TradeCheck(NumberConversions.ToInt(windowIndex), 0, 0, false);๋งค๊ฐ๋ณ์: tradeNum (Any), num (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(Arg(0), tradeSide - 1, 0, false).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "tradecheck":
// The compatibility reader uses participants 1/2; the legacy
// one/three-argument forms use checkbox indices 0/1.
int tradeSide = Arg(1);
return new InjectionValue(tradeSide is 1 or 2
? bridge.TradeCheck(Arg(0), tradeSide - 1, 0, false) : 0);๋งค๊ฐ๋ณ์: windowIndex (Any), checkbox (Any), stateValue (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeCheck. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(NumberConversions.ToInt(windowIndex), NumberConversions.ToInt(checkbox), NumberConversions.ToInt(stateValue), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TradeCheck(InjectionValue windowIndex, InjectionValue checkbox, InjectionValue stateValue)
=> bridge.TradeCheck(NumberConversions.ToInt(windowIndex), NumberConversions.ToInt(checkbox), NumberConversions.ToInt(stateValue), true);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.TradeContainer(object? windowIndex);๊ตํ ์ปจํ ์ด๋์ serial๋ฅผ 16์ง์ ๋ฌธ์์ด๋ก ๋ฐํํฉ๋๋ค.
-
windowIndexโ ์ ์: 0๋ถํฐ TradeCount()-1๊น์ง์ ํ์ฌ ์ฐฝ ์ธ๋ฑ์ค. ์์ ๋๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
string: "0x40000011" ํ์์ 16์ง์; ์ฐฝ์ด ์์ผ๋ฉด "0x00000000"์ ๋๋ค. ์ด๋ bool๋ ๋น ๋ฌธ์์ด์ด ์๋ ์ปจํ ์ด๋์ ID์ ๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TradeContainer(0);
UO.Print("TradeContainer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.TradeContainer(0);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeContainer(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "0x00000000";
}
return UO.TradeContainer(index);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: windowIndex (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeContainer. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(bridge.TradeContainer(NumberConversions.ToInt(windowIndex))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeContainer:bridge.TradeContainer(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string TradeContainer(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeContainer(NumberConversions.ToInt(windowIndex)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TradeCount();์ด๋ฆฐ ๊ตํ ์ฐฝ ์๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int: 0์ ์ฐฝ ์. ์ด๋ bool์ด ์๋ ์๋์ ๋๋ค. ์ด์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธํ๊ธฐ > 0.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TradeCount();
UO.Print("TradeCount: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.TradeCount();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ /์ดํ - 500 ๋ฐ๋ฆฌ์ด ๊ฐ๊ฒฉ์ ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท์ ๋๋ค. ์ผ์์ ์ง๋ ํน์ ๊ตํ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ๋ ํ๋ ์ฌ์ด์ ์ํ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.TradeCount();
await Delay(500);
var after = UO.TradeCount();
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeState();
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeState()
{
return UO.TradeCount();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeCount. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCount:bridge.TradeCount().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TradeCount() => bridge.TradeCount();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.TradeName(object? windowIndex);๊ตํ์ฐฝ์ ํํธ๋ ์ด๋ฆ์ 0๋ถํฐ ์ธ๋ฑ์ค๋ก ๋ฐํํฉ๋๋ค.
-
windowIndexโ ์ ์: 0๋ถํฐ TradeCount()-1๊น์ง์ ํ์ฌ ์ฐฝ ์ธ๋ฑ์ค. ์์ ๋๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
string: ์ ์ฅ๋ ํํธ๋ ์ด๋ฆ; ์ฐฝ/์ด๋ฆ์ด ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ ๋๋ค. ์ปจํ ์ด๋ ํญ๋ชฉ ์ด๋ฆ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TradeName(0);
UO.Print("TradeName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.TradeName(0);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeName(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "";
}
return UO.TradeName(index);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: windowIndex (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeName:bridge.TradeName(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string TradeName(InjectionValue windowIndex) => bridge.TradeName(NumberConversions.ToInt(windowIndex));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.TradeOpponent(object? windowIndex);ํํธ๋ ์ปจํ ์ด๋์ serial์ 16์ง์ ๋ฌธ์์ด๋ก ๋ฐํํฉ๋๋ค. ID ๋ฌธ์๊ฐ ์๋๋๋ค.
-
windowIndexโ ์ ์: 0๋ถํฐ TradeCount()-1๊น์ง์ ํ์ฌ ์ฐฝ ์ธ๋ฑ์ค. ์์ ๋๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค.
string: ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋ ID2์ 16์ง์ serial; ์ฐฝ์ด ์์ผ๋ฉด "0x00000000"์ ๋๋ค. ID ๋ฌธ์์ ๊ฒฝ์ฐ GetTradeOpponent(index + 1)๋ฅผ ์ฌ์ฉํ์ธ์.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ซ์ ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋ ํํ์ TradeCheck - 0 ํฌํจ. ์ด๋ ์ด ํด๋ผ์ด์ธํธ์ ๋ช ๋ฐฑํ ํธํ์ฑ์ ๋๋ค. ๋ค์ํ ์์ง์ ์ธ๋ถ ์ฐธ์กฐ ์์ ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๊ธฐ๋ ํ์ฌ ์ธ๊ณ์ ๋ผ์ด๋ธ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ ๋์์ ์ํ๋ฉ๋๋ค. ๋ซํ ์ฐฝ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ํธ์ถ์ ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์์๋ ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์๋ก ์ด๋ํ ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ๋ฒํธ๋ ์๊ตฌ ์๋ณ์๊ฐ ์๋๋๋ค.
- ConfirmTrade ๋ฐ ํด๋น TradeCheck ๋ ์ฝ๋๋ ๋์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ํจํท์ ๋ณด๋ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋์๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. CancelTrade๋ ์ทจ์๋ฅผ ํ ๋ฒ ๋ณด๋ ๋๋ค. 1/true๋ ํ์ง ์ํ/์ฒ๋ฆฌ์ด๋ฉฐ ๊ตํ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด๋ฆ๊ณผ ๋ ๊ณ์ฝ ๋ชจ๋ ํญ๋ชฉ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TradeOpponent(0);
UO.Print("TradeOpponent: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ด ํ ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ณผ๋ value/result์ ์ ์ฅ๋ฉ๋๋ค. 0๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ด๊ณ , 1๋ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋ค(์ด ๋ช ๋ น์ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋ ์ซ์ serial๋ฅผ ํ์ํฉ๋๋ค. Convert.ToString โ ์ซ์ ๋๋ ๋ฌธ์์ด.
var value = UO.TradeOpponent(0);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- total โ ์ฐฝ ์์ ์ค๋ ์ท; index - ํ์ฌ ์ธ๋ฑ์ค/๋ฒํธ. ์ด๊ฑฐ ์์ ๋ ์๋ฌด๊ฒ๋ ํ์ธํ์ง ์์ต๋๋ค. GetTradeContainer์์ ๋ ๋ฒ์ ํธ์ถ์ ์ฒซ ๋ฒ์งธ ์ฐฝ(1)์ ์ปจํ ์ด๋(1)์ ๋ค๋ฅธ ์ฌ๋์ ์ปจํ ์ด๋(2)๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeOpponent(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฐ๋ฏธ๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ ์ค์ ๋ก Main์์ ํธ์ถ๋ฉ๋๋ค. Range/ID ๊ฒ์ฌ๋ ์ค๋ฅ ์ํ์ ์ค์ด์ง๋ง ์ฌ๋ฌ ํธ์ถ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฐฝ์ ํธ์ถ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์์ expectedPartner โ ์ ์ฅ๋ serial ๋ฌธ์; ์ด๋ ๊ตํ ๊ฐ๊ฒฉ์ด๋ ๋ด์ฉ์ ๋ํ ๋ฆฌ๋ทฐ๊ฐ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "0x00000000";
}
return UO.TradeOpponent(index);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: windowIndex (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TradeOpponent. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(bridge.TradeOpponent(NumberConversions.ToInt(windowIndex))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeOpponent:bridge.TradeOpponent(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string TradeOpponent(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeOpponent(NumberConversions.ToInt(windowIndex)));