Page 1 of 3 123 LastLast
Results 1 to 15 of 43
  1. #1
    coolsidharth's Avatar
    Join Date
    Oct 2009
    Gender
    male
    Location
    In my room
    Posts
    2,345
    Reputation
    70
    Thanks
    248
    My Mood
    Tired

    Post SOURCE CODE FOR AIMBOT : USE THESE CODES TO MAKE AN AIMBOT :D

    I found these codes and i edited some I DIDNT TRY IT any coder try it and tell if it workz

    Code:
    /******Creditz to coolsidharth and a special thanks here to evolution2009 for teaching me how to code C++******/
    Note: I GUESS I HELPED YOU ALL
    This is alot of text i know but its user friendly the actual code is small as i keep adding to it every section
    This is my variation - some people will prefere to code colour aimbots (unreliable) or addressed (useless in most games other than cs. So my way uses world co-ords (including North point/ south point)
    What we do, is get our position by co-ordinates, in X,Y and Z (or East/West, North/South and Height), and the same for the enemy. With this, we can work out our relative angle between North (or a different point, which comes up later), our player, and the enemy. So in at the end of that, we get our angle to aim for (away from North) in order to look at the enemy. This is then used to set our rotational look onto the enemy. Then we do the same with the height (between a point which is straight ahead of us, our player, and the enemy) to get the angle we need to aim up/down.
    So to start off we want 3 main functions
    Code:
    PLAYER_DATA GetMyPlayerData(void)
    PLAYER_DATA GetPlayerData(BYTE PlayerNumber)
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    PLAYER_DATA - I like to use some structs as well as functions. I was taught this way by evolution so i got used to it mu PLAYER_DATA structure holds valuable information about a player. Such as:
    Code:
    typedef struct _PLAYER_DATA {
    DWORD baseadd; // base address of this current player
    DWORD coordEW; // East/West (X) co-ord
    DWORD coordNS; // North/South (Y) co-ord
    DWORD coordUD; // Up/Down (Z) co-ord
    DWORD coordEWa; // The address of the players EW co-ord
    DWORD coordNSa; // The address of the players NS co-ord
    DWORD coordUDa; // The address of the players UD (up/down..wth was i thinking when naming this) co-ord
    DWORD lookX; // The players X-axis look (what will change if you move the mouse side to side)
    DWORD lookY; // The players Y-axis look (what will change if you move the mouse forwards and backwards)
    DWORD lookXa; // The address of the X look
    DWORD lookYa; // The address of the Y look
    char name; // Holds the current players name
    DWORD namea; // The address of the current players name
    } PLAYER_DATA;
    I dont really know why I put all the addresses for everything in the struct, but helloo, might come in use when making something one day. All the stuff in there will come to use when making our aimbot, so heres how to search for each of them (in DFX at least).
    The easiest to start with is name, use Artmoneys Text search
    Co-ords:
    NS - Move north, search increased, move south, search decreased
    EW - Move east, search increased, move west, search decreased
    UD - Move up (a hill/ladder), search increased, move down, search decreased
    LookX - Move mouse left/right, search has changed set your search range to around the other addies to narrow search down (this value may be different to DFX. In DFX, 0 was east, and it increased as you went anti-clockwise until you got to just before east, which was 0xFFFFFFFF)
    LookY - Move mouse forward/backward, search has changed
    You should be able to get the player base address from near enough any of these, and a pointer to get it in game. I use 2 pointers, 1 which always points to player 0s (or 1, the 1st player in memory)s base address, and 1 which always points to the base address of my player. Now we can modify the GetMyPlayerData and GetPlayerData functions to get us this info:

    Now at the top of the C++, I define the bases:
    Code:
    #define mBase 0xBD63D8
    #define hBase 0xB0D228
    ///
    PLAYER_DATA GetMyPlayerData(void)
    {
    PLAYER_DATA Player; // Create a blank PLAYER_DATA struct
    ZeroMemory(&Player, sizeof(PLAYER_DATA)); // Initiate it all to 0 (thanks L.Spiro, this solved some problems)
    Peek((void*)mBase,(void*)&Player.baseadd,4); // Get our players Base Address from the pointer
    /*****made by stickleback******/
    Player.coordEWa = Player.baseadd + 0×8; // Get all the addies for everything…the 0×8, 0xC and **** are the offsets I found for DFX
    Player.coordNSa = Player.baseadd + 0xC;
    Player.coordUDa = Player.baseadd + 0×10;
    Player.lookXa = Player.baseadd + 0×14;
    Player.lookYa = Player.baseadd + 0×18;
    Player.namea = Player.baseadd + 0xF4;
    Peek((void*)Player.coordEWa,(void*)&Player.coordEW ,4); // Now we got all the addies, read in the info from em all
    Peek((void*)Player.coordNSa,(void*)&Player.coordNS ,4);
    Peek((void*)Player.coordUDa,(void*)&Player.coordUD ,4);
    Peek((void*)Player.lookXa,(void*)&Player.lookX,4);
    Peek((void*)Player.lookYa,(void*)&Player.lookY,4);
    Peek((void*)Player.namea,(void*)&Player.name,15);

    return Player; // Give our PLAYER_DATA Player, as the return value
    }
    ///
    PLAYER_DATA GetPlayerData(BYTE PlayerNum) // Takes the number of the player as a param
    {
    PLAYER_DATA Player;
    ZeroMemory(&Player, sizeof(PLAYER_DATA));
    Peek((void*)hBase,(void*)&Player.baseadd,4);

    Player.baseadd = Player.baseadd + (PlayerNum*0×388); // 0×388 is the gap between players, starting with player 1

    Player.coordEWa = Player.baseadd + 0×8;
    Player.coordNSa = Player.baseadd + 0xC;
    Player.coordUDa = Player.baseadd + 0×10;
    Player.lookXa = Player.baseadd + 0×14;
    Player.lookYa = Player.baseadd + 0×18;
    Player.namea = Player.baseadd + 0xF4;

    Peek((void*)Player.coordEWa,(void*)&Player.coordEW ,4);
    Peek((void*)Player.coordNSa,(void*)&Player.coordNS ,4);
    Peek((void*)Player.coordUDa,(void*)&Player.coordUD ,4);
    Peek((void*)Player.lookXa,(void*)&Player.lookX,4);
    Peek((void*)Player.lookYa,(void*)&Player.lookY,4);
    Peek((void*)Player.namea,(void*)&Player.name,15);

    return Player;
    }
    ///

    Now that we've made our functions to collect all the data we need, its time to get to the core of the aimbot. This will be some Hcore reading so take a brake and make sure you really suck this in
    This uses Trigganometry
    Maths knowledge is needed to make this! If youre useless at maths, and still reading, youre also useless at english for not understanding the knowledge requirements at the top Lets start with the X look.
    Because DFX works around the East point (, facing Directly east = 00000000/0xFFFFFFFF), then all our calculations will be made off it. To help the understanding with this tutorial, Ill include some snazzy little photoshuppered drawings, woo
    The aimbot works in 4 sectors. This makes things easier when finding out distances. Here are the sectors and how to determine what sector an enemy is in :

    Sector 1 = South-East of our position
    Sector 2 = South-West of our position
    Sector 3 = North-West of our position
    Sector 4 = North-East of our position

    So, lets add these sectors to our source code. Note that also we have to tell our aimbot what to do if they are, for example, east of us, but the same on the NS axis. No need to put the code for if they are the same on both the NS and the EW axis, as otherwise you wont need it to set an aim for you, youre on them
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber); // oP = Opposition’s Player
    PLAYER_DATA cP = GetMyPlayerData(); // cP = Current Player (our player) .. sorry for bad var names

    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    }

    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    }

    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    }

    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    }
    }

    Now, to get the angle we need to look, we have to make a triangle between the EW axis, us, and the player. Then we have to find the angle of which we are the apex. Heres 1 of the snazzy little drawings:



    This is a top view :
    Blue dot = Our player
    Red dot = enemy
    Green = The triangle we make
    Purple = The angle we need to find
    Orange = The differences we need to work out for the angle

    Incase youve forgotten Triganometry, then due to the 2 side we can get the easiest we will the Tangent function :
    Tan(angle) = Opposite/Adjacent

    In all our sectors, the Adjacent is the EW difference, and the Opposite is the NS difference. So lets add some coding to our function :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData();

    double EWdif; // These need to be double for our Trig calculations to work later on
    double NSdif;

    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    }

    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    }

    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    }

    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    }
    }

    Please note that in each sector, the calculations ARE NOT the same. You need to do the biggest take away the smallest hope thats obvious. Right, so now we have this, we need to get the angle in degrees. For this, we need to do go back to the formula :

    Tan(angle) = Opposite/Adjacent
    Tan(angle) = NSdif/EWdif

    We need to do the Inverse Tangent function of this, so that we get the angle rather than the Tangent of the angle. The function to do this is atan (could have used atan2 but didnt know of this function at the time of programming). It takes 1 double parameter, and returns a double value of the angle in radians. But this is no good for us, we want it in degrees. Well, to turn radians into degrees, its a multiplication of, as found off the tinternet Remember to include <math.h> for the atan function

    Then, due to our X-look not having a maximum of 360, it goes upto 0xFFFFFFFF (4294967295), we need to find the percentage what this angle is of 360. This is so that we can find out what value we need to use, for example:

    If the angle was 90 degrees
    90/360 = 0.25 (decimal percentage of the angle)
    0xFFFFFFFF * 0.25 = 3FFFFFFF (roughly), which is the new value we need to use

    Lets put this in the code.
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData();

    double EWdif;
    double NSdif;
    double angleA; // The angle in degrees between the enemy, east, and us
    double angleP; // The decimal percentage of the angle

    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578; // Remember, the 57.29578 is to convert from radians to degrees
    angleP = (angleA/360);
    }

    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }

    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }

    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }
    }


    Next, we need to know what to do with that code now we got a Ss stickleback special coming rite up for ya



    To understand, remember that 0 on our X-Look is EASTand that the values go counter-clockwise. Lets revert back to the sectors :

    Sector 1 (SE) = 0xFFFFFFFF (east) - our new value
    Sector 2 (SW) = 0xFFFFFFFF/2 (west) + our new value
    Sector 3 (NW) = 0xFFFFFFFF/2 (west) - our new value
    Sector 4 (NE) = 0 (east) + our new value

    Before we write them though, we have to convert them back to DWORDs, from doubles. Heres the new code :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData();

    double EWdif;
    double NSdif;
    double angleA;
    double angleP;
    double newValue; // To hold our new double value
    DWORD newValue2; // To convert our double back into DWORD ready for writing

    double halfCircle = 0xFFFFFFFF/2; // Just to make the code a bit more readable

    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0xFFFFFFFF - (0xFFFFFFFF*angleP); // As described above
    newValue2 = newValue; // Put it into DWORD (may get compile warnings about losing data..thats the whole reason we’re doing it
    Poke((void*)cP.lookXa, &newValue2,4); // Write our new value
    }

    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0 + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    }

    WOOOO, we now have our X look tracking the enemy we specify (or at least, if you copied and pasted right you should have )

    If youve managed to read this all in 1 go, well done *round of applause*, this ****ers taking me ages to write. Okey doke, snack time again, then its onto setting the Y-look

    //-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//

    Right, for our Y-look its still trig, its still tan, and we still have to make a triangle. This time, imagine we already have X-look locked on them, and are looking straight in front.the point infront which is the same level distance away from us as he is, which is right above/below him. That is 1 point, then our player, then the enemy player. Here is another class drawing (man, I should put this **** on deviantart :-P) :
    This time there are only 2 sectors if the enemy is below us, or above us.
    The distance from us to him along a level view is obtained by pythagoras on the EWdif and NWdif. We then use that, and the UDdif as the Opposite and Adjacent and do the same stuff as before. This time though, we need to include a bit for if the enemy is at the same height as us too
    Heres the updated code :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData();

    double EWdif;
    double NSdif;
    double UDdif;

    double angleA;
    double angleP;
    double angleB;
    double angleBP;

    double newValue;
    DWORD newValue2;

    double newValueb;
    DWORD newValueb2;

    double halfCircle = 0xFFFFFFFF/2;

    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0xFFFFFFFF - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0 + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }

    // Done the X-look, now this is for the Y-look

    double flatDist = sqrt((EWdif*EWdif)+(NSdif*NSdif)); // Get the level distance between us and the enemy, using pythagoras

    if(oP.coordUD == cP.coordUD)
    {
    BYTE zero4[4] = {0×00,0×00,0×00,0 ×00};
    Poke((void*)cP.lookYa,zero4, 4); // If we are equal height, set our Y-look to 0 (level)

    } else if(oP.coordUD > cP.coordUD)
    {
    UDdif = oP.coordUD - cP.coordUD; // Work out our UDdif
    angleB = atan(UDdif/flatDist) * 57.29578; // Same old stuff as before
    angleBP = (angleB/360);
    newValueb = 0 + (0xFFFFFFFF*angleBP);
    newValueb2 = newValueb;
    Poke((void*)cP.lookYa, &newValueb2,4);

    } else if (oP.coordUD < cP.coordUD)
    {
    UDdif = cP.coordUD - oP.coordUD;
    angleB = atan(UDdif/flatDist) * 57.29578;
    angleBP = (angleB/360);
    newValueb = 0xFFFFFFFF - (0xFFFFFFFF*angleBP);
    newValueb2 = newValueb;
    Poke((void*)cP.lookYa, &newValueb2,4);
    }
    }



    So this is basicly the basic aimbot - it will need a bit of work depending on what game
    ****list (only aim for certain people use the name part of the player structure to check if they are on it or not)
    Account for lag (lead bullets infront of people to account for the lag in the game(if its mp), and bullet travel)
    Account for bullet dipping (aim above a player so bullets dip onto them)
    Grenade arcs (workout where to throw grenades in order for them to go on your target)
    Enemy only aim (so you dont aim at team-mates)
    Only aim if alive (shooting dead people doesnt workz}

    I FOUND THESE CODES AND EDITED THEM PLZ TRY AND TELL ME IF THEY WORKED FOR CROSSFIRE.. MAKE A AIMBOT GUYS HAVE FUN
    and plz dont leech it or at least GIve credits to me *coolsidharth*
    thank me if i helped :: phew a lot of typing
    The Privilege of the Dead is not to Die more.

  2. The Following 8 Users Say Thank You to coolsidharth For This Useful Post:

    /b/oss (06-15-2010),DonkeyKing (10-26-2010),haloistaken100 (06-29-2010),joaoxu619 (06-11-2010),jojoko23 (06-08-2010),Lonesome Cowboy (05-28-2010),rodolfgonzales4 (11-02-2010),SLAV7EN (07-14-2012)

  3. #2
    ReZaJwZ's Avatar
    Join Date
    Apr 2010
    Gender
    male
    Location
    Somewere
    Posts
    1,308
    Reputation
    14
    Thanks
    866
    My Mood
    Aggressive
    Old Codes?
    Copy and Paste?

  4. The Following 3 Users Say Thank You to ReZaJwZ For This Useful Post:

    jojoko23 (06-08-2010),rodolfgonzales4 (11-02-2010),thesuker (06-06-2010)

  5. #3
    coolsidharth's Avatar
    Join Date
    Oct 2009
    Gender
    male
    Location
    In my room
    Posts
    2,345
    Reputation
    70
    Thanks
    248
    My Mood
    Tired
    You just try i didnt try i said
    The Privilege of the Dead is not to Die more.

  6. The Following 3 Users Say Thank You to coolsidharth For This Useful Post:

    DonkeyKing (10-26-2010),minireese (06-16-2010),rodolfgonzales4 (11-02-2010)

  7. #4
    Shift++'s Avatar
    Join Date
    May 2010
    Gender
    male
    Location
    Melbourne
    Posts
    45
    Reputation
    10
    Thanks
    3
    Try adding some Code tags

    At the start of the code add [Code]

    And at the end at [Code] but with a / Before Code

  8. #5
    coolsidharth's Avatar
    Join Date
    Oct 2009
    Gender
    male
    Location
    In my room
    Posts
    2,345
    Reputation
    70
    Thanks
    248
    My Mood
    Tired
    Ok ill try adding it will take a lot of editing i guess
    The Privilege of the Dead is not to Die more.

  9. The Following 2 Users Say Thank You to coolsidharth For This Useful Post:

    DonkeyKing (10-26-2010),lacrocz (07-01-2010)

  10. #6
    I got ants in my butt, and I needs to strut.
    Premium Seller
    Former Staff
    Premium Member
    Trusted
    Wyo's Avatar
    Join Date
    Feb 2010
    Gender
    male
    Location
    Guadalajara
    Posts
    24,113
    Reputation
    4354
    Thanks
    4,203
    My Mood
    Lurking
    Code:
    PLAYER_DATA GetMyPlayerData(void)
    PLAYER_DATA GetPlayerData(BYTE PlayerNumber)
    void SetCrosshairOnEnemy(BYTE PlayerNumber) 
    PLAYER_DATA - I like to use some structs as well as functions. I was taught this way by evolution so i got used to it mu PLAYER_DATA structure holds valuable information about a player. Such as:
    Code:
    typedef struct _PLAYER_DATA {
    DWORD baseadd; // base address of this current player
    DWORD coordEW; // East/West (X) co-ord
    DWORD coordNS; // North/South (Y) co-ord
    DWORD coordUD; // Up/Down (Z) co-ord
    DWORD coordEWa; // The address of the players EW co-ord
    DWORD coordNSa; // The address of the players NS co-ord
    DWORD coordUDa; // The address of the players UD (up/down..wth was i thinking when naming this) co-ord
    DWORD lookX; // The players X-axis look (what will change if you move the mouse side to side)
    DWORD lookY; // The players Y-axis look (what will change if you move the mouse forwards and backwards)
    DWORD lookXa; // The address of the X look
    DWORD lookYa; // The address of the Y look
    char name; // Holds the current players name
    DWORD namea; // The address of the current players name
    } PLAYER_DATA; 
    I dont really know why I put all the addresses for everything in the struct, but helloo, might come in use when making something one day. All the stuff in there will come to use when making our aimbot, so heres how to search for each of them (in DFX at least).
    The easiest to start with is name, use Artmoneys Text search
    Co-ords:
    NS - Move north, search increased, move south, search decreased
    EW - Move east, search increased, move west, search decreased
    UD - Move up (a hill/ladder), search increased, move down, search decreased
    LookX - Move mouse left/right, search has changed set your search range to around the other addies to narrow search down (this value may be different to DFX. In DFX, 0 was east, and it increased as you went anti-clockwise until you got to just before east, which was 0xFFFFFFFF)
    LookY - Move mouse forward/backward, search has changed
    You should be able to get the player base address from near enough any of these, and a pointer to get it in game. I use 2 pointers, 1 which always points to player 0s (or 1, the 1st player in memory)s base address, and 1 which always points to the base address of my player. Now we can modify the GetMyPlayerData and GetPlayerData functions to get us this info:
    
    Now at the top of the C++, I define the bases:
    Code:
    #define mBase 0xBD63D8
    #define hBase 0xB0D228
    ///
    PLAYER_DATA GetMyPlayerData(void)
    {
    PLAYER_DATA Player; // Create a blank PLAYER_DATA struct
    ZeroMemory(&Player, sizeof(PLAYER_DATA)); // Initiate it all to 0 (thanks L.Spiro, this solved some problems)
    Peek((void*)mBase,(void*)&Player.baseadd,4); // Get our players Base Address from the pointer
    /*****made by stickleback******/
    Player.coordEWa = Player.baseadd + 0×8; // Get all the addies for everything…the 0×8, 0xC and **** are the offsets I found for DFX
    Player.coordNSa = Player.baseadd + 0xC;
    Player.coordUDa = Player.baseadd + 0×10;
    Player.lookXa = Player.baseadd + 0×14;
    Player.lookYa = Player.baseadd + 0×18;
    Player.namea = Player.baseadd + 0xF4;
    Peek((void*)Player.coordEWa,(void*)&Player.coordEW ,4); // Now we got all the addies, read in the info from em all
    Peek((void*)Player.coordNSa,(void*)&Player.coordNS ,4);
    Peek((void*)Player.coordUDa,(void*)&Player.coordUD ,4);
    Peek((void*)Player.lookXa,(void*)&Player.lookX,4);
    Peek((void*)Player.lookYa,(void*)&Player.lookY,4);
    Peek((void*)Player.namea,(void*)&Player.name,15);
    
    return Player; // Give our PLAYER_DATA Player, as the return value
    }
    ///
    PLAYER_DATA GetPlayerData(BYTE PlayerNum) // Takes the number of the player as a param
    {
    PLAYER_DATA Player;
    ZeroMemory(&Player, sizeof(PLAYER_DATA));
    Peek((void*)hBase,(void*)&Player.baseadd,4);
    
    Player.baseadd = Player.baseadd + (PlayerNum*0×388); // 0×388 is the gap between players, starting with player 1
    
    Player.coordEWa = Player.baseadd + 0×8; 
    Player.coordNSa = Player.baseadd + 0xC;
    Player.coordUDa = Player.baseadd + 0×10;
    Player.lookXa = Player.baseadd + 0×14;
    Player.lookYa = Player.baseadd + 0×18;
    Player.namea = Player.baseadd + 0xF4;
    
    Peek((void*)Player.coordEWa,(void*)&Player.coordEW ,4); 
    Peek((void*)Player.coordNSa,(void*)&Player.coordNS ,4);
    Peek((void*)Player.coordUDa,(void*)&Player.coordUD ,4);
    Peek((void*)Player.lookXa,(void*)&Player.lookX,4);
    Peek((void*)Player.lookYa,(void*)&Player.lookY,4);
    Peek((void*)Player.namea,(void*)&Player.name,15);
    
    return Player;
    }
    /// 
    
    Now that we've made our functions to collect all the data we need, its time to get to the core of the aimbot. This will be some Hcore reading so take a brake and make sure you really suck this in
    This uses Trigganometry
    Maths knowledge is needed to make this! If youre useless at maths, and still reading, youre also useless at english for not understanding the knowledge requirements at the top Lets start with the X look.
    Because DFX works around the East point (, facing Directly east = 00000000/0xFFFFFFFF), then all our calculations will be made off it. To help the understanding with this tutorial, Ill include some snazzy little photoshuppered drawings, woo 
    The aimbot works in 4 sectors. This makes things easier when finding out distances. Here are the sectors and how to determine what sector an enemy is in :
    
    Sector 1 = South-East of our position
    Sector 2 = South-West of our position
    Sector 3 = North-West of our position
    Sector 4 = North-East of our position
    
    So, lets add these sectors to our source code. Note that also we have to tell our aimbot what to do if they are, for example, east of us, but the same on the NS axis. No need to put the code for if they are the same on both the NS and the EW axis, as otherwise you wont need it to set an aim for you, youre on them 
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber); // oP = Opposition’s Player
    PLAYER_DATA cP = GetMyPlayerData(); // cP = Current Player (our player) .. sorry for bad var names 
    
    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    }
    
    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    }
    
    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    }
    
    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    }
    } 
    
    Now, to get the angle we need to look, we have to make a triangle between the EW axis, us, and the player. Then we have to find the angle of which we are the apex. Heres 1 of the snazzy little drawings:
    
    
    
    This is a top view :
    Blue dot = Our player
    Red dot = enemy
    Green = The triangle we make
    Purple = The angle we need to find
    Orange = The differences we need to work out for the angle
    
    Incase youve forgotten Triganometry, then due to the 2 side we can get the easiest we will the Tangent function :
    Tan(angle) = Opposite/Adjacent
    
    In all our sectors, the Adjacent is the EW difference, and the Opposite is the NS difference. So lets add some coding to our function :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData(); 
    
    double EWdif; // These need to be double for our Trig calculations to work later on 
    double NSdif;
    
    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    }
    
    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    }
    
    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    }
    
    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    }
    } 
    
    Please note that in each sector, the calculations ARE NOT the same. You need to do the biggest take away the smallest hope thats obvious. Right, so now we have this, we need to get the angle in degrees. For this, we need to do go back to the formula :
    
    Tan(angle) = Opposite/Adjacent
    Tan(angle) = NSdif/EWdif
    
    We need to do the Inverse Tangent function of this, so that we get the angle rather than the Tangent of the angle. The function to do this is atan (could have used atan2 but didnt know of this function at the time of programming). It takes 1 double parameter, and returns a double value of the angle in radians. But this is no good for us, we want it in degrees. Well, to turn radians into degrees, its a multiplication of, as found off the tinternet Remember to include <math.h> for the atan function 
    
    Then, due to our X-look not having a maximum of 360, it goes upto 0xFFFFFFFF (4294967295), we need to find the percentage what this angle is of 360. This is so that we can find out what value we need to use, for example:
    
    If the angle was 90 degrees
    90/360 = 0.25 (decimal percentage of the angle)
    0xFFFFFFFF * 0.25 = 3FFFFFFF (roughly), which is the new value we need to use 
    
    Lets put this in the code.
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData(); 
    
    double EWdif;
    double NSdif;
    double angleA; // The angle in degrees between the enemy, east, and us
    double angleP; // The decimal percentage of the angle
    
    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578; // Remember, the 57.29578 is to convert from radians to degrees 
    angleP = (angleA/360);
    }
    
    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }
    
    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }
    
    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    }
    } 
    
    
    Next, we need to know what to do with that code now we got a Ss stickleback special coming rite up for ya
    
    
    
    To understand, remember that 0 on our X-Look is EASTand that the values go counter-clockwise. Lets revert back to the sectors :
    
    Sector 1 (SE) = 0xFFFFFFFF (east) - our new value
    Sector 2 (SW) = 0xFFFFFFFF/2 (west) + our new value
    Sector 3 (NW) = 0xFFFFFFFF/2 (west) - our new value
    Sector 4 (NE) = 0 (east) + our new value
    
    Before we write them though, we have to convert them back to DWORDs, from doubles. Heres the new code :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData(); 
    
    double EWdif;
    double NSdif;
    double angleA;
    double angleP;
    double newValue; // To hold our new double value
    DWORD newValue2; // To convert our double back into DWORD ready for writing
    
    double halfCircle = 0xFFFFFFFF/2; // Just to make the code a bit more readable 
    
    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0xFFFFFFFF - (0xFFFFFFFF*angleP); // As described above 
    newValue2 = newValue; // Put it into DWORD (may get compile warnings about losing data..thats the whole reason we’re doing it 
    Poke((void*)cP.lookXa, &newValue2,4); // Write our new value
    }
    
    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0 + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    } 
    
    WOOOO, we now have our X look tracking the enemy we specify (or at least, if you copied and pasted right you should have )
    
    If youve managed to read this all in 1 go, well done *round of applause*, this ****ers taking me ages to write. Okey doke, snack time again, then its onto setting the Y-look 
    
    //-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//
    
    Right, for our Y-look its still trig, its still tan, and we still have to make a triangle. This time, imagine we already have X-look locked on them, and are looking straight in front.the point infront which is the same level distance away from us as he is, which is right above/below him. That is 1 point, then our player, then the enemy player. Here is another class drawing (man, I should put this **** on deviantart :-P) :
    This time there are only 2 sectors if the enemy is below us, or above us.
    The distance from us to him along a level view is obtained by pythagoras on the EWdif and NWdif. We then use that, and the UDdif as the Opposite and Adjacent and do the same stuff as before. This time though, we need to include a bit for if the enemy is at the same height as us too 
    Heres the updated code :
    Code:
    void SetCrosshairOnEnemy(BYTE PlayerNumber)
    {
    PLAYER_DATA oP = GetPlayerData(PlayerNumber);
    PLAYER_DATA cP = GetMyPlayerData(); 
    
    double EWdif;
    double NSdif;
    double UDdif;
    
    double angleA;
    double angleP;
    double angleB;
    double angleBP;
    
    double newValue;
    DWORD newValue2;
    
    double newValueb;
    DWORD newValueb2;
    
    double halfCircle = 0xFFFFFFFF/2;
    
    /*Sec 1*/
    if(oP.coordEW > cP.coordEW && oP.coordNS <= cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0xFFFFFFFF - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    /*Sec 2*/
    if(oP.coordEW <= cP.coordEW && oP.coordNS < cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = cP.coordNS - oP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    /*Sec 3*/
    if(oP.coordEW < cP.coordEW && oP.coordNS >= cP.coordNS)
    {
    EWdif = cP.coordEW - oP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = halfCircle - (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    /*Sec 4*/
    if(oP.coordEW >= cP.coordEW && oP.coordNS > cP.coordNS)
    {
    EWdif = oP.coordEW - cP.coordEW;
    NSdif = oP.coordNS - cP.coordNS;
    angleA = atan(NSdif/EWdif) * 57.29578;
    angleP = (angleA/360);
    newValue = 0 + (0xFFFFFFFF*angleP);
    newValue2 = newValue;
    Poke((void*)cP.lookXa, &newValue2,4);
    }
    
    // Done the X-look, now this is for the Y-look
    
    double flatDist = sqrt((EWdif*EWdif)+(NSdif*NSdif)); // Get the level distance between us and the enemy, using pythagoras
    
    if(oP.coordUD == cP.coordUD)
    {
    BYTE zero4[4] = {0×00,0×00,0×00,0 ×00};
    Poke((void*)cP.lookYa,zero4, 4); // If we are equal height, set our Y-look to 0 (level)
    
    } else if(oP.coordUD > cP.coordUD)
    {
    UDdif = oP.coordUD - cP.coordUD; // Work out our UDdif
    angleB = atan(UDdif/flatDist) * 57.29578; // Same old stuff as before
    angleBP = (angleB/360);
    newValueb = 0 + (0xFFFFFFFF*angleBP);
    newValueb2 = newValueb;
    Poke((void*)cP.lookYa, &newValueb2,4);
    
    } else if (oP.coordUD < cP.coordUD)
    {
    UDdif = cP.coordUD - oP.coordUD;
    angleB = atan(UDdif/flatDist) * 57.29578;
    angleBP = (angleB/360);
    newValueb = 0xFFFFFFFF - (0xFFFFFFFF*angleBP);
    newValueb2 = newValueb;
    Poke((void*)cP.lookYa, &newValueb2,4);
    }
    }

  11. The Following User Says Thank You to Wyo For This Useful Post:

    DonkeyKing (10-26-2010)

  12. #7
    paok2's Avatar
    Join Date
    Sep 2009
    Gender
    male
    Posts
    86
    Reputation
    10
    Thanks
    4
    My Mood
    Fine
    DOES THIS WORK?

  13. #8
    serpentine's Avatar
    Join Date
    Aug 2008
    Gender
    male
    Location
    In your moms bed
    Posts
    1,623
    Reputation
    22
    Thanks
    176
    What is with this you and ECsTaSY both posted and leeched this, wtf? Credits mother fuckers, CREDITS!!
    [IMG]https://i306.photobucke*****m/albums/nn265/chugsweet23/Reverb.png[/IMG]


    Bans: 1337

    .:Gifts:.

    Johhny 3 Tears: [x] [x]

  14. #9
    coolsidharth's Avatar
    Join Date
    Oct 2009
    Gender
    male
    Location
    In my room
    Posts
    2,345
    Reputation
    70
    Thanks
    248
    My Mood
    Tired
    i found these codes and no one to claim,,,
    and serpentine these are NOT your codes
    The Privilege of the Dead is not to Die more.

  15. The Following User Says Thank You to coolsidharth For This Useful Post:

    DonkeyKing (10-26-2010)

  16. #10
    serpentine's Avatar
    Join Date
    Aug 2008
    Gender
    male
    Location
    In your moms bed
    Posts
    1,623
    Reputation
    22
    Thanks
    176
    Quote Originally Posted by coolsidharth View Post
    i found these codes and no one to claim,,,
    and serpentine these are NOT your codes
    I know they are not, I am just wondering why 2 people have posted this without giving credit where credit is due...
    [IMG]https://i306.photobucke*****m/albums/nn265/chugsweet23/Reverb.png[/IMG]


    Bans: 1337

    .:Gifts:.

    Johhny 3 Tears: [x] [x]

  17. #11
    Tnt944's Avatar
    Join Date
    May 2010
    Gender
    male
    Posts
    1
    Reputation
    10
    Thanks
    0
    i dont get it

  18. #12
    ClamPie's Avatar
    Join Date
    Nov 2009
    Gender
    male
    Location
    United States
    Posts
    958
    Reputation
    11
    Thanks
    117
    My Mood
    Aggressive
    Quote Originally Posted by Tnt944 View Post
    i dont get it
    It's code...(that's C++?! Sheesh...I'm a ways off from learning THAT, eh? @__@) If you don't know what it is, or does, I suggest you just let it pass from your memory like I'm about to do since we can't use it for anything...

    *leaves memory in C:\Recycler *
    [IMG]https://i227.photobucke*****m/albums/dd287/Darkwiz666/Signatures/ClampPieSig2.png[/IMG]

    Quote Originally Posted by JohnKun View Post
    fucking noobs these days need to use their brain.exe. for vista users, run as admin.
    Clampie's UGC/Karma Koin Cardshop on indefinite hold...

  19. #13
    Greengo's Avatar
    Join Date
    Dec 2009
    Gender
    male
    Posts
    726
    Reputation
    10
    Thanks
    227
    My Mood
    Inspired
    No, look, eCstacy Re-Posted the Code but in [code] [ /code] type, so the post wouldn't be huge so you'd just have to copy from the [Code] thing, Of course there was no need for EcStacy to give credits since i think it's on the First post.
    InToxicated

  20. #14
    Lonesome Cowboy's Avatar
    Join Date
    Mar 2010
    Gender
    male
    Location
    https://www.mpgh.net Posts: 12,475
    Posts
    5,379
    Reputation
    748
    Thanks
    1,423
    My Mood
    Brooding
    [php]Put the final code in a box like this![/php]


    (the php button)
    Minecraft Wiki Manager since: 2012.12.16.
    Games Wiki Manager since: 2012.12.16
    Minecraft Section Minion: 2013.05.04.-2014.05.04
    League of Legends Section Minion: 2013.05.04.-2014.05.04
    Need for Speed World Minion: 2013.07.23.-2014.05.04
    Steam Games Section Minion: 2013.08.05.
    -2014.05.04
    Warrock Section Minion: 2013.10.09.
    -2014.05.04

    If you would like to become a Minecraft Wiki Editor, apply here!
    If you would like to become a Games Wiki Editor, PM me!

    Gifts:
    Gyongytyuk,Gyongytyuk,Zaps

  21. #15
    coolsidharth's Avatar
    Join Date
    Oct 2009
    Gender
    male
    Location
    In my room
    Posts
    2,345
    Reputation
    70
    Thanks
    248
    My Mood
    Tired
    You guys didnt even thank me for these useful codes
    The Privilege of the Dead is not to Die more.

  22. The Following 2 Users Say Thank You to coolsidharth For This Useful Post:

    DonkeyKing (10-26-2010),tambre (05-28-2010)

Page 1 of 3 123 LastLast

Similar Threads

  1. what are source codes used for
    By lagathon121 in forum CrossFire Help
    Replies: 0
    Last Post: 07-19-2010, 06:19 PM
  2. Visual Basic Aimbot Source Code
    By whitten in forum Visual Basic Programming
    Replies: 19
    Last Post: 08-05-2009, 10:39 AM
  3. My Aimbot source code!
    By wertoskiller in forum Combat Arms Hacks & Cheats
    Replies: 8
    Last Post: 07-27-2009, 04:46 PM
  4. vb AImbot! No tut only source code!
    By reversflux in forum Visual Basic Programming
    Replies: 6
    Last Post: 07-20-2009, 10:07 AM
  5. Exteel Aimbot Script Source Code
    By Trip-FX in forum General Game Hacking
    Replies: 15
    Last Post: 05-21-2009, 01:09 PM