feat: Added new module-specific functions

+ Added exception handling inside python scripts
+ Changed some G2O functions to accept python objects as arguments
This commit is contained in:
AURUMVORXX
2025-03-30 16:30:54 +03:00
parent c093bd2f81
commit a00e601a14
12 changed files with 485 additions and 26 deletions

View File

@@ -1,6 +1,13 @@
## Changelog ## Changelog
- Creating new embedded modules changed for using existing ones (needed for proper launch under venv; reverse compatible change) - All event functions, called events and some other functions now have built-in exception handler
- Entry point module now will be added to ``sys.path`` on the server launch - Added new function: ``set_default_logger`` for redirect all built-in exception messages to your custom logger
- Server will now throw an exception if entry point module doesn't exist - Added new decorator: ``handle_exception`` for convinient exception handling
- Fix for ``Packet.sendToAll`` had incorrect argument list - Changed function ``setTime``: now all arguments are optional, so you can partially change time, and you can pass negative values to subtract them from current time.
- Changed function ``getDistance2d``: now accepts old variant ``(x1, y1, x2, y2)`` OR ``({x: value1, y: value1}, {x: value2, y: value2})``
- Changed function ``getDistance3d``: now accepts old variant ``(x1, y1, z1, x2, y2, z2)`` OR ``({x: value1, y: value1, z: value1}, {x: value2, y: value2, z: value2})``
- Changed function ``getVectorAngle``: now accepts old variant ``(x1, y1, z1, x2, y2, z2)`` OR ``({x: value1, y: value1, z: value1}, {x: value2, y: value2, z: value2})``
- Changed function ``setPlayerPosition``: now accepts old variant ``(playerid, x, y, z)`` OR ``(playerid, {x: value, y: value, z: value})``
- Changed function ``setPlayerScale``: now accepts old variant ``(playerid, x, y, z)`` OR ``(playerid, {x: value, y: value, z: value})``
- Added function ``setPlayerAttributes`` (module-specific function)
- Added function ``setPlayerTalents`` (module-specific function)

View File

@@ -0,0 +1,2 @@
# `function` handle_exception
::: g2o.exception.handle_exception

View File

@@ -0,0 +1,2 @@
# `function` set_default_logger
::: g2o.exception.set_default_logger

View File

@@ -0,0 +1,2 @@
#`function` setPlayerAttributes
::: g2o.functions.player.setPlayerAttributes

View File

@@ -0,0 +1,2 @@
#`function` setPlayerTalents
::: g2o.functions.player.setPlayerTalents

View File

@@ -144,6 +144,8 @@ from g2o.functions.player import unreadySpell
from g2o.functions.player import unspawnPlayer from g2o.functions.player import unspawnPlayer
from g2o.functions.player import useItem from g2o.functions.player import useItem
from g2o.functions.player import useItemToState from g2o.functions.player import useItemToState
from g2o.functions.player import setPlayerAttributes
from g2o.functions.player import setPlayerTalents
from g2o.functions.streamer import findNearbyPlayers from g2o.functions.streamer import findNearbyPlayers
from g2o.functions.streamer import getStreamedPlayersByPlayer from g2o.functions.streamer import getStreamedPlayersByPlayer
@@ -152,4 +154,7 @@ from g2o.functions.streamer import getSpawnedPlayersForPlayer
from g2o.functions.waypoint import getNearestWaypoint from g2o.functions.waypoint import getNearestWaypoint
from g2o.functions.waypoint import getWaypoint from g2o.functions.waypoint import getWaypoint
from g2o.exception import set_default_logger
from g2o.exception import handle_exception
from g2o.constants import * from g2o.constants import *

68
python/g2o/exception.py Normal file
View File

@@ -0,0 +1,68 @@
import logging
from functools import wraps
logger = None
def set_default_logger(value: logging.Logger):
"""
This function will the change default to your custom one.
## Declaration
```python
def set_default_logger(value: logging.Logger):
```
## Parameters
* `logging.Logger` **value**: custom logger object.
"""
global logger
logger = value
def handle_exception(func = None):
"""
This decorator will handle all occuring exceptions and print them into the logger.
## Declaration
```python
def handle_exception(func = None):
```
## Usage
```python
from g2o import handle_exception
@handle_exception
def terrifying_function():
print(5/0)
@handle_exception
def check_pass_exception():
wrong_position = {'x': 100, 'z': 300} # missing 'y'
try:
g2o.setPlayerPosition(0, wrong_position, pass_exception=True) # exception will occur inside this function, but `pass_exception` will also raise it here
except:
print('Exception passed to the parent')
```
"""
global logger
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
pass_exception = kwargs.pop('pass_exception', False)
try:
return f(*args, **kwargs)
except Exception as e:
if logger is not None:
logger.exception(e)
else:
logging.exception(e)
if pass_exception:
raise
return wrapper
if func is not None:
return decorator(func)
return decorator

View File

@@ -1,9 +1,13 @@
from g2o.exception import handle_exception
eventList = {} eventList = {}
disabledEventList = [] disabledEventList = []
@handle_exception
def callEvent(evtName : str, **kwargs : dict): def callEvent(evtName : str, **kwargs : dict):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will notify (call) every handler bound to specified event. This function will notify (call) every handler bound to specified event.
Original: [callEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/callEvent/) Original: [callEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/callEvent/)
@@ -44,8 +48,11 @@ def callEvent(evtName : str, **kwargs : dict):
return isEventCancelled return isEventCancelled
@handle_exception
def addEvent(name : str): def addEvent(name : str):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will register a new event with specified name. This function will register a new event with specified name.
Events can be used to notify function(s) when something will happen, like player joins the server, etc. Events can be used to notify function(s) when something will happen, like player joins the server, etc.
Original: [addEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/addEvent/) Original: [addEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/addEvent/)
@@ -68,8 +75,11 @@ def addEvent(name : str):
if not name in eventList: if not name in eventList:
eventList[name] = [] eventList[name] = []
@handle_exception
def event(name : str, priority : int = 9999): def event(name : str, priority : int = 9999):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will bind function to specified event. This function will bind function to specified event.
Original: [addEventHandler](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/addEventHandler/) Original: [addEventHandler](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/addEventHandler/)
@@ -100,8 +110,11 @@ def event(name : str, priority : int = 9999):
return func return func
return inlineEvt return inlineEvt
@handle_exception
def removeEventHandler(name : str, func : object): def removeEventHandler(name : str, func : object):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will unbind function from specified event. This function will unbind function from specified event.
Original: [removeEventHandler](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/removeEventHandler/) Original: [removeEventHandler](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/removeEventHandler/)
@@ -131,10 +144,13 @@ def removeEventHandler(name : str, func : object):
if item['function'] == func: if item['function'] == func:
del eventList[name][index] del eventList[name][index]
@handle_exception
def toggleEvent(name : str, toggle : bool): def toggleEvent(name : str, toggle : bool):
''' '''
!!! note !!! note
By default every event is toggled `on` (enabled). By default every event is toggled `on` (enabled).
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will toggle event (enable or disable it globally). By toggling event off, you can completely disable certain event from calling it's handlers. This function will toggle event (enable or disable it globally). By toggling event off, you can completely disable certain event from calling it's handlers.
Original: [toggleEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/toggleEvent/) Original: [toggleEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/toggleEvent/)
@@ -163,10 +179,13 @@ def toggleEvent(name : str, toggle : bool):
elif toggle and name in disabledEventList: elif toggle and name in disabledEventList:
disabledEventList.remove(name) disabledEventList.remove(name)
@handle_exception
def removeEvent(name : str): def removeEvent(name : str):
''' '''
!!! warning !!! warning
Removing an event also cause all event handlers to unregister. Removing an event also cause all event handlers to unregister.
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will unregister an event with specified name. This function will unregister an event with specified name.
Original: [removeEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/removeEvent/) Original: [removeEvent](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/event/removeEvent/)

View File

@@ -1,4 +1,5 @@
import sqg2o import sqg2o
from g2o.exception import handle_exception
def getHostname() -> str: def getHostname() -> str:
""" """
@@ -206,18 +207,33 @@ def setServerWorld(world : str):
""" """
return sqg2o.setServerWorld(world) return sqg2o.setServerWorld(world)
def setTime(hour : int, min : int, day : int = 0): @handle_exception
def setTime(hour : int = None, mins : int = None, day : int = None):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will set the current time in the game to the given time, for all the players. This function will set the current time in the game to the given time, for all the players.
Original: [setTime](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/game/setTime/) Original: [setTime](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/game/setTime/)
## Declaration ## Declaration
```python ```python
def setTime(hour : int, min : int, day : int = 0) def setTime(hour : int = None, mins : int = None, day : int = None)
``` ```
## Parameters ## Parameters
`int` **hour**: the hour of new time (in the range between 0-23). `int` **hour**: the hour of new time (in the range between 0-23) or subtract value from hour (hour < 0).
`int` **min**: the minute of new time (in the range between 0-59). `int` **mins**: the minute of new time (in the range between 0-59) or subtract value from mins (mins < 0).
`int` **day**: the day of new time. `int` **day**: the day of new time or subtract value from day (day < 0).
""" """
return sqg2o.setTime(hour, min, day) current_time = getTime()
# Check for provided arguments
hour = current_time['hour'] if hour is None else hour
mins = current_time['min'] if mins is None else mins
day = current_time['day'] if day is None else day
# Check for negative arguments
hour = current_time['hour'] + hour if hour < 0 else hour
mins = current_time['min'] + mins if mins < 0 else mins
day = current_time['day'] + day if day < 0 else day
return sqg2o.setTime(hour, mins, day)

View File

@@ -1,7 +1,18 @@
import sqg2o import sqg2o
from g2o.exception import handle_exception
def getDistance2d(x1 : float, y1: float, x2 : float, y2 : float) -> float: @handle_exception
def getDistance2d(
x1: float = 0,
y1: float = 0,
x2: float = 0,
y2 : float = 0,
first: dict[str, float] = None,
second: dict[str, float] = None
) -> float:
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will get the 2d distance between two points. This function will get the 2d distance between two points.
Original: [getDistance2d](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getDistance2d/) Original: [getDistance2d](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getDistance2d/)
@@ -15,13 +26,31 @@ def getDistance2d(x1 : float, y1: float, x2 : float, y2 : float) -> float:
* `float` **y1**: the position on Y axis of the first point. * `float` **y1**: the position on Y axis of the first point.
* `float` **x2**: the position on X axis of the second point. * `float` **x2**: the position on X axis of the second point.
* `float` **y2**: the position on Y axis of the second point. * `float` **y2**: the position on Y axis of the second point.
**OR**
* `dict[str, float]` **first**: the poistion on XY axis of the first point.
* `dict[str, float]` **second**: the position of XY axis of the second point.
## Returns ## Returns
`float`: Returns the calculated 2d distance between two points as floating point number. `float`: Returns the calculated 2d distance between two points as floating point number.
""" """
return sqg2o.getDistance2d(x1, y1, x2, y2) if first is not None and second is not None:
return sqg2o.getDistance2d(first['x'], first['y'], second['x'], second['y'])
else:
return sqg2o.getDistance2d(x1, y1, x2, y2)
def getDistance3d(x1 : float, y1: float, z1 : float, x2 : float, y2 : float, z2 : float) -> float: @handle_exception
def getDistance3d(
x1 : float = 0,
y1: float = 0,
z1 : float = 0,
x2 : float = 0,
y2 : float = 0,
z2 : float = 0,
first: dict[str, float] = None,
second: dict[str, float] = None
) -> float:
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will get the 3d distance between two points. This function will get the 3d distance between two points.
Original: [getDistance3d](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getDistance3d/) Original: [getDistance3d](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getDistance3d/)
@@ -37,13 +66,29 @@ def getDistance3d(x1 : float, y1: float, z1 : float, x2 : float, y2 : float, z2
* `float` **x2**: the position on X axis of the second point. * `float` **x2**: the position on X axis of the second point.
* `float` **y2**: the position on Y axis of the second point. * `float` **y2**: the position on Y axis of the second point.
* `float` **z2**: the position on Z axis of the second point. * `float` **z2**: the position on Z axis of the second point.
**OR**
* `dict[str, float]` **first**: the position on XYZ axis of the first point.
* `dict[str, float]` **second**: the position on XYZ axic of the second point.
## Returns ## Returns
`float`: Returns the calculated 3d distance between two points as floating point number. `float`: Returns the calculated 3d distance between two points as floating point number.
""" """
return sqg2o.getDistance3d(x1, y1, z1, x2, y2, z2) if first is not None and second is not None:
return sqg2o.getDistance3d(first['x'], first['y'], first['z'], second['x'], second['y'], second['z'])
else:
return sqg2o.getDistance3d(x1, y1, z1, x2, y2, z2)
def getVectorAngle(x1 : float, y1: float, x2 : float, y2 : float) -> float: @handle_exception
def getVectorAngle(
x1: float = 0,
y1: float = 0,
x2: float = 0,
y2 : float = 0,
first: dict[str, float] = None,
second: dict[str, float] = None
) -> float:
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will get angle on Y axis directed towards the second point. This function will get angle on Y axis directed towards the second point.
Original: [getVectorAngle](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getVectorAngle/) Original: [getVectorAngle](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/shared-functions/math/getVectorAngle/)
@@ -57,7 +102,13 @@ def getVectorAngle(x1 : float, y1: float, x2 : float, y2 : float) -> float:
* `float` **y1**: the position on Y axis of the first point. * `float` **y1**: the position on Y axis of the first point.
* `float` **x2**: the position on X axis of the second point. * `float` **x2**: the position on X axis of the second point.
* `float` **y2**: the position on Y axis of the second point. * `float` **y2**: the position on Y axis of the second point.
**OR**
* `dict[str, float]` **first**: the poistion on XY axis of the first point.
* `dict[str, float]` **second**: the position of XY axis of the second point.
## Returns ## Returns
`float`: Returns the angle on Y axis directed towards the second point. `float`: Returns the angle on Y axis directed towards the second point.
""" """
return sqg2o.getVectorAngle(x1, y1, x2, y2) if first is not None and second is not None:
return sqg2o.getVectorAngle(first['x'], first['y'], second['x'], second['y'])
else:
return sqg2o.getVectorAngle(x1, y1, x2, y2)

View File

@@ -1,4 +1,6 @@
import sqg2o import sqg2o
from g2o.exception import handle_exception
from g2o.constants import *
def addBan(info : dict) -> bool: def addBan(info : dict) -> bool:
""" """
@@ -1189,8 +1191,11 @@ def setPlayerName(id : int, name : str) -> bool:
""" """
return sqg2o.setPlayerName(id, name) return sqg2o.setPlayerName(id, name)
def setPlayerPosition(id : int, x : float, y : float, z : float): @handle_exception
def setPlayerPosition(id : int, x : float = 0, y : float = 0, z : float = 0, pos: dict[str, float] = None):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will set the player world position for all players. This function will set the player world position for all players.
Original: [setPlayerPosition](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/player/setPlayerPosition/) Original: [setPlayerPosition](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/player/setPlayerPosition/)
@@ -1203,8 +1208,13 @@ def setPlayerPosition(id : int, x : float, y : float, z : float):
`float` **x**: the position in the world on the x axis. `float` **x**: the position in the world on the x axis.
`float` **y**: the position in the world on the y axis. `float` **y**: the position in the world on the y axis.
`float` **z**: the position in the world on the z axis. `float` **z**: the position in the world on the z axis.
OR
`dict[str, float]` **pos**: the position in the world on the XYZ axis.
""" """
return sqg2o.setPlayerPosition(id, x, y, z) if pos is not None:
return sqg2o.setPlayerPosition(id, pos['x'], pos['y'], pos['z'])
else:
return sqg2o.setPlayerPosition(id, x, y, z)
def setPlayerRespawnTime(id : int, respawnTime : int): def setPlayerRespawnTime(id : int, respawnTime : int):
""" """
@@ -1223,8 +1233,11 @@ def setPlayerRespawnTime(id : int, respawnTime : int):
""" """
return sqg2o.setPlayerRespawnTime(id, respawnTime) return sqg2o.setPlayerRespawnTime(id, respawnTime)
def setPlayerScale(id : int, x : float, y : float, z : float): @handle_exception
def setPlayerScale(id : int, x : float = 0, y : float = 0, z : float = 0, scale: dict[str, float] = None):
""" """
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will set the player scale for all players. This function will set the player scale for all players.
Original: [setPlayerScale](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/player/setPlayerScale/) Original: [setPlayerScale](https://gothicmultiplayerteam.gitlab.io/docs/0.3.0/script-reference/server-functions/player/setPlayerScale/)
@@ -1237,8 +1250,13 @@ def setPlayerScale(id : int, x : float, y : float, z : float):
`float` **x**: the scale factor on x axis. `float` **x**: the scale factor on x axis.
`float` **y**: the scale factor on y axis. `float` **y**: the scale factor on y axis.
`float` **z**: the scale factor on z axis. `float` **z**: the scale factor on z axis.
OR
`dict[str, float]` **pos**: the scale factor on the XYZ axis.
""" """
return sqg2o.setPlayerScale(id, x, y, z) if scale is not None:
return sqg2o.setPlayerScale(id, scale['x'], scale['y'], scale['z'])
else:
return sqg2o.setPlayerScale(id, x, y, z)
def setPlayerSkillWeapon(id : int, skillId : int, percentage : int): def setPlayerSkillWeapon(id : int, skillId : int, percentage : int):
""" """
@@ -1476,3 +1494,265 @@ def useItemToState(id : int, instance : str, state : int):
`int` **state**: the state that you'll start from interacting with item. `int` **state**: the state that you'll start from interacting with item.
""" """
return sqg2o.useItemToState(id, instance, state) return sqg2o.useItemToState(id, instance, state)
@handle_exception
def setPlayerAttributes(
id: int,
health: int = None,
max_health: int = None,
mana: int = None,
max_mana: int = None,
strength: int = None,
dexterity: int = None,
one_handed: int = None,
two_handed: int = None,
bow: int = None,
crossbow: int = None,
):
"""
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will modify player attributes for all players.
## Declaration
```python
def setPlayerAttributes(
id: int,
health: int = None,
max_health: int = None,
mana: int = None,
max_mana: int = None,
strength: int = None,
dexterity: int = None,
two_handed: int = None,
two_handned: int = None,
bow: int = None,
crossbow: int = None,
):
```
## Parameters
`int` **id**: the player id.
`int` **health**: health points amount.
`int` **max_health**: maximum health points amount.
`int` **mana**: mana points amount.
`int` **max_mana**: maximum mana points amount.
`int` **strength**: strength points amount.
`int` **dexterity**: dexterity points amount.
`int` **one_handed**: one-handed weapon skill value.
`int` **two_handed**: two-handed weapon skill value.
`int` **bow**: bow weapon skill value.
`int` **crossbow**: crossbow skill value.
## Usage
```python
import g2o
@g2o.event('onPlayerJoin')
def evt_join(**kwargs):
pid = kwargs['playerid']
g2o.setPlayerAttributes(
id=pid,
health=500,
max_health=500,
strength=1000,
dexterity=1000,
one_handed=90,
two_handed=90,
bow=90,
crossbow=90
)
```
"""
health = sqg2o.getPlayerHealth(id) if health is None else str(health)
max_health = sqg2o.getPlayerMaxHealth(id) if max_health is None else str(max_health)
mana = sqg2o.getPlayerMana(id) if mana is None else str(mana)
max_mana = sqg2o.getPlayerMaxMana(id) if max_mana is None else str(max_mana)
strength = sqg2o.getPlayerStrength(id) if strength is None else str(strength)
dexterity = sqg2o.getPlayerDexterity(id) if dexterity is None else str(dexterity)
one_handed = sqg2o.getPlayerSkillWeapon(id, 0) if one_handed is None else str(one_handed)
two_handed = sqg2o.getPlayerSkillWeapon(id, 1) if two_handed is None else str(two_handed)
bow = sqg2o.getPlayerSkillWeapon(id, 2) if bow is None else str(bow)
crossbow = sqg2o.getPlayerSkillWeapon(id, 3) if crossbow is None else str(crossbow)
health = sqg2o.getPlayerHealth(id) + int(health) if type(health) is str and (health.startswith('+') or health.startswith('-')) else int(health)
max_health = sqg2o.getPlayerMaxHealth(id) + int(max_health) if type(max_health) is str and (max_health.startswith('+') or max_health.startswith('-')) else int(max_health)
mana = sqg2o.getPlayerMana(id) + int(mana) if type(mana) is str and (mana.startswith('+') or mana.startswith('-')) else int(mana)
max_mana = sqg2o.getPlayerMaxMana(id) + int(max_mana) if type(max_mana) is str and (max_mana.startswith('+') or max_mana.startswith('-')) else int(max_mana)
strength = sqg2o.getPlayerStrength(id) + int(strength) if type(strength) is str and (strength.startswith('+') or strength.startswith('-')) else int(strength)
dexterity = sqg2o.getPlayerDexterity(id) + int(dexterity) if type(dexterity) is str and (dexterity.startswith('+') or dexterity.startswith('-')) else int(dexterity)
one_handed = sqg2o.getPlayerSkillWeapon(id, 0) + int(one_handed) if type(one_handed) is str and (one_handed.startswith('+') or one_handed.startswith('-')) else int(one_handed)
two_handed = sqg2o.getPlayerSkillWeapon(id, 1) + int(two_handed) if type(two_handed) is str and (two_handed.startswith('+') or two_handed.startswith('-')) else int(two_handed)
bow = sqg2o.getPlayerSkillWeapon(id, 2) + int(two_handed) if type(bow) is str and (bow.startswith('+') or bow.startswith('-')) else int(bow)
crossbow = sqg2o.getPlayerSkillWeapon(id, 3) + int(crossbow) if type(crossbow) is str and (crossbow.startswith('+') or crossbow.startswith('-')) else int(crossbow)
sqg2o.setPlayerMaxHealth(id, max_health)
sqg2o.setPlayerHealth(id, health)
sqg2o.setPlayerMaxMana(id, max_mana)
sqg2o.setPlayerMana(id, mana)
sqg2o.setPlayerStrength(id, strength)
sqg2o.setPlayerDexterity(id, dexterity)
sqg2o.setPlayerSkillWeapon(id, 0, one_handed)
sqg2o.setPlayerSkillWeapon(id, 1, two_handed)
sqg2o.setPlayerSkillWeapon(id, 2, bow)
sqg2o.setPlayerSkillWeapon(id, 3, crossbow)
@handle_exception
def setPlayerTalents(
id: int,
one_handed: int = None,
two_handed: int = None,
bow: int = None,
crossbow: int = None,
pick_locks: int = None,
pickpocket: int = None,
mage: int = None,
sneak: int = None,
regenerate: int = None,
firemaster: int = None,
acrobatics: int = None,
pickpocket_unused: int = None,
smith: int = None,
runes: int = None,
alchemy: int = None,
throphy: int = None,
talent_a: int = None,
talent_b: int = None,
talent_c: int = None,
talent_d: int = None,
talent_e: int = None,
):
"""
!!! note
This functions supports ``pass_exception: bool`` optional argument for manual handling exceptions.
This function will modify player talents for all players.
## Declaration
```python
def setPlayerTalents(
id: int,
one_handed: int = None,
two_handed: int = None,
bow: int = None,
crossbow: int = None,
pick_locks: int = None,
pickpocket: int = None,
mage: int = None,
sneak: int = None,
regenerate: int = None,
firemaster: int = None,
acrobatics: int = None,
pickpocket_unused: int = None,
smith: int = None,
runes: int = None,
alchemy: int = None,
throphy: int = None,
talent_a: int = None,
talent_b: int = None,
talent_c: int = None,
talent_d: int = None,
talent_e: int = None,
):
```
## Parameters
`int` **one_handed**: npc one handed weapon skill talent.
`int` **two_handed**: npc two handed weapon skill talent.
`int` **bow**: npc bow weapon skill talent.
`int` **crossbow**: npc crossbow weapon skill talent.
`int` **pick_locks**: npc picklock talent.
`int` **pickpocket**: npc pickpocket talent.
`int` **mage**: npc magic circle talent.
`int` **sneak**: npc sneak talent.
`int` **regenerate**: npc health regeneration talent.
`int` **firemaster**: npc firemaster talent (unused by the game).
`int` **acrobatics**: npc acrobatic talent.
`int` **pickpocket_unused**: npc old pickpocket talent (unused by the game).
`int` **smith**: npc smith talent.
`int` **runes**: npc runes creation talent.
`int` **alchemy**: npc potion creation talent.
`int` **throphy**: npc trophy gathering talent.
`int` **talent_a**: npc talent A (unused by the game).
`int` **talent_b**: npc talent B (unused by the game).
`int` **talent_c**: npc talent C (unused by the game).
`int` **talent_d**: npc talent D (unused by the game).
`int` **talent_e**: npc talent E (unused by the game).
## Usage
```python
import g2o
@g2o.event('onPlayerJoin')
def evt_join(**kwargs):
pid = kwargs['playerid']
g2o.setPlayerTalents(
id=pid,
pick_locks=1,
mage=6,
smith=1
)
```
"""
one_handed = sqg2o.getPlayerTalent(id, TALENT_1H) if one_handed is None else str(one_handed)
two_handed = sqg2o.getPlayerTalent(id, TALENT_2H) if two_handed is None else str(two_handed)
bow = sqg2o.getPlayerTalent(id, TALENT_BOW) if bow is None else str(bow)
crossbow = sqg2o.getPlayerTalent(id, TALENT_CROSSBOW) if crossbow is None else str(crossbow)
pick_locks = sqg2o.getPlayerTalent(id, TALENT_PICK_LOCKS) if pick_locks is None else str(pick_locks)
pickpocket = sqg2o.getPlayerTalent(id, TALENT_PICKPOCKET) if pickpocket is None else str(pickpocket)
mage = sqg2o.getPlayerTalent(id, TALENT_MAGE) if mage is None else str(mage)
sneak = sqg2o.getPlayerTalent(id, TALENT_SNEAK) if sneak is None else str(sneak)
regenerate = sqg2o.getPlayerTalent(id, TALENT_REGENERATE) if regenerate is None else str(regenerate)
firemaster = sqg2o.getPlayerTalent(id, TALENT_FIREMASTER) if firemaster is None else str(firemaster)
acrobatics = sqg2o.getPlayerTalent(id, TALENT_ACROBATIC) if acrobatics is None else str(acrobatics)
pickpocket_unused = sqg2o.getPlayerTalent(id, TALENT_PICKPOCKET_UNUSED) if pickpocket_unused is None else str(pickpocket_unused)
smith = sqg2o.getPlayerTalent(id, TALENT_SMITH) if smith is None else str(smith)
runes = sqg2o.getPlayerTalent(id, TALENT_RUNES) if runes is None else str(runes)
alchemy = sqg2o.getPlayerTalent(id, TALENT_ALCHEMY) if alchemy is None else str(alchemy)
throphy = sqg2o.getPlayerTalent(id, TALENT_THROPHY) if throphy is None else str(throphy)
talent_a = sqg2o.getPlayerTalent(id, TALENT_A) if talent_a is None else str(talent_a)
talent_b = sqg2o.getPlayerTalent(id, TALENT_B) if talent_b is None else str(talent_b)
talent_c = sqg2o.getPlayerTalent(id, TALENT_C) if talent_c is None else str(talent_c)
talent_d = sqg2o.getPlayerTalent(id, TALENT_D) if talent_d is None else str(talent_d)
talent_e = sqg2o.getPlayerTalent(id, TALENT_E) if talent_e is None else str(talent_e)
one_handed = sqg2o.getPlayerTalent(id, TALENT_1H) + int(one_handed) if type(one_handed) is str and (one_handed.startswith('+') or one_handed.startswith('-')) else int(one_handed)
two_handed = sqg2o.getPlayerTalent(id, TALENT_2H) + int(two_handed) if type(two_handed) is str and (two_handed.startswith('+') or two_handed.startswith('-')) else int(two_handed)
bow = sqg2o.getPlayerTalent(id, TALENT_BOW) + int(bow) if type(bow) is str and (bow.startswith('+') or bow.startswith('-')) else int(bow)
crossbow = sqg2o.getPlayerTalent(id, TALENT_CROSSBOW) + int(crossbow) if type(crossbow) is str and (crossbow.startswith('+') or crossbow.startswith('-')) else int(crossbow)
pick_locks = sqg2o.getPlayerTalent(id, TALENT_PICK_LOCKS) + int(pick_locks) if type(pick_locks) is str and (pick_locks.startswith('+') or pick_locks.startswith('-')) else int(pick_locks)
pickpocket = sqg2o.getPlayerTalent(id, TALENT_PICKPOCKET) + int(pickpocket) if type(pickpocket) is str and (pickpocket.startswith('+') or pickpocket.startswith('-')) else int(pickpocket)
mage = sqg2o.getPlayerTalent(id, TALENT_MAGE) + int(mage) if type(mage) is str and (mage.startswith('+') or mage.startswith('-')) else int(mage)
sneak = sqg2o.getPlayerTalent(id, TALENT_SNEAK) + int(sneak) if type(sneak) is str and (sneak.startswith('+') or sneak.startswith('-')) else int(sneak)
regenerate = sqg2o.getPlayerTalent(id, TALENT_REGENERATE) + int(regenerate) if type(regenerate) is str and (regenerate.startswith('+') or regenerate.startswith('-')) else int(regenerate)
firemaster = sqg2o.getPlayerTalent(id, TALENT_FIREMASTER) + int(firemaster) if type(firemaster) is str and (firemaster.startswith('+') or firemaster.startswith('-')) else int(firemaster)
acrobatics = sqg2o.getPlayerTalent(id, TALENT_ACROBATIC) + int(acrobatics) if type(acrobatics) is str and (acrobatics.startswith('+') or acrobatics.startswith('-')) else int(acrobatics)
pickpocket_unused = sqg2o.getPlayerTalent(id, TALENT_PICKPOCKET_UNUSED) + int(pickpocket_unused) if type(pickpocket_unused) is str and (pickpocket_unused.startswith('+') or pickpocket_unused.startswith('-')) else int(pickpocket_unused)
smith = sqg2o.getPlayerTalent(id, TALENT_SMITH) + int(smith) if type(smith) is str and (smith.startswith('+') or smith.startswith('-')) else int(smith)
runes = sqg2o.getPlayerTalent(id, TALENT_RUNES) + int(runes) if type(runes) is str and (runes.startswith('+') or runes.startswith('-')) else int(runes)
alchemy = sqg2o.getPlayerTalent(id, TALENT_ALCHEMY) + int(alchemy) if type(alchemy) is str and (alchemy.startswith('+') or alchemy.startswith('-')) else int(alchemy)
throphy = sqg2o.getPlayerTalent(id, TALENT_THROPHY) + int(throphy) if type(throphy) is str and (throphy.startswith('+') or throphy.startswith('-')) else int(throphy)
talent_a = sqg2o.getPlayerTalent(id, TALENT_A) + int(talent_a) if type(talent_a) is str and (talent_a.startswith('+') or talent_a.startswith('-')) else int(talent_a)
talent_b = sqg2o.getPlayerTalent(id, TALENT_B) + int(talent_b) if type(talent_b) is str and (talent_b.startswith('+') or talent_b.startswith('-')) else int(talent_b)
talent_c = sqg2o.getPlayerTalent(id, TALENT_C) + int(talent_c) if type(talent_c) is str and (talent_c.startswith('+') or talent_c.startswith('-')) else int(talent_c)
talent_d = sqg2o.getPlayerTalent(id, TALENT_D) + int(talent_d) if type(talent_d) is str and (talent_d.startswith('+') or talent_d.startswith('-')) else int(talent_d)
talent_e = sqg2o.getPlayerTalent(id, TALENT_E) + int(talent_e) if type(talent_e) is str and (talent_e.startswith('+') or talent_e.startswith('-')) else int(talent_e)
sqg2o.setPlayerTalent(id, TALENT_1H, one_handed)
sqg2o.setPlayerTalent(id, TALENT_2H, two_handed)
sqg2o.setPlayerTalent(id, TALENT_BOW, bow)
sqg2o.setPlayerTalent(id, TALENT_CROSSBOW, crossbow)
sqg2o.setPlayerTalent(id, TALENT_PICK_LOCKS, pick_locks)
sqg2o.setPlayerTalent(id, TALENT_PICKPOCKET, pickpocket)
sqg2o.setPlayerTalent(id, TALENT_MAGE, mage)
sqg2o.setPlayerTalent(id, TALENT_SNEAK, sneak)
sqg2o.setPlayerTalent(id, TALENT_REGENERATE, regenerate)
sqg2o.setPlayerTalent(id, TALENT_FIREMASTER, firemaster)
sqg2o.setPlayerTalent(id, TALENT_ACROBATIC, acrobatics)
sqg2o.setPlayerTalent(id, TALENT_PICKPOCKET_UNUSED, pickpocket_unused)
sqg2o.setPlayerTalent(id, TALENT_SMITH, smith)
sqg2o.setPlayerTalent(id, TALENT_RUNES, runes)
sqg2o.setPlayerTalent(id, TALENT_ALCHEMY, alchemy)
sqg2o.setPlayerTalent(id, TALENT_THROPHY, throphy)
sqg2o.setPlayerTalent(id, TALENT_A, talent_a)
sqg2o.setPlayerTalent(id, TALENT_B, talent_b)
sqg2o.setPlayerTalent(id, TALENT_C, talent_c)
sqg2o.setPlayerTalent(id, TALENT_D, talent_d)
sqg2o.setPlayerTalent(id, TALENT_E, talent_e)

View File

@@ -106,6 +106,9 @@ nav:
- onPlayerTeleport: defaultEvents/player/onPlayerTeleport.md - onPlayerTeleport: defaultEvents/player/onPlayerTeleport.md
- onPlayerToggleFaceAni: defaultEvents/player/onPlayerToggleFaceAni.md - onPlayerToggleFaceAni: defaultEvents/player/onPlayerToggleFaceAni.md
- Functions: - Functions:
- Exception:
- set_default_logger: functions/exception/set_default_logger.md
- handle_exception: functions/exception/handle_exception.md
- Chat: - Chat:
- sendMessageToAll: functions/chat/sendMessageToAll.md - sendMessageToAll: functions/chat/sendMessageToAll.md
- sendMessageToPlayer: functions/chat/sendMessageToPlayer.md - sendMessageToPlayer: functions/chat/sendMessageToPlayer.md
@@ -225,6 +228,8 @@ nav:
- setPlayerVisual: functions/player/setPlayerVisual.md - setPlayerVisual: functions/player/setPlayerVisual.md
- setPlayerWeaponMode: functions/player/setPlayerWeaponMode.md - setPlayerWeaponMode: functions/player/setPlayerWeaponMode.md
- setPlayerWorld: functions/player/setPlayerWorld.md - setPlayerWorld: functions/player/setPlayerWorld.md
- setPlayerAttributes: functions/player/setPlayerAttributes.md
- setPlayerTalents: functions/player/setPlayerTalents.md
- spawnPlayer: functions/player/spawnPlayer.md - spawnPlayer: functions/player/spawnPlayer.md
- stopAni: functions/player/stopAni.md - stopAni: functions/player/stopAni.md
- stopFaceAni: functions/player/stopFaceAni.md - stopFaceAni: functions/player/stopFaceAni.md