Obsidian Knife User
DescriptionUsing obsidian knife on dead bodies. Optionaly you can setup:
- range - it will consider bodies only in this range
- waitfresh - if true it will also consider fresh bodies
It will use browse field if body is covered by any unmoveable item, if its covered by moveable item it will just push it away. It will also add looted items to the MMH list (you need to add items to the loot list also (Looting > LootList)).
ConfigurationJust paste the code to:
- Cavebot > Scripter (it will works only if cavebot is enabled)
- Scripter > Persistant
Credits: @Garkstal
Code
init start -- local SCRIPT_VERSION = '1.0.1'
local Range = 6 -- Range from which bot will consider bodies
local waitFreshBodies = false -- Wait till body wont be fresh?
-- Do not edit anything below
local fresh = {6017, 5969, 5973, 5981, 5982, 5983, 5984, 5999, 6030, 4239, 6040, 6041, 10355, 10359, 10363, 10367, 8182} -- ID's of fresh dead bodies
local old = {4173, 4011, 4025, 4047, 4052, 4057, 4062, 4112, 4212, 4321, 4324, 4327, 10352, 10356, 10360, 10364, 8181} -- ID's of not fresh dead bodies
local lootItems = {5878, 5876, 5877, 5948, 5925, 5893, 954, 2977} -- items which will be added to the MMH list
local function bodiesInfo(range, _fresh)
local infos = {}
for a=0, range do
local i, j = -a, -a
while j <= a do
i = -a
while i <= a do
local px, py = $posx+i, $posy+j
if (math.abs(j) == a or math.abs(i) == a) and tilehasinfo(px, py, $posz) then
local tile = gettile(px, py, $posz)
for k=0, tile.itemcount do
if (_fresh and table.find(fresh, tile.item[k].id)) or (table.find(old, tile.item[k].id)) then
table.insert(infos, {px, py})
break
end
end
end
if math.abs(j) ~= a then
i = i+2*a
else
i = i + 1
end
end
j = j + 1
end
end
return infos
end
function _skin(range, waitfresh)
local waitfresh = waitfresh or false
local info = bodiesInfo(range, waitfresh)
if skin and itemcount('obsidian knife') == 0 and clientitemhotkey('obsidian knife','crosshair') == 'not found' then
info = {}
return ''
end
if #info ~= 0 then
-- Counting items (actual amount)
local Amount = {}
for _, Items in ipairs(lootItems) do
Amount[Items] = itemcount(Items)
end
pausewalking(60000)
for a=1, #info do
local px, py = info[a][1], info[a][2]
if tilehasinfo(px, py, $posz) and tilereachable(px, py, $posz) then
local function distFrom(x,y)
return math.abs($posx - x) > math.abs($posy - y) and math.abs($posx - x) or math.abs($posy - y)
end
if distFrom(px, py) > 1 then
reachlocation(px, py, $posz)
end
local tile = gettile(px, py, $posz)
if not table.find(old, topitem(px, py, $posz).id) and not table.find(fresh, topitem(px, py, $posz).id) then
if itemproperty(topitem(px, py, $posz).id, ITEM_NOTMOVEABLE) then
while windowcount("Browse Field") == 0 do
browsefield(px, py, $posz)
wait(500)
end
for i=1, getcontainer("Browse Field").itemcount do
local itemId = getcontainer("Browse Field").item[i].id
if (table.find(old, itemId)) or (table.find(fresh, itemId) and waitfresh) then
while table.find(fresh, itemId) and waitfresh do
wait(200)
itemId = getcontainer("Browse Field").item[i].id
end
while not table.find(old, topitem(px, py, $posz).id) and itemcount(itemId, "Browse Field") > 0 do
moveitems(itemId, ground(px, py, $posz), "Browse Field", 1)
wait(500)
end
local function bodiesInWindow(win)
local counter = 0
for i=1, getcontainer(win).itemcount do
if (table.find(old, getcontainer(win).item[i].id)) or (waitfresh and table.find(fresh, getcontainer(win).item[i].id)) then
counter = counter + 1
break
end
end
return counter
end
if bodiesInWindow("Browse Field") <= 1 then
closewindows("Browse Field")
end
break
end
end
else
local function push(startx, starty)
local x,y,z = 0, 0, $posz
for i=-1, 1 do
for j=-1, 1 do
if tilewalkable(startx+i, starty+j, $posz) and (i ~= 0 or j ~= 0) and x == 0 then
x,y = startx+i, starty+j
break
end
end
end
return x,y,z
end
while not table.find(fresh, topitem(px, py, $posz).id) and not table.find(old, topitem(px, py, $posz).id) do
moveitems(topitem(px, py, $posz).id, ground(push(px, py)), ground(px, py, $posz), 1)
wait(400, 500)
end
end
end
while table.find(fresh, topitem(px, py, $posz).id and waitfresh) do
wait(200)
end
while table.find(old, topitem(px, py, $posz).id) do
if $posx == px and $posy == py then
local dirs = {
{$posx-1, $posy},
{$posx+1, $posy},
{$posx, $posy-1},
{$posx, $posy+1}
}
for _, v in ipairs(dirs) do
if not itemproperty(topitem(v[1], v[2], $posz).id, ITEM_FLOORCHANGE) and tilewalkable(v[1], v[2], $posz) then
moveto(v[1], v[2], $posz)
wait(200)
break
end
end
end
useitemon("obsidian knife", 0, ground(px, py, $posz))
wait(500)
end
end
end
-- Checking if count has changed
for Item, Count in pairs(Amount) do
local Current = itemcount(Item)
if Current > Count then
Amount[Item] = Current
increaseamountlooted(Item, Current - Count)
end
end
pausewalking(1000)
end
end
init end
auto(100)
--Example of use
if maround(7) == 0 then
_skin(Range, waitFreshBodies)
end