View difference between Paste ID: k4YmtA1x and ikg2DxBC
SHOW: | | - or go back to the newest paste.
1
=====
2
 
3
Kwskii
4
 
5
## Features
6
 
7
Options;
8
- Per Weapon Recoil Reduction
9
- Per Weapon Anti Bloom
10
- Per Weapon Fire Rate Control and Autofire
11
- Fast Weapon Switching using Animation Canceling
12
- Quick Shoot Hotkey using Animation Canceling
13
- Turbo use Option to Autofire Use when the button is held down
14
- AR Perfect Aim 100% First Shot Accuracy
15
- Fast Edit Reset to automaticly stop editing upon rightclick
16
 
17
Always On Features;
18
- Auto Reload Cancel on Weapon Switch or Use
19
 
20
 
21
 
22
## Usage
23
 
24
Start Script in CMD Window
25
 
26
"""
27
# TODO
28
# -Add Keybinds to select weapon loadout
29
# -Tune Weapon Defs
30
# -Add LMG Def
31
# -Add Couch Peek
32
# -Add type checker in Quick_Shoot to check if pump or rocket, etc
33
# -Add Key Handlers like jump, escape, map, inventory, build, edit, crouch, reload
34
# -Add Turbofarming
35
 
36
# -Add Fast_Shoot time to Weapon Defs
37
# -Add Crouch Modifier to Weapon Defs
38
 
39
#Current Bugs;
40
 
41
#Bug #1:
42
#Effect: When Hip Firing with Recoil compensation aiming the weapon upward causes the anti recoil to over compensate.
43
 
44
#Imports:
45
from time import gmtime, strftime, sleep, time
46
from ctypes import windll, c_uint, Structure, c_long, byref
47
from win32api import GetKeyState, GetAsyncKeyState
48
import mouse
49
import keyboard
50
import weapon
51
 
52
#Weapon_Tables Init
53
nowep = weapon.Weapon("None")
54
Pickaxe = weapon.Weapon("Pickaxe")
55
AR = weapon.Weapon("AR")
56
SCAR = weapon.Weapon("SCAR")
57
BURST = weapon.Weapon("BURST")
58
PUMP = weapon.Weapon("PUMP")
59
TAC = weapon.Weapon("TAC")
60
HEAVY = weapon.Weapon("HEAVY")
61
SMG = weapon.Weapon("SMG")
62
S_SMG = weapon.Weapon("S_SMG")
63
TOMMYGUN = weapon.Weapon("TOMMYGUN")
64
P90 = weapon.Weapon("P90")
65
HR = weapon.Weapon("HR")
66
BOLT = weapon.Weapon("BOLT")
67
SAR = weapon.Weapon("SAR")
68
ROCKET = weapon.Weapon("ROCKET")
69
NADES = weapon.Weapon("NADES")
70
HEAL = weapon.Weapon("HEAL")
71
 
72
#Settings;
73
 
74
#Debug:
75
Debug = True #Debug Mode, used for Output of Debug Info.
76
Debug_Movement = False #If Debug Mode is On, output Mouse Movement Info.
77
Debug_Buttons = True #If Debug Mode is On, output Mouse Button Activity.
78
Debug_Wheel = False #If Debug Mode is On, output Mouse Wheel Movement Info.
79
Debug_Keyboard = False #If Debug Mode is On, output Keyboard Activity.
80
 
81
 
82
#Features;
83
 
84
#General:
85
Option_AR_Perfect_Aim = False #If Enabled, causes constant First Shot Accuracy with AR when in ADS.
86
Option_Fast_Weapon_Switch = True #If Enabled, causes the Weapon Pullout Animation Cancel to be done on every weapon switch.
87
Option_Reload_Canceling = True #If Enabled, causes an Animation Cancel to occur if reloading when attempting to use.
88
 
89
#Quick Shoot:
90
Option_Quick_Shoot = True #If Enabled, allows an instant fire of a specific weapon choosen below.
91
if Option_Quick_Shoot:
92
Quick_Shoot_Default_Weapon = PUMP
93
QuickShoot_Fire_Attempts = 40 #(Delay is 10ms so loop of 40 is around 400ms).
94
 
95
#Turbo Use:
96
Option_Turbo_Use = True #When Enabled, causes the use Key to Autofire when held down.
97
Delay_Turbo_Use = 0.060 #Time inbetween autofire + the natural 20ms delay for the keypress.
98
 
99
#Editing:
100
Option_Fast_Edit_Reset = True #When the Reset Edit Button is Pressed, Instantly exit edit mode.
101
 
102
#Ghost Peaking(TODO):
103
Use_Ghost_Peaking = True #If Enabled, uses a Modifier Key to enable fast crouching while shooting.
104
Ghost_Peak_Delay = 100 #Time between Ghost Peak Shots.
105
 
106
#Fast Farming(TODO):
107
Fast_Farming = False #If Enabled, Uses a Button to activate "Current Farming Exploit".
108
Turbofarm_Activation_Window = 300 #Delay from pressing "Farming_Button" to start Normal Farming instead of turbo.
109
Turbofarm_Fast_Swing_Delay = 200
110
Turbofarm_Emote_Time = 70
111
Turbofarm_Slow_Swing_Delay = 400
112
Turbofarm_Emote_Cancel_Delay = 300
113
STWAF = False #If Enabled, Switch to a Weapon of Choice after Farming.
114
STWAF_WeaponSlot = 1 #Weapon to Switch to after Farming.
115
 
116
#Anti Recoil:
117
Use_No_Recoil_ADS = True #If Enabled, Reduces Recoil when ADS Firing.
118
Use_No_Recoil_Hipfire = True #If Enabled, Reduces Recoil when Hip Firing.
119
Use_Jitter = True #If Enabled, Moves the Aim back and forth while firing.
120
 
121
#Weapon Slot Options
122
Default_Ingame_Weapon_Slot1 = AR
123
Default_Ingame_Weapon_Slot2 = PUMP
124
Default_Ingame_Weapon_Slot3 = SMG
125
Default_Ingame_Weapon_Slot4 = HR
126
Default_Ingame_Weapon_Slot5 = HEAL
127
 
128
#-------------------------------
129
#Keybinds;
130
#-------------------------------
131
 
132
#Macro Related;
133
#-------------------------------
134
 
135
#General:
136
Keybind_Fire = "left" #Key to Shoot Weapons.
137
 
138
#Key to Fast Fire Pre Set Weapon.
139
if Option_Quick_Shoot:
140
Keybind_QuickShoot_Button = "x2"
141
Keybind_QuickShoot_Button_Code = 0x06
142
 
143
Keybind_Enable = "middle" #Key to Enable/Disable the Macro.
144
Keybind_Edit = "alt" #Desired Key to go into edit mode.(Must have In-game set to alternate).
145
Keybind_Use = "f" #Desired key for Use.
146
if Option_Turbo_Use:
147
Keybind_Use_Key_Code = 0x46
148
 
149
#Weapon Keybinds Part 1 (Macro)
150
#-----------------------------------------------
151
#Set these to the same as in-game if not using fast weapon switching.
152
#If using fast weapon switching set these to your desired keys for each slot-
153
#and scroll down to set the alternate in game key binds so the fast switch can work.
154
Keybind_Weapon_Slot1 = "2"
155
Keybind_Weapon_Slot2 = "3"
156
Keybind_Weapon_Slot3 = "4"
157
Keybind_Weapon_Slot4 = "z"
158
Keybind_Weapon_Slot5 = "x"
159
Keybind_Weapon_Pickaxe = "l"
160
 
161
#Ingame;
162
#These Keybinds should match the ones set in game.
163
#-------------------------------
164
 
165
#General:
166
Ingame_Keybind_Jump = "space"
167
Ingame_Keybind_Crouch = "shift" #Ingame Keybind set for Crouch.
168
Ingame_Keybind_Fire = "k" #Ingame Keybind set to Fire(Not Mouse1!!!).
169
if Option_Turbo_Use:
170
Ingame_Keybind_Use = "i"
171
else:
172
Ingame_Keybind_Use = Keybind_Use
173
Ingame_Keybind_Reload = "r"
174
 
175
#Weapon Keybinds Part 2 (In-game)
176
# Fast Weapon Switching:
177
#-------------------------------------------------
178
#Used ONLY when Option_Fast_Weapon_Switch is Enabled.
179
#Fast Weapon Switching is Required to have intermedary control over the weapon keys so-
180
#they need to be set to something different in-game.
181
#Ignore this Section if not using Fast Weapon Switching.
182
if Option_Fast_Weapon_Switch == True:
183
Ingame_Weapon_Slot1 = "p"
184
Ingame_Weapon_Slot2 = "6"
185
Ingame_Weapon_Slot3 = "7"
186
Ingame_Weapon_Slot4 = "8"
187
Ingame_Weapon_Slot5 = "9"
188
Ingame_Weapon_Pickaxe = "0"
189
else:
190
Ingame_Weapon_Slot1 = Keybind_Weapon_Slot1
191
Ingame_Weapon_Slot2 = Keybind_Weapon_Slot2
192
Ingame_Weapon_Slot3 = Keybind_Weapon_Slot3
193
Ingame_Weapon_Slot4 = Keybind_Weapon_Slot4
194
Ingame_Weapon_Slot5 = Keybind_Weapon_Slot5
195
Ingame_Weapon_Pickaxe = Keybind_Weapon_Pickaxe
196
 
197
#Other Weapons
198
Weapon_Trap = "5" #Actual In-game Keybind used to select traps.
199
 
200
#Building:
201
Ingame_Keybind_Ramp = "e" #Actual Ingame Keybind set for Ramp.
202
Ingame_Keybind_Wall = "x" #Actual Ingame Keybind set for Wall(Thumb Button 2 on Logetech G502).
203
Ingame_Keybind_Platform = "q" #Actual Ingame Keybind set for Platform.
204
Ingame_Keybind_Roof = "[" #Actual Ingame Keybind set for Roof.
205
 
206
#Editing:
207
Ingame_Keybind_Edit = "]" #Alternate Ingame Keybind set for Edit.
208
Ingame_Keybind_Edit_Reset = "right" #Actual Ingame Keybind set for Edit Reset.
209
 
210
#Emoting:
211
Keybind_EmoteWheel_Up = "up"
212
Keybind_EmoteWheel_Down = "down"
213
Keybind_Emote = "n"
214
Keybind_FastEmote1 = "f1"
215
Keybind_FastEmote2 = "f2"
216
Keybind_FastEmote3 = "f3"
217
 
218
 
219
#Globals:
220
global Running
221
global Enabled
222
global Current_Weapon
223
global Current_Loadout
224
global JitterFlop
225
global Editing
226
global Building
227
global Crouching
228
global Jumping
229
global Reloading
230
global Using
231
 
232
#Main Functions;
233
 
234
#Main Function: Gets run at start after init.
235
def main():
236
# Print out a List of the Globals to Check Inits.
237
DebugPrint('Printing Globals List:')
238
DebugPrintGlobals()
239
 
240
#Hook Logical Mouse Events.
241
DebugPrint('Hooking Mouse Input')
242
mouse.hook(Mouse_Input)
243
 
244
#Hook Logical Keyboard Events.
245
DebugPrint('Hooking Keyboard Input')
246
keyboard.hook(Keyboard_Input)
247
 
248
 
249
#Helper Functions;
250
 
251
#Move Mouse: Moves Mouse Relative to Current Location.
252
def Move_Mouse(x, y):
253
windll.user32.mouse_event(
254
c_uint(0x0001),
255
c_uint(x),
256
c_uint(y),
257
c_uint(0),
258
c_uint(0)
259
)
260
 
261
class POINT(Structure):
262
_fields_ = [("x", c_long), ("y", c_long)]
263
 
264
def queryMousePosition():
265
pt = POINT()
266
windll.user32.GetCursorPos(byref(pt))
267
return pt
268
 
269
#Cancel Anim: Cancels Weapon Switching Animation and Pickaxe Swings.
270
def Cancel_Anim(Weapon, Emote_Bind):
271
#Emote to cancel pull out animation.
272
keyboard.press(Emote_Bind);
273
sleep(0.100);
274
#Switch to Desired Weapon.
275
Switch_to_Weapon(Weapon)
276
sleep(0.020);
277
keyboard.release(Emote_Bind);
278
sleep(0.030);
279
 
280
#Converts Inventory Slot ID to actual weapon slot.
281
def InvSlot_to_WeaponKeybind(InvSlot):
282
if InvSlot == 0:
283
return Ingame_Weapon_Slot1
284
if InvSlot == 1:
285
return Ingame_Weapon_Slot2
286
if InvSlot == 2:
287
return Ingame_Weapon_Slot3
288
if InvSlot == 3:
289
return Ingame_Weapon_Slot4
290
if InvSlot == 4:
291
return Ingame_Weapon_Slot5
292
 
293
#Check Quick Shoot Button Function.
294
def isPressed_QuickShoot_Button():
295
QuickShoot_Button_State = GetKeyState(Keybind_QuickShoot_Button_Code)
296
DebugPrint("MB6:{0}".format(QuickShoot_Button_State))
297
if QuickShoot_Button_State < 0:
298
return True
299
return False
300
 
301
def Toggle_Enabled():
302
global Enabled
303
if Enabled:
304
Enabled = False
305
else:
306
Enabled = True
307
DebugPrint("Enabled changed to {0}".format(Enabled))
308
 
309
#Debug PrintFunction: Print's Debug Output if Debug is Enabled.
310
def DebugPrint(s):
311
if Debug:
312
print("{0}:{1}".format(strftime("%H:%M:%S", gmtime()),s));
313
 
314
def DebugPrintGlobals():
315
for k, v in globals().items():
316
print("{0} = {1}".format(k, v))
317
 
318
#Turbo Use Function: Sends the Use Event as long as the Use key is held down.
319
def Turbo_Use():
320
global Reloading
321
global Using
322
 
323
#Check if we are Reloading and want to use Reload Canceling.
324
if Reloading and Option_Reload_Canceling:
325
#Since we are canceling the Reload, set global to false.
326
Reloading = False
327
Using = False
328
 
329
#Switch Directly to Pickaxe to Cancel the Reload.
330
keyboard.send(Ingame_Weapon_Pickaxe);
331
sleep(0.020);
332
 
333
#Switch Back to the Weapon we had before the Animation Cancel.
334
Switch_to_Weapon(Current_Weapon)
335
 
336
#Check if we are'nt already Using.
337
if not Using:
338
Using = True
339
DebugPrint("Detected Use Action")
340
 
341
#Handle Turbo Use Action.
342
if Option_Turbo_Use:
343
 
344
overrun = 400
345
#While Use Key is Down Loop.
346
while True:
347
#Overrun Protection.
348
overrun = overrun - 1
349
if overrun == 0:
350
break
351
 
352
sleep(0.020) #Sleep To prevent GetKeyState Lockup.
353
 
354
if windll.user32.GetKeyState(Keybind_Use_Key_Code) >= 0:
355
break
356
 
357
DebugPrint("Sending Turbo Use Action")
358
 
359
#Send Use Action.
360
keyboard.press(Ingame_Keybind_Use)
361
sleep(0.020)
362
keyboard.release(Ingame_Keybind_Use)
363
 
364
#Delay a Pre Set amount.
365
sleep(Delay_Turbo_Use)
366
else:
367
print("Sending Use Action")
368
keyboard.send(Ingame_Keybind_Use)
369
sleep(0.080)
370
 
371
 
372
#Shooting Functions;
373
 
374
#Quick_Shoot: Quick Switches to Desired Weapon, pulls trigger and then switches back.
375
def Quick_Shoot(Weapon):
376
global Editing
377
global Building
378
global Reloading
379
 
380
#Set Building and Editing to False since we are now shooting.
381
Building = False
382
Editing = False
383
 
384
#Store our Current Weapon so we can return to it after Quick.
385
OldWeapon = Current_Weapon
386
print("Insta Shooting {0}".format(Weapon.name))
387
 
388
#Loop Until Button is Detected
389
while True:
390
if not isPressed_QuickShoot_Button():
391
break #Break to Handle Quick Shoot.
392
sleep(0.100)
393
 
394
#Check if we are ADS
395
MB2_State = GetKeyState(0x02)
396
DebugPrint("Checking for MB2 or Reload")
397
if MB2_State < 0 or Reloading:
398
#We are ADS and trying to shoot with No Recoil.
399
DebugPrint("Detected MB2 for ADS or Reloading")
400
keyboard.send(Ingame_Weapon_Pickaxe);
401
sleep(0.020);
402
 
403
#Since we are shooting and have canceled any reload anim by now set it to false.
404
Reloading = False
405
 
406
#Emote to cancel pull out animation.
407
Cancel_Anim(Weapon, Keybind_FastEmote3)
408
 
409
count = 0
410
#Loop while Attempting to Fire at a specified count.
411
while True:
412
count = count + 1
413
if count == QuickShoot_Fire_Attempts:
414
break #Break when we have hit the end of the delay.
415
#Send Fire Event.
416
keyboard.send(Ingame_Keybind_Fire)
417
DebugPrint("Firing Fast")
418
sleep(0.010)
419
#Switch back to Weapon that was Active before the Fast Shoot.
420
Switch_to_Weapon(OldWeapon)
421
sleep(0.100)
422
#Check if MB1 is still down.
423
Handle_MB1_Down()
424
 
425
#Fire: Handles No Recoil and Anti Bloom
426
def Fire(ADS, Recoil):
427
global JitterFlop
428
global Crouching
429
global Reloading
430
 
431
#Init Locals
432
local_Jitter = 0
433
local_Jitter_ADS = 0
434
 
435
#We are Shooting and not reloading so set global to False
436
Reloading = False
437
 
438
Local_Mouse_Pos = queryMousePosition()
439
 
440
DebugPrint("Sending Simulated Fire Event")
441
keyboard.press(Ingame_Keybind_Fire) #Send the input to fire the weapon
442
sleep(0.020) #Delay to ensure the fire button gets recognized by the game
443
 
444
if Current_Weapon.name != "Pickaxe" and (Current_Weapon.type == "AR" or Current_Weapon.type == "SMG"):
445
 
446
#We are Shooting with Fire Button Down and without a Pickaxe
447
if Current_Weapon.ControlFireRate:
448
#Release the Fire Button if we are controlling Fire Rate
449
keyboard.release(Ingame_Keybind_Fire)
450
 
451
#If Fire has beeen called with the Recoil Bool then we can compensate
452
if Recoil:
453
#We are not Pickaxing and wanting to use Jitter so set it based on weapon
454
if Use_Jitter:
455
if JitterFlop == False:
456
JitterFlop = True
457
local_Jitter = Current_Weapon.jitter
458
local_Jitter_ADS = Current_Weapon.jitter_ADS
459
else:
460
JitterFlop = False
461
local_Jitter = Current_Weapon.jitter * -1
462
local_Jitter_ADS = Current_Weapon.jitter_ADS * -1
463
if Current_Weapon.firstshot == 0:
464
Current_Weapon.firstshot = time()
465
print("firstshot: {0}".format(time()))
466
if ADS:
467
#mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
468
Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)
469
else:
470
print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
471
Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
472
else:
473
difference = time() - Current_Weapon.firstshot
474
print("Not firstshot, Difference: {0}".format(difference))
475
if ADS:
476
#mouse.move(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static, absolute=False, duration=Current_Weapon.update_time_ADS)
477
if difference >= Current_Weapon.recoil_ADS_Init_Delay:
478
Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Static)
479
else:
480
Move_Mouse(local_Jitter_ADS, Current_Weapon.recoil_ADS_Init)
481
else:
482
if difference >= Current_Weapon.recoil_Hip_Init_Delay:
483
print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
484
Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Static)
485
else:
486
print("current coursor pos: X:{0}, Y:{1}".format(Local_Mouse_Pos.x, Local_Mouse_Pos.y))
487
Move_Mouse(local_Jitter, Current_Weapon.recoil_Hip_Init)
488
#mouse.move(local_Jitter, Current_Weapon.recoil_Hip_Static, absolute=False, duration=Current_Weapon.update_time)
489
DebugPrint("Done Sending Simulated Fire Event")
490
 
491
#Switch to Weapon: Finds Weapon in Current Loadout and Switches to it
492
def Switch_to_Weapon(Weapon):
493
global Editing
494
global Building
495
global Current_Weapon
496
global Reloading
497
 
498
if Weapon == Current_Weapon and not Building and not Editing:
499
return 2 #Return Error:2 Which means Weapon is Already Out.
500
 
501
#Check if we are trying to switch to the Pickaxe.
502
if Weapon.name == "Pickaxe":
503
DebugPrint("Attempting to Switch Weapon to Pickaxe")
504
 
505
#Send Event to Switch to Pickaxe.
506
keyboard.send(Ingame_Weapon_Pickaxe)
507
 
508
#Set the Global to the new weapon.
509
Current_Weapon = Weapon
510
 
511
#Reset Globals.
512
Building = False
513
Editing = False
514
Reloading = False
515
 
516
return 1 #Return 1 for Success.
517
else: #We are trying to switch to another weapon other than the pickaxe.
518
 
519
DebugPrint("Attempting to Switch Weapon\nSearching for Weapon:{0} in Current Loadout".format(Weapon.name))
520
 
521
#Parse the Players Current Loadout for the Weapon.
522
for i in range(len(Current_Loadout)):
523
DebugPrint("Checking Inventory Slot{0}\nFound: {1}".format(i, Current_Loadout[i].name))
524
 
525
if Current_Loadout[i].name == Weapon.name:
526
DebugPrint("Found Weapon, Attempting Switch")
527
 
528
#Switch to the Found weapon
529
keyboard.send(InvSlot_to_WeaponKeybind(i))
530
 
531
#Set the Global to the new weapon.
532
Current_Weapon = Weapon
533
 
534
#Reset Globals.
535
Building = False
536
Editing = False
537
Reloading = False
538
 
539
return 1 #Return 1 for Success.
540
elif i >= 5: #We have reached the end of the Loadout.
541
break #Break to return 3 Error.
542
return 3 #Return 3 Which means Unknown Error.
543
 
544
#Handle Mouse Button 1 Down, Pretty much the Bread and Butter
545
#TODO need to find a better way to check MB1, MB2 and MB6 so it doesnt use Win32API
546
def Handle_MB1_Down():
547
 
548
#Locals
549
ADS = False
550
overrun = 0
551
 
552
#Debug Out
553
DebugPrint("MB1 Event Detected")
554
 
555
#Loop While MB1 is down and fast shoot button is not pressed
556
while True:
557
#Prevent Infinite Loop from an Overrun Error.
558
overrun = overrun + 1
559
if overrun >= 4000:
560
Current_Weapon.firstshot = 0 #Reset First Shot Timer
561
keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
562
break #Break if we hit overrun
563
 
564
#Use Win32API to get state of MB1 and MB2 because mouse.is_pressed() is retarted
565
MB1_State = GetKeyState(0x01)
566
DebugPrint("Checking if MB1 is Still Down")
567
#Check if MB1 is still down both Logically and Hardware Based
568
if MB1_State >= 0 and GetAsyncKeyState(0x01) == 0:
569
Current_Weapon.firstshot = 0 #Reset First Shot Timer
570
DebugPrint("MB1 Button Released, State: {0}".format(MB1_State))
571
keyboard.release(Ingame_Keybind_Fire) #Relase the Actual Fire Key
572
break #Break if we are not pressing MB1 Anymore
573
else:
574
DebugPrint("MB1 Still Detected, State: {0}".format(MB1_State))
575
 
576
#Check if we are in Pickaxe Mode
577
if Current_Weapon.name == "Pickaxe":
578
 
579
#Check if Quick Shoot Button is Pressed
580
if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
581
break #Break to Handle Quick Shoot
582
 
583
DebugPrint("Swinging Pickaxe")
584
Fire(False, False) # Send Command to Swing Pickaxe
585
 
586
#FastFarming would go here
587
 
588
#if we are using Quick shoot then we need to check every 10ms during the pickaxe swing delay
589
if Option_Quick_Shoot:
590
count = 20 # 20x10ms = 200ms (Current Optimal Pickaxe Swingtime)
591
while True:
592
count = count - 1
593
if count <= 0:
594
break #Break to Swing the Axe again
595
if isPressed_QuickShoot_Button():
596
break #Break to Handle Quick Shoot
597
sleep(0.010)
598
else: #Not using Quickshoot so just delay 200ms
599
sleep(0.200)
600
 
601
else: # Trying to Fire something that is not a pickaxe
602
 
603
#Check if we are trying to Quick Shoot
604
if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
605
Current_Weapon.firstshot = 0 #Reset First Shot Timer
606
if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
607
keyboard.release(Ingame_Keybind_Fire)
608
break #Break to Handle Quick Shoot
609
 
610
#Check if we are ADS.
611
MB2_State = GetKeyState(0x02)
612
DebugPrint("Checking for MB2")
613
#Check for MB2 both Logically and Hardware Based
614
if MB2_State < 0 and GetAsyncKeyState(0x02) == 1:
615
#We are ADS and trying to shoot with No Recoil
616
DebugPrint("MB2 is Detected, Setting ADS to True")
617
ADS = True
618
else:
619
ADS = False
620
 
621
#Check if we should use anti recoil for hipfire
622
if Use_No_Recoil_Hipfire and not ADS:
623
#Hipfire No Recoil
624
DebugPrint("Hipfire Reducing")
625
Fire(False, True)
626
 
627
#Check if we are trying to Quick Shoot
628
if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
629
Current_Weapon.firstshot = 0 #Reset First Shot Timer
630
if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
631
keyboard.release(Ingame_Keybind_Fire)
632
break #Break to Handle Quick Shoot
633
 
634
#Delay for the set amount of time in the Weapon Def
635
sleep(Current_Weapon.update_time)
636
elif ADS and Use_No_Recoil_ADS:
637
#ADS, No Recoil
638
DebugPrint("ADS Reducing")
639
Fire(True, True)
640
 
641
#Check if we are trying to Quick Shoot
642
if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
643
Current_Weapon.firstshot = 0 #Reset First Shot Timer
644
if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
645
keyboard.release(Ingame_Keybind_Fire)
646
break #Break to Handle Quick Shoot
647
 
648
#Delay for the set amount of time in the Weapon Def
649
sleep(Current_Weapon.update_time_ADS)
650
else:
651
#No Recoil Mode Off
652
DebugPrint("Not Reducing")
653
Fire(False, False)
654
 
655
#Check if we are trying to Quick Shoot
656
if isPressed_QuickShoot_Button() and Option_Quick_Shoot:
657
Current_Weapon.firstshot = 0 #Reset First Shot Timer
658
if not Current_Weapon.ControlFireRate: #Fire Key may still be Down from Last Fire() so release it.
659
keyboard.release(Ingame_Keybind_Fire)
660
break #Break to Handle Quick Shoot
661
 
662
#Delay for the set amount of time in the Weapon Def
663
sleep(Current_Weapon.delay_time)
664
 
665
# if Current_Weapon.ControlFireRate == False:
666
# Current_Weapon.firstshot = 0
667
# keyboard.release(Ingame_Keybind_Fire)
668
# break
669
 
670
#Keyboard Hook Callback Function: Gets run when Keyboard activity is detected.
671
def Keyboard_Input(Keyboard_Event):
672
global Editing
673
global Building
674
global Crouching
675
global Jumping
676
global Reloading
677
global Using
678
 
679
if type(Keyboard_Event) == keyboard._keyboard_event.KeyboardEvent:
680
#Debug Output
681
if Debug_Keyboard:
682
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))
683
 
684
#Weapon Slot 1
685
if Keyboard_Event.name == Keybind_Weapon_Slot1 and Keyboard_Event.event_type == "down" and Enabled:
686
 
687
#Get Weapon in Slot 1 of Inventory
688
TargetWeapon = Current_Loadout[0]
689
 
690
#Check if we should try and Fast Switch the Weapon
691
if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":
692
if TargetWeapon != Current_Weapon or (Building or Editing):
693
Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
694
else:
695
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
696
else:
697
#If we are in the middle of a reload then Cancel by switching to Pickaxe
698
if Reloading:
699
Reloading = False
700
keyboard.send(Ingame_Weapon_Pickaxe);
701
sleep(0.020);
702
Switch_to_Weapon(TargetWeapon)
703
 
704
#Weapon Slot 2
705
elif Keyboard_Event.name == Keybind_Weapon_Slot2 and Keyboard_Event.event_type == "down" and Enabled:
706
 
707
#Get Weapon in Slot 2 of Inventory
708
TargetWeapon = Current_Loadout[1]
709
 
710
#Check if we should try and Fast Switch the Weapon
711
if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":
712
if TargetWeapon != Current_Weapon or (Building or Editing):
713
Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
714
else:
715
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
716
else:
717
#If we are in the middle of a reload then Cancel by switching to Pickaxe
718
if Reloading:
719
Reloading = False
720
keyboard.send(Ingame_Weapon_Pickaxe);
721
sleep(0.020);
722
Switch_to_Weapon(TargetWeapon)
723
 
724
#Weapon Slot 3
725
elif Keyboard_Event.name == Keybind_Weapon_Slot3 and Keyboard_Event.event_type == "down" and Enabled:
726
 
727
#Get Weapon in Slot 3 of Inventory
728
TargetWeapon = Current_Loadout[2]
729
 
730
#Check if we should try and Fast Switch the Weapon
731
if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":
732
if TargetWeapon != Current_Weapon or (Building or Editing):
733
Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
734
else:
735
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
736
else:
737
#If we are in the middle of a reload then Cancel by switching to Pickaxe
738
if Reloading:
739
Reloading = False
740
keyboard.send(Ingame_Weapon_Pickaxe);
741
sleep(0.020);
742
Switch_to_Weapon(TargetWeapon)
743
 
744
#Weapon Slot 4
745
elif Keyboard_Event.name == Keybind_Weapon_Slot4 and Keyboard_Event.event_type == "down" and Enabled:
746
 
747
#Get Weapon in Slot 4 of Inventory
748
TargetWeapon = Current_Loadout[3]
749
 
750
#Check if we should try and Fast Switch the Weapon
751
if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":
752
if TargetWeapon != Current_Weapon or (Building or Editing):
753
Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
754
else:
755
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
756
else:
757
#If we are in the middle of a reload then Cancel by switching to Pickaxe
758
if Reloading:
759
Reloading = False
760
keyboard.send(Ingame_Weapon_Pickaxe);
761
sleep(0.020);
762
Switch_to_Weapon(TargetWeapon)
763
 
764
#Weapon Slot 5
765
elif Keyboard_Event.name == Keybind_Weapon_Slot5 and Keyboard_Event.event_type == "down" and Enabled:
766
 
767
#Get Weapon in Slot one of Inventory
768
TargetWeapon = Current_Loadout[4]
769
 
770
#Check if we should try and Fast Switch the Weapon
771
if Option_Fast_Weapon_Switch and TargetWeapon.type != "Heal" and TargetWeapon.type != "Nade":
772
if TargetWeapon != Current_Weapon or (Building or Editing):
773
Cancel_Anim(TargetWeapon, Keybind_FastEmote3)
774
else:
775
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
776
else:
777
#If we are in the middle of a reload then Cancel by switching to Pickaxe
778
if Reloading:
779
Reloading = False
780
keyboard.send(Ingame_Weapon_Pickaxe);
781
sleep(0.020);
782
Switch_to_Weapon(TargetWeapon)
783
 
784
#Weapon Slot Pickaxe
785
elif Keyboard_Event.name == Keybind_Weapon_Pickaxe and Keyboard_Event.event_type == "down" and Enabled:
786
 
787
#Check if we should try and Fast Switch the Weapon
788
if Option_Fast_Weapon_Switch:
789
if Pickaxe != Current_Weapon or (Building or Editing):
790
Cancel_Anim(Pickaxe, Keybind_FastEmote3)
791
else:
792
DebugPrint("Error when attempting to fast switch: Weapon Already Selected")
793
else:
794
Switch_to_Weapon(Pickaxe)
795
 
796
#Edit Keybind Handling
797
elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "down" and Enabled:
798
#Set the Edit flag
799
if not Editing:
800
keyboard.send(Ingame_Keybind_Edit)
801
DebugPrint("Detected Editing")
802
Editing = True
803
elif Keyboard_Event.name == Keybind_Edit and Keyboard_Event.event_type == "up" and Enabled:
804
#Set the Edit flag
805
if Editing:
806
keyboard.send(Ingame_Keybind_Edit)
807
DebugPrint("Finished Editing")
808
Editing = False
809
 
810
#Building Keybind Handling
811
elif Keyboard_Event.name == Ingame_Keybind_Ramp and Keyboard_Event.event_type == "down" and Enabled:
812
DebugPrint("Detected Building")
813
#Set the Building flag
814
Building = True
815
elif Keyboard_Event.name == Ingame_Keybind_Platform and Keyboard_Event.event_type == "down" and Enabled:
816
DebugPrint("Detected Building")
817
#Set the Building flag
818
Building = True
819
elif Keyboard_Event.name == Ingame_Keybind_Roof and Keyboard_Event.event_type == "down" and Enabled:
820
DebugPrint("Detected Building")
821
#Set the Building flag
822
Building = True
823
 
824
#Cruching Keybind Handling
825
elif Keyboard_Event.name == Ingame_Keybind_Crouch and Keyboard_Event.event_type == "down" and Enabled:
826
DebugPrint("Detected Crouching")
827
#Set the Building flag
828
if Crouching:
829
Crouching = False
830
else:
831
Crouching = True
832
 
833
#Jumping Keybind Handling
834
elif Keyboard_Event.name == Ingame_Keybind_Jump and Keyboard_Event.event_type == "down" and Enabled:
835
DebugPrint("Detected Jumping")
836
#Set the Jumping Global to Current Time.
837
Jumping = time()
838
#Set the Crouching Global to False since if jumping we are not crouching.
839
Crouching = False
840
 
841
#Reload Keybind Handling
842
elif Keyboard_Event.name == Ingame_Keybind_Reload and Keyboard_Event.event_type == "down" and Enabled:
843
DebugPrint("Detected Reloading")
844
Reloading = True
845
 
846
#Use Keybind Handling
847
elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "down" and Enabled:
848
Turbo_Use()
849
elif Keyboard_Event.name == Keybind_Use and Keyboard_Event.event_type == "up" and Enabled:
850
Using = False
851
DebugPrint("Detected End of Use Action")
852
 
853
#Mouse Hook Callback Function: Gets run when Mouse activity is detected.
854
def Mouse_Input(Mouse_Event):
855
global Editing
856
global Building
857
 
858
if Running:
859
#Mouse Wheel Event.
860
if type(Mouse_Event) == mouse._mouse_event.MoveEvent:
861
if Debug_Movement:
862
DebugPrint("Move_Event: x:{0}, y:{1}, Time:{2}".format(Mouse_Event.x, Mouse_Event.y, Mouse_Event.time))
863
 
864
#Mouse Button Event.
865
elif type(Mouse_Event) == mouse._mouse_event.ButtonEvent:
866
 
867
if Debug_Buttons:
868
DebugPrint("Button_Event: Type:{0}, Button:{1}, Time:{2}".format(Mouse_Event.event_type, Mouse_Event.button, Mouse_Event.time))
869
 
870
#Handle MouseButton1 Down Event
871
if Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Fire and Enabled:
872
#Only Handle MB1 for Weapons so if building or editing then we dont want to control it.
873
if not Editing and not Building:
874
Handle_MB1_Down()
875
 
876
#Handle MouseButton2 Down Event
877
elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Edit_Reset and Enabled:
878
#Fast Edit Reset:
879
if Editing and Option_Fast_Edit_Reset:
880
 
881
#If we are editing and right click with Fast Reset enabled then exit edit mode.
882
keyboard.send(Ingame_Keybind_Edit)
883
DebugPrint("Finished Editing with Quick Reset")
884
Editing = False
885
 
886
#Handle Quick Switch Weapon
887
elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_QuickShoot_Button and Enabled:
888
Quick_Shoot(PUMP)
889
 
890
#Handle Enable Eventv
891
elif Mouse_Event.event_type == "down" and Mouse_Event.button == Keybind_Enable:
892
Toggle_Enabled()
893
 
894
#Handle Building Event
895
elif Mouse_Event.event_type == "down" and Mouse_Event.button == Ingame_Keybind_Wall:
896
DebugPrint("Detected Building")
897
Building = True
898
 
899
elif type(Mouse_Event) == mouse._mouse_event.WheelEvent:
900
if Debug_Wheel:
901
DebugPrint("Wheel_Event: Delta:{0}, Time:{1}".format(Mouse_Event.delta, Mouse_Event.time))
902
 
903
def Init_Weapons():
904
#AR
905
#Info;
906
#Advertised Fire Rate = 181.81ms (5.5)
907
AR.recoil_Hip_Init = 21
908
AR.recoil_Hip_Init_Delay = 0.340
909
AR.recoil_Hip_Static = 23
910
AR.recoil_ADS_Init = 30
911
AR.recoil_ADS_Init_Delay = 0.330
912
AR.recoil_ADS_Static = 1
913
AR.jitter = 0
914
AR.jitter_ADS = 0
915
AR.update_time = 0.040 #+0.020
916
if Option_AR_Perfect_Aim:
917
AR.update_time_ADS = 0.330
918
else:
919
AR.update_time_ADS = 0.040
920
AR.firstshot = 0.0
921
AR.ControlFireRate = True
922
AR.type = "AR"
923
#SCAR
924
SCAR.recoil_Hip_Init = 21
925
SCAR.recoil_Hip_Init_Delay = 0.340
926
SCAR.recoil_Hip_Static = 23
927
SCAR.recoil_ADS_Init = 30
928
SCAR.recoil_ADS_Init_Delay = 0.330
929
SCAR.recoil_ADS_Static = 1
930
SCAR.jitter = 0
931
SCAR.jitter_ADS = 0
932
SCAR.update_time = 0.040
933
SCAR.update_time_ADS = 0.330
934
SCAR.firstshot = 0.0
935
SCAR.ControlFireRate = True
936
SCAR.type = "AR"
937
#BURST
938
BURST.recoil_Hip_Init = 150
939
BURST.recoil_Hip_Static = 100
940
BURST.recoil_ADS_Init = 125
941
BURST.recoil_ADS_Static = 70
942
BURST.jitter = 2
943
BURST.jitter_ADS = 2
944
BURST.update_time = 10
945
BURST.update_time_ADS = 10
946
BURST.firstshot = 0
947
BURST.type = "AR"
948
#PUMP
949
PUMP.firstshot = 0
950
PUMP.type = "Shotgun"
951
#TAC
952
TAC.firstshot = 0
953
TAC.type = "Shotgun"
954
#HEAVY
955
HEAVY.firstshot = 0
956
HEAVY.type = "Shotgun"
957
#SMG
958
SMG.recoil_Hip_Init = 4
959
SMG.recoil_Hip_Init_Delay = 0.160
960
SMG.recoil_Hip_Static = 8
961
SMG.recoil_ADS_Init = 5
962
SMG.recoil_ADS_Init_Delay = 0.160
963
SMG.recoil_ADS_Static = 1
964
SMG.jitter = 10
965
SMG.jitter_ADS = 2
966
SMG.update_time = 0.010
967
SMG.update_time_ADS = 0.010
968
SMG.firstshot = 0.0
969
SMG.ControlFireRate = False
970
SMG.type = "SMG"
971
#SILENCEDSMG
972
S_SMG.recoil_Hip_Init = 150
973
S_SMG.recoil_Hip_Static = 100
974
S_SMG.recoil_ADS_Init = 125
975
S_SMG.recoil_ADS_Static = 70
976
S_SMG.jitter = 2
977
S_SMG.jitter_ADS = 2
978
S_SMG.update_time = 10
979
S_SMG.update_time_ADS = 10
980
S_SMG.firstshot = 0
981
S_SMG.type = "SMG"
982
#TOMMYGUN
983
TOMMYGUN.recoil_Hip_Init = 150
984
TOMMYGUN.recoil_Hip_Static = 100
985
TOMMYGUN.recoil_ADS_Init = 125
986
TOMMYGUN.recoil_ADS_Static = 70
987
TOMMYGUN.jitter = 2
988
TOMMYGUN.jitter_ADS = 2
989
TOMMYGUN.update_time = 10
990
TOMMYGUN.update_time_ADS = 10
991
TOMMYGUN.firstshot = 0
992
TOMMYGUN.type = "SMG"
993
#P90
994
P90.recoil_Hip_Init = 150
995
P90.recoil_Hip_Static = 100
996
P90.recoil_ADS_Init = 125
997
P90.recoil_ADS_Static = 70
998
P90.jitter = 2
999
P90.jitter_ADS = 2
1000
P90.update_time = 10
1001
P90.update_time_ADS = 10
1002
P90.firstshot = 0
1003
P90.type = "SMG"
1004
#Hunting Rifle
1005
HR.firstshot = 0
1006
HR.type = "Sniper"
1007
#Bolt Rifle
1008
BOLT.firstshot = 0
1009
BOLT.type = "Sniper"
1010
#Scoped AR
1011
SAR.firstshot = 0
1012
SAR.type = "Sniper"
1013
#Rockets
1014
ROCKET.firstshot = 0
1015
ROCKET.type = "Splode"
1016
#Grenades
1017
NADES.firstshot = 0
1018
NADES.type = "Nade"
1019
#Healing
1020
HEAL.type = "Heal"
1021
 
1022
#Detect if we are being run
1023
if __name__ == '__main__':
1024
DebugPrint('Starting FortBolt\n')
1025
DebugPrint('Initalizing Globals\n')
1026
Running = True
1027
Enabled = False
1028
JitterFlop = False
1029
Editing = False
1030
Building = False
1031
Crouching = False
1032
Reloading = False
1033
Using = False
1034
Jumping = 0.0
1035
Init_Weapons()
1036
Current_Weapon = Pickaxe
1037
Current_Loadout = [AR, PUMP, SMG, HR, HEAL]
1038
 
1039
try:
1040
main()
1041
exit
1042
except ValueError:
1043
print("Error: Could not Run Script")