Trade-окна.

Things you must know!

Moderators: Murderator+, Murderator

Post Reply
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Trade-окна.

Post by Destruction »

Покавырялся чутка, решил поделиться, если кому нужно -)

Имя того, с кем торгуем.

Code: Select all

str TradeName( [int TradeNumber] );

TradeNumber - номер окошка (отсчёт идёт от нуля).

ID контейнера в котором торгуем.

Code: Select all

str TradeContainer( [[str Position], int TradeNumber] );

Position - left или right, в зависимости от того, какая часть окна нужна.

ID того, с кем торгуем:

Code: Select all

str TradeOpponent( [int TradeNumber] );


Проверка подтверждённости трейд-окна и подтверждение.

Code: Select all

bool TradeCheck( [[[int TradeNumber], str Position], bool Check] );

Check - отметить галочкой, с правой половиной разумеется не работает.

Количество окон торговли.

Code: Select all

int TradeCount();


Список аругментов может быть не полный, по умолчанию используется самое первое окно - нулевое, если можно так выразиться и соответсвенно его левая часть.

Всё, что я перечислил - просто замечательно, но вот никто из вас случаем незнает, как закрыть трейд-окно? Следущие варианты не устраивают: схайдиться, нажать правой кнопкой.

PS: Вероятно зря я выкладываю эту информацию - разведёться теперь ботов-торговцев по всему миру -)

PPS: А оно ваще кому-нибудь нужно? -)
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Написал небольшой пример, не тестировал, ибо писал на коленках.

Всё проблема в работе в Injection с трейд-окнами, это если трейд окно закроют.

Допустим - у нас есть два трейд окна (ID нуль и единица соответсвенно), нулевой окно закрывают - то окно которое имело ID единица - становиться ID нуль, а трейд-окно с ID единица более не существует.

В чём суть моего примера? Суть простая - продемонстрировать работу с несколькими трейд-окнами, если что-то где-то ошибся, надеюсь сами доправите, ибо тестировать не имею возможности (3 чара для меня несколько перебор, а просить друзей помочь отлаживать скрипт - совесть не позволяет).

Code: Select all

sub Trader()
var i
repeat
   if uo.TradeCount() then
      ; Если есть трейд-окна - пускаем цикл.
      for i=0 to uo.TradeCount() -1
         if Not uo.getGlobal( "Trade thread " + str( i ) ) == "1" then
            ; Если обработчик трейд-окна не определён - запустим его.
            uo.setGlobal( "Trade thread " + str( i ), "1" )
            uo.setGlobal( "Trade number", str( i ) )
            uo.exec( "exec doTrader" )
         endif
      next
   endif
   wait(100)
until false
endsub

Sub doTrader()
var i, old_trade, trade = val( uo.getGlobal( "Trade number" ) ) ; получим ID трейд-окна
var player = uo.TradeOpponent( trade ) : Получим ID того, с кем торгуем
; Следущий цикл крутится, пока оппонент не подтвердит сделку.
repeat
   wait(100)
   if Not player == uo.TradeOpponent( trade ) then
   ; Если трейд-окно с ID меньшим или равным, чем у этого было закрыто
      old_trade = trade ; запомним, для истории -)
      for i=0 to uo.TradeCount() -1
      ; Пробежимся циклом по всем трейд окнам
         if uo.TradeOpponent( trade ) == player then
            ; Если оппонент найден
            trade = i
            i = uo.TradeCount() -1
         endif
      next
      if uo.TradeCount() >= old_trade then
         ; Затрудняюсь сказать, что за проверка
         ; Но она нужна, точно говорю -)
         uo.setGlobal( "Trade thread "+str(old_trade), "0" )
      endif
      if Not uo.TradeOpponent( trade ) == trade then
         ; Если трейд окно с этим игроком не найдено
         ; Стало быть, оно было закрыто - выключаем обработчик
         uo.print( "Trade window closed" )
         return false
      endif
   endif
until uo.TradeCheck( trade, "right" )
uo.TradeCheck( trade, "left", true ) ; Подтверждаем сделку
uo.print( "Thanks" ) ; Делаем что-либо с полученным добром
uo.setGlobal( "Trade thread " + str( trade ), "0" ) ; Выключаем обработчик
endsub


