Scripte für das neue Open EasyUO
Verfasst: So 27. Jan 2013, 14:55
Der Thread ist ab sofort dafür gedacht, dass man sich Anregungen holen und es gegebenenfalls etwas leichter fällt Lua (die Scriptspache für OEUO) zu erlernen. Fragen werden gerne beantwortet.
OpenEUO nutzt Lua als Scriptsprache und ist um einiges mächtiger und vor allem deutlich schneller als EasyUO. Ich habe daher mal ein Script gebastelt, das Wegpunkte abläuft und alle 25 Felder in Reichweite leergräbt. Kristalle werden ebenfalls abgebaut. Werden keine Wegpunkte angegeben, wird an der momentanen Position gebuddelt. Ein Packpferd oder -lama muss man dabei haben und Schaufeln müssen im Hauptrucksack liegen.
Eine Fütterfunktion ist für das Script in Zukunft vorgesehen, aber noch nicht implementiert.
Da dies meine ersten Gehversuche mit Lua sind, ist das Ganze noch nicht Objektorientiert aufgezogen. Die Programmierer unter euch mögen es mir nachsehen
Wenn ihr die Meldung "Für den Steinabbau benötigt ihr eine Spitzhacke" bekommt, einfach manuell einmalig irgendein Feld abgraben und das Script starten. Das scheint nur zu passieren, wenn man im Client seit dem Start noch nie einen Target Cursor hatte.
OpenEUO nutzt Lua als Scriptsprache und ist um einiges mächtiger und vor allem deutlich schneller als EasyUO. Ich habe daher mal ein Script gebastelt, das Wegpunkte abläuft und alle 25 Felder in Reichweite leergräbt. Kristalle werden ebenfalls abgebaut. Werden keine Wegpunkte angegeben, wird an der momentanen Position gebuddelt. Ein Packpferd oder -lama muss man dabei haben und Schaufeln müssen im Hauptrucksack liegen.
Eine Fütterfunktion ist für das Script in Zukunft vorgesehen, aber noch nicht implementiert.
Da dies meine ersten Gehversuche mit Lua sind, ist das Ganze noch nicht Objektorientiert aufgezogen. Die Programmierer unter euch mögen es mir nachsehen
Wenn ihr die Meldung "Für den Steinabbau benötigt ihr eine Spitzhacke" bekommt, einfach manuell einmalig irgendein Feld abgraben und das Script starten. Das scheint nur zu passieren, wenn man im Client seit dem Start noch nie einen Target Cursor hatte.
- Code: Alles auswählen
--Schaufel Type = 3897
--Spitzhacke Type = 3717
--Kristall Type = 10055
startWegpunkt = 1--Diesen Wert anpassen, um bei einem anderen als den ersten Wegpunkt zu beginnen
if UO.TileInit(true) then
print("TileInit war erfolgreich!")
else
print("TileInit fehlgeschlagen!")
stop()
end
if nRef == nil then
nRef = 0
end
nRef,nCnt = UO.ScanJournal(nRef)
tMeldungen = {
["success"] = "in euren Rucksack.",
["fail"] = "Ihr konntet kein verwertbares Erz gewinnen",
["empty"] = "Hier gibt es kein Erz mehr abzubauen",
["busy"] = "I am already doing something else.",
["far"] = "Das ist zu weit entfernt",
["crystal"] = "Ihr legt den Kristall in Euren Rucksack."
}
tPacktiere = {
["Packpferd"] = 291,
["Packlama"] = 292
}
tWegpunkte = {
--Wegpunkte haben das Format {X,Y} und werden durch Kommata getrennt.
--5 einzelne Wegpunkte sähen also so aus: {1,2}, {3,4}, {5,6}, {7,8}, {9,10}
--Wenn hier keine Wegpunkte angegeben werden, buddelt das Script die 25 Felder um den Character leer.
--Wepunkte direkt nach dieser Zeile einfügen.
}
function findDist(findX, findY)
--Gibt die Distanz in Feldern zurück
local dx,dy = math.abs(UO.CharPosX - findX), math.abs(UO.CharPosY - findY)
return math.max(dx,dy)
end
function findItem(nFindType, nRange, nCont)
--Sucht einen ItemType und gibt die Eigenschaften als Tabelle oder nil zurück
local tResult = nil
local nItems = UO.ScanItems(true) - 1
for nIndex = 0,nItems do
local nID,nType,nKind,nContID,nX,nY,nZ,nStack,nRep,nCol = UO.GetItem(nIndex)
if ( nType == nFindType ) then
if ( ( nCont == nil and findDist(nX,nY) <= nRange ) or (nCont ~= nil and nCont == nContID) ) then --Nur Items ins Ergebnis schreiben, die in dem Container liegen, der Angegeben wurde bzw. die in Reichweite sind
local temp =
{
["id"] = nID,
["type"] = nType,
["kind"] = nKind,
["contid"] = nContID,
["x"] = nX,
["y"] = nY,
["z"] = nZ,
["stack"] = nStack,
["col"] = nCol
}
if ( tResult == nil ) then
tResult = {}
end
table.insert(tResult, temp)
end
end
end
return tResult
end
function setToolId()
--Setzt die ID des zu nutzenden Werkzeugs. Nimmt als erstes kleine Stacks
local tItemList = findItem(3897,0,UO.BackpackID)--Schaufeln im Rucksack
local stack = 999
for num,item in pairs(tItemList) do
if ( item["stack"] < stack ) then
stack = item["stack"]
nToolId = item["id"]
end
end
end
function checkCrystal()
local tItemList = findItem(10055,2)
if ( tItemList ~= nil ) then
UO.LObjectID = tItemList[1]["id"]
UO.Macro(17,0)
waitJournal()
end
end
function digTile(x,y,z)
--Buddelt auf einem Feld
while true do
setToolId()
if ( nToolId ~= nil ) then
--Kristall in der Nähe?
checkCrystal()
--Gewichtslimit fast erreicht?
if ( ( UO.Weight + 15 ) >= UO.MaxWeight ) then
oreToPacki()
end
UO.LObjectID = nToolId
UO.Macro(17,0)--LastObject
UO.LTargetX = x
UO.LTargetY = y
UO.LTargetZ = z
UO.LTargetKind = 3
--Auf Target Cursor warten
repeat
wait(10)
until UO.TargCurs == true
UO.Macro(22,0)--LastTarget
next = waitJournal()
if next then
print("Feld leer, nächstes")
return
end
else
print("Schaufeln alle")
stop()
end
end
end
function waitJournal()
while true do
wait(10)
nRef,nCnt = UO.ScanJournal(nRef)
for i=0,nCnt - 1 do
local sLine,nCol = UO.GetJournal(i)
for k,val in pairs(tMeldungen) do
if string.find(sLine, val) ~= nil then
if k ~= "busy" then
if (k == "success") or (k == "fail") or (k == "crystal") then
return false
elseif (k == "empty") or (k=="far") then
return true
end
else
wait(10000)
end
end
end
end
end
end
function feedPacki()
end
function oreToPacki()
feedPacki()
UO.NextCPosX = 0
UO.NextCPosY = 0
if nPackiID == nil then
findPacki()
end
UO.LObjectID = nPackiID
UO.Macro(17,0)
wait(1000)
local con = UO.ContID
local tItemList = findItem(6585,0,UO.BackpackID)--Erz aller Art
for k,item in pairs(tItemList) do
UO.Drag(item["id"],item["stack"])
wait(500)
UO.DropC(con)
end
end
function findPacki()
while nPackiID == nil do
for k,v in pairs(tPacktiere) do
local temp = findItem(v,2)
if ( temp[1]["id"] ~= nil ) then
nPackiID = temp[1]["id"]
return
end
end
if nPackiID == nil then
UO.Macro(1,0,"all follow me")
wait(2000)
end
end
end
function selectTile()
--Wählt ein Tile zum Minern aus, wenn das TileType stimmt
for i = -2,2 do
local x = UO.CharPosX + i
for j = -2,2 do
local y = UO.CharPosY + j
for nTileIndex = UO.TileCnt(x,y),1,-1 do
local nTileType, z, sName, nFlags = UO.TileGet(x,y,nTileIndex)
if sName == "Hoehlenboden" then
digTile(x,y,z)
end
end
end
end
end
function moveTo(moveX,moveY)
local moveZ = -1
if (moveX == nil) or (moveY == nil) then
return false
end
UO.Pathfind(moveX,moveY,moveZ)
repeat
wait(100)
until (UO.CharPosX == moveX) and (UO.CharPosY == moveY)
return true
end
if tWegpunkte[1] ~= nil then
--Equivalent zu foreach in anderen Sprachen
for key,value in pairs(tWegpunkte) do
if key >= startWegpunkt then
minetile = moveTo(value[1], value[2])
if minetile then
selectTile()
end
end
end
else
selectTile()
end
print("Ende")