Написал небольшой пример, не тестировал, ибо писал на коленках.
Всё проблема в работе в Injection с трейд-окнами, это если трейд окно закроют.
Допустим - у нас есть два трейд окна (ID нуль и единица соответсвенно), нулевой окно закрывают - то окно которое имело ID единица - становиться ID нуль, а трейд-окно с ID единица более не существует.
В чём суть моего примера? Суть простая - продемонстрировать работу с несколькими трейд-окнами, если что-то где-то ошибся, надеюсь сами доправите, ибо тестировать не имею возможности (3 чара для меня несколько перебор, а просить друзей помочь отлаживать скрипт - совесть не позволяет).
Code:
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: Теперь точно толпа ботов-торговцев разведёться.