Пару слов о том, как скрипт должен работать.

Если найдены трейд окна - проверяем каждое из них, если для данного окна не запускалась функция-обработчик (это определяем через глобальные переменные) - тогда запустим обработчик и пометим, что обработчик запущен.

Касательно трейд-окон, которые впоследствии были закрыты - читайте внутри функции.

PS: Если вдруг в одну долю секунды произойдёт куча всяких открытий и закрытий трейд-окон, то скрипт скорее всего не справится чьё-нибудь окно не отработает. Впринципе можно проверку пришить - если такое случилось, то схайдиться и расхайдиться.

PPS: Теперь точно толпа ботов-торговцев разведёться.
Nmy
Expert!
Posts: 2152
Joined: 2005-09-14 15:31:58
Location: Latvia

Post by Nmy »

это в полезности :wink:
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Мой топик - мне лучше знать куда.

Никто не проверит на работспособность?..
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Говорил с Yoko насчёт трейдов.

Думал, напрягал мозг.

Как нормально закрыть контейнер - так и не придумал.

Придумал другую фичу:

Code: Select all

uo.hide( uo.tradecontainer( "left" ) )
uo.hide( uo.tradecontainer( "right" ) )


После такого, исчезнут вещи в трейд окне, что и логично, но трейд окно будет висеть. А вот после правого нажатия - начинается интересное - в клиенте трейд-окно исчезнет, но физически - оно будет существовать.

Вопрос о закрытии трейда остаётся открытым.

Добавлено:
Много думал, пришёл к выводу - есть способ проще. Жаль, что мне на него не указали - потратил кучу времени.

И вообще - логика у меня неверная.
- Зачем не закрывать трейд-окно? Оно, мне, что? Мешает, чтоли ? - Нет, не мешает. Ну так и не буду его ворошить - пущай висит, всё равно пару тыщь чаров никто не притащит, чтобы понаоткрывать трейдов и подвесить клиент.

Добавлено:
Касательно закрытия всех трейд окон, на данный момент я знаю три варианта:
1. UO'шный макрос CloseGumps.
2. ,useskill Hiding
3. Right Click

Для закрытия одного гампа - может подойти трейти пункт, но он будет закрывать верхний гамп, а не нужный, что наврятли понадобится при работе с несколькими трейд-окнами.

Добавлено:
Думал, читал список комманд.

Интересно, а через ,target можно извратиться, и что-нибудь экое замутить?..
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Для закрытия одного гампа - может подойти трейти пункт, но он будет закрывать верхний гамп, а не нужный, что наврятли понадобится при работе с несколькими трейд-окнами.


Хмм, а так разве бывает, что несколько трейд окон одновременно открылись? Если "трейд окно", это то, что я подумал, так тогда при попытке открыть второе вылазит "You already in trade".
DerMeister сейчас на нейрале!
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

DerMeister =) wrote:
Для закрытия одного гампа - может подойти трейти пункт, но он будет закрывать верхний гамп, а не нужный, что наврятли понадобится при работе с несколькими трейд-окнами.


Хмм, а так разве бывает, что несколько трейд окон одновременно открылись? Если "трейд окно", это то, что я подумал, так тогда при попытке открыть второе вылазит "You already in trade".

У тебя вылазит, а у меня не вылазит.

Зачем тогда uo.TradeCount() ? Думаешь года три назад Yoko просто так писал эту функцию ?
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Destruction wrote:
DerMeister =) wrote:
Для закрытия одного гампа - может подойти трейти пункт, но он будет закрывать верхний гамп, а не нужный, что наврятли понадобится при работе с несколькими трейд-окнами.


Хмм, а так разве бывает, что несколько трейд окон одновременно открылись? Если "трейд окно", это то, что я подумал, так тогда при попытке открыть второе вылазит "You already in trade".

У тебя вылазит, а у меня не вылазит.

Зачем тогда uo.TradeCount() ? Думаешь года три назад Yoko просто так писал эту функцию ?

Ну, дык, ты хелп тогда перепиши. А тоя про "недокументированниые" функийии ничо не знаю.
DerMeister сейчас на нейрале!
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Хелп переписать не могу - нет доступа.

Посему выложил сюда, внимательно прочти первый пост - там вся информация про эту комманду !!!
Post Reply