Перейти к содержанию
Форум шарда Middle-Earth
Авторизация  
nepret

[Stealth] Копка песка и глины

Рекомендуемые сообщения

stealth version 8.12.7

Копка песка и глины

Как запустить:  читать тут

Что делает:

  • копает песок
  • копает глину\торф
  • жрёт фиш стейки (можно поменять)
  • реконектит

Инструкция по применению:

  • одеваем чара и даём в лапы ствол, так как есть шанс выкопать элементаля или слизня
  • отводим на место копки
  • кидаем в пак лопату (Shovel)
  • кидаем в пак еду
FOOD = 0x097B  # Type еды, сейчас фишстейки
  • запускаем скрипт

 

from datetime import datetime, timedelta
from time import sleep
from py_stealth import *

############################## info ################################
#
#   Скрипт для копки песка или глины\торфа
#   Устанавливаем радиус поиска тайлов - RADIUS
#   Ставим чара на место добычи
#   * еду в пак - FOOD
#   * в бекпак кидаем лопату - Shovel
#   Одеваем чара и даём в руки какой нибудь ствол,
#   так как есть шанс выкопать элементаля или слизняка
#
###################################################################
############################ settings ##############################
#
RADIUS = 4
#
FOOD = 0x097B  # тип еды, сейчас фишь-стейки \ type food, now fish steaks
#
###################################################################


def msg(args):
    print(args)
    ClientPrintEx(0, 60, 2, args)


def CheckConnect(waitTimeReconnected=5):
    """
    waitTimeReconnected: wait reconnected time, int >= 1
    """
    if int(waitTimeReconnected) <= 0:
        waitTimeReconnected = 5
    waitTimeReconnected *= 1000

    if GetARStatus():
        SetARStatus(False)

    if Connected() and not Hidden() and not CheckLag():
        Disconnect()
        Wait(5000)

    if not Connected():
        print('# Not connected to server!')
        print('# Reconnected...')
        while not Connected():
            Connect()
            Wait(3000)
            if Connected() and Hidden():
                UOSay(" ")
            if Connected() and not CheckLag(5000):
                Disconnect()
                Wait(waitTimeReconnected)
        Wait(5000)
        print('# Server connection restored.')


def WaitTarget(sec=5):
    for i in range(sec):
        if not Connected() or Dead() or TargetPresent():
            break
        Wait(1000)
    if not Connected() or Dead() or not TargetPresent():
        return False
    return True


def evSpeech(_text, _senderName, _senderID):
    # Check Save World
    if _senderID == 16843009 and _text == 'Saving World State':
        eventTime = datetime.now()
        msg(f"{_senderName}: {_text}")
        for i in range(15):
            if InJournalBetweenTimes('Saving World State complete.', eventTime, datetime.now()) != 1:
                break
            sleep(1)


class Hungry:
    def __init__(self, food=0x097B, timer=10):
        """
        Ищем еду в бекпаке, если не нашли, ищем в банке, потом на полу
        (при поиске в банке, бонк должен быть предварительно открыт)
        food: сейчас фишстейки или указать тип еды
        timer: через сколько докармливать чара
        """
        self._food = food
        self._nextTime = datetime.now()
        self._timer = timer

    def __call__(self):
        if datetime.now() >= self._nextTime:
            place = [Backpack(), ObjAtLayer(BankLayer()), Ground()]
            ct = datetime.now()
            f = False
            while InJournalBetweenTimes("Я объелся|You are full", ct, datetime.now()) == -1:
                if Connected() and not Dead():
                    for i in place:
                        if f := FindType(self._food, i):
                            if TargetPresent():
                                CancelTarget()
                            ct = datetime.now()
                            UseObject(f)
                            Wait(300)
                            break
                    if not f:
                        msg("Attention!: Food not found!")
                        break
                else:
                    return
            self._nextTime = datetime.now() + timedelta(minutes=self._timer)


class Processed:
    def __init__(self, _range=4):
        self._range = _range
        self._sand = [22, 23, 24, 25, 26, 27, 28, 35, 39, 52, 53, 54, 56,
                      57, 58, 59, 60, 61, 88, 92, 95, 96, 100]
        self._peat = [15810, 15811, 15825, 15832, 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, 15843,
                      15844, 15845, 15846, 15848, 15849, 15850, 15851, 15852, 15853, 15854, 15855, 15856]
        self._arrWorkTile = []  # dict {'x': x, 'y': y, 'z': z}
        self._shovel = None
        self._lastIndex = None

    def __call__(self):
        CheckConnect()
        if not Hidden() and not CheckLag():
            Disconnect()
            Wait(5000)
        if Connected():
            if Dead():
                msg('Character is dead!')
                return False
            if LastContainer() != Backpack():
                for i in range(5):
                    UseObject(Backpack())
                    if LastContainer() == Backpack():
                        break
                    Wait(1000)
                if LastContainer() != Backpack():
                    msg("I can't open my backpack")
                    return False
            if not self.__CheckShovel():
                msg('Not found tool (SHovel)!')
                return False
            if not len(self._arrWorkTile):
                if not self.__GetTile():
                    print(f'Not found tiles!')
                    return False
                msg(f'Found {len(self._arrWorkTile)} tiles.')
        if not WarMode():
            SetWarMode(True)
        return True

    def __CheckShovel(self):
        if f := FindType(0x0F39, Backpack()):
            self._shovel = f
            return True
        return False

    def __GetTile(self):
        _allTypeTile = self._sand + self._peat
        for x in range(GetX(Self()) - self._range, GetX(Self()) + self._range + 1):
            for y in range(GetY(Self()) - self._range, GetY(Self()) + self._range + 1):
                if cell := GetCell(x, y, WorldNum()):
                    try:
                        if _allTypeTile.index(cell['Tile']):
                            cell['x'] = x
                            cell['y'] = y
                            self._arrWorkTile.append({'x': cell['x'], 'y': cell['y'],
                                                      'z': cell['Z'], 't': cell['Tile']})
                            pass
                    except ValueError:
                        pass
        if len(self._arrWorkTile):
            return True
        return False

    def Mining(self):
        if Connected() and not Dead():
            ct = datetime.now()
            if not TargetPresent():
                UseObject(self._shovel)
            if WaitTarget():
                if self._lastIndex is None:
                    self._lastIndex = 0
                _i = self._lastIndex
                x, y, z = self._arrWorkTile[_i]['x'], self._arrWorkTile[_i]['y'], self._arrWorkTile[_i]['z']
                if not newMoveXY(x, y, False, 2, True):
                    self._arrWorkTile.pop(_i)
                    return
                TargetToXYZ(x, y, z)
                for i in range(15):
                    Wait(2000)
                    UseObject(self._shovel)
                    if not Connected() or Dead() or TargetPresent():
                        break
                if InJournalBetweenTimes('There is nothing to dig here|'
                                         'You fail to|'
                                         'There is no brimstone', ct, datetime.now()) != -1:
                    if FoundedParamID() == 0:
                        msg(f'DELETE type "{self._arrWorkTile[_i]["t"]} in script! 118 or 120 line!"')
                    if self._lastIndex >= len(self._arrWorkTile) - 1:
                        self._lastIndex = 0
                    else:
                        self._lastIndex += 1


if __name__ == '__main__':
    SetMoveCheckStamina(0)
    SetMoveThroughNPC(0)
    SetEventProc('evSpeech', evSpeech)
    _p = Processed(RADIUS)
    _hungry = Hungry(FOOD)
    while _p():
        _p.Mining()
        _hungry()
    msg("End script")
    Disconnect()

 

Mining_SAND_or_PEAT.py

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


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

×
×
  • Создать...