[Tool] MapItemManager

05/04/2014 12:20 Freszone#1
Hey,

This is a simple tool that notifies you with a message box (and perhaps sound in the future) when an item of your choice drops.
I made this because there was something like this requested, and I wanted to do some external tool.
It should be undetectable since it only uses only ReadProcessMemory with minimum rights, but as usual, I'm not responsible if you get banned for using it.
It should work for at least a few patches before it needs updating.
I originally made this in C++, but since it needed a GUI I changed to C#.
I might continue the C++ version to add the rest of the GUI and upload it, if I have time and interest.

[How to]
1. Download
2. Extract
3. Run as administrator
4. Log in to Conquer
5. Select your character from the drop down menu
6. Press "Start"
7. Add items you want to get notified for in the list. Write the name in the text box and press "Add".
Make sure the name is in correct case (DragonBall not Dragonball etc) just like it shows up in Conquer.
I was too unskilled at C# to make lowercase comparison :p
It saves the items you add so you only have to do it once. To delete an item, select it and press "Delete selected".

P.S. I suck at naming stuff and making posts and GUIs, as you can probably see

[Only registered and activated users can see links. Click Here To Register...]

Changes:
-1.0 Initial release
-1.01 Fixed issue with long names not showing up correctly

Virus scan:
[Only registered and activated users can see links. Click Here To Register...]
05/04/2014 21:49 SteveRambo#2
Good job, but somehow I feel that phize deserves some credit :o
05/04/2014 23:03 Freszone#3
I don't know for what reason though... If I had to give someone credits for this, it would probably be to HexRays for IDA
I've spent plenty of time reversing the client myself.
Wasn't too hard to find the items that are located in a vector that is in CMapItemManager class that is in CGameMap.
And as for the names, I just copy a linked list from CItemData.
05/04/2014 23:42 SteveRambo#4
Quote:
Originally Posted by Freszone View Post
I don't know for what reason though... If I had to give someone credits for this, it would probably be to HexRays for IDA
I've spent plenty of time reversing the client myself.
Wasn't too hard to find the items that are located in a vector that is in CMapItemManager class that is in CGameMap.
And as for the names, I just copy a linked list from CItemData.
Wow, sorry, it seems like I jumped the gun on that one. I'm just used to seeing so many retarded leechers here who only release stuff that they steal from others.

[Only registered and activated users can see links. Click Here To Register...] is where I thought you got your information from, but I guess I was wrong :o.
05/05/2014 00:38 Freszone#5
I see your point, but I can't say I would have seen that thread before.
And the class names are straight from TQ as you might know...

I have currently a lot of spare time so I'm spending it doing shit like this...
I have renamed and reversed loads of functions (made scripts for most), wrote a basic framework for bot ("minor" problems with restrictions :p) and stuff.
I won't probably use any of the stuff myself, but I find it a great way of improving my skills, I try to use new techniques in every "project".
My career is going to be in computer science so I care about understanding stuff and not just leeching from someone else.
Sorry for being such a prick, but I just get pissed easily.
06/03/2014 17:21 BestestBooster#6
update pls
06/03/2014 17:51 SteveRambo#7
Quote:
Originally Posted by BestestBooster View Post
update pls
Oh, so you can post now that the tool doesn't work, but you can't even give the creator a "thanks" when it works? Get the fuck out.
06/07/2014 00:02 anger001#8
Does the tool works?
06/12/2014 13:45 Freszone#9
Just tested it for a few minutes on the latest patch (5910) and it seemed to be working fine.
If there are some issues that I'm not aware of, please be a bit more specific than "update pls" ;)
06/14/2014 12:39 Wolfy.#10
Um, tried it worked fine for me too...
07/01/2014 14:24 nicolastyler#11
Quote:
Originally Posted by SteveRambo View Post
Wow, sorry, it seems like I jumped the gun on that one. I'm just used to seeing so many retarded leechers here who only release stuff that they steal from others.

[Only registered and activated users can see links. Click Here To Register...] is where I thought you got your information from, but I guess I was wrong :o.
It is possible he used that thread for the offsets but he used patterns to find the base pointers, which is not mentioned in that post.

I have massive respect for phize and other users who post there code and apps for free and in general help the community. So i say phize deserves credit. XD
07/01/2014 20:23 Freszone#12
Code:
#pragma once

//////////////////////////////////////////////////////////////////////////////////////////
//       Item entries are located in a vector. This vector is found at					//
//       CGameMap:: + 0x8C (0x7C + 0x10) which points to the first item					//
//       of the vector. Last item is pointed by CGameMap:: + 0x90 (0x7C + 0x14).		//
//		 To find the offsets, search for "3dgamemap\\mapitemmanager.cpp" in IDA.		//
//       Total amount of items in this vector can be calculated as follows:				//
//																						//
//	items.size()																		//
//	{                                                                                   //
//		return (items.end() - items.begin()) / 4;										//
//	}																					//
//																						//
//	where items.end() = pointer to last item and items.begin() = pointer to first item  //
//																						//
//////////////////////////////////////////////////////////////////////////////////////////

#pragma pack(push, 1)
struct ItemEntry
{
	unsigned long uid;
	unsigned long id;
	unsigned long x;
	unsigned long y;
};
#pragma pack(pop)

//Example usage

DWORD size = (mr_.Read<DWORD>(pLastItem_) - mr_.Read<DWORD>(pFirstItem_)) / 4;
for(DWORD i = 0; i < size; ++i)
	ItemEntry item = mr_.Read<ItemEntry>(mr_.Read<DWORD>(mr_.Read<DWORD>(pFirstItem_) + i * 4));
There you go, for free and you can do anything you want to. I can't be bothered to post my IDB here since you would just tell me it's leeched from someone, clearly it is.
07/01/2014 22:04 nicolastyler#13
I assumed your app was made in C#, is it not?

some similar C# code:
Code:
private static Dictionary<int, string> item_names = new Dictionary<int, string>();

private struct ItemEntry
{
    public uint uid;
    public uint id;
    public uint x;
    public uint y;

    public override string ToString()
    {
        return item_names[Convert.ToInt32(id)] + " X:" + x.ToString() + " Y:" + y.ToString();
    }
}

//Example usage

private void getItems(Process process)
{
    HashSet<int> hashSet = new HashSet<int>();
    List<int> list = new List<int>();
    list.Add(memoryManager.ReadInt32(pFirstEntry));
    list.Add(memoryManager.ReadInt32(pFirstEntry + 4));
    list.Add(memoryManager.ReadInt32(pFirstEntry + 8));
    while (list.Count > 0)
    {
        int num1 = list[0];
        list.Remove(num1);
        hashSet.Add(num1);
        for (int index = 0; index < 3; ++index)
        {
            int num2 = memoryManager.ReadInt32(num1 + index * 4);
            if (!hashSet.Contains(num2))
                list.Add(num2);
        }
        int index1 = memoryManager.ReadInt32(num1 + 12);
        if (index1 != 0)
        {
            int nCount = memoryManager.ReadInt32(num1 + 40);
            string str = string.Empty;
            if (nCount <= 15)
                str = memoryManager.ReadString(num1 + 24, nCount);
            else
                str = memoryManager.ReadString(memoryManager.ReadInt32(num1 + 24), nCount);
            item_names[index1] = str;
        }
    }
}
07/27/2014 14:34 Tale99#14
Not working?
07/27/2014 18:11 hatemtiger#15
pleas reload hack