Results 1 to 10 of 21

Thread: isTouching()

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Honestly I didn't even know there was a isTouching() function until after I posted this thread. Made the above method so that my sprint does not clash with stock weapon pickups. You can also block bots from picking up weapons/using turrets with a little tweaking.

  2. #2
    Global Mossaderator Mitch's Avatar
    Join Date
    Nov 2012
    Posts
    654
    Thanks
    204
    Thanked 450 Times in 305 Posts
    Quote Originally Posted by filthy_freak_ View Post
    Honestly I didn't even know there was a isTouching() function until after I posted this thread. Made the above method so that my sprint does not clash with stock weapon pickups. You can also block bots from picking up weapons/using turrets with a little tweaking.
    Wouldn't it be more effective and useful to hook the call/function that is responsible for picking up weapons?
    Then with a libcod function you can set if the player is allowed to pickup weapons or not.

    Like this
    PHP Code:
    player enableWeaponPickup();
    player disableWeaponPickup(); 
    Last edited by Mitch; 16th June 2015 at 13:35. Reason: added function example (suggestion) and added '?'.

  3. #3
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Quote Originally Posted by Mitch View Post
    Wouldn't it be more effective and useful to hook the call/function that is responsible for picking up weapons?
    Then with a libcod function you can set if the player is allowed to pickup weapons or not.

    Like this
    PHP Code:
    player enableWeaponPickup();
    player disableWeaponPickup(); 
    I don't have the knowledge to do this yet. I'm still earning about C++ and libcod.

  4. #4
    Global Mossaderator Mitch's Avatar
    Join Date
    Nov 2012
    Posts
    654
    Thanks
    204
    Thanked 450 Times in 305 Posts
    Quote Originally Posted by filthy_freak_ View Post
    I don't have the knowledge to do this yet. I'm still earning about C++ and libcod.
    This is the information that i found so far.

    PHP Code:
    Touch_Item_Auto 8105C80 (1.3), 81037F0 (1.0
    It calls:
    PHP Code:
    Touch_Item(item_weaponplayermessage 1
    Item_weapon and player are probably gentities.
    So the function gentityaddress_to_num in gsc_player.cpp will probably give you a number between 0 and 63.

    The function is called from:
    PHP Code:
    8187F64 (1.3), 8167AE4 (1.0)
    8187F8C (1.3), 8167B0C (1.0)
    8187FB4 (1.3), 8167B34 (1.0
    These addresses are pointers to a function like closer or download.
    Now you can try and replace these pointers with your own function and return to the original function.
    Before return to the function you can add a message to see which of the addresses you need.

    These commits might help:
    Replacing a function: https://github.com/M-itch/libcod/com...9ef0a8cb70d2c1
    Client number: https://github.com/M-itch/libcod/com...1e2387aadc42ff
    Last edited by Mitch; 17th June 2015 at 14:04. Reason: added commits for examples

  5. #5
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Here is disablePickup()

    Usage example:
    PHP Code:
    self disablePickup(true); 
    Also make sure to set disablePickup(bool) on player connect so it will reset properly.

    Installation
    Open gsc.cpp, CTRL + F and search for "resetNextReliableTime". Then add the following on a new line;
    PHP Code:
    {"disablepickup"         gsc_player_disable_pickup     0}, 
    Open gsc_player.hpp, CTRL + F and search for "void gsc_player_resetNextReliableTime(int id);". Then add the following on a new line;
    PHP Code:
    void gsc_player_disable_pickup(int id); 
    Open gsc_player.cpp, CTRL + F and search for "// entity functions". Then add the following on a new line;
    PHP Code:
    void gsc_player_disable_pickup(int id)
    {
        
    int disable;
        
        if ( ! 
    stackGetParams("i", &disable)) {
            
    printf("scriptengine> ERROR: gsc_player_allow_pickup(): param \"disable\"[1] has to be an integer!\n");
            
    stackPushUndefined();
            return;
        }
        
        
    extern int disable_player_pickup[64];
        
        if(
    disable)
            
    disable_player_pickup[id] = (1);
        else
            
    disable_player_pickup[id] = (0);

    Open libcod.cpp, CTRL + F and search for "int hook_RemoteCommandTime(void)". Then add the following function before "int hook_RemoteCommandTime(void)";
    PHP Code:
    int disable_player_pickup[64] = {0};
    int clientaddress_to_num(int client);

    cHook *hook_disable_pickup;
    int disable_pickup(int a1int a2int a3)
    {
        
    int addrtyperet 0;
        
    int clientnum clientaddress_to_num(a2);
        
    extern int playerinfo_baseplayerinfo_size;
        if(*(
    int*)(*(int*)playerinfo_base clientnum playerinfo_size) == && !disable_player_pickup[clientnum])
        {
            
    hook_disable_pickup->unhook();
            
    signed int (*sig)(int a1int a2int a3);
            *(
    int *)&sig hook_disable_pickup->from;
            
    ret sig(a1a2a3);
            
    hook_disable_pickup->hook();
        }
        return 
    ret;

    Also while in libcod.cpp, add search and add the following new lines depending on your version;

    1.0;
    Search for "cracking_hook_call(0x080707C3, (int)Scr_GetCustomMethod);"

    Add the following on a new line;
    PHP Code:
                hook_disable_pickup = new cHook(0x080DCC7A, (int)disable_pickup);
                
    hook_disable_pickup->hook(); 
    1.2;
    Search for "cracking_hook_call(0x08070D3F, (int)Scr_GetCustomMethod);"

    Add the following on a new line;
    PHP Code:
                hook_disable_pickup = new cHook(0x080DF25A, (int)disable_pickup);
                
    hook_disable_pickup->hook(); 
    1.3;
    Search for "cracking_hook_call(0x08070E0B, (int)Scr_GetCustomMethod);"

    Add the following on a new line;
    PHP Code:
                hook_disable_pickup = new cHook(0x080DF39E, (int)disable_pickup);
                
    hook_disable_pickup->hook(); 
    Compile your version and you are done.

  6. The Following User Says Thank You to filthy_freak_ For This Useful Post:

    Mitch (19th June 2015)

  7. #6
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    The above function only disables weapon pickup and doesn't disable turrets, bomb planting etc.

  8. #7
    Global Mossaderator Mitch's Avatar
    Join Date
    Nov 2012
    Posts
    654
    Thanks
    204
    Thanked 450 Times in 305 Posts
    Quote Originally Posted by filthy_freak_ View Post
    The above function only disables weapon pickup and doesn't disable turrets, bomb planting etc.
    The code doesn't work correctly, because a2 isn't a client address but a gentity address.
    You need to replace 'clientaddress_to_num' with 'gentityaddress_to_num' to get a valid client number.

    Edit: the function uses a different a2 variable. So i was wrong. See: http://killtube.org/showthread.php?2...ll=1#post12093
    Last edited by Mitch; 30th June 2015 at 14:31.

  9. The Following User Says Thank You to Mitch For This Useful Post:

    filthy_freak_ (30th June 2015)

  10. #8
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Quote Originally Posted by Mitch View Post
    The code doesn't work correctly, because a2 isn't a client address but a gentity address.
    You need to replace 'clientaddress_to_num' with 'gentityaddress_to_num' to get a valid client number.
    Are you sure? This is what my log returns;
    Code:
    clientaddress_to_num = 0, gentityaddress_to_num = 1024
    PHP Code:
        int clientnum clientaddress_to_num(a2);
        
    int clientnum2 gentityaddress_to_num(a2);
        
    printf("clientaddress_to_num = %i, gentityaddress_to_num = %i\n"clientnumclientnum2); 

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •