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

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.GetTradeContainer

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

var value = UO.GetTradeContainer(1, 1);
UO.Print(Hex(value));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

UO.ConfirmTrade

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.CancelTrade

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.CancelTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” 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;

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CancelTrade(tradeNum) โ€” UO.CancelTrade(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "canceltrade": return new InjectionValue(bridge.CancelTrade(Arg(0)));

UO.ConfirmTrade

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.ConfirmTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” 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;

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ConfirmTrade(tradeNum) โ€” UO.ConfirmTrade(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "confirmtrade": return new InjectionValue(bridge.ConfirmTrade(Arg(0)));

UO.GetTradeContainer

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” 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");

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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");

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetTradeContainer(tradeNum, num) โ€” UO.GetTradeContainer(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any), num (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "gettradecontainer": return new InjectionValue(bridge.GetTradeContainer(Arg(0), Arg(1)));

UO.GetTradeOpponent

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.GetTradeOpponent(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” 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");

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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");

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetTradeOpponent(tradeNum) โ€” UO.GetTradeOpponent(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "gettradeopponent": return new InjectionValue(bridge.GetTradeOpponent(Arg(0)));

UO.GetTradeOpponentName

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.GetTradeOpponentName(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.GetTradeOpponentName(1);
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetTradeOpponentName(tradeNum) โ€” UO.GetTradeOpponentName(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "gettradeopponentname": return new InjectionValue(bridge.GetTradeOpponentName(Arg(0)));

UO.IsTrade

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.IsTrade();
UO.Print("IsTrade: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.IsTrade();
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด์ „/์ดํ›„ - 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)));

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.IsTrade() โ€” UO.IsTrade()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "istrade": return new InjectionValue(bridge.IsTrade());

UO.TradeCheck

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TradeCheck(0);
UO.Print("TradeCheck: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TradeCheck(windowIndex) โ€” UO.TradeCheck(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: windowIndex (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int TradeCheck(InjectionValue windowIndex)

            => bridge.TradeCheck(NumberConversions.ToInt(windowIndex), 0, 0, false);

UO.TradeCheck(tradeNum, num) โ€” UO.TradeCheck(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tradeNum (Any), num (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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);

UO.TradeCheck(windowIndex, checkbox, stateValue) โ€” UO.TradeCheck(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: windowIndex (Any), checkbox (Any), stateValue (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int TradeCheck(InjectionValue windowIndex, InjectionValue checkbox, InjectionValue stateValue)

            => bridge.TradeCheck(NumberConversions.ToInt(windowIndex), NumberConversions.ToInt(checkbox), NumberConversions.ToInt(stateValue), true);

UO.TradeContainer

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TradeContainer(0);
UO.Print("TradeContainer: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.TradeContainer(0);
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TradeContainer(windowIndex) โ€” UO.TradeContainer(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: windowIndex (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string TradeContainer(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeContainer(NumberConversions.ToInt(windowIndex)));

UO.TradeCount

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.TradeCount();

์—ด๋ฆฐ ๊ตํ™˜ ์ฐฝ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0์˜ ์ฐฝ ์ˆ˜. ์ด๋Š” bool์ด ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. ์ด์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ > 0.

๋™์ž‘

  • GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade 1 ์ˆซ์ž ์ฐฝ; TradeContainer/TradeOpponent/TradeName ๋ฐ ๋ชจ๋“  ํ˜•ํƒœ์˜ TradeCheck - 0 ํฌํ•จ. ์ด๋Š” ์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋ช…๋ฐฑํ•œ ํ˜ธํ™˜์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์—”์ง„์˜ ์™ธ๋ถ€ ์ฐธ์กฐ ์„œ์ ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฐธ์กฐ ์ง€์ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ๋Š” ํ˜„์žฌ ์„ธ๊ณ„์˜ ๋ผ์ด๋ธŒ ์ฐฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ซํžŒ ์ฐฝ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ํ˜ธ์ถœ์€ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UI์˜ ์ˆœ์„œ๋Š” ์ฐฝ์„ ์—ด๊ณ  ๋‹ซ๊ณ  ์œ„๋กœ ์ด๋™ํ•  ๋•Œ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๋Š” ์˜๊ตฌ ์‹๋ณ„์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ConfirmTrade ๋ฐ ํ•ด๋‹น TradeCheck ๋ ˆ์ฝ”๋“œ๋Š” ๋™์˜๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ํŒจํ‚ท์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋™์˜๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. CancelTrade๋Š” ์ทจ์†Œ๋ฅผ ํ•œ ๋ฒˆ ๋ณด๋ƒ…๋‹ˆ๋‹ค. 1/true๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TradeCount();
UO.Print("TradeCount: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.TradeCount();
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด์ „/์ดํ›„ - 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)));

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TradeCount() โ€” UO.TradeCount()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int TradeCount() => bridge.TradeCount();

UO.TradeName

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TradeName(0);
UO.Print("TradeName: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.TradeName(0);
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TradeName(windowIndex) โ€” UO.TradeName(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: windowIndex (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string TradeName(InjectionValue windowIndex) => bridge.TradeName(NumberConversions.ToInt(windowIndex));

UO.TradeOpponent

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ํ˜„์ง€ ์ƒํƒœ/์ฒ˜๋ฆฌ์ด๋ฉฐ ๊ตํ™˜ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‘ ๊ณ„์•ฝ ๋ชจ๋‘ ํ•ญ๋ชฉ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TradeOpponent(0);
UO.Print("TradeOpponent: " + Convert.ToString(result));

1. ์ง์ ‘ ์ฝ๊ธฐ ๋˜๋Š” ์ž‘์—… - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ๋Š” value/result์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ด๊ณ , 1๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค(์ด ๋ช…๋ น์˜ ๊ตฌ๋ฌธ ์ฐธ์กฐ). HEX๋Š” ์ˆซ์ž serial๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Convert.ToString โ€” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด.
var value = UO.TradeOpponent(0);
UO.Print(Convert.ToString(value));

2. ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์™„๋ฒฝํ•œ ๋„์šฐ๋ฏธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋„์šฐ๋ฏธ๋Š” ์ „์ฒด๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ ์‹ค์ œ๋กœ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TradeOpponent(windowIndex) โ€” UO.TradeOpponent(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: windowIndex (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string TradeOpponent(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeOpponent(NumberConversions.ToInt(windowIndex)));
โš ๏ธ **GitHub.com Fallback** โš ๏ธ