InventoryScanner

Runes of Magic/Radiant Arcana (http://www.runesofmagic.com)
Post Reply
Message
Author
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

InventoryScanner

#1 Post by demogor »

Hi to all!
At 1st,thanks for creators of micromacro-there are many useful codes in it,sometimes I use alhorytms of it in my programs.
I have 1 little idea-make program,which would give me list of items in inventory and would help to sort it(C++,MFC).
I try to use item.lua for it. I can get count,dura etc.-all,whic use self.Address,but I have troubles with understanding and using self.BaseItemAddress).
I see,that this taken by GetItemAddress(id),that declared in mmorytable.lua. Ok,I try to make analog of this function in my program,but can't understand 1 thing - how to use tables: local startAddressOffsets = {0,addresses.tableStartPtrOffset, addresses.tableDataStartPtrOffset} ?
If there any analogs in C++ and what must doing memoryReadIntPtr( getProc(), tablePointer , startAddressOffsets )?

Sorry for my bad English and thanks for your attention!
Best regards,Demogor!
User avatar
lisa
Posts: 8332
Joined: Tue Nov 09, 2010 11:46 pm
Location: Australia

Re: InventoryScanner

#2 Post by lisa »

I haven't played with C++ in a looong time so not sure how much help I can be with that.

Any reason you can't just extract the info you want from an excel sheet or such?

It is very easy to save info into log files and then you can import the info into excel without to much hassle.

It all depends on how you want the info.
Remember no matter you do in life to always have a little fun while you are at it ;)

wiki here http://www.solarstrike.net/wiki/index.php?title=Manual
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

Re: InventoryScanner

#3 Post by demogor »

I wanna scan inventory and count,how many(for ex.) leather items I have.
"save info into log files " what kind of info?
User avatar
lisa
Posts: 8332
Joined: Tue Nov 09, 2010 11:46 pm
Location: Australia

Re: InventoryScanner

#4 Post by lisa »

Code: Select all

		self.Id = 0;
		--self.BagId = bagId;
		self.Name = "<EMPTY>";
		self.ItemCount = 0;
		self.Color = "ffffff";
		self.SlotNumber = slotnumber
		self.Icon = "";
		self.ItemLink = "|Hitem:33BF1|h|cff0000ff[Empty]|r|h";
		self.Durability = 0;
		self.MaxDurability = 0;
		self.Quality = 0; -- 0 = white / 1 = green / 2 = blue / 3 = purple / 4 = orange / 5 = gold
		self.Value = 0;
		self.Worth = 0;
		self.InUse = false;
		self.BoundStatus = 1; -- 0 = bound on pickup, 1 = not bound, 2 = binds on equip 3 = binds on equip and bound
		self.RequiredLvl = 0;
		self.CoolDownTime = 0;
		self.LastTimeUsed = 0;
		self.MaxStack = 0;
		self.ObjType = 0;
		self.ObjSubType = 0;
		self.ObjSubSubType = 0;
		self.Stats = {}; -- list of named stats and their ids.
That is the item info we can get.
on top of that you can do account name, character name, server name, date and time.
It all depends on what you want =)

I believe ObjSubType is if leather or not,
2 == leather.

Code: Select all

		[2] = { Name = "Leather",
			[1] = { Name = "Upper Body Leather" },
			[2] = { Name = "Belts Leather" },
			[3] = { Name = "Lower Body Leather" },
			[4] = { Name = "Hands Leather" },
			[5] = { Name = "Feet Leather" },
			[6] = { Name = "Capes Leather" },
			[7] = { Name = "Shoulders Leather" },
			[0] = { Name = "Head Leather" },
Remember no matter you do in life to always have a little fun while you are at it ;)

wiki here http://www.solarstrike.net/wiki/index.php?title=Manual
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

Re: InventoryScanner

#5 Post by demogor »

Yes,that's why I start trying to use this alhorythm.But it 1 trouble with it...

For ex.,we get count: self.ItemCount = memoryReadInt( getProc(), self.Address + addresses.itemCountOffset );
And we get obj type: self.ObjType = memoryReadInt( getProc(), self.BaseItemAddress + addresses.typeOffset );

As we can see,in frist we use self.Address,that get from
self.BagId = memoryReadUByte(getProc(), addresses.inventoryBagIds + self.SlotNumber - 1) + 1
self.Address = addresses.staticInventory + ( ( self.BagId - 61 ) * 68 ).
It's ok,I did it.

But self.BaseItemAddress is mor hard to take: GetItemAddress( self.Id );

And from this part troubles started.

function GetItemAddress(id) declared in memorytable.lua
For using it we need addressline = GetIdAddressLine(id);

And in local function GetIdAddressLine(id) I get problem-can't understand what next code must doing:

local startAddressOffsets = {0,addresses.tableStartPtrOffset, addresses.tableDataStartPtrOffset}
local dataPointer = memoryReadIntPtr( getProc(), tablePointer , startAddressOffsets ) - lineSize

startAddressOffsets - it's offset for taking dataPointer - but I can't understand,how it work(

If you can tell me,what mean it {0,addresses.tableStartPtrOffset, addresses.tableDataStartPtrOffset} and how it used in memoryReadIntPtr( getProc(), tablePointer , startAddressOffsets ) ?
User avatar
lisa
Posts: 8332
Joined: Tue Nov 09, 2010 11:46 pm
Location: Australia

Re: InventoryScanner

#6 Post by lisa »

I think you are missing the point, all the adress code is all done in the bachground and we don't need to worry about it.

I'll give you an example.

Code: Select all

	local bags = {}
	inventory:update()
	for slot = 61, 240 do
		item = inventory.BagSlot[slot]
 	    if item.Available and  item.Name ~= "<EMPTY>" then
			table.insert(bags, {Name = item.Name, Id = item.Id, Rlevel = item.RequiredLvl, stats = item.Stats})
		end;
	end;
	table.print(bags)
This code will print to micromacro all the item
Names, Id, required levels, stats.
I didn't have to worry about any addresses as that code is already done.

So instead of doing a table.insert you could save that information to a log file for usage with what ever programme you are thinking of.

Another example is this code I added to Rock's CoT WP.

Code: Select all

		local filename = getExecutionPath() .. "/logs/shellitems.log";
		local file, err = io.open(filename, "a+");
		if file then
			inventory:update()
			for slot = 61, 240 do
				item = inventory.BagSlot[slot]
				if item.RequiredLvl >= 67 then
					file:write("Account: "..RoMScript("GetAccountName()").."\tName: " ..string.format("%-10s",player.Name ).." \tDate: " .. os.date())
					for k,v in pairs(item.Stats) do
						file:write("\n \t Name = "..item.Name.."\tStat = "..v.Name) 
						file:write("\t Durability = "..item.Durability)
					end
				file:write("\n\n")
				end
			end
			file:close()
		end
So this saves information to a file named shellitems.log
which looks like this

Code: Select all

Account: *****	Name: *****	Date: 12/18/11 01:31:59
 	 Name = Callous Wisdom Gloves	Stat = Glorious Mysticism VIII	 Durability = 98

Account: *****	Name: *****	Date: 12/18/11 01:37:40
 	 Name = Callous Vengeance Belt	Stat = Glorious Strength VIII	 Durability = 100

Account: *****	Name: *****	Date: 12/18/11 01:43:18
 	 Name = Suppression Heavy Boots of the Fort	Stat = Crimson Defense VIII	 Durability = 103
Remember no matter you do in life to always have a little fun while you are at it ;)

wiki here http://www.solarstrike.net/wiki/index.php?title=Manual
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

Re: InventoryScanner

#7 Post by demogor »

Look like that I really miss the point)

I wanna take this alhorytm to my program.

You use inventory:update() for loading list of items from memory,yeah? If you wouldn't doing it,you wouldn't can get inf about item.
That's mean,that you wouldn't can't get list without GetIdAddressLine(),that return us to place,where I miss point)
Or may be I muiss with it?
User avatar
lisa
Posts: 8332
Joined: Tue Nov 09, 2010 11:46 pm
Location: Australia

Re: InventoryScanner

#8 Post by lisa »

That is what I thought.

This forum is about the usage of Micromacro and more importantly Rombot.

If you wanted help with usage of Micromacro i would be able to help you.

You however are trying to use the code of Micromacro in your programme for what ever reason and I can't help you with that.

Good luck.
Remember no matter you do in life to always have a little fun while you are at it ;)

wiki here http://www.solarstrike.net/wiki/index.php?title=Manual
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

Re: InventoryScanner

#9 Post by demogor »

Thanks for helping!
Good luck!
demogor
Posts: 20
Joined: Wed Dec 01, 2010 5:42 am

Re: InventoryScanner

#10 Post by demogor »

I did it!
Thanks for alhorytm and ideas!
If anyone would need code of the sorter,write here.
Post Reply