Jump to content


  • Content Count

  • Donations

  • Joined

  • Last visited

  • Days Won


CmP last won the day on May 25

CmP had the most liked content!

Community Reputation

293 Boss

About CmP

  • Rank
    Experienced Member

Additional Information

  • Android
    7.x (Nougat)
  • Device
    Xiaomi Redmi Note 4X

Recent Profile Visitors

5,655 profile views
  1. @F0zG0d bool = true or false is equal to bool = true and therefore is redundant. You can use bool = not bool to invert boolean value.
  2. Yes, it is. For information about the reasons and prerequisites of this decision refer to this topic: Uploading decrypted scripts (#4kw1v0qd)
  3. CmP


    A function has to be defined before it is called. Consider the following examples. Example 1. Incorrect order of function definition and the call to it. f() -- won't work because the function is not defined here function f() print('f') end Example 2. Correct order of function definition and the call to it. function f() print('f') end f() -- will work properly
  4. CmP

    Help pls

    Yes, thanks for notice, I have corrected the examples.
  5. CmP

    Help pls

    You need to handle the result returned by "multiChoice" function properly. According to the function documentation, returned value is either nil (in case of dialog being cancelled), or a table in which selected keys contain value "true". Therefore, proper handling may look like this: local choices = gg.multiChoice({'Option 1', 'Option 2'}) if choices == nil then -- action if dialog has been cancelled else if choices[1] then -- action if first option has been selected end if choices[2] then -- action if first option has been selected end end However, there may be tricky cases where one action prevents other action(s) from being executed. One of such cases is "goto" statement. Once it is executed, all other conditions won't be checked and therefore no actions will be executed. Consider the following example: local choices = gg.multiChoice({'Option 1', 'Option 2'}) if choices == nil then os.exit() else if choices[1] then print('Option 1') goto finish end if choices[2] then print('Option 2') end end ::finish:: Here, if user selects both option 1 and option 2, only actions related to option 1 will be executed, because after executing "goto" statement script execution continues from the specified label, "finish" in this case. Possible workaround here is to check the condition that represents option 1 being selected after all other conditions, so that other conditions will be checked first and related actions will or won't be executed depending on the result of each check. But this workaround can't be applied to the cases where there are "goto" statements in 2 or more blocks of actions related to different conditions. So don't use "goto" and there will be no need to deal with such problems. Use functions instead. There are quite little amount of cases where usage of "goto" is justified and your case is not one of them.
  6. CmP

    Decrypt values

    It's xor-encryption with the key "1 545 691 265" (equal to value with 0 coins). 1 545 691 265 xor 37 = 1 545 691 300 1 545 691 265 xor 487 = 1 545 691 494 Therefore, to get encrypted value Y that corresponds to real value X, you need to use the following formula: Y = 1 545 691 265 xor X This will work, if the key is constant. If it is not, you will first need to find it out to be able to calculate encrypted values.
  7. CmP


    That was a temporary solution for searching/replacing text (string, HEX, array of bytes). Clicking the button caused the following script to be executed: Text (string, HEX, AoB) search/replace (#6a821ivq) Latest few updates introduced a general solution for both searching and editing text (including UTF-8 and UTF-16LE encoded text). Refer to the following video tutorials to get the idea of how it works now: 80.0: Text (string, HEX, AoB) search - GameGuardian (#bvil9mxj) 79.0: Edit UTF-8 text (C String) - GameGuardian (#g2vdech) 79.0: Edit UTF-16LE text (Java String) - GameGuardian (#7itpk8ge)
  8. getResultsCount function from the API can be used to get count of found results. Example of usage: -- some search print('Found ' .. gg.getResultsCount() .. ' result(s)')
  9. CmP


    "Pointer search" feature in GG will find all pointers to the value, if the offset is set to 0, or to the range of values , if the offset is set to a positive integer. There may be no results or too many results. Adjust "offset" parameter accordingly. Once you have the list of pointers to desired value/structure, according to the document, you need to filter the list "until the number of pointers will not decrease". That's how filtering is done there: Obviously, this won't work for Android. So you need to think of another way to reduce the count of found pointers or simply use all of them to keep the reference to desired value. Short conclusion (and probably the answer to your initial question): filtering of found pointers on Android can not be done as described in the document, because restarting the process causes all values to relocate.
  10. CmP


    Yes, just as I have written in one of the previous messages.
  11. CmP


    They don't stop to work, but their address will be different after every process restart. For example, you found a pointer. It's address is 0x5522AA00. Then you restart a process and check the address. There will be another value. It may be just some regular value or it may be a pointer, but different one, that points not to the structure/value you expect. And the pointer you have found before, will be located, for example, at address 0x4488AA00.
  12. CmP


    Quote from the first page: While this may be true for PC, it is not for Android. On Android there is ASLR. After the process is restarted, all values change their location. Therefore, the method described in the document won't help with finding the value after the process is restarted.
  13. CmP

    LUA scripting

    To select specific items use "getListItems" function and filter items that match condition. Example of selecting frozen items with freeze type "freeze in range": local items = gg.getListItems() for i, v in ipairs(items) do if (not v.freeze) or (v.freezeType ~= gg.FREEZE_IN_RANGE) then items[i] = nil end end To change values of the selected items use "setValues" function (if only value needs to be changed) or "addListItems" function (if anything of the following needs to be changed: freeze state, freeze type, "freeze from" value, "freeze to" value). Example of changing values of the previously selected items: for k, v in pairs(items) do v.value = '123' end gg.setValues(items)
  14. Use refineNumber function. Examples are present in the documentation.
  15. 75.0: Example of seek bar in the script - GameGuardian (#4rwuh7vc)
  • Create New...