Главный модератор
Главный Модератор
-
Автор темы
- #1
Функции:
- Сокращение отдачи у оружия
- Анти-Блум
- Контроль скорости выстрелов и авто выстрел.
- Быстрая смена оружия
- Бинд на быстрый выстрел
- AR Perfect Aim (100% попадание первого выстрела).
- И прочее...
Сам скрипт:
Установка и использование:
- Сокращение отдачи у оружия
- Анти-Блум
- Контроль скорости выстрелов и авто выстрел.
- Быстрая смена оружия
- Бинд на быстрый выстрел
- 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")
Установка и использование:
- Скачать Python 3.5.x или новее.
- Копируем код скрипта и вставляем его в редактор текста, например Atom.
- Сохраняем файл в папку (Я назвал файл как "fortbot")
- Открываем CMD
- Прописываем в CMD расположение файла fortbot.py
- Для запуска пишем python fortbot.py