-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathPosLocker.py
85 lines (68 loc) · 2.83 KB
/
PosLocker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from FFxivPythonTrigger import *
from ctypes import *
from FFxivPythonTrigger.AddressManager import AddressManager
from FFxivPythonTrigger.memory import scan_address, read_memory, scan_pattern
from FFxivPythonTrigger.memory.StructFactory import PointerStruct
command = "@posL"
pattern_main = "f3 0f ?? ?? ?? ?? ?? ?? eb ?? 48 8b ?? ?? ?? ?? ?? e8 ?? ?? ?? ?? 48 85"
pattern_actor_move = "40 53 48 83 EC ? F3 0F 11 89 ? ? ? ? 48 8B D9 F3 0F 11 91 ? ? ? ?"
class PosLocker(PluginBase):
name = "PosLocker"
git_repo = 'nyouoG/fpt_plugins'
repo_path = 'PosLocker.py'
hash_path = __file__
def __init__(self):
super().__init__()
self.statements = set()
am = AddressManager(self.storage.data, self.logger)
ptr_main = am.get("posL_main_ptr", scan_address, pattern_main, add=0x14, cmd_len=8)
addr_move_func = am.get("posL_move_func", scan_pattern, pattern_actor_move)
self.storage.save()
self.main_addr = cast(ptr_main, POINTER(c_int64))
self.main_coor = read_memory(PointerStruct(c_float * 3, 160), ptr_main)
self._enable = False
class ActorMoveHook(self.PluginHook):
restype = c_int64
argtypes = [c_int64, c_float, c_float, c_float]
def hook_function(_self, addr, x, z, y):
if self.main_addr[0] == addr and (self._enable or self.get_result()):
return _self.original(addr, *self.main_coor.value)
return _self.original(addr, x, z, y)
self.hook = ActorMoveHook(addr_move_func, True)
api.command.register(command, self.process_command)
self.register_api('PosLock', type('obj', (object,), {
'enable': self.enable,
'disable': self.disable,
'register_statement': self.register_statement,
'remove_statement': self.remove_statement,
}))
def process_command(self, args):
if args:
if args[0] == 'on':
self._enable = True
elif args[0] == 'off':
self._enable = False
else:
api.Magic.echo_msg("unknown args: %s" % args[0])
else:
self._enable = not self._enable
api.Magic.echo_msg("pl: [%s]" % ('enable' if self._enable else 'disable'))
def _onunload(self):
api.command.unregister(command)
def get_result(self):
for statement in self.statements:
if statement():
return True
return False
def enable(self):
self._enable = True
def disable(self):
self._enable = False
def register_statement(self, statement):
self.statements.add(statement)
def remove_statement(self, statement):
try:
self.statements.remove(statement)
return True
except KeyError:
return False