trainerbase 3.0.0__tar.gz → 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trainerbase
3
- Version: 3.0.0
3
+ Version: 3.1.0
4
4
  Summary: Framework for creating game trainers/mods
5
5
  Home-page: https://gitlab.com/python-trainers/trainer-base
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "trainerbase"
3
- version = "3.0.0"
3
+ version = "3.1.0"
4
4
  description = "Framework for creating game trainers/mods"
5
5
  authors = ["v01d <v01d@v01d.ru>", "doomayka <zd@doomayka.ru>"]
6
6
  license = "MIT"
@@ -114,6 +114,21 @@ class AllocatingCodeInjection(AbstractCodeInjection): # pylint: disable=too-man
114
114
  self.new_memory_address = 0
115
115
 
116
116
 
117
+ class MultipleCodeInjection(AbstractCodeInjection):
118
+ def __init__(self, *injections: AbstractCodeInjection):
119
+ self._injections = injections
120
+
121
+ @override
122
+ def inject(self):
123
+ for injection in self._injections:
124
+ injection.inject()
125
+
126
+ @override
127
+ def eject(self):
128
+ for injection in self._injections:
129
+ injection.eject()
130
+
131
+
117
132
  def compile_asm(code: Code) -> bytes:
118
133
  if isinstance(code, str):
119
134
  fasm_mode = f"use{ARCH}"
@@ -8,8 +8,8 @@ from typing import Self
8
8
  from keyboard import on_press_key, on_release_key
9
9
  from pymem.exception import MemoryReadError
10
10
 
11
- from trainerbase.gameobject import GameObject
12
- from trainerbase.scriptengine import Script
11
+ from trainerbase.gameobject import AbstractReadableObject, GameObject
12
+ from trainerbase.scriptengine import Script, system_script_engine
13
13
 
14
14
 
15
15
  type Coords[T: (int, float)] = tuple[T, T, T]
@@ -75,7 +75,8 @@ class Teleport:
75
75
  self.current_position: Coords | None = None
76
76
  self.movement_vector = Vector3(0, 0, 0)
77
77
  self.minimal_movement_vector_length = minimal_movement_vector_length
78
- self.movement_vector_updater_script: Script | None = None
78
+
79
+ system_script_engine.register_script(Script(self.update_movement_vector, enabled=True))
79
80
 
80
81
  def set_coords(self, x: Number, y: Number, z: Number = 100) -> None:
81
82
  self.player_x.value = x
@@ -126,12 +127,6 @@ class Teleport:
126
127
  new_coords = Vector3(*self.get_coords()) + dash_movement_vector
127
128
  self.set_coords(*new_coords)
128
129
 
129
- def create_movement_vector_updater_script(self) -> Script:
130
- if self.movement_vector_updater_script is None:
131
- self.movement_vector_updater_script = Script(self.update_movement_vector, enabled=True)
132
-
133
- return self.movement_vector_updater_script
134
-
135
130
 
136
131
  class Switchable(ABC):
137
132
  @abstractmethod
@@ -195,7 +190,7 @@ class ShortLongPressSwitch:
195
190
 
196
191
  def regenerate(
197
192
  current_value: GameObject,
198
- max_value: GameObject,
193
+ max_value: AbstractReadableObject,
199
194
  percent: Number,
200
195
  min_value: Number = 1,
201
196
  ):
@@ -6,7 +6,14 @@ from pymem.exception import MemoryWriteError
6
6
  from trainerbase.memory import ConvertibleToAddress, ensure_address, pm
7
7
 
8
8
 
9
- class GameObject[PymemType, TrainerBaseType](ABC):
9
+ class AbstractReadableObject[T](ABC):
10
+ @property
11
+ @abstractmethod
12
+ def value(self) -> T:
13
+ pass
14
+
15
+
16
+ class GameObject[PymemType, TrainerBaseType](AbstractReadableObject[TrainerBaseType]):
10
17
  created_objects: list[Self] = []
11
18
 
12
19
  @staticmethod
@@ -45,6 +52,7 @@ class GameObject[PymemType, TrainerBaseType](ABC):
45
52
  return value # type: ignore
46
53
 
47
54
  @property
55
+ @override
48
56
  def value(self) -> TrainerBaseType:
49
57
  return self.after_read(self.pm_read(self.address.resolve()))
50
58
 
@@ -126,6 +134,15 @@ class GameBool(GameObject[bool, bool]):
126
134
  pm_write = pm.write_bool
127
135
 
128
136
 
137
+ class ReadonlyGameObjectSumGetter(AbstractReadableObject[int | float]):
138
+ def __init__(self, *game_numbers: GameInt | GameFloat):
139
+ self.game_numbers = game_numbers
140
+
141
+ @property
142
+ def value(self) -> int | float:
143
+ return sum(number.value for number in self.game_numbers)
144
+
145
+
129
146
  def update_frozen_objects():
130
147
  for game_object in GameObject.created_objects:
131
148
  if game_object.frozen is not None:
@@ -262,7 +262,7 @@ class TeleportUI(AbstractUIComponent):
262
262
  dpg.add_text(f"[{self.hotkey_set_saved_position}] Set Saved Position")
263
263
 
264
264
  def _tp_add_dash_hotkeys_if_needed(self):
265
- if self.tp.movement_vector_updater_script is None or self.hotkey_dash is None:
265
+ if self.hotkey_dash is None:
266
266
  return
267
267
 
268
268
  add_hotkey(self.hotkey_dash, self.on_hotkey_dash_press)
File without changes
File without changes
File without changes