Source code for eolib.protocol.net.server.skill_learn
# Generated from the eo-protocol XML specification.
#
# This file should not be modified.
# Changes will be lost when code is regenerated.
from __future__ import annotations
from collections.abc import Iterable
from .skill_stat_requirements import SkillStatRequirements
from ....serialization_error import SerializationError
from .....data.eo_writer import EoWriter
from .....data.eo_reader import EoReader
[docs]
class SkillLearn:
"""
A skill that can be learned from a skill master NPC
"""
_byte_size: int = 0
_id: int
_level_requirement: int
_class_requirement: int
_cost: int
_skill_requirements: tuple[int, ...]
_stat_requirements: SkillStatRequirements
[docs]
def __init__(self, *, id: int, level_requirement: int, class_requirement: int, cost: int, skill_requirements: Iterable[int], stat_requirements: SkillStatRequirements):
"""
Create a new instance of SkillLearn.
Args:
id: (Value range is 0-64008.)
level_requirement: (Value range is 0-252.)
class_requirement: (Value range is 0-252.)
cost: (Value range is 0-4097152080.)
skill_requirements: (Length must be `4`.) (Element value range is 0-64008.)
stat_requirements:
"""
self._id = id
self._level_requirement = level_requirement
self._class_requirement = class_requirement
self._cost = cost
self._skill_requirements = tuple(skill_requirements)
self._stat_requirements = stat_requirements
@property
def byte_size(self) -> int:
"""
The size of the data that this was deserialized from.
"""
return self._byte_size
@property
def id(self) -> int:
"""
The `id` field.
"""
return self._id
@property
def level_requirement(self) -> int:
"""
The `level_requirement` field.
"""
return self._level_requirement
@property
def class_requirement(self) -> int:
"""
The `class_requirement` field.
"""
return self._class_requirement
@property
def cost(self) -> int:
"""
The `cost` field.
"""
return self._cost
@property
def skill_requirements(self) -> tuple[int, ...]:
"""
The `skill_requirements` field.
"""
return self._skill_requirements
@property
def stat_requirements(self) -> SkillStatRequirements:
"""
The `stat_requirements` field.
"""
return self._stat_requirements
[docs]
@staticmethod
def serialize(writer: EoWriter, data: "SkillLearn") -> None:
"""
Serializes an instance of `SkillLearn` to the provided `EoWriter`.
Args:
writer (EoWriter): The writer that the data will be serialized to.
data (SkillLearn): The data to serialize.
"""
old_string_sanitization_mode: bool = writer.string_sanitization_mode
try:
if data._id is None:
raise SerializationError("id must be provided.")
writer.add_short(data._id)
if data._level_requirement is None:
raise SerializationError("level_requirement must be provided.")
writer.add_char(data._level_requirement)
if data._class_requirement is None:
raise SerializationError("class_requirement must be provided.")
writer.add_char(data._class_requirement)
if data._cost is None:
raise SerializationError("cost must be provided.")
writer.add_int(data._cost)
if data._skill_requirements is None:
raise SerializationError("skill_requirements must be provided.")
if len(data._skill_requirements) != 4:
raise SerializationError(f"Expected length of skill_requirements to be exactly 4, got {len(data._skill_requirements)}.")
for i in range(4):
writer.add_short(data._skill_requirements[i])
if data._stat_requirements is None:
raise SerializationError("stat_requirements must be provided.")
SkillStatRequirements.serialize(writer, data._stat_requirements)
finally:
writer.string_sanitization_mode = old_string_sanitization_mode
[docs]
@staticmethod
def deserialize(reader: EoReader) -> "SkillLearn":
"""
Deserializes an instance of `SkillLearn` from the provided `EoReader`.
Args:
reader (EoReader): The writer that the data will be serialized to.
Returns:
The data to serialize.
"""
old_chunked_reading_mode: bool = reader.chunked_reading_mode
try:
reader_start_position: int = reader.position
id = reader.get_short()
level_requirement = reader.get_char()
class_requirement = reader.get_char()
cost = reader.get_int()
skill_requirements = []
for i in range(4):
skill_requirements.append(reader.get_short())
stat_requirements = SkillStatRequirements.deserialize(reader)
result = SkillLearn(id=id, level_requirement=level_requirement, class_requirement=class_requirement, cost=cost, skill_requirements=skill_requirements, stat_requirements=stat_requirements)
result._byte_size = reader.position - reader_start_position
return result
finally:
reader.chunked_reading_mode = old_chunked_reading_mode
def __repr__(self):
return f"SkillLearn(byte_size={repr(self._byte_size)}, id={repr(self._id)}, level_requirement={repr(self._level_requirement)}, class_requirement={repr(self._class_requirement)}, cost={repr(self._cost)}, skill_requirements={repr(self._skill_requirements)}, stat_requirements={repr(self._stat_requirements)})"