OpenEUO Craft and BOD Filling script

  • Не в сети
  • Manticorr
  • Автор темы
  • Senior Member
  • Сообщений: 23
  • Thanks: 0
Не в сети

OpenEUO Craft and BOD Filling script

#26103
Захотелось написать простенький скрипт для крафта и заполнения булок.
Был пьян. Поэтому не обижайтесь.

Для начала, помимо OpenEUO, советую поставить Modded OpenEUO Interface (GUI) by EN. Version 11d:
www.easyuo.com/forum/viewtopic.php?f=38&t=46408

Использованные материалы

1) Взял замечательный скрипт поиска предметов и их представления в стандартизированном виде от Kal In Ex
Оригинал можно взять отсюда: www.easyuo.com/forum/viewtopic.php?t=43949
Пришлось оверрайдить функцию GetBODInfo, чтобы информация о булках работала на данном шарде. Конкретно, дописал в конец файла это:
-- overrided GetBODInfo
IMT.__index = function(table,key)
	if key == "Name" or key == "Details" then
		local Name,Details = UO.Property(table.ID)
		rawset(table,"Name",string.match(Name,"[%s%d]*(.+)"))
		rawset(table,"Details",Details)
	end
	if key == "Property" then
		local Property = GetItemData(table.Details)
		Property.Name = table.Name
		rawset(table,"Property",Property)
	end
	if key == "BODInfo" then
		rawset(table,"BODInfo",GetBODInfo(table.Details,table.Col))
	end
	return rawget(table,key)
end
local patternPhrases = {
      Size = "Bulk Order",
      Amount = "Amount To Make",
      Quality = "All Items Must Be Exceptional",
      Material = "All Items Must Be Made With",
      MaterialType = "With .* Ingots",
      Name = ".*:",
      Digits = "[%w%s]+: (%d+)"
}
local function parseBODInfoString(BODInfo, string)
      if string.match(string,patternPhrases.Size) ~= nil then
         BODInfo.Size = string.sub(string,1,5) 
      elseif string.match(string,patternPhrases.Amount) ~= nil then 
         BODInfo.Amount = tonumber(string.match(string,patternPhrases.Digits))
      elseif string.match(string,patternPhrases.Quality) ~= nil then
         BODInfo.Quality = "exceptional"
      elseif string.match(string,patternPhrases.Material) ~= nil then 
         BODInfo.Material = string.sub(string.match(string,patternPhrases.MaterialType),6,-8)
      else
          local indx = table.getn(BODInfo.Items)+1
          BODInfo.Items[indx] = {}                                                                          
          BODInfo.Items[indx].Name = string.lower(string.sub(string.match(string,patternPhrases.Name),1,-2))
          BODInfo.Items[indx].Done = tonumber(string.match(string,patternPhrases.Digits))
      end
      return BODInfo
end
local BSmithBodCol = 1102
local TailorBODCol = 1155
GetBODInfo = function(Details,Color)
        local DefaultMaterialType
        if Color == BSmithBodCol then
           DefaultMaterialType = 'Iron'
        elseif Color == TailorBODCol then 
           DefaultMaterialType = 'Leather'      
        end
        
	if type(Details) == "number" then
		local Name
		Name,Details = UO.Property(Details)
		if Name ~= "A Bulk Order Deed" or string.len(Details) == 0 then
			print("GetBODInfo - error item ID:"..ID.." is not a BOD")
			return nil
		end
	end
	local GetLine = string.gfind(Details,"([^%c]+)%c*")
	GetLine() -- Blessed
	GetLine() -- Weight: 1 Stone
	local RetVal = {
              Size = "Small",
              Quality = "normal", -- optional
              Material = DefaultMaterialType, -- optional
              Amount = 0,
              Items = {}
        }
        local BODInfoString = GetLine()
        while BODInfoString ~= nil do 
            RetVal = parseBODInfoString(RetVal, BODInfoString)
            BODInfoString = GetLine() 
        end 
	return RetVal
end
Благодаря этому костылю информация о булке BODInfo возвращается в виде:
Size,Quality,Material,Amount,Items
где Items = {{Name,Done},{Name,Done},{Name,Done},...}

2) Отличная приспособлена для чтения текста из гампов от того же Kal In Ex
Оригинал туда: www.easyuo.com/forum/viewtopic.php?t=43234
Ничего не менял.

Установка

Распаковываем архив в директорию, где установлена OpenEUO, в папку scripts

Инструкция

Создаём свой скрипт и подключаем ту дрянь, что я написал
dofile('modules/modCraft.lua')

Теперь можно можно использовать.

Скрафтить предмет
local Item = {
      itemName = "dagger", // название предмета в нижнем регистре
      categoryName = "Bladed", // категория, как она написана в гампе инструмента
      amount = 3, // сколько надо сделать
      Material = "Dull Copper", // название материала ("Iron","Copper","Gold", "Leather"...)
      Quality = "normal" // "normal" или "exceptional"
}
Craft.make(Item,toolType,toolColor)
toolType - тип инструмента, которым будете пользоваться
toolColor - цвет инструмента. По дефолту 0. Если знаете цвета рунических инструментов, подставляйте. Мне лень искать было.

Найти первый подходящий по параметрам BOD в инвентаре
BOD = Craft.findBOD(size,material,quality,amount,itemsNames,strictAmount,completed)
size - "Small" , "Large"
material - название материала кэмел кейсом (Каждое новое слово с заглавной буквы)
quality - "normal" или "exceptional"
amount - кол-во предметов в BOD
itemsNames - массив с именами предметов в нижнем регистре
strictAmount - как учитывать количество требуемых в BOD изделий. true - точное совпадение, false - больше или равное количество
completed - true - искать выполненный BOD, false - любой

Заполнить BOD
Craft.fillBOD(BOD)
этой функции надо отдавать на вход BOD в формате, возвращаемом функциями Craft.findBOD (или ScanItems из файла FindItems.lua с моим костылём)

Примеры

Скрафтить 3 Dull Copper даггера обычного качества и запихать их в маленький BOD
dofile('modules/modCraft.lua')

Types = {
      Tool     = {
               SmithsHammer = 5091,
               Tongs = 4027,
      },
}

local Item = {
      itemName = "dagger",
      categoryName = "Bladed",
      amount = 3,
      Material = "Dull Copper",
      Quality = "normal"
}

Craft.make(Item,Types.Tool.SmithsHammer)
wait(1000)
Craft.fillBOD(Craft.findBOD("Small","Dull Copper","normal",10,{Item.itemName}))

Заполнить большой BOD мелкими. Разумеется, всё это должно быть в инвентаре.
Craft.fillBOD(Craft.findBOD("Large","Iron","normal",10,{"ringmail gloves","ringmail tunic","ringmail sleeves","ringmail leggings"},true))


Вложенный файл:

Имя файла: 5046.zip
Размер файла:10 KB
Вложения:
Последнее редактирование: 29 июль 2019 17:27 пользователем Old Man.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Allice [FreeZzy] аватар
    Не в сети
  • Allice [FreeZzy]
  • Пророк
  • United Pirates Guild
  • Сообщений: 3317
  • Thanks: 53
Allice [FreeZzy] аватар
Не в сети

Re: Re: OpenEUO Craft and BOD Filling script

#26134
Очень полезный скрипт. И ресурсы на которые в посте ссылаются - тоже полезно просмотреть.
Но смотришь и на скрипты на изи и на ескрипт/питон/луа и офигеваешь. Тоже самое под питоном занимает в 4 раза меньше кода.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Не в сети
  • Manticorr
  • Автор темы
  • Senior Member
  • Сообщений: 23
  • Thanks: 0
Не в сети

Re: OpenEUO Craft and BOD Filling script

#47212
Чорт. Вложение не находится.

А я хотел достать, переписать на другие утилиты.

Мб, осталось у кого?
Последнее редактирование: 27 июль 2019 22:04 пользователем Manticorr.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Old Man аватар
    Не в сети
  • Old Man
  • Администрация
  • Сообщений: 3507+
  • Сообщений: 1358
  • Thanks: 316
Old Man аватар
Не в сети

Re: OpenEUO Craft and BOD Filling script

#47215

Чорт. Вложение не находится.

А я хотел достать, переписать на другие утилиты.

Мб, осталось у кого?


Элитная команда спасения снова с вами (с)
Прикрепил в аттач.

Вложенный файл:

Имя файла: 5046.zip
Размер файла:10 KB


UPD: в первом посте тоже заменил на рабочий
Вложения:
Последнее редактирование: 29 июль 2019 17:27 пользователем Old Man.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.