Fortnite Python Cheat

Статус
В этой теме нельзя размещать новые ответы.
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
2 Апр 2017
Сообщения
2,544
Реакции[?]
1,203
Поинты[?]
41K
Функции:

- Сокращение отдачи у оружия
- Анти-Блум
- Контроль скорости выстрелов и авто выстрел.
- Быстрая смена оружия
- Бинд на быстрый выстрел
- AR Perfect Aim (100% попадание первого выстрела).
- И прочее...


Сам скрипт:

Код:
=====
 
Kwskii
 
## Features
 
Options;
-  Per Weapon Recoil Reduction
-  Per Weapon Anti Bloom
-  Per Weapon Fire Rate Control and Autofire
-  Fast Weapon Switching using Animation Canceling
-  Quick Shoot Hotkey using Animation Canceling
-  Turbo use Option to Autofire Use when the button is held down
-  AR Perfect Aim 100% First Shot Accuracy
-  Fast Edit Reset to automaticly stop editing upon rightclick
 
Always On Features;
-  Auto Reload Cancel on Weapon Switch or Use
 
 
 
## Usage
 
Start Script in CMD Window
 
"""
# TODO
# -Add Keybinds to select weapon loadout
# -Tune Weapon Defs
# -Add LMG Def
# -Add Couch Peek
# -Add type checker in Quick_Shoot to check if pump or rocket, etc
# -Add Key Handlers like jump, escape, map, inventory, build, edit, crouch, reload
# -Add Turbofarming
 
# -Add Fast_Shoot time to Weapon Defs
# -Add Crouch Modifier to Weapon Defs
 
#Current Bugs;
 
#Bug #1:
#Effect: When Hip Firing with Recoil compensation aiming the weapon upward causes the anti recoil to over compensate.
 
#Imports:
from time import gmtime, strftime, sleep, time
from ctypes import windll, c_uint, Structure, c_long, byref
from win32api import GetKeyState, GetAsyncKeyState
import mouse
import keyboard
import weapon
 
#Weapon_Tables Init
nowep = weapon.Weapon("None")
Pickaxe = weapon.Weapon("Pickaxe")
AR = weapon.Weapon("AR")
SCAR = weapon.Weapon("SCAR")
BURST = weapon.Weapon("BURST")
PUMP = weapon.Weapon("PUMP")
TAC = weapon.Weapon("TAC")
HEAVY = weapon.Weapon("HEAVY")
SMG = weapon.Weapon("SMG")
S_SMG = weapon.Weapon("S_SMG")
TOMMYGUN = weapon.Weapon("TOMMYGUN")
P90 = weapon.Weapon("P90")
HR = weapon.Weapon("HR")
BOLT = weapon.Weapon("BOLT")
SAR = weapon.Weapon("SAR")
ROCKET = weapon.Weapon("ROCKET")
NADES = weapon.Weapon("NADES")
HEAL = weapon.Weapon("HEAL")
 
#Settings;
 
#Debug:
Debug = True #Debug Mode, used for Output of Debug Info.
Debug_Movement = False #If Debug Mode is On, output Mouse Movement Info.
Debug_Buttons = True #If Debug Mode is On, output Mouse Button Activity.
Debug_Wheel = False #If Debug Mode is On, output Mouse Wheel Movement Info.
Debug_Keyboard = False #If Debug Mode is On, output Keyboard Activity.
 
 
#Features;
 
#General:
Option_AR_Perfect_Aim = False #If Enabled, causes constant First Shot Accuracy with AR when in ADS.
Option_Fast_Weapon_Switch = True #If Enabled, causes the Weapon Pullout Animation Cancel to be done on every weapon switch.
Option_Reload_Canceling = True #If Enabled, causes an Animation Cancel to occur if reloading when attempting to use.
 
#Quick Shoot:
Option_Quick_Shoot = True #If Enabled, allows an instant fire of a specific weapon choosen below.
if Option_Quick_Shoot:
    Quick_Shoot_Default_Weapon = PUMP
QuickShoot_Fire_Attempts = 40 #(Delay is 10ms so loop of 40 is around 400ms).
 
#Turbo Use:
Option_Turbo_Use = True #When Enabled, causes the use Key to Autofire when held down.
Delay_Turbo_Use = 0.060 #Time inbetween autofire + the natural 20ms delay for the keypress.
 
#Editing:
Option_Fast_Edit_Reset = True #When the Reset Edit Button is Pressed, Instantly exit edit mode.
 
#Ghost Peaking(TODO):
Use_Ghost_Peaking = True #If Enabled, uses a Modifier Key to enable fast crouching while shooting.
Ghost_Peak_Delay = 100 #Time between Ghost Peak Shots.
 
#Fast Farming(TODO):
Fast_Farming = False #If Enabled, Uses a Button to activate "Current Farming Exploit".
Turbofarm_Activation_Window = 300 #Delay from pressing "Farming_Button" to start Normal Farming instead of turbo.
Turbofarm_Fast_Swing_Delay = 200
Turbofarm_Emote_Time = 70
Turbofarm_Slow_Swing_Delay = 400
Turbofarm_Emote_Cancel_Delay = 300
STWAF = False #If Enabled, Switch to a Weapon of Choice after Farming.
STWAF_WeaponSlot = 1 #Weapon to Switch to after Farming.
 
#Anti Recoil:
Use_No_Recoil_ADS = True #If Enabled, Reduces Recoil when ADS Firing.
Use_No_Recoil_Hipfire = True #If Enabled, Reduces Recoil when Hip Firing.
Use_Jitter = True #If Enabled, Moves the Aim back and forth while firing.
 
#Weapon Slot Options
Default_Ingame_Weapon_Slot1 = AR
Default_Ingame_Weapon_Slot2 = PUMP
Default_Ingame_Weapon_Slot3 = SMG
Default_Ingame_Weapon_Slot4 = HR
Default_Ingame_Weapon_Slot5 = HEAL
 
#-------------------------------
#Keybinds;
#-------------------------------
 
#Macro Related;
#-------------------------------
 
#General:
Keybind_Fire = "left" #Key to Shoot Weapons.
 
#Key to Fast Fire Pre Set Weapon.
if Option_Quick_Shoot:
    Keybind_QuickShoot_Button = "x2"
    Keybind_QuickShoot_Button_Code = 0x06
 
Keybind_Enable = "middle" #Key to Enable/Disable the Macro.
Keybind_Edit = "alt" #Desired Key to go into edit mode.(Must have In-game set to alternate).
Keybind_Use = "f" #Desired key for Use.
if Option_Turbo_Use:
    Keybind_Use_Key_Code = 0x46
 
#Weapon Keybinds Part 1 (Macro)
#-----------------------------------------------
#Set these to the same as in-game if not using fast weapon switching.
#If using fast weapon switching set these to your desired keys for each slot-
#and scroll down to set the alternate in game key binds so the fast switch can work.
Keybind_Weapon_Slot1 = "2"
Keybind_Weapon_Slot2 = "3"
Keybind_Weapon_Slot3 = "4"
Keybind_Weapon_Slot4 = "z"
Keybind_Weapon_Slot5 = "x"
Keybind_Weapon_Pickaxe = "l"
 
#Ingame;
#These Keybinds should match the ones set in game.
#-------------------------------
 
#General:
Ingame_Keybind_Jump = "space"
Ingame_Keybind_Crouch = "shift" #Ingame Keybind set for Crouch.
Ingame_Keybind_Fire = "k" #Ingame Keybind set to Fire(Not Mouse1!!!).
if Option_Turbo_Use:
    Ingame_Keybind_Use = "i"
else:
    Ingame_Keybind_Use = Keybind_Use
Ingame_Keybind_Reload = "r"
 
#Weapon Keybinds Part 2 (In-game)
# Fast Weapon Switching:
#-------------------------------------------------
#Used ONLY when Option_Fast_Weapon_Switch is Enabled.
#Fast Weapon Switching is Required to have intermedary control over the weapon keys so-
#they need to be set to something different in-game.
#Ignore this Section if not using Fast Weapon Switching.
if Option_Fast_Weapon_Switch == True:
    Ingame_Weapon_Slot1 = "p"
    Ingame_Weapon_Slot2 = "6"
    Ingame_Weapon_Slot3 = "7"
    Ingame_Weapon_Slot4 = "8"
    Ingame_Weapon_Slot5 = "9"
    Ingame_Weapon_Pickaxe = "0"
else:
    Ingame_Weapon_Slot1 = Keybind_Weapon_Slot1
    Ingame_Weapon_Slot2 = Keybind_Weapon_Slot2
    Ingame_Weapon_Slot3 = Keybind_Weapon_Slot3
    Ingame_Weapon_Slot4 = Keybind_Weapon_Slot4
    Ingame_Weapon_Slot5 = Keybind_Weapon_Slot5
    Ingame_Weapon_Pickaxe = Keybind_Weapon_Pickaxe
 
#Other Weapons
Weapon_Trap = "5" #Actual In-game Keybind used to select traps.
 
#Building:
Ingame_Keybind_Ramp = "e" #Actual Ingame Keybind set for Ramp.
Ingame_Keybind_Wall = "x" #Actual Ingame Keybind set for Wall(Thumb Button 2 on Logetech G502).
Ingame_Keybind_Platform = "q" #Actual Ingame Keybind set for Platform.
Ingame_Keybind_Roof = "[" #Actual Ingame Keybind set for Roof.
 
#Editing:
Ingame_Keybind_Edit = "]" #Alternate Ingame Keybind set for Edit.
Ingame_Keybind_Edit_Reset = "right" #Actual Ingame Keybind set for Edit Reset.
 
#Emoting:
Keybind_EmoteWheel_Up = "up"
Keybind_EmoteWheel_Down = "down"
Keybind_Emote = "n"
Keybind_FastEmote1 = "f1"
Keybind_FastEmote2 = "f2"
Keybind_FastEmote3 = "f3"
 
 
#Globals:
global Running
global Enabled
global Current_Weapon
global Current_Loadout
global JitterFlop
global Editing
global Building
global Crouching
global Jumping
global Reloading
global Using
 
#Main Functions;
 
#Main Function: Gets run at start after init.
def main():
    # Print out a List of the Globals to Check Inits.
    DebugPrint('Printing Globals List:')
    DebugPrintGlobals()
   
    #Hook Logical Mouse Events.
    DebugPrint('Hooking Mouse Input')
    mouse.hook(Mouse_Input)
   
    #Hook Logical Keyboard Events.
    DebugPrint('Hooking Keyboard Input')
    keyboard.hook(Keyboard_Input)
 
 
#Helper Functions;
 
#Move Mouse:  Moves Mouse Relative to Current Location.
def Move_Mouse(x, y):
    windll.user32.mouse_event(
        c_uint(0x0001),
        c_uint(x),
        c_uint(y),
        c_uint(0),
        c_uint(0)
    )
 
class POINT(Structure):
    _fields_ = [("x", c_long), ("y", c_long)]
   
def queryMousePosition():
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return pt  
 
#Cancel Anim: Cancels Weapon Switching Animation and Pickaxe Swings.
def Cancel_Anim(Weapon, Emote_Bind):
    #Emote to cancel pull out animation.
    keyboard.press(Emote_Bind);
    sleep(0.100);
    #Switch to Desired Weapon.
    Switch_to_Weapon(Weapon)
    sleep(0.020);
    keyboard.release(Emote_Bind);
    sleep(0.030);
   
#Converts Inventory Slot ID to actual weapon slot.
def InvSlot_to_WeaponKeybind(InvSlot):
    if InvSlot == 0:
        return Ingame_Weapon_Slot1
    if InvSlot == 1:
        return Ingame_Weapon_Slot2
    if InvSlot == 2:
        return Ingame_Weapon_Slot3
    if InvSlot == 3:
        return Ingame_Weapon_Slot4
    if InvSlot == 4:
        return Ingame_Weapon_Slot5
   
#Check Quick Shoot Button Function.
def isPressed_QuickShoot_Button():
    QuickShoot_Button_State = GetKeyState(Keybind_QuickShoot_Button_Code)
    DebugPrint("MB6:{0}".format(QuickShoot_Button_State))
    if QuickShoot_Button_State < 0:
        return True
    return False
 
def Toggle_Enabled():
    global Enabled
    if Enabled:
        Enabled = False
    else:
        Enabled = True
    DebugPrint("Enabled changed to {0}".format(Enabled))
 
#Debug PrintFunction: Print's Debug Output if Debug is Enabled.
def DebugPrint(s):
    if Debug:
        print("{0}:{1}".format(strftime("%H:%M:%S", gmtime()),s));
       
def DebugPrintGlobals():
    for k, v in globals().items():
        print("{0} = {1}".format(k, v))
 
#Turbo Use Function: Sends the Use Event as long as the Use key is held down.
def Turbo_Use():
    global Reloading
    global Using
   
    #Check if we are Reloading and want to use Reload Canceling.
    if Reloading and Option_Reload_Canceling:
        #Since we are canceling the Reload, set global to false.
        Reloading = False
        Using = False
       
        #Switch Directly to Pickaxe to Cancel the Reload.
        keyboard.send(Ingame_Weapon_Pickaxe);
        sleep(0.020);
       
        #Switch Back to the Weapon we had before the Animation Cancel.
        Switch_to_Weapon(Current_Weapon)
       
    #Check if we are'nt already Using.
    if not Using:
        Using = True
        DebugPrint("Detected Use Action")
       
        #Handle Turbo Use Action.
        if Option_Turbo_Use:
           
            overrun = 400
            #While Use Key is Down Loop.
            while True:
                #Overrun Protection.
                overrun = overrun - 1
                if overrun == 0:
                    break
               
                sleep(0.020) #Sleep To prevent GetKeyState Lockup.
               
                if windll.user32.GetKeyState(Keybind_Use_Key_Code) >= 0:
                    break
               
                DebugPrint("Sending Turbo Use Action")
               
                #Send Use Action.
                keyboard.press(Ingame_Keybind_Use)
                sleep(0.020)
                keyboard.release(Ingame_Keybind_Use)
               
                #Delay a Pre Set amount.
                sleep(Delay_Turbo_Use)
        else:
            print("Sending Use Action")          
            keyboard.send(Ingame_Keybind_Use)
            sleep(0.080)
       
 
#Shooting Functions;
 
#Quick_Shoot: Quick Switches to Desired Weapon, pulls trigger and then switches back.
def Quick_Shoot(Weapon):
    global Editing
    global Building
    global Reloading
   
    #Set Building and Editing to False since we are now shooting.
    Building = False
    Editing = False
   
    #Store our Current Weapon so we can return to it after Quick.
    OldWeapon = Current_Weapon
    print("Insta Shooting {0}".format(Weapon.name))
   
    #Loop Until Button is Detected
    while True:
        if not isPressed_QuickShoot_Button():
            break #Break to Handle Quick Shoot.
        sleep(0.100)
   
    #Check if we are ADS
    MB2_State = GetKeyState(0x02)
    DebugPrint("Checking for MB2 or Reload")
    if MB2_State < 0 or Reloading:
        #We are ADS and trying to shoot with No Recoil.
        DebugPrint("Detected MB2 for ADS or Reloading")
        keyboard.send(Ingame_Weapon_Pickaxe);
        sleep(0.020);
   
    #Since we are shooting and have canceled any reload anim by now set it to false.
    Reloading = False
 
    #Emote to cancel pull out animation.
    Cancel_Anim(Weapon, Keybind_FastEmote3)
   
    count = 0
    #Loop while Attempting to Fire at a specified count.
    while True:
        count = count + 1
        if count == QuickShoot_Fire_Attempts:
            break #Break when we have hit the end of the delay.
        #Send Fire Event.
        keyboard.send(Ingame_Keybind_Fire)
        DebugPrint("Firing Fast")
        sleep(0.010)
    #Switch back to Weapon that was Active before the Fast Shoot.
    Switch_to_Weapon(OldWeapon)
    sleep(0.100)
    #Check if MB1 is still down.
    Handle_MB1_Down()
   
#Fire: Handles No Recoil and Anti Bloom
def Fire(ADS, Recoil):
    global JitterFlop
    global Crouching
    global Reloading
   
    #Init Locals
    local_Jitter = 0
    local_Jitter_ADS = 0
   
    #We are Shooting and not reloading so set global to False
    Reloading = False
   
    Local_Mouse_Pos = queryMousePosition()
   
    DebugPrint("Sending Simulated Fire Event")
    keyboard.press(Ingame_Keybind_Fire) #Send the input to fire the weapon
    sleep(0.020) #Delay to ensure the fire button gets recognized by the game
       
    if Current_Weapon.name != "Pickaxe" and (Current_Weapon.type == "AR" or Current_Weapon.type == "SMG"):
       
        #We are Shooting with Fire Button Down and without a Pickaxe
        if Current_Weapon.ControlFireRate:
            #Release the Fire Button if we are controlling Fire Rate
            keyboard.release(Ingame_Keybind_Fire)
           
        #If Fire has beeen called with the Recoil Bool then we can compensate
        if Recoil:
            #We are not Pickaxing and wanting to use Jitter so set it based on weapon
            if Use_Jitter:
                if JitterFlop == False:
                    JitterFlop = True
                    local_Jitter = Current_Weapon.jitter
                    local_Jitter_ADS = Current_Weapon.jitter_ADS
                else:
                    JitterFlop = False
                    local_Jitter = Current_Weapon.jitter * -1
                    local_Jitter_ADS = Current_Weapon.jitter_ADS * -1                
            if Current_Weapon.firstshot == 0:
                Current_Weapon.firstshot = time()
                print("firstshot: {0}".format(time()))  
                if ADS:
                    #mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
                    Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)
                else:
                    print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                    Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
            else:
                difference = time() - Current_Weapon.firstshot
                print("Not firstshot, Difference: {0}".format(difference))
                if ADS:
                    #mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
                    if difference >= Current_Weapon.recoil_ADS_Init_Delay:
                        Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static)
                    else:
                        Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)                    
                else:
                    if difference >= Current_Weapon.recoil_Hip_Init_Delay:
                        print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                        Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Static)
                    else:
                        print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                        Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
                #mouse.move(local_Jitter, Current_Weapon.recoil_Hip_Static, absolute=False, duration=Current_Weapon.update_time)
    DebugPrint("Done Sending Simulated Fire Event")
   
#Switch to Weapon: Finds Weapon in Current Loadout and Switches to it
def Switch_to_Weapon(Weapon):
    global Editing
    global Building
    global Current_Weapon
    global Reloading
 
    if Weapon == Current_Weapon and not Building and not Editing:
        return 2 #Return Error:2 Which means Weapon is Already Out.
   
    #Check if we are trying to switch to the Pickaxe.
    if Weapon.name == "Pickaxe":
        DebugPrint("Attempting to Switch Weapon to Pickaxe")
       
        #Send Event to Switch to Pickaxe.
        keyboard.send(Ingame_Weapon_Pickaxe)
       
        #Set the Global to the new weapon.
        Current_Weapon = Weapon
       
        #Reset Globals.
        Building = False
        Editing = False
        Reloading = False
       
        return 1 #Return 1 for Success.
    else: #We are trying to switch to another weapon other than the pickaxe.
       
        DebugPrint("Attempting to Switch Weapon\nSearching for Weapon:{0} in Current Loadout".format(Weapon.name))
       
        #Parse the Players Current Loadout for the Weapon.
        for i in range(len(Current_Loadout)):
            DebugPrint("Checking Inventory Slot{0}\nFound: {1}".format(i, Current_Loadout[i].name))
           
            if Current_Loadout[i].name == Weapon.name:
                DebugPrint("Found Weapon, Attempting Switch")
               
                #Switch to the Found weapon
                keyboard.send(InvSlot_to_WeaponKeybind(i))
               
                #Set the Global to the new weapon.
                Current_Weapon = Weapon
               
                #Reset Globals.
                Building = False
                Editing = False
                Reloading = False
               
                return 1 #Return 1 for Success.
            elif i >= 5: #We have reached the end of the Loadout.
                break #Break to return 3 Error.
    return 3 #Return 3 Which means Unknown Error.
   
#Handle Mouse Button 1 Down, Pretty much the Bread and Butter
#TODO need to find a better way to check MB1, MB2 and MB6 so it doesnt use Win32API
def Handle_MB1_Down():
   
    #Locals
    ADS = False
    overrun = 0
   
    #Debug Out
    DebugPrint("MB1 Event Detected")
   
    #Loop While MB1 is down and fast shoot button is not pressed
    while True:
        #Prevent Infinite Loop from an Overrun Error.
        overrun = overrun + 1
        if overrun >= 4000:
            Current_Weapon.firstshot = 0 #Reset First Shot Timer
            keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
            break #Break if we hit overrun
       
        #Use Win32API to get state of MB1 and MB2 because mouse.is_pressed() is retarted
        MB1_State = GetKeyState(0x01)
        DebugPrint("Checking if MB1 is Still Down")
        #Check if MB1 is still down both Logically and Hardware Based
        if MB1_State >= 0 and GetAsyncKeyState(0x01) == 0:
            Current_Weapon.firstshot = 0 #Reset First Shot Timer
            DebugPrint("MB1 Button Released, State: {0}".format(MB1_State))
            keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
            break #Break if we are not pressing MB1 Anymore
        else:
            DebugPrint("MB1 Still Detected, State: {0}".format(MB1_State))  
       
        #Check if we are in Pickaxe Mode
        if Current_Weapon.name == "Pickaxe":
           
            #Check if Quick Shoot Button is Pressed
            if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                break #Break to Handle Quick Shoot
           
            DebugPrint("Swinging Pickaxe")
            Fire(False, False) # Send Command to Swing Pickaxe
           
            #FastFarming would go here
           
            #if we are using Quick shoot then we need to check every 10ms during the pickaxe swing delay
            if Option_Quick_Shoot:
                count = 20 # 20x10ms = 200ms (Current Optimal Pickaxe Swingtime)
                while True:
                    count = count - 1
                    if count <= 0:
                        break #Break to Swing the Axe again
                    if isPressed_QuickShoot_Button():
                        break #Break to Handle Quick Shoot
                    sleep(0.010)
            else: #Not using Quickshoot so just delay 200ms
                sleep(0.200)
               
        else: # Trying to Fire something that is not a pickaxe
           
            #Check if we are trying to Quick Shoot
            if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                Current_Weapon.firstshot = 0 #Reset First Shot Timer
                if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                    keyboard.release(Ingame_Keybind_Fire)
                break #Break to Handle Quick Shoot
           
            #Check if we are ADS.
            MB2_State = GetKeyState(0x02)
            DebugPrint("Checking for MB2")
            #Check for MB2 both Logically and Hardware Based
            if MB2_State < 0 and GetAsyncKeyState(0x02) == 1:
                #We are ADS and trying to shoot with No Recoil
                DebugPrint("MB2 is Detected, Setting ADS to True")
                ADS = True
            else:
                ADS = False
           
            #Check if we should use anti recoil for hipfire
            if Use_No_Recoil_Hipfire and not ADS:
                #Hipfire No Recoil
                DebugPrint("Hipfire Reducing")
                Fire(False, True)
               
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
               
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.update_time)
            elif ADS and Use_No_Recoil_ADS:
                #ADS, No Recoil
                DebugPrint("ADS Reducing")
                Fire(True, True)
               
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
               
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.update_time_ADS)
            else:
                #No Recoil Mode Off
                DebugPrint("Not Reducing")
                Fire(False, False)
               
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
               
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.delay_time)
               
           # if Current_Weapon.ControlFireRate == False:
           #     Current_Weapon.firstshot = 0
           #     keyboard.release(Ingame_Keybind_Fire)
           # break
   
#Keyboard Hook Callback Function: Gets run when Keyboard activity is detected.  
def Keyboard_Input(Keyboard_Event):
    global Editing
    global Building
    global Crouching
    global Jumping
    global Reloading
    global Using
   
    if type(Keyboard_Event) == keyboard._keyboard_event.KeyboardEvent:
        #Debug Output
        if Debug_Keyboard:
            DebugPrint("Keyboard_Event: Key:{0},Scancode:{1}, Action:{2},Modifier:{3} Time:{4}".format(Keyboard_Event.name,Keyboard_Event.scan_code, Keyboard_Event.event_type, Keyboard_Event.modifiers, Keyboard_Event.time))
         
        #Weapon Slot 1
        if Keyboard_Event.name == Keybind_Weapon_Slot1 and Keyboard_Event.event_type == "down" and Enabled:
           
            #Get Weapon in Slot 1 of Inventory
            TargetWeapon = Current_Loadout[0]
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":              
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);
                Switch_to_Weapon(TargetWeapon)
               
        #Weapon Slot 2                  
        elif Keyboard_Event.name == Keybind_Weapon_Slot2 and Keyboard_Event.event_type == "down" and Enabled:
           
            #Get Weapon in Slot 2 of Inventory
            TargetWeapon = Current_Loadout[1]
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":              
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);              
                Switch_to_Weapon(TargetWeapon)
               
        #Weapon Slot 3      
        elif Keyboard_Event.name == Keybind_Weapon_Slot3 and Keyboard_Event.event_type == "down" and Enabled:
           
            #Get Weapon in Slot 3 of Inventory
            TargetWeapon = Current_Loadout[2]
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":              
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);              
                Switch_to_Weapon(TargetWeapon)
               
        #Weapon Slot 4                
        elif Keyboard_Event.name == Keybind_Weapon_Slot4 and Keyboard_Event.event_type == "down" and Enabled:
           
            #Get Weapon in Slot 4 of Inventory
            TargetWeapon = Current_Loadout[3]
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":              
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);              
                Switch_to_Weapon(TargetWeapon)
               
        #Weapon Slot 5      
        elif Keyboard_Event.name == Keybind_Weapon_Slot5 and Keyboard_Event.event_type == "down" and Enabled:
           
            #Get Weapon in Slot one of Inventory
            TargetWeapon = Current_Loadout[4]
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":              
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);              
                Switch_to_Weapon(TargetWeapon)
               
        #Weapon Slot Pickaxe              
        elif Keyboard_Event.name == Keybind_Weapon_Pickaxe and Keyboard_Event.event_type == "down" and Enabled:
           
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch:              
                if Pickaxe != Current_Weapon or (Building or Editing):
                    Cancel_Anim(Pickaxe, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                Switch_to_Weapon(Pickaxe)
               
        #Edit Keybind Handling
        elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "down" and Enabled:
            #Set the Edit flag
            if not Editing:
                keyboard.send(Ingame_Keybind_Edit)
            DebugPrint("Detected Editing")                
            Editing = True  
        elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "up" and Enabled:
            #Set the Edit flag
            if Editing:
                keyboard.send(Ingame_Keybind_Edit)
            DebugPrint("Finished Editing")
            Editing = False
           
        #Building Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Ramp and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")          
            #Set the Building flag
            Building = True
        elif Keyboard_Event.name == Ingame_Keybind_Platform and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")
            #Set the Building flag
            Building = True
        elif Keyboard_Event.name == Ingame_Keybind_Roof and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")
            #Set the Building flag
            Building = True
       
        #Cruching Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Crouch and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Crouching")
            #Set the Building flag
            if Crouching:
                Crouching = False
            else:
                Crouching = True
               
        #Jumping Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Jump and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Jumping")
            #Set the Jumping Global to Current Time.
            Jumping = time()
            #Set the Crouching Global to False since if jumping we are not crouching.
            Crouching = False
           
        #Reload Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Reload and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Reloading")
            Reloading = True
       
        #Use Keybind Handling
        elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "down" and Enabled:
            Turbo_Use()
        elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "up" and Enabled:
            Using = False
            DebugPrint("Detected End of Use Action")
 
#Mouse Hook Callback Function: Gets run when Mouse activity is detected.
def Mouse_Input(Mouse_Event):
    global Editing
    global Building
   
    if Running:
        #Mouse Wheel Event.
        if type(Mouse_Event) == mouse._mouse_event.MoveEvent:
            if Debug_Movement:
                DebugPrint("Move_Event: x:{0}, y:{1}, Time:{2}".format(Mouse_Event.x, Mouse_Event.y, Mouse_Event.time))
       
        #Mouse Button Event.
        elif type(Mouse_Event) == mouse._mouse_event.ButtonEvent:
           
            if Debug_Buttons:
                DebugPrint("Button_Event: Type:{0}, Button:{1}, Time:{2}".format(Mouse_Event.event_type, Mouse_Event.button, Mouse_Event.time))
           
            #Handle MouseButton1 Down Event
            if Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Fire and Enabled:
                #Only Handle MB1 for Weapons so if building or editing then we dont want to control it.
                if not Editing and not Building:
                    Handle_MB1_Down()
           
            #Handle MouseButton2 Down Event
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Edit_Reset and Enabled:
                #Fast Edit Reset:
                if Editing and Option_Fast_Edit_Reset:
                   
                    #If we are editing and right click with Fast Reset enabled then exit edit mode.
                    keyboard.send(Ingame_Keybind_Edit)
                    DebugPrint("Finished Editing with Quick Reset")                  
                    Editing = False                  
           
            #Handle Quick Switch Weapon
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_QuickShoot_Button and Enabled:
                Quick_Shoot(PUMP)                  
         
           #Handle Enable Eventv
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Enable:
                Toggle_Enabled()
           
            #Handle Building Event
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Wall:
                DebugPrint("Detected Building")
                Building = True
       
        elif type(Mouse_Event) == mouse._mouse_event.WheelEvent:
            if Debug_Wheel:
                DebugPrint("Wheel_Event: Delta:{0}, Time:{1}".format(Mouse_Event.delta, Mouse_Event.time))
 
def Init_Weapons():
    #AR
    #Info;
    #Advertised Fire Rate = 181.81ms (5.5)
    AR.recoil_Hip_Init = 21
    AR.recoil_Hip_Init_Delay = 0.340
    AR.recoil_Hip_Static = 23
    AR.recoil_ADS_Init = 30
    AR.recoil_ADS_Init_Delay = 0.330  
    AR.recoil_ADS_Static = 1
    AR.jitter = 0
    AR.jitter_ADS = 0
    AR.update_time = 0.040 #+0.020
    if Option_AR_Perfect_Aim:
        AR.update_time_ADS = 0.330
    else:
        AR.update_time_ADS = 0.040  
    AR.firstshot = 0.0
    AR.ControlFireRate = True
    AR.type = "AR"
    #SCAR
    SCAR.recoil_Hip_Init = 21
    SCAR.recoil_Hip_Init_Delay = 0.340
    SCAR.recoil_Hip_Static = 23
    SCAR.recoil_ADS_Init = 30
    SCAR.recoil_ADS_Init_Delay = 0.330  
    SCAR.recoil_ADS_Static = 1
    SCAR.jitter = 0
    SCAR.jitter_ADS = 0
    SCAR.update_time = 0.040
    SCAR.update_time_ADS = 0.330
    SCAR.firstshot = 0.0
    SCAR.ControlFireRate = True
    SCAR.type = "AR"
    #BURST
    BURST.recoil_Hip_Init = 150
    BURST.recoil_Hip_Static = 100
    BURST.recoil_ADS_Init = 125
    BURST.recoil_ADS_Static = 70
    BURST.jitter = 2
    BURST.jitter_ADS = 2
    BURST.update_time = 10
    BURST.update_time_ADS = 10
    BURST.firstshot = 0
    BURST.type = "AR"  
    #PUMP
    PUMP.firstshot = 0
    PUMP.type = "Shotgun"
    #TAC
    TAC.firstshot = 0
    TAC.type = "Shotgun"
    #HEAVY
    HEAVY.firstshot = 0
    HEAVY.type = "Shotgun"
    #SMG
    SMG.recoil_Hip_Init = 4
    SMG.recoil_Hip_Init_Delay = 0.160
    SMG.recoil_Hip_Static = 8
    SMG.recoil_ADS_Init = 5
    SMG.recoil_ADS_Init_Delay = 0.160
    SMG.recoil_ADS_Static = 1
    SMG.jitter = 10
    SMG.jitter_ADS = 2
    SMG.update_time = 0.010
    SMG.update_time_ADS = 0.010
    SMG.firstshot = 0.0
    SMG.ControlFireRate = False
    SMG.type = "SMG"
    #SILENCEDSMG
    S_SMG.recoil_Hip_Init = 150
    S_SMG.recoil_Hip_Static = 100
    S_SMG.recoil_ADS_Init = 125
    S_SMG.recoil_ADS_Static = 70
    S_SMG.jitter = 2
    S_SMG.jitter_ADS = 2
    S_SMG.update_time = 10
    S_SMG.update_time_ADS = 10
    S_SMG.firstshot = 0
    S_SMG.type = "SMG"
    #TOMMYGUN
    TOMMYGUN.recoil_Hip_Init = 150
    TOMMYGUN.recoil_Hip_Static = 100
    TOMMYGUN.recoil_ADS_Init = 125
    TOMMYGUN.recoil_ADS_Static = 70
    TOMMYGUN.jitter = 2
    TOMMYGUN.jitter_ADS = 2
    TOMMYGUN.update_time = 10
    TOMMYGUN.update_time_ADS = 10
    TOMMYGUN.firstshot = 0
    TOMMYGUN.type = "SMG"
    #P90
    P90.recoil_Hip_Init = 150
    P90.recoil_Hip_Static = 100
    P90.recoil_ADS_Init = 125
    P90.recoil_ADS_Static = 70
    P90.jitter = 2
    P90.jitter_ADS = 2
    P90.update_time = 10
    P90.update_time_ADS = 10
    P90.firstshot = 0
    P90.type = "SMG"
    #Hunting Rifle
    HR.firstshot = 0
    HR.type = "Sniper"
    #Bolt Rifle
    BOLT.firstshot = 0
    BOLT.type = "Sniper"
    #Scoped AR
    SAR.firstshot = 0
    SAR.type = "Sniper"
    #Rockets
    ROCKET.firstshot = 0
    ROCKET.type = "Splode"
    #Grenades
    NADES.firstshot = 0
    NADES.type = "Nade"
    #Healing
    HEAL.type = "Heal"
   
#Detect if we are being run
if __name__ == '__main__':
    DebugPrint('Starting FortBolt\n')
    DebugPrint('Initalizing Globals\n')
    Running = True
    Enabled = False
    JitterFlop = False
    Editing = False
    Building = False
    Crouching = False
    Reloading = False
    Using = False
    Jumping = 0.0
    Init_Weapons()
    Current_Weapon = Pickaxe
    Current_Loadout = [AR, PUMP, SMG, HR, HEAL]
   
    try:
        main()
        exit
    except ValueError:
        print("Error: Could not Run Script")

Установка и использование:
  1. Скачать Python 3.5.x или новее.
  2. Копируем код скрипта и вставляем его в редактор текста, например Atom.
  3. Сохраняем файл в папку (Я назвал файл как "fortbot")
  4. Открываем CMD
  5. Прописываем в CMD расположение файла fortbot.py
  6. Для запуска пишем python fortbot.py
 
Эксперт
Статус
Оффлайн
Регистрация
31 Мар 2017
Сообщения
997
Реакции[?]
652
Поинты[?]
0
Функции:

- Сокращение отдачи у оружия
- Анти-Блум
- Контроль скорости выстрелов и авто выстрел.
- Быстрая смена оружия
- Бинд на быстрый выстрел
- AR Perfect Aim (100% попадание первого выстрела).
- И прочее...


Сам скрипт:

Код:
=====
 
Kwskii
 
## Features
 
Options;
-  Per Weapon Recoil Reduction
-  Per Weapon Anti Bloom
-  Per Weapon Fire Rate Control and Autofire
-  Fast Weapon Switching using Animation Canceling
-  Quick Shoot Hotkey using Animation Canceling
-  Turbo use Option to Autofire Use when the button is held down
-  AR Perfect Aim 100% First Shot Accuracy
-  Fast Edit Reset to automaticly stop editing upon rightclick
 
Always On Features;
-  Auto Reload Cancel on Weapon Switch or Use
 
 
 
## Usage
 
Start Script in CMD Window
 
"""
# TODO
# -Add Keybinds to select weapon loadout
# -Tune Weapon Defs
# -Add LMG Def
# -Add Couch Peek
# -Add type checker in Quick_Shoot to check if pump or rocket, etc
# -Add Key Handlers like jump, escape, map, inventory, build, edit, crouch, reload
# -Add Turbofarming
 
# -Add Fast_Shoot time to Weapon Defs
# -Add Crouch Modifier to Weapon Defs
 
#Current Bugs;
 
#Bug #1:
#Effect: When Hip Firing with Recoil compensation aiming the weapon upward causes the anti recoil to over compensate.
 
#Imports:
from time import gmtime, strftime, sleep, time
from ctypes import windll, c_uint, Structure, c_long, byref
from win32api import GetKeyState, GetAsyncKeyState
import mouse
import keyboard
import weapon
 
#Weapon_Tables Init
nowep = weapon.Weapon("None")
Pickaxe = weapon.Weapon("Pickaxe")
AR = weapon.Weapon("AR")
SCAR = weapon.Weapon("SCAR")
BURST = weapon.Weapon("BURST")
PUMP = weapon.Weapon("PUMP")
TAC = weapon.Weapon("TAC")
HEAVY = weapon.Weapon("HEAVY")
SMG = weapon.Weapon("SMG")
S_SMG = weapon.Weapon("S_SMG")
TOMMYGUN = weapon.Weapon("TOMMYGUN")
P90 = weapon.Weapon("P90")
HR = weapon.Weapon("HR")
BOLT = weapon.Weapon("BOLT")
SAR = weapon.Weapon("SAR")
ROCKET = weapon.Weapon("ROCKET")
NADES = weapon.Weapon("NADES")
HEAL = weapon.Weapon("HEAL")
 
#Settings;
 
#Debug:
Debug = True #Debug Mode, used for Output of Debug Info.
Debug_Movement = False #If Debug Mode is On, output Mouse Movement Info.
Debug_Buttons = True #If Debug Mode is On, output Mouse Button Activity.
Debug_Wheel = False #If Debug Mode is On, output Mouse Wheel Movement Info.
Debug_Keyboard = False #If Debug Mode is On, output Keyboard Activity.
 
 
#Features;
 
#General:
Option_AR_Perfect_Aim = False #If Enabled, causes constant First Shot Accuracy with AR when in ADS.
Option_Fast_Weapon_Switch = True #If Enabled, causes the Weapon Pullout Animation Cancel to be done on every weapon switch.
Option_Reload_Canceling = True #If Enabled, causes an Animation Cancel to occur if reloading when attempting to use.
 
#Quick Shoot:
Option_Quick_Shoot = True #If Enabled, allows an instant fire of a specific weapon choosen below.
if Option_Quick_Shoot:
    Quick_Shoot_Default_Weapon = PUMP
QuickShoot_Fire_Attempts = 40 #(Delay is 10ms so loop of 40 is around 400ms).
 
#Turbo Use:
Option_Turbo_Use = True #When Enabled, causes the use Key to Autofire when held down.
Delay_Turbo_Use = 0.060 #Time inbetween autofire + the natural 20ms delay for the keypress.
 
#Editing:
Option_Fast_Edit_Reset = True #When the Reset Edit Button is Pressed, Instantly exit edit mode.
 
#Ghost Peaking(TODO):
Use_Ghost_Peaking = True #If Enabled, uses a Modifier Key to enable fast crouching while shooting.
Ghost_Peak_Delay = 100 #Time between Ghost Peak Shots.
 
#Fast Farming(TODO):
Fast_Farming = False #If Enabled, Uses a Button to activate "Current Farming Exploit".
Turbofarm_Activation_Window = 300 #Delay from pressing "Farming_Button" to start Normal Farming instead of turbo.
Turbofarm_Fast_Swing_Delay = 200
Turbofarm_Emote_Time = 70
Turbofarm_Slow_Swing_Delay = 400
Turbofarm_Emote_Cancel_Delay = 300
STWAF = False #If Enabled, Switch to a Weapon of Choice after Farming.
STWAF_WeaponSlot = 1 #Weapon to Switch to after Farming.
 
#Anti Recoil:
Use_No_Recoil_ADS = True #If Enabled, Reduces Recoil when ADS Firing.
Use_No_Recoil_Hipfire = True #If Enabled, Reduces Recoil when Hip Firing.
Use_Jitter = True #If Enabled, Moves the Aim back and forth while firing.
 
#Weapon Slot Options
Default_Ingame_Weapon_Slot1 = AR
Default_Ingame_Weapon_Slot2 = PUMP
Default_Ingame_Weapon_Slot3 = SMG
Default_Ingame_Weapon_Slot4 = HR
Default_Ingame_Weapon_Slot5 = HEAL
 
#-------------------------------
#Keybinds;
#-------------------------------
 
#Macro Related;
#-------------------------------
 
#General:
Keybind_Fire = "left" #Key to Shoot Weapons.
 
#Key to Fast Fire Pre Set Weapon.
if Option_Quick_Shoot:
    Keybind_QuickShoot_Button = "x2"
    Keybind_QuickShoot_Button_Code = 0x06
 
Keybind_Enable = "middle" #Key to Enable/Disable the Macro.
Keybind_Edit = "alt" #Desired Key to go into edit mode.(Must have In-game set to alternate).
Keybind_Use = "f" #Desired key for Use.
if Option_Turbo_Use:
    Keybind_Use_Key_Code = 0x46
 
#Weapon Keybinds Part 1 (Macro)
#-----------------------------------------------
#Set these to the same as in-game if not using fast weapon switching.
#If using fast weapon switching set these to your desired keys for each slot-
#and scroll down to set the alternate in game key binds so the fast switch can work.
Keybind_Weapon_Slot1 = "2"
Keybind_Weapon_Slot2 = "3"
Keybind_Weapon_Slot3 = "4"
Keybind_Weapon_Slot4 = "z"
Keybind_Weapon_Slot5 = "x"
Keybind_Weapon_Pickaxe = "l"
 
#Ingame;
#These Keybinds should match the ones set in game.
#-------------------------------
 
#General:
Ingame_Keybind_Jump = "space"
Ingame_Keybind_Crouch = "shift" #Ingame Keybind set for Crouch.
Ingame_Keybind_Fire = "k" #Ingame Keybind set to Fire(Not Mouse1!!!).
if Option_Turbo_Use:
    Ingame_Keybind_Use = "i"
else:
    Ingame_Keybind_Use = Keybind_Use
Ingame_Keybind_Reload = "r"
 
#Weapon Keybinds Part 2 (In-game)
# Fast Weapon Switching:
#-------------------------------------------------
#Used ONLY when Option_Fast_Weapon_Switch is Enabled.
#Fast Weapon Switching is Required to have intermedary control over the weapon keys so-
#they need to be set to something different in-game.
#Ignore this Section if not using Fast Weapon Switching.
if Option_Fast_Weapon_Switch == True:
    Ingame_Weapon_Slot1 = "p"
    Ingame_Weapon_Slot2 = "6"
    Ingame_Weapon_Slot3 = "7"
    Ingame_Weapon_Slot4 = "8"
    Ingame_Weapon_Slot5 = "9"
    Ingame_Weapon_Pickaxe = "0"
else:
    Ingame_Weapon_Slot1 = Keybind_Weapon_Slot1
    Ingame_Weapon_Slot2 = Keybind_Weapon_Slot2
    Ingame_Weapon_Slot3 = Keybind_Weapon_Slot3
    Ingame_Weapon_Slot4 = Keybind_Weapon_Slot4
    Ingame_Weapon_Slot5 = Keybind_Weapon_Slot5
    Ingame_Weapon_Pickaxe = Keybind_Weapon_Pickaxe
 
#Other Weapons
Weapon_Trap = "5" #Actual In-game Keybind used to select traps.
 
#Building:
Ingame_Keybind_Ramp = "e" #Actual Ingame Keybind set for Ramp.
Ingame_Keybind_Wall = "x" #Actual Ingame Keybind set for Wall(Thumb Button 2 on Logetech G502).
Ingame_Keybind_Platform = "q" #Actual Ingame Keybind set for Platform.
Ingame_Keybind_Roof = "[" #Actual Ingame Keybind set for Roof.
 
#Editing:
Ingame_Keybind_Edit = "]" #Alternate Ingame Keybind set for Edit.
Ingame_Keybind_Edit_Reset = "right" #Actual Ingame Keybind set for Edit Reset.
 
#Emoting:
Keybind_EmoteWheel_Up = "up"
Keybind_EmoteWheel_Down = "down"
Keybind_Emote = "n"
Keybind_FastEmote1 = "f1"
Keybind_FastEmote2 = "f2"
Keybind_FastEmote3 = "f3"
 
 
#Globals:
global Running
global Enabled
global Current_Weapon
global Current_Loadout
global JitterFlop
global Editing
global Building
global Crouching
global Jumping
global Reloading
global Using
 
#Main Functions;
 
#Main Function: Gets run at start after init.
def main():
    # Print out a List of the Globals to Check Inits.
    DebugPrint('Printing Globals List:')
    DebugPrintGlobals()
  
    #Hook Logical Mouse Events.
    DebugPrint('Hooking Mouse Input')
    mouse.hook(Mouse_Input)
  
    #Hook Logical Keyboard Events.
    DebugPrint('Hooking Keyboard Input')
    keyboard.hook(Keyboard_Input)
 
 
#Helper Functions;
 
#Move Mouse:  Moves Mouse Relative to Current Location.
def Move_Mouse(x, y):
    windll.user32.mouse_event(
        c_uint(0x0001),
        c_uint(x),
        c_uint(y),
        c_uint(0),
        c_uint(0)
    )
 
class POINT(Structure):
    _fields_ = [("x", c_long), ("y", c_long)]
  
def queryMousePosition():
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return pt 
 
#Cancel Anim: Cancels Weapon Switching Animation and Pickaxe Swings.
def Cancel_Anim(Weapon, Emote_Bind):
    #Emote to cancel pull out animation.
    keyboard.press(Emote_Bind);
    sleep(0.100);
    #Switch to Desired Weapon.
    Switch_to_Weapon(Weapon)
    sleep(0.020);
    keyboard.release(Emote_Bind);
    sleep(0.030);
  
#Converts Inventory Slot ID to actual weapon slot.
def InvSlot_to_WeaponKeybind(InvSlot):
    if InvSlot == 0:
        return Ingame_Weapon_Slot1
    if InvSlot == 1:
        return Ingame_Weapon_Slot2
    if InvSlot == 2:
        return Ingame_Weapon_Slot3
    if InvSlot == 3:
        return Ingame_Weapon_Slot4
    if InvSlot == 4:
        return Ingame_Weapon_Slot5
  
#Check Quick Shoot Button Function.
def isPressed_QuickShoot_Button():
    QuickShoot_Button_State = GetKeyState(Keybind_QuickShoot_Button_Code)
    DebugPrint("MB6:{0}".format(QuickShoot_Button_State))
    if QuickShoot_Button_State < 0:
        return True
    return False
 
def Toggle_Enabled():
    global Enabled
    if Enabled:
        Enabled = False
    else:
        Enabled = True
    DebugPrint("Enabled changed to {0}".format(Enabled))
 
#Debug PrintFunction: Print's Debug Output if Debug is Enabled.
def DebugPrint(s):
    if Debug:
        print("{0}:{1}".format(strftime("%H:%M:%S", gmtime()),s));
      
def DebugPrintGlobals():
    for k, v in globals().items():
        print("{0} = {1}".format(k, v))
 
#Turbo Use Function: Sends the Use Event as long as the Use key is held down.
def Turbo_Use():
    global Reloading
    global Using
  
    #Check if we are Reloading and want to use Reload Canceling.
    if Reloading and Option_Reload_Canceling:
        #Since we are canceling the Reload, set global to false.
        Reloading = False
        Using = False
      
        #Switch Directly to Pickaxe to Cancel the Reload.
        keyboard.send(Ingame_Weapon_Pickaxe);
        sleep(0.020);
      
        #Switch Back to the Weapon we had before the Animation Cancel.
        Switch_to_Weapon(Current_Weapon)
      
    #Check if we are'nt already Using.
    if not Using:
        Using = True
        DebugPrint("Detected Use Action")
      
        #Handle Turbo Use Action.
        if Option_Turbo_Use:
          
            overrun = 400
            #While Use Key is Down Loop.
            while True:
                #Overrun Protection.
                overrun = overrun - 1
                if overrun == 0:
                    break
              
                sleep(0.020) #Sleep To prevent GetKeyState Lockup.
              
                if windll.user32.GetKeyState(Keybind_Use_Key_Code) >= 0:
                    break
              
                DebugPrint("Sending Turbo Use Action")
              
                #Send Use Action.
                keyboard.press(Ingame_Keybind_Use)
                sleep(0.020)
                keyboard.release(Ingame_Keybind_Use)
              
                #Delay a Pre Set amount.
                sleep(Delay_Turbo_Use)
        else:
            print("Sending Use Action")         
            keyboard.send(Ingame_Keybind_Use)
            sleep(0.080)
      
 
#Shooting Functions;
 
#Quick_Shoot: Quick Switches to Desired Weapon, pulls trigger and then switches back.
def Quick_Shoot(Weapon):
    global Editing
    global Building
    global Reloading
  
    #Set Building and Editing to False since we are now shooting.
    Building = False
    Editing = False
  
    #Store our Current Weapon so we can return to it after Quick.
    OldWeapon = Current_Weapon
    print("Insta Shooting {0}".format(Weapon.name))
  
    #Loop Until Button is Detected
    while True:
        if not isPressed_QuickShoot_Button():
            break #Break to Handle Quick Shoot.
        sleep(0.100)
  
    #Check if we are ADS
    MB2_State = GetKeyState(0x02)
    DebugPrint("Checking for MB2 or Reload")
    if MB2_State < 0 or Reloading:
        #We are ADS and trying to shoot with No Recoil.
        DebugPrint("Detected MB2 for ADS or Reloading")
        keyboard.send(Ingame_Weapon_Pickaxe);
        sleep(0.020);
  
    #Since we are shooting and have canceled any reload anim by now set it to false.
    Reloading = False
 
    #Emote to cancel pull out animation.
    Cancel_Anim(Weapon, Keybind_FastEmote3)
  
    count = 0
    #Loop while Attempting to Fire at a specified count.
    while True:
        count = count + 1
        if count == QuickShoot_Fire_Attempts:
            break #Break when we have hit the end of the delay.
        #Send Fire Event.
        keyboard.send(Ingame_Keybind_Fire)
        DebugPrint("Firing Fast")
        sleep(0.010)
    #Switch back to Weapon that was Active before the Fast Shoot.
    Switch_to_Weapon(OldWeapon)
    sleep(0.100)
    #Check if MB1 is still down.
    Handle_MB1_Down()
  
#Fire: Handles No Recoil and Anti Bloom
def Fire(ADS, Recoil):
    global JitterFlop
    global Crouching
    global Reloading
  
    #Init Locals
    local_Jitter = 0
    local_Jitter_ADS = 0
  
    #We are Shooting and not reloading so set global to False
    Reloading = False
  
    Local_Mouse_Pos = queryMousePosition()
  
    DebugPrint("Sending Simulated Fire Event")
    keyboard.press(Ingame_Keybind_Fire) #Send the input to fire the weapon
    sleep(0.020) #Delay to ensure the fire button gets recognized by the game
      
    if Current_Weapon.name != "Pickaxe" and (Current_Weapon.type == "AR" or Current_Weapon.type == "SMG"):
      
        #We are Shooting with Fire Button Down and without a Pickaxe
        if Current_Weapon.ControlFireRate:
            #Release the Fire Button if we are controlling Fire Rate
            keyboard.release(Ingame_Keybind_Fire)
          
        #If Fire has beeen called with the Recoil Bool then we can compensate
        if Recoil:
            #We are not Pickaxing and wanting to use Jitter so set it based on weapon
            if Use_Jitter:
                if JitterFlop == False:
                    JitterFlop = True
                    local_Jitter = Current_Weapon.jitter
                    local_Jitter_ADS = Current_Weapon.jitter_ADS
                else:
                    JitterFlop = False
                    local_Jitter = Current_Weapon.jitter * -1
                    local_Jitter_ADS = Current_Weapon.jitter_ADS * -1               
            if Current_Weapon.firstshot == 0:
                Current_Weapon.firstshot = time()
                print("firstshot: {0}".format(time())) 
                if ADS:
                    #mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
                    Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)
                else:
                    print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                    Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
            else:
                difference = time() - Current_Weapon.firstshot
                print("Not firstshot, Difference: {0}".format(difference))
                if ADS:
                    #mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
                    if difference >= Current_Weapon.recoil_ADS_Init_Delay:
                        Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static)
                    else:
                        Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)                   
                else:
                    if difference >= Current_Weapon.recoil_Hip_Init_Delay:
                        print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                        Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Static)
                    else:
                        print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
                        Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
                #mouse.move(local_Jitter, Current_Weapon.recoil_Hip_Static, absolute=False, duration=Current_Weapon.update_time)
    DebugPrint("Done Sending Simulated Fire Event")
  
#Switch to Weapon: Finds Weapon in Current Loadout and Switches to it
def Switch_to_Weapon(Weapon):
    global Editing
    global Building
    global Current_Weapon
    global Reloading
 
    if Weapon == Current_Weapon and not Building and not Editing:
        return 2 #Return Error:2 Which means Weapon is Already Out.
  
    #Check if we are trying to switch to the Pickaxe.
    if Weapon.name == "Pickaxe":
        DebugPrint("Attempting to Switch Weapon to Pickaxe")
      
        #Send Event to Switch to Pickaxe.
        keyboard.send(Ingame_Weapon_Pickaxe)
      
        #Set the Global to the new weapon.
        Current_Weapon = Weapon
      
        #Reset Globals.
        Building = False
        Editing = False
        Reloading = False
      
        return 1 #Return 1 for Success.
    else: #We are trying to switch to another weapon other than the pickaxe.
      
        DebugPrint("Attempting to Switch Weapon\nSearching for Weapon:{0} in Current Loadout".format(Weapon.name))
      
        #Parse the Players Current Loadout for the Weapon.
        for i in range(len(Current_Loadout)):
            DebugPrint("Checking Inventory Slot{0}\nFound: {1}".format(i, Current_Loadout[i].name))
          
            if Current_Loadout[i].name == Weapon.name:
                DebugPrint("Found Weapon, Attempting Switch")
              
                #Switch to the Found weapon
                keyboard.send(InvSlot_to_WeaponKeybind(i))
              
                #Set the Global to the new weapon.
                Current_Weapon = Weapon
              
                #Reset Globals.
                Building = False
                Editing = False
                Reloading = False
              
                return 1 #Return 1 for Success.
            elif i >= 5: #We have reached the end of the Loadout.
                break #Break to return 3 Error.
    return 3 #Return 3 Which means Unknown Error.
  
#Handle Mouse Button 1 Down, Pretty much the Bread and Butter
#TODO need to find a better way to check MB1, MB2 and MB6 so it doesnt use Win32API
def Handle_MB1_Down():
  
    #Locals
    ADS = False
    overrun = 0
  
    #Debug Out
    DebugPrint("MB1 Event Detected")
  
    #Loop While MB1 is down and fast shoot button is not pressed
    while True:
        #Prevent Infinite Loop from an Overrun Error.
        overrun = overrun + 1
        if overrun >= 4000:
            Current_Weapon.firstshot = 0 #Reset First Shot Timer
            keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
            break #Break if we hit overrun
      
        #Use Win32API to get state of MB1 and MB2 because mouse.is_pressed() is retarted
        MB1_State = GetKeyState(0x01)
        DebugPrint("Checking if MB1 is Still Down")
        #Check if MB1 is still down both Logically and Hardware Based
        if MB1_State >= 0 and GetAsyncKeyState(0x01) == 0:
            Current_Weapon.firstshot = 0 #Reset First Shot Timer
            DebugPrint("MB1 Button Released, State: {0}".format(MB1_State))
            keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
            break #Break if we are not pressing MB1 Anymore
        else:
            DebugPrint("MB1 Still Detected, State: {0}".format(MB1_State)) 
      
        #Check if we are in Pickaxe Mode
        if Current_Weapon.name == "Pickaxe":
          
            #Check if Quick Shoot Button is Pressed
            if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                break #Break to Handle Quick Shoot
          
            DebugPrint("Swinging Pickaxe")
            Fire(False, False) # Send Command to Swing Pickaxe
          
            #FastFarming would go here
          
            #if we are using Quick shoot then we need to check every 10ms during the pickaxe swing delay
            if Option_Quick_Shoot:
                count = 20 # 20x10ms = 200ms (Current Optimal Pickaxe Swingtime)
                while True:
                    count = count - 1
                    if count <= 0:
                        break #Break to Swing the Axe again
                    if isPressed_QuickShoot_Button():
                        break #Break to Handle Quick Shoot
                    sleep(0.010)
            else: #Not using Quickshoot so just delay 200ms
                sleep(0.200)
              
        else: # Trying to Fire something that is not a pickaxe
          
            #Check if we are trying to Quick Shoot
            if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                Current_Weapon.firstshot = 0 #Reset First Shot Timer
                if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                    keyboard.release(Ingame_Keybind_Fire)
                break #Break to Handle Quick Shoot
          
            #Check if we are ADS.
            MB2_State = GetKeyState(0x02)
            DebugPrint("Checking for MB2")
            #Check for MB2 both Logically and Hardware Based
            if MB2_State < 0 and GetAsyncKeyState(0x02) == 1:
                #We are ADS and trying to shoot with No Recoil
                DebugPrint("MB2 is Detected, Setting ADS to True")
                ADS = True
            else:
                ADS = False
          
            #Check if we should use anti recoil for hipfire
            if Use_No_Recoil_Hipfire and not ADS:
                #Hipfire No Recoil
                DebugPrint("Hipfire Reducing")
                Fire(False, True)
              
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
              
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.update_time)
            elif ADS and Use_No_Recoil_ADS:
                #ADS, No Recoil
                DebugPrint("ADS Reducing")
                Fire(True, True)
              
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
              
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.update_time_ADS)
            else:
                #No Recoil Mode Off
                DebugPrint("Not Reducing")
                Fire(False, False)
              
                #Check if we are trying to Quick Shoot
                if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
                    Current_Weapon.firstshot = 0 #Reset First Shot Timer
                    if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
                        keyboard.release(Ingame_Keybind_Fire)
                    break #Break to Handle Quick Shoot
              
                #Delay for the set amount of time in the Weapon Def
                sleep(Current_Weapon.delay_time)
              
           # if Current_Weapon.ControlFireRate == False:
           #     Current_Weapon.firstshot = 0
           #     keyboard.release(Ingame_Keybind_Fire)
           # break
  
#Keyboard Hook Callback Function: Gets run when Keyboard activity is detected. 
def Keyboard_Input(Keyboard_Event):
    global Editing
    global Building
    global Crouching
    global Jumping
    global Reloading
    global Using
  
    if type(Keyboard_Event) == keyboard._keyboard_event.KeyboardEvent:
        #Debug Output
        if Debug_Keyboard:
            DebugPrint("Keyboard_Event: Key:{0},Scancode:{1}, Action:{2},Modifier:{3} Time:{4}".format(Keyboard_Event.name,Keyboard_Event.scan_code, Keyboard_Event.event_type, Keyboard_Event.modifiers, Keyboard_Event.time))
        
        #Weapon Slot 1
        if Keyboard_Event.name == Keybind_Weapon_Slot1 and Keyboard_Event.event_type == "down" and Enabled:
          
            #Get Weapon in Slot 1 of Inventory
            TargetWeapon = Current_Loadout[0]
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":             
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);
                Switch_to_Weapon(TargetWeapon)
              
        #Weapon Slot 2                 
        elif Keyboard_Event.name == Keybind_Weapon_Slot2 and Keyboard_Event.event_type == "down" and Enabled:
          
            #Get Weapon in Slot 2 of Inventory
            TargetWeapon = Current_Loadout[1]
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":             
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);             
                Switch_to_Weapon(TargetWeapon)
              
        #Weapon Slot 3     
        elif Keyboard_Event.name == Keybind_Weapon_Slot3 and Keyboard_Event.event_type == "down" and Enabled:
          
            #Get Weapon in Slot 3 of Inventory
            TargetWeapon = Current_Loadout[2]
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":             
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);             
                Switch_to_Weapon(TargetWeapon)
              
        #Weapon Slot 4               
        elif Keyboard_Event.name == Keybind_Weapon_Slot4 and Keyboard_Event.event_type == "down" and Enabled:
          
            #Get Weapon in Slot 4 of Inventory
            TargetWeapon = Current_Loadout[3]
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":             
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);             
                Switch_to_Weapon(TargetWeapon)
              
        #Weapon Slot 5     
        elif Keyboard_Event.name == Keybind_Weapon_Slot5 and Keyboard_Event.event_type == "down" and Enabled:
          
            #Get Weapon in Slot one of Inventory
            TargetWeapon = Current_Loadout[4]
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":             
                if TargetWeapon != Current_Weapon or (Building or Editing):
                    Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                #If we are in the middle of a reload then Cancel by switching to Pickaxe
                if Reloading:
                    Reloading = False
                    keyboard.send(Ingame_Weapon_Pickaxe);
                    sleep(0.020);             
                Switch_to_Weapon(TargetWeapon)
              
        #Weapon Slot Pickaxe             
        elif Keyboard_Event.name == Keybind_Weapon_Pickaxe and Keyboard_Event.event_type == "down" and Enabled:
          
            #Check if we should try and Fast Switch the Weapon
            if Option_Fast_Weapon_Switch:             
                if Pickaxe != Current_Weapon or (Building or Editing):
                    Cancel_Anim(Pickaxe, Keybind_FastEmote3)
                else:
                    DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
            else:
                Switch_to_Weapon(Pickaxe)
              
        #Edit Keybind Handling
        elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "down" and Enabled:
            #Set the Edit flag
            if not Editing:
                keyboard.send(Ingame_Keybind_Edit)
            DebugPrint("Detected Editing")               
            Editing = True 
        elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "up" and Enabled:
            #Set the Edit flag
            if Editing:
                keyboard.send(Ingame_Keybind_Edit)
            DebugPrint("Finished Editing")
            Editing = False
          
        #Building Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Ramp and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")         
            #Set the Building flag
            Building = True
        elif Keyboard_Event.name == Ingame_Keybind_Platform and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")
            #Set the Building flag
            Building = True
        elif Keyboard_Event.name == Ingame_Keybind_Roof and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Building")
            #Set the Building flag
            Building = True
      
        #Cruching Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Crouch and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Crouching")
            #Set the Building flag
            if Crouching:
                Crouching = False
            else:
                Crouching = True
              
        #Jumping Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Jump and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Jumping")
            #Set the Jumping Global to Current Time.
            Jumping = time()
            #Set the Crouching Global to False since if jumping we are not crouching.
            Crouching = False
          
        #Reload Keybind Handling
        elif Keyboard_Event.name == Ingame_Keybind_Reload and Keyboard_Event.event_type == "down" and Enabled:
            DebugPrint("Detected Reloading")
            Reloading = True
      
        #Use Keybind Handling
        elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "down" and Enabled:
            Turbo_Use()
        elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "up" and Enabled:
            Using = False
            DebugPrint("Detected End of Use Action")
 
#Mouse Hook Callback Function: Gets run when Mouse activity is detected.
def Mouse_Input(Mouse_Event):
    global Editing
    global Building
  
    if Running:
        #Mouse Wheel Event.
        if type(Mouse_Event) == mouse._mouse_event.MoveEvent:
            if Debug_Movement:
                DebugPrint("Move_Event: x:{0}, y:{1}, Time:{2}".format(Mouse_Event.x, Mouse_Event.y, Mouse_Event.time))
      
        #Mouse Button Event.
        elif type(Mouse_Event) == mouse._mouse_event.ButtonEvent:
          
            if Debug_Buttons:
                DebugPrint("Button_Event: Type:{0}, Button:{1}, Time:{2}".format(Mouse_Event.event_type, Mouse_Event.button, Mouse_Event.time))
          
            #Handle MouseButton1 Down Event
            if Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Fire and Enabled:
                #Only Handle MB1 for Weapons so if building or editing then we dont want to control it.
                if not Editing and not Building:
                    Handle_MB1_Down()
          
            #Handle MouseButton2 Down Event
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Edit_Reset and Enabled:
                #Fast Edit Reset:
                if Editing and Option_Fast_Edit_Reset:
                  
                    #If we are editing and right click with Fast Reset enabled then exit edit mode.
                    keyboard.send(Ingame_Keybind_Edit)
                    DebugPrint("Finished Editing with Quick Reset")                 
                    Editing = False                 
          
            #Handle Quick Switch Weapon
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_QuickShoot_Button and Enabled:
                Quick_Shoot(PUMP)                 
        
           #Handle Enable Eventv
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Enable:
                Toggle_Enabled()
          
            #Handle Building Event
            elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Wall:
                DebugPrint("Detected Building")
                Building = True
      
        elif type(Mouse_Event) == mouse._mouse_event.WheelEvent:
            if Debug_Wheel:
                DebugPrint("Wheel_Event: Delta:{0}, Time:{1}".format(Mouse_Event.delta, Mouse_Event.time))
 
def Init_Weapons():
    #AR
    #Info;
    #Advertised Fire Rate = 181.81ms (5.5)
    AR.recoil_Hip_Init = 21
    AR.recoil_Hip_Init_Delay = 0.340
    AR.recoil_Hip_Static = 23
    AR.recoil_ADS_Init = 30
    AR.recoil_ADS_Init_Delay = 0.330 
    AR.recoil_ADS_Static = 1
    AR.jitter = 0
    AR.jitter_ADS = 0
    AR.update_time = 0.040 #+0.020
    if Option_AR_Perfect_Aim:
        AR.update_time_ADS = 0.330
    else:
        AR.update_time_ADS = 0.040 
    AR.firstshot = 0.0
    AR.ControlFireRate = True
    AR.type = "AR"
    #SCAR
    SCAR.recoil_Hip_Init = 21
    SCAR.recoil_Hip_Init_Delay = 0.340
    SCAR.recoil_Hip_Static = 23
    SCAR.recoil_ADS_Init = 30
    SCAR.recoil_ADS_Init_Delay = 0.330 
    SCAR.recoil_ADS_Static = 1
    SCAR.jitter = 0
    SCAR.jitter_ADS = 0
    SCAR.update_time = 0.040
    SCAR.update_time_ADS = 0.330
    SCAR.firstshot = 0.0
    SCAR.ControlFireRate = True
    SCAR.type = "AR"
    #BURST
    BURST.recoil_Hip_Init = 150
    BURST.recoil_Hip_Static = 100
    BURST.recoil_ADS_Init = 125
    BURST.recoil_ADS_Static = 70
    BURST.jitter = 2
    BURST.jitter_ADS = 2
    BURST.update_time = 10
    BURST.update_time_ADS = 10
    BURST.firstshot = 0
    BURST.type = "AR" 
    #PUMP
    PUMP.firstshot = 0
    PUMP.type = "Shotgun"
    #TAC
    TAC.firstshot = 0
    TAC.type = "Shotgun"
    #HEAVY
    HEAVY.firstshot = 0
    HEAVY.type = "Shotgun"
    #SMG
    SMG.recoil_Hip_Init = 4
    SMG.recoil_Hip_Init_Delay = 0.160
    SMG.recoil_Hip_Static = 8
    SMG.recoil_ADS_Init = 5
    SMG.recoil_ADS_Init_Delay = 0.160
    SMG.recoil_ADS_Static = 1
    SMG.jitter = 10
    SMG.jitter_ADS = 2
    SMG.update_time = 0.010
    SMG.update_time_ADS = 0.010
    SMG.firstshot = 0.0
    SMG.ControlFireRate = False
    SMG.type = "SMG"
    #SILENCEDSMG
    S_SMG.recoil_Hip_Init = 150
    S_SMG.recoil_Hip_Static = 100
    S_SMG.recoil_ADS_Init = 125
    S_SMG.recoil_ADS_Static = 70
    S_SMG.jitter = 2
    S_SMG.jitter_ADS = 2
    S_SMG.update_time = 10
    S_SMG.update_time_ADS = 10
    S_SMG.firstshot = 0
    S_SMG.type = "SMG"
    #TOMMYGUN
    TOMMYGUN.recoil_Hip_Init = 150
    TOMMYGUN.recoil_Hip_Static = 100
    TOMMYGUN.recoil_ADS_Init = 125
    TOMMYGUN.recoil_ADS_Static = 70
    TOMMYGUN.jitter = 2
    TOMMYGUN.jitter_ADS = 2
    TOMMYGUN.update_time = 10
    TOMMYGUN.update_time_ADS = 10
    TOMMYGUN.firstshot = 0
    TOMMYGUN.type = "SMG"
    #P90
    P90.recoil_Hip_Init = 150
    P90.recoil_Hip_Static = 100
    P90.recoil_ADS_Init = 125
    P90.recoil_ADS_Static = 70
    P90.jitter = 2
    P90.jitter_ADS = 2
    P90.update_time = 10
    P90.update_time_ADS = 10
    P90.firstshot = 0
    P90.type = "SMG"
    #Hunting Rifle
    HR.firstshot = 0
    HR.type = "Sniper"
    #Bolt Rifle
    BOLT.firstshot = 0
    BOLT.type = "Sniper"
    #Scoped AR
    SAR.firstshot = 0
    SAR.type = "Sniper"
    #Rockets
    ROCKET.firstshot = 0
    ROCKET.type = "Splode"
    #Grenades
    NADES.firstshot = 0
    NADES.type = "Nade"
    #Healing
    HEAL.type = "Heal"
  
#Detect if we are being run
if __name__ == '__main__':
    DebugPrint('Starting FortBolt\n')
    DebugPrint('Initalizing Globals\n')
    Running = True
    Enabled = False
    JitterFlop = False
    Editing = False
    Building = False
    Crouching = False
    Reloading = False
    Using = False
    Jumping = 0.0
    Init_Weapons()
    Current_Weapon = Pickaxe
    Current_Loadout = [AR, PUMP, SMG, HR, HEAL]
  
    try:
        main()
        exit
    except ValueError:
        print("Error: Could not Run Script")

Установка и использование:
  1. Скачать Python 3.5.x или новее.
  2. Копируем код скрипта и вставляем его в редактор текста, например Atom.
  3. Сохраняем файл в папку (Я назвал файл как "fortbot")
  4. Открываем CMD
  5. Прописываем в CMD расположение файла fortbot.py
  6. Для запуска пишем python fortbot.py
Блять, не тот я язык учил.:FeelsBadMan:
 
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
2 Апр 2017
Сообщения
2,544
Реакции[?]
1,203
Поинты[?]
41K
Забаненный
Статус
Оффлайн
Регистрация
27 Июн 2018
Сообщения
36
Реакции[?]
4
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А готовый чит можно ну консоль или что там)
 
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
2 Апр 2017
Сообщения
2,544
Реакции[?]
1,203
Поинты[?]
41K
Закрыто по причине детекта. Возможно будет другая версия софта.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу