Advertisement
jgamerx

Untitled

Sep 24th, 2017
674
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.58 KB | None | 0 0
  1. def pbSameThread(wnd)
  2. return false if wnd==0
  3. processid=[0].pack('l')
  4. getCurrentThreadId=Win32API.new('kernel32','GetCurrentThreadId', '%w()','l')
  5. getWindowThreadProcessId=Win32API.new('user32','GetWindowThreadProcessId', '%w(l p)','l')
  6. threadid=getCurrentThreadId.call
  7. wndthreadid=getWindowThreadProcessId.call(wnd,processid)
  8. return (wndthreadid==threadid)
  9. end
  10.  
  11.  
  12.  
  13. module Input
  14. DOWN = 2
  15. LEFT = 4
  16. RIGHT = 6
  17. UP = 8
  18. A = 11
  19. B = 12
  20. C = 13
  21. X = 14
  22. Y = 15
  23. Z = 16
  24. L = 17
  25. R = 18
  26. SHIFT = 21
  27. CTRL = 22
  28. ALT = 23
  29. F5 = 25
  30. F6 = 26
  31. F7 = 27
  32. F8 = 28
  33. F9 = 29
  34. LeftMouseKey = 1
  35. RightMouseKey = 2
  36. # GetAsyncKeyState or GetKeyState will work here
  37. @GetKeyState=Win32API.new("user32", "GetAsyncKeyState", "i", "i")
  38. @GetForegroundWindow=Win32API.new("user32", "GetForegroundWindow", "", "i")
  39. # Returns whether a key is being pressed
  40. @PadState=Win32API.new("xinput1_3.dll","XInputGetState","ip","l")
  41. Buttons=[64,128,32,16,256,512,1024,2048,1,16384,2,32768]
  42. Assign=[64,128,32,16,256,512,1024,2048,1,16384,2,32768]
  43. @counter=0
  44. @DeadZone=[]
  45. def self.getstate(key)
  46. return (@GetKeyState.call(key)&0x8000)>0
  47. end
  48.  
  49.  
  50. def self.PadState(key) #Basicamente, el nucleo de todo esto, all hail this method
  51. inputData= "\0" * 16
  52. @PadState.call(0,inputData)
  53. arr=inputData.unpack("ssnnssss")
  54. if @DeadZone.empty?
  55. @DeadZone.push(arr[4],arr[5],arr[6],arr[7])
  56. end
  57. if key==Assign[6] && (arr[4]==-32767||arr[6]==-32767)
  58. return true
  59. end
  60. if key==Assign[7] && (arr[6]==32767 || arr[4]==32767)
  61. return true
  62. end
  63. if key==Assign[4] && (arr[5]==32767 || arr[7]==32767)
  64. return true
  65. end
  66. if key==Assign[5] && (arr[5]==-32767 || arr[7]==-32767)
  67. return true
  68. end
  69. if key==Assign[3] && arr[3]>100
  70. return true
  71. end
  72.  
  73.  
  74. if arr[2]==key
  75. return true
  76. end
  77. return false
  78. end
  79.  
  80. def self.State2(key)
  81. data=self.PadState(key)
  82. code=self.GetCode(key)
  83. if data==true && @padPState[code]==false
  84. @padPState[code]=true
  85. @padKeyState[code]+=1
  86. return true
  87. end
  88. if data==false
  89. @padPState[code]=false
  90. @padKeyState[code]=0
  91. return false
  92. end
  93. if data==true && @padPState[code]==true
  94. @padKeyState[code]+=1
  95. return false
  96. end
  97. return false
  98. end
  99.  
  100. def self.State(key)
  101. data=self.PadState(key)
  102. code=self.GetCode(key)
  103. if data==true && @padPressState[code]==false
  104. @padPressState[code]=true
  105. @padKeyState[code]+=1
  106. return true
  107. end
  108. if data==false
  109. @padPressState[code]=false
  110. @padKeyState[code]=0
  111. return false
  112. end
  113. if data==true && @padPressState[code]==true
  114. @padKeyState[code]+=1
  115. return false
  116. end
  117. return false
  118. end
  119.  
  120.  
  121. def self.padVibrate(vibration1,vibration2)
  122. @SetState=Win32API.new("xinput1_3.dll","XInputSetState","ip","")
  123. @SetState.call(0,"#{vibration1},#{vibration2}")
  124. end
  125.  
  126. def self.updateKeyState(i)
  127. gfw=pbSameThread(@GetForegroundWindow.call())
  128. if !@stateUpdated[i]
  129. newstate=self.getstate(i) && gfw
  130. @triggerstate[i]=(newstate&&@keystate[i]==0)
  131. @releasestate[i]=(!newstate&&@keystate[i]>0)
  132. @keystate[i]=newstate ? @keystate[i]+1 : 0
  133. @stateUpdated[i]=true
  134. end
  135. end
  136.  
  137. def self.Update(i,identifier=0)
  138. gfw = pbSameThread(@GetForegroundWindow.call())
  139. if !@padStateUpdated[i]
  140. state=(self.PadState(Assign[i]) && gfw)
  141. @padTriggerState[i]=(state && @padKeyState[i]==0)
  142. @padKeyState[i]=(state ? @padKeyState[i]+1 : 0)
  143. @padReleaseState[i]=(!state && @padKeyState[i]>0)
  144. @padStateUpdated[i]=true
  145. end
  146. end
  147.  
  148. def self.update
  149. if @keystate
  150. for i in 0...256
  151. # just noting that the state should be updated
  152. # instead of thunking to Win32 256 times
  153. @stateUpdated[i]=false
  154. if @keystate[i] > 0
  155. # If there is a repeat count, update anyway
  156. # (will normally apply only to a very few keys)
  157. updateKeyState(i)
  158. end
  159. if @counter>Assign.size
  160. @counter=0
  161. end
  162. @padStateUpdated[@counter]=false
  163. if @padKeyState
  164. if @padKeyState[@counter]>0
  165. self.Update(@counter)
  166. end
  167. end
  168. @counter+=1
  169. end
  170. else
  171. @stateUpdated=[]
  172. @keystate=[]
  173. @triggerstate=[]
  174. @releasestate=[]
  175. @padStateUpdated=[]
  176. @padKeyState=[]
  177. @padTriggerState=[]
  178. @padPressState=[]
  179. @padPState=[]
  180. @padReleaseState=[]
  181. for i in 0...256
  182. @stateUpdated[i]=true
  183. @keystate[i]=self.getstate(i) ? 1 : 0
  184. @triggerstate[i]=false
  185. @releasestate[i]=false
  186. if i<=Assign.size
  187. @padStateUpdated[i]=true
  188. @padKeyState[i]= self.PadState(i) ? 1 : 0
  189. @padTriggerState[i]=false
  190. @padPressState[i]=false
  191. @padReleaseState[i]=false
  192. @padPState[i]=false
  193. end
  194. end
  195. end
  196. end
  197.  
  198. def self.buttonToKey(button)
  199. case button
  200. when Input::DOWN
  201. return [0x28] # Down
  202. when Input::LEFT
  203. return [0x25] # Left
  204. when Input::RIGHT
  205. return [0x27] # Right
  206. when Input::UP
  207. return [0x26] # Up
  208. when Input::A
  209. return [0x5A,0x10] # Z, Shift
  210. when Input::B
  211. return [0x58,0x1B] # X, ESC
  212. when Input::C
  213. return [0x43,0x0D,0x20] # C, ENTER, Space
  214. when Input::X
  215. return [0x41] # A
  216. when Input::Y
  217. return [0x53] # S
  218. when Input::Z
  219. return [0x44] # D
  220. when Input::L
  221. return [0x51,0x21] # Q, Page Up
  222. when Input::R
  223. return [0x57,0x22] # W, Page Down
  224. when Input::SHIFT
  225. return [0x10] # Shift
  226. when Input::CTRL
  227. return [0x11] # Ctrl
  228. when Input::ALT
  229. return [0x12] # Alt
  230. when Input::F5
  231. return [0x74] # F5
  232. when Input::F6
  233. return [0x75] # F6
  234. when Input::F7
  235. return [0x76] # F7
  236. when Input::F8
  237. return [0x77] # F8
  238. when Input::F9
  239. return [0x78] # F9
  240. else
  241. return []
  242. end
  243. end
  244.  
  245. def self.PadCode(button) #Returns the key value
  246. case button
  247. when Input::UP; return [Assign[4]]
  248. when Input::DOWN; return [Assign[5]]
  249. when Input::LEFT; return [Assign[6]]
  250. when Input::RIGHT; return [Assign[7]]
  251. when Input::B; return [Assign[1]]
  252. when Input::C; return [Assign[2]]
  253. when Input::A; return [Assign[3]]
  254. when Input::L; return [Assign[8]]
  255. when Input::R; return [Assign[10]]
  256. end
  257. return []
  258. end
  259.  
  260. def self.dir4
  261. button=0
  262. repeatcount=0
  263. if self.press?(Input::DOWN) && self.press?(Input::UP)
  264. return 0
  265. end
  266. if self.press?(Input::LEFT) && self.press?(Input::RIGHT)
  267. return 0
  268. end
  269. for b in [Input::DOWN,Input::LEFT,Input::RIGHT,Input::UP]
  270. rc=self.count(b)
  271. if rc>0
  272. if repeatcount==0 || rc<repeatcount
  273. button=b
  274. repeatcount=rc
  275. end
  276. end
  277. end
  278. return button
  279. end
  280.  
  281. def self.dir8
  282. buttons=[]
  283. for b in [Input::DOWN,Input::LEFT,Input::RIGHT,Input::UP]
  284. rc=self.count(b)
  285. if rc>0
  286. buttons.push([b,rc])
  287. end
  288. end
  289. if buttons.length==0
  290. return 0
  291. elsif buttons.length==1
  292. return buttons[0][0]
  293. elsif buttons.length==2
  294. # since buttons sorted by button, no need to sort here
  295. if (buttons[0][0]==Input::DOWN && buttons[1][0]==Input::UP)
  296. return 0
  297. end
  298. if (buttons[0][0]==Input::LEFT && buttons[1][0]==Input::RIGHT)
  299. return 0
  300. end
  301. end
  302. buttons.sort!{|a,b| a[1]<=>b[1]}
  303. updown=0
  304. leftright=0
  305. for b in buttons
  306. if updown==0 && (b[0]==Input::UP || b[0]==Input::DOWN)
  307. updown=b[0]
  308. end
  309. if leftright==0 && (b[0]==Input::LEFT || b[0]==Input::RIGHT)
  310. leftright=b[0]
  311. end
  312. end
  313. if updown==Input::DOWN
  314. return 1 if leftright==Input::LEFT
  315. return 3 if leftright==Input::RIGHT
  316. return 2
  317. elsif updown==Input::UP
  318. return 7 if leftright==Input::LEFT
  319. return 9 if leftright==Input::RIGHT
  320. return 8
  321. else
  322. return 4 if leftright==Input::LEFT
  323. return 6 if leftright==Input::RIGHT
  324. return 0
  325. end
  326. end
  327.  
  328. def self.count(button)
  329. for btn in self.buttonToKey(button)
  330. c=self.repeatcount(btn)
  331. return c if c>0
  332. end
  333. for btn in self.PadCode(button)
  334. c=self.padRepeatCount(btn)
  335. return c if c>0
  336. end
  337. return 0
  338. end
  339.  
  340. def self.release?(button)
  341. rc=0
  342. for btn in self.buttonToKey(button)
  343. c=self.repeatcount(btn)
  344. return false if c>0
  345. rc+=1 if self.releaseex?(btn)
  346. end
  347. for btn in self.PadCode(button)
  348. c=self.padRepeatCount(btn)
  349. return false if c>0
  350. rc+=1 if self.padReleaseex?(btn)
  351. end
  352. return rc>0
  353. end
  354.  
  355. def self.trigger?(button)
  356. trigger= self.buttonToKey(button).any? {|item| self.triggerex?(item) }
  357. pad = self.PadCode(button).any? {|item| self.padTriggerex?(item)}
  358. return trigger || pad
  359. end
  360.  
  361. def self.repeat?(button)
  362. trigger= self.buttonToKey(button).any? {|item| self.repeatex?(item) }
  363. pad= self.PadCode(button).any? {|item| self.padRepeatex?(item)}
  364. return trigger || pad
  365. end
  366.  
  367. def self.press?(button)
  368. return self.count(button)>0
  369. end
  370.  
  371. def self.repeatex?(key)
  372. return false if !@keystate
  373. updateKeyState(key)
  374. return @keystate[key]==1 || (@keystate[key]>20 && (@keystate[key]&1)==0)
  375. end
  376.  
  377. def self.padRepeatex?(key)
  378. return false if !@padKeyState
  379. code=GetCode(key)
  380. self.State2(key)
  381. return @padKeyState[code]==1 || (@padKeyState[code]>20 && (@padKeyState[code]&1)==0)
  382. end
  383.  
  384. def self.releaseex?(key)
  385. return false if !@releasestate
  386. updateKeyState(key)
  387. return @releasestate[key]
  388. end
  389.  
  390. def self.padReleasex?(key)
  391. return false if !@padReleaseState
  392. code=self.GetCode(key)
  393. self.Update(code)
  394. return @padReleaseState[code]
  395. end
  396.  
  397. def self.triggerex?(key)
  398. return false if !@triggerstate
  399. updateKeyState(key)
  400. return @triggerstate[key]
  401. end
  402.  
  403. def self.padTriggerex?(key)
  404. return false if !@padTriggerState
  405. code= self.GetCode(key)
  406. result=self.State(key)
  407. return result
  408. end
  409.  
  410. def self.repeatcount(key)
  411. return 0 if !@keystate
  412. updateKeyState(key)
  413. return @keystate[key]
  414. end
  415.  
  416. def self.padRepeatCount(key)
  417. return 0 if !@padKeyState
  418. code= self.GetCode(key)
  419. result=self.Update(code)
  420. return @padKeyState[code]
  421. end
  422.  
  423. def self.pressex?(key)
  424. trigger= self.repeatcount(key)>0
  425. pad= self.repeatcount(key)>0
  426. return trigger || pad
  427. end
  428.  
  429. def self.RunToogle
  430. Kernel.pbMessage(_INTL("wds"))
  431. $PokemonSystem.runstyle=1
  432. $PokemonGlobal.runtoogle=true
  433. end
  434.  
  435. def self.GetCode(key)
  436. for i in 0..Assign.size
  437. if Assign[i]==key
  438. return i
  439. end
  440. end
  441. return 100
  442. end
  443. end
  444.  
  445. # Requires Win32API
  446. module Mouse
  447. gsm = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')
  448. @GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
  449. @SetCapture = Win32API.new('user32', 'SetCapture', 'p', 'i')
  450. @ReleaseCapture = Win32API.new('user32', 'ReleaseCapture', '', 'i')
  451. module_function
  452. def getMouseGlobalPos
  453. pos = [0, 0].pack('ll')
  454. if @GetCursorPos.call(pos) != 0
  455. return pos.unpack('ll')
  456. else
  457. return nil
  458. end
  459. end
  460.  
  461. def screen_to_client(x, y)
  462. return nil unless x and y
  463. screenToClient = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i')
  464. pos = [x, y].pack('ll')
  465. if screenToClient.call(Win32API.pbFindRgssWindow, pos) != 0
  466. return pos.unpack('ll')
  467. else
  468. return nil
  469. end
  470. end
  471.  
  472. def setCapture
  473. @SetCapture.call(Win32API.pbFindRgssWindow)
  474. end
  475.  
  476. def releaseCapture
  477. @ReleaseCapture.call
  478. end
  479.  
  480. # Returns the position of the mouse relative to the game window.
  481. def getMousePos(catch_anywhere = false)
  482. resizeFactor=($ResizeFactor) ? $ResizeFactor : 1
  483. x, y = screen_to_client(*getMouseGlobalPos)
  484. width, height = Win32API.client_size
  485. if catch_anywhere or (x >= 0 and y >= 0 and x < width and y < height)
  486. return (x/resizeFactor).to_i, (y/resizeFactor).to_i
  487. else
  488. return nil
  489. end
  490. end
  491.  
  492. def del
  493. if @oldcursor == nil
  494. return
  495. else
  496. @SetClassLong.call(Win32API.pbFindRgssWindow,-12, @oldcursor)
  497. @oldcursor = nil
  498. end
  499. end
  500. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement