Авторизация  
Thanatos

[Python] Ламбер с выгрузкой в дом(Секуьюр контейнеры)

В теме 2 сообщения

Т.к. планы крайне поменялись и нет возможности залипать в УО, решил выложить пару скриптиков, не пропадать же добру :)

Stealth - 8.7.8, Python - 3.6-32

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

waypoints = {
                '0' : {'x' : 1272, 'y' : 1291}, Возле сундука - откуда разгружатся
                '1' : {'x' : 1244, 'y' : 1316}, Поляна в лесу, где рубить

}

from datetime import timedelta,datetime, datetime as dt

logColors =     {
                    0x0000 : 'Log',
                    0x046C : 'Alder',
                    0x0654 : 'Maple',
                    0x0415 : 'Oak',
                    0x0203 : 'Cedar',
                    0x0030 : 'Linden',
                    0x048A : 'Poplar',
                    0x0455 : 'Mahogany',
                    0x0482 : 'Sycamore',
                    0x0094 : 'Karund',
                    0x01B0 : 'Leshram',
                    0x01A2 : 'Turmalit',
                    0x0498 : 'Folorit',
                    0x0026 : 'Emerint',
                    0x0499 : 'Viburnum',
                    0x00CB : 'Legrand',
                    0x00C8 : 'Juniper',
                    0x094A : 'Solmur',
                    0x092B : 'Kleor',
                    0x08FD : 'Panacee',
                    0x0931 : 'Lorgadum',
                    0x093F : 'Vialonit',
                    0x0542 : 'Larch',
                    0x0074 : 'Stardust',
                    0x0487 : 'Oleander',
                    0x006F : 'Pironil',
                    0x066D : 'Nanays',
                    0x0492 : 'Sloe',
                    0x09EF : 'Mistyc',
                    0x049F : 'Laurel',
                    0x0488 : 'Sunreed',
                    0x0119 : 'Elvin',
                    0x0505 : 'Crowntree',
                    0x0504 : 'Kimya',
                    0x0507 : 'Draorun',
                    0x000B : 'Elkris',
                    0x0501 : 'Xiom',
                    0x049F : 'Cosmo'
                }

### Standart Types
axe = 0x0F43
log = 0x1BDD
###
# Weight to unload
weightRequired = 250
tileSearchRadius = 10

sulfur = 0x0F8C
deadwood = 0x0F90

resourceChest = 0x432A5A30
resourceChestOpened = 0x432A5A31
toolChest = 0x43298D76
toolChestOpened = 0x43298D77


bad_points = []
badMessages = [
                'System: There is no more logs here to chop.',
                'System: You cannot mine so close to yourself.',
                'System: You can\'t chop anything there.',
                'System: You have no line of sight to that location',
                'Thanatos: That is too far away.'
]

waypoints = {
                '0' : {'x' : 1272, 'y' : 1291}, # Near chest
                '1' : {'x' : 1244, 'y' : 1316},

}



def speechHandler(Text,SenderName,SenderID):
    AddToSystemJournal('test = '+Text+' name = '+SenderName+' id = '+str(SenderID))
    if SenderName == 'a snake':
        while not IsDead(SenderID):
            Attack(SenderID)
            Wait(1000)
            AddToSystemJournal('Attacking +'+SenderName)


def HungryVIP(levelRequired):
    now = dt.now()
    level = 1
    levels = [
    'You are absolutely stuffed!',
    'You are stuffed',
    'hungry at all',
    'You are a little hungry',
    'You are somewhat hungry',
    'You are REALLY hungry',
    'Your stomash hurts',
    'Your stomash hurts and you feel dizzy',
    'You are starving',
    'You are almost dying of hunger',
    'You are DYING of hunger...',
    'Are you still alive?'
    ]

    UOSay('.hungry')
    Wait(500)
    for (key, value) in enumerate(levels):
        if InJournalBetweenTimes(value, now, dt.now()) >=0 :
            level = key
            if levelRequired < level:
                UOSay('.charstatus')
                Wait(200)
                NumGumpButton(GetGumpsCount()-1,3)
                Wait(200)
                UOSay('.charstatus')
                Wait(200)
                NumGumpButton(GetGumpsCount()-1,2)
                Wait(200)
                AddToSystemJournal('VIP Food used')

def checkTool():
    FindType(axe,Backpack())
    if FindCount() < 3:
        now = dt.now()
        UseObject(toolChest)
        WaitJournalLine(now,'You open the secure container',4000)

        FindType(axe, toolChestOpened)
        if FindCount() < 1:
            print('[CheckTool] No axes left, exiting')
            SetARStatus(False)
            Disconnect()
        else:
            for i in range(0,2):
                FindType(axe, toolChestOpened)
                MoveItem(FindItem(),1,Backpack(),0,0,0)

            FindType(axe, toolChestOpened)
            print('[CheckTool] There is '+str(FindCount())+' axes left')

def Unload():
    now = dt.now()
    UseObject(resourceChest)
    WaitJournalLine(now,'You open the secure container',4000)
    AddToSystemJournal('=========================================')
    for (color,name) in logColors.items():
        foundQty = 0
        if FindTypeEx(log,color,Backpack(),True):
            foundLog = FindItem()
            foundQty = FindQuantity()
            if FindTypeEx(log,color,resourceChestOpened,False):
                MoveItem(foundLog,-1,FindItem(),0,0,0)
                Wait(200)
            else:
                MoveItem(foundLog,-1,resourceChestOpened,0,0,0)
                Wait(200)

        if FindTypeEx(log,color,resourceChestOpened,True):
            AddToSystemJournal('There is '+str(FindQuantity())+' (+'+str(foundQty)+') '+name+' logs in chest')
    AddToSystemJournal('=========================================')
    if FindType(sulfur,Backpack()) > 0:
        backpackItem = FindItem()
        FindType(sulfur, resourceChestOpened)
        MoveItem(backpackItem,-1,FindItem(),0,0,0)
        Wait(200)

    if FindType(deadwood,Backpack()) > 0:
        backpackItem = FindItem()
        FindType(deadwood, resourceChestOpened)
        MoveItem(backpackItem,-1,FindItem(),0,0,0)
        Wait(200)

    checkTool()

def ToHouse():
    for key in sorted(waypoints,reverse = True):
        AddToSystemJournal('Point '+ key)
        NewMoveXY(waypoints[key]['x'],waypoints[key]['y'],True,1,False)

def ToMine():
    for key in sorted(waypoints):
        AddToSystemJournal('Point '+ key)
        NewMoveXY(waypoints[key]['x'],waypoints[key]['y'],True,1,False)

def CheckWeight():
     if Weight() >= weightRequired:
        Wait(100)
        ToHouse()
        Wait(100)
        Unload()
        Wait(100)
        ToMine()
        Wait(100)

def FindTiles(center_x, center_y, radius):
    min_x, min_y = center_x-radius, center_y-radius
    max_x, max_y = center_x+radius, center_y+radius
    tiles_coords = []
    for tile in range(3230,3499):
        tiles_coords += GetStaticTilesArray(min_x,min_y,max_x,max_y,WorldNum(),tile)
    print('[FindTiles] Found '+str(len(tiles_coords))+' tiles')
    return tiles_coords

def Lumber():
    for t,x,y,z in FindTiles(GetX(Self()),GetY(Self()),tileSearchRadius):
        if ([x,y] not in bad_points) and newMoveXY(x,y,True,1,False):
            while True:
                HungryVIP(1)
                now = dt.now()
                ###
                CancelWaitTarget()
                CancelTarget()
                if FindType(axe,Backpack()):
                    UseSkill('Arms Lore')
                    WaitJournalLine(now,'Select an object',500)
                    WaitTargetType(axe)
                    WaitJournalLine(now,'What you selected|This',500)
                now = dt.now()
                CancelWaitTarget()
                CancelTarget()
                UseType(axe,-1)
                Wait(500);
                WaitJournalLine(now,'Select a tree',4000)
                Wait(500);
                ###
                if InJournalBetweenTimes('I am already doing something else', now, dt.now()) >=0:
                    AddToSystemJournal('Seems like we stuck, relogging')
                    Disconnect()
                ###
                WaitTargetTile(t,x,y,GetZ(Self()))
                WaitJournalLine(now,'You can\'t chop|breaks|too far away|There is no more|You have no line|You cannot see that|You cannot mine here.|You cannot mine so close',100000)
                if LastJournalMessage() in badMessages:
                    break;
            CheckWeight()
            if InJournalBetweenTimes('You cannot see that|That is too far away|You can\'t chop', now, dt.now()) >=0:
                if [x,y] not in bad_points:
                    bad_points.append([x,y])

#SetEventProc('evspeech', speechHandler)
SetARStatus(True)
NewMoveXY(waypoints['1']['x'],waypoints['1']['y'],True,1,False)
while Connected() and not Dead():
    Lumber()

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.s. при открытии секьюр контейнеры имеют ID на 1 больше, чем собсна ID сундука, по этому по 2 ID на каждый сундук, узнать точный ID можно функцией LastContainer(), т.е. в чистый скрипт запхать что то типа Print(str(LastContainer())), открыть сундук и врубить скрипт и конвертнуть его из Decimal в Hex (https://www.binaryhexconverter.com/decimal-to-hex-converter)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация