I want to put the scope and address information of a class and a function in the symbol of MSHookFunction at the same time.
Of course, if you leave it like this, you will get an error, but like this:
Tweak.xm
#include "Item.h"
#include "ItemInstance.h"
#include "Recipes.h"
void (*Recipes_init)(Recipes*);
void _Recipes_init(Recipes* res) {
Recipes_init(res);
const std::vector<Recipes::Type, std::allocator<Recipes::Type>>& def = definition<Item*, Item*>('#', Item::mItems[296], 'S', Item::mItems[368]);
res->addShapedRecipe(ItemInstance(Item::mItems[432], 0), "###", "#S#", "###", def);
}
%ctor {
MSHookFunction(Recipes::_init + (0x100774f40 + _dyld_get_image_vmaddr_slide(0)), (void*)&_Recipes_init, (void**)&_Recipes_init);
MSHookFunction(Recipes::addShapedRecipe + (0x100781d74 + _dyld_get_image_vmaddr_slide(0)), NULL, NULL);
MSHookFunction(Item::mItems + (0x10074689c + _dyld_get_image_vmaddr_slide(0)), NULL, NULL);
MSHookFunction(ItemInstance::ItemInstance + (0x1007569a4 + _dyld_get_image_vmaddr_slide(0)), NULL, NULL);
}
Recipes.h
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <stdint.h>
#include "ItemInstance.h"
class Recipes {
public:
class Type {
public:
Item* item;
uintptr_t* block;
ItemInstance inst;
char c;
};
public:
void _init();
void addShapedRecipe(const ItemInstance&, const std::string&, const std::string&, const std::string&, const std::vector<Recipes::Type, std::allocator<Recipes::Type>>&);
};
template <class A, class B>
std::vector<Recipes::Type, std::allocator<Recipes::Type>>
definition(char, A, char, B);
ItemInstance.h
#pragma once
#include <memory>
#include "Item.h"
class ItemInstance {
public:
ItemInstance(Item const*, int);
};
Item.h
#pragma once
#include <string>
#include <memory>
#include <vector>
#include <unordered_map>
class Item {
public:
char filler[200];
public:
static Item* mItems[512];
};