Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Macros.h"
- /*****************************/
- // Please see sample.xm for sample menu code.
- // title of your menu
- static NSString *const title = @"";
- // who made the hack?
- static NSString *const credits = @"";
- // what font do you want the text to be? don't put anything for the default font
- static NSString *const font = @"";
- // should the menu have a blurred background? true or false
- // FYI: this won't always look pretty
- static const bool blur = true;
- // blur style
- // you MUST pick from these three: UIBlurEffectStyleExtraLight, UIBlurEffectStyleLight, or UIBlurEffectStyleDark
- // *** If you opted for no blur background, this is ignored. However, you still need to fill it in. ***
- static const UIBlurEffectStyle blurStyle = UIBlurEffectStyleDark;
- // A complete list of fonts can be found here: http://iosfonts.com/
- /******************************/
- %hook UnityAppController
- - (void)applicationDidBecomeActive:(id)arg0 {
- /* For iOS 11 compatibility, the theme color must be here. */
- /* The overall color for the menu and the button. */
- /* If you want a custom color, use rgb(color code) */
- /* Use rgb(arc4random_uniform(0xFFFFFF)) for a random color each launch. */
- UIColor *themeColor = rgb(arc4random_uniform(0xFFFFFF));
- UIWindow *main = [UIApplication sharedApplication].keyWindow.rootViewController.view;
- UIButton *openButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- openButton.frame = CGRectMake((main.frame.size.width/2)-15, (main.frame.size.height/2)+75, 30, 30);
- openButton.backgroundColor = [UIColor clearColor];
- openButton.layer.cornerRadius = 16;
- openButton.layer.borderWidth = 2;
- openButton.layer.borderColor = themeColor.CGColor;
- [openButton addTarget:self action:@selector(wasDragged:withEvent:)
- forControlEvents:UIControlEventTouchDragInside];
- [openButton addTarget:self action:@selector(showMenu)
- forControlEvents:UIControlEventTouchDownRepeat];
- if(!buttonAdded){
- timer(5){
- UIWindow *main = [UIApplication sharedApplication].keyWindow.rootViewController.view;
- menu = [[ModMenu alloc] initWithTitle:title credits:credits fontName:font theme:themeColor blur:blur blurStyle:blurStyle];
- /*
- Add features below this comment. Feel free to delete this comment if you're comfortable with how this menu works.
- Things are added to the menu in the order you have added them.
- A Hack is a switch that contains offsets, hacked hexes, and original hexes. Straightforward.
- To create one, call addHack.
- addHack is called as follows: addHack(@"Hack Name", @"The description of your hack", themeColor, {offsets}, {hacked hexes}, {original hexes});
- For example:
- addHack(@"Infinite Ammo", @"Ammo doesn't run out.", themeColor, {0x1001B292A}, {0xC0035FD6}, {0xD213AEB5});
- You can also have multiple offsets, hacked hexes, and original hexes. There's no limit to the number of offsets you can have! For example:
- addHack(@"No Recoil", @"No recoil prevents any recoil from being applied when you shoot.", themeColor, {0x356a7c, 0x110f0a}, {0x7047, 0x7047}, {0xf0b5, 0xf0b5});
- A Hook is a switch that used to hook a function and apply a feature. This doesn't make much sense because you cannot "unhook" a function if
- the user wants the feature off. It currently serves no purpose except for backward compatibility. All it does is turn on or off now.
- A SliderHook is a slider that can be customized to have a minimum and maximum value.
- Good for hooking a function and returning user-specified values. To create one, call addSliderHook.
- addSliderHook is called as follows: addSliderHook(@"Hack Name", @"Description of your hack", themeColor, initial value, minimum value, maximum value);
- For example:
- addSliderHook(@"Adjust Field of View", @"Adjust your field of view.", themeColor, 0, 100, 50);
- To get the value of a SliderHook:
- float value = [SliderHook getSliderValueForHook:@"hack name here"];
- int value = (int)[SliderHook getSliderValueForHook:@"hack name here"];
- A TextfieldHook is a textfield. Again, good for hooking a function and returning user-specified values.
- To create one, call addTextfieldHook.
- addTextfieldHook is called as follows: addTextfieldHook(@"Hack name", @"Description of your hack", themeColor);
- For example:
- addTextfieldHook(@"Set Gems", @"Set your gem amount.", themeColor);
- To get the value of a TextfieldHook:
- NSString *value = [TextfieldHook getTextfieldValueForHook:@"hack name here"];
- float value = [[TextfieldHook getTextfieldValueForHook:@"hack name here"] floatValue];
- int value = [[TextfieldHook getTextfieldValueForHook:@"hack name here"] intValue];
- A Switch does nothing but turn on or off. Useful when you are in a hooked function and need to know when to call a function or mod an instance variable.
- Since it doesn't do anything but turn on or off, it is essentially the same thing as a Hook.
- To create one, call addSwitch.
- addSwitch is called as follows:
- addSwitch(@"Hack name", @"Description of your hack", themeColor);
- For example:
- addSwitch(@"Kill Everyone", @"Kill everyone in the lobby", themeColor);
- To test whether or not a Switch is on:
- bool on = [Switch getSwitchOnForSwitch:@"hack name here"];
- If you want to use writeData in your Tweak.xm, now you can! Call writeData like you normally would.
- Call writeData after the menu has been created. If you use it where you add features, you'll be fine.
- Handle hooking with the HOOK and HOOK_NO_ORIG macros. I decided to let you guys handle hooking because
- it is too troublesome to make sure I handle cases where you guys pass parameters incorrectly.
- If I wanted to hook a function called LocalPlayer::Update at 0x1001B762A with a pointer to the original function, I would do this:
- HOOK(0x1001B762A, _LocalPlayer_Update, LocalPlayer_Update);
- Where _LocalPlayer_Update is the function you write, and LocalPlayer_Update is the pointer to the original function.
- You can use HOOK_NO_ORIG if you don't need the pointer to the original function:
- HOOK_NO_ORIG(0x1001B762A, _LocalPlayer_Update);
- If that is too confusing, you can always just use MSHookFunction. HOOK and HOOK_NO_ORIG just wrap MSHookFunction in a cleaner call.
- */
- // add features
- addSwitch(@"test", @"Kill everyone in the lobby", themeColor);
- [main addSubview:openButton];
- [main addSubview:menu];
- buttonAdded = true;
- });
- }
- %orig;
- }
- void (* PlayerMovement_Update)(void *PlayerMovement);
- void _PlayerMovement_Update(void *PlayerMovement) {
- if([Switch getSwitchOnForSwitch:@"test"]) {
- // do your hack
- *(float *)((uint64_t)PlayerMovement + 0x48) = 100.0f;
- *(float *)((uint64_t)PlayerMovement + 0x78) = 100.0f;
- *(float *)((uint64_t)PlayerMovement + 0x80) = 0.0f;
- *(float *)((uint64_t)PlayerMovement + 0x74) = 16.0f;
- }
- PlayerMovement_Update(PlayerMovement);
- }
- %new
- - (void)showMenu {
- [menu show];
- }
- %new
- - (void)wasDragged:(UIButton *)button withEvent:(UIEvent *)event
- {
- UITouch *touch = [[event touchesForView:button] anyObject];
- CGPoint previousLocation = [touch previousLocationInView:button];
- CGPoint location = [touch locationInView:button];
- CGFloat delta_x = location.x - previousLocation.x;
- CGFloat delta_y = location.y - previousLocation.y;
- button.center = CGPointMake(button.center.x + delta_x, button.center.y + delta_y);
- }
- %end
- %ctor {
- MSHookFunction((void *)getRealOffset(0x101196238), (void *)_PlayerMovement_Update, (void **)&PlayerMovement_Update);
- }
- void addHack(NSString *name, NSString *description, UIColor *theme, std::initializer_list<uint64_t> offsets, std::initializer_list<uint64_t> hackedHexes, std::initializer_list<uint64_t> originalHexes){
- if(menu == nil)
- return;
- std::vector<uint64_t> offsetVector;
- std::vector<uint64_t> hackedHexVector;
- std::vector<uint64_t> originalHexVector;
- offsetVector.insert(offsetVector.begin(), offsets.begin(), offsets.end());
- hackedHexVector.insert(hackedHexVector.begin(), hackedHexes.begin(), hackedHexes.end());
- originalHexVector.insert(originalHexVector.begin(), originalHexes.begin(), originalHexes.end());
- Hack *h = [[Hack alloc] initWithHackName:name info:description fontName:font theme:theme offset:offsetVector hackedHex:hackedHexVector originalHex:originalHexVector];
- [menu addHack:h];
- }
- void addHook(NSString *name, NSString *description, UIColor *theme){
- if(menu == nil)
- return;
- Hook *h = [[Hook alloc] initWithHookName:name info:description fontName:font theme:theme];
- [menu addHook:h];
- }
- void addSliderHook(NSString *name, NSString *description, UIColor *theme, float initialValue, float minValue, float maxValue){
- if(menu == nil)
- return;
- if(minValue > maxValue)
- return;
- SliderHook *sh = [[SliderHook alloc] initWithSliderHookName:name info:description fontName:font theme:theme initialValue:initialValue minValue:minValue maxValue:maxValue];
- [menu addHook:sh];
- }
- void addTextfieldHook(NSString *name, NSString *description, UIColor *theme){
- if(menu == nil)
- return;
- TextfieldHook *th = [[TextfieldHook alloc] initWithTextfieldHookName:name info:description fontName:font theme:theme];
- [menu addHook:th];
- }
- void addSwitch(NSString *name, NSString *description, UIColor *theme){
- if(menu == nil)
- return;
- Switch *s = [[Switch alloc] initWithSwitchName:name info:description fontName:font theme:theme];
- [menu addHook:s];
- }
- void writeData(uint64_t offset, uint64_t hex){
- if(menu == nil)
- return;
- [menu writeTo:offset withHex:hex];
- }
Advertisement
Add Comment
Please, Sign In to add comment