added logic module structure, reimplemented core hooks as a module
(but can't use it like yet that because of circular imports)
This commit is contained in:
parent
8537ca3e45
commit
577b7f3de7
3 changed files with 93 additions and 0 deletions
1
treepuncher/modules/__init__.py
Normal file
1
treepuncher/modules/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
from .module import LogicModule
|
81
treepuncher/modules/core.py
Normal file
81
treepuncher/modules/core.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
from ..treepuncher import Treepuncher, TreepuncherEvents
|
||||||
|
from .module import LogicModule
|
||||||
|
|
||||||
|
from aiocraft.mc.proto.play.clientbound import (
|
||||||
|
PacketRespawn, PacketLogin, PacketPosition, PacketUpdateHealth, PacketExperience,
|
||||||
|
PacketAbilities, PacketChat as PacketChatMessage
|
||||||
|
)
|
||||||
|
from aiocraft.mc.proto.play.serverbound import PacketTeleportConfirm, PacketClientCommand, PacketChat
|
||||||
|
from aiocraft.mc.definitions import Difficulty, Dimension, Gamemode, Position
|
||||||
|
|
||||||
|
class CoreLogic(LogicModule):
|
||||||
|
def register(self, client:Treepuncher):
|
||||||
|
@client.on_disconnected()
|
||||||
|
async def on_disconnected():
|
||||||
|
client.in_game = False
|
||||||
|
|
||||||
|
@client.on_packet(PacketRespawn)
|
||||||
|
async def on_player_respawning(packet:PacketRespawn):
|
||||||
|
client.gamemode = Gamemode(packet.gamemode)
|
||||||
|
client.dimension = Dimension(packet.dimension)
|
||||||
|
client.difficulty = Difficulty(packet.difficulty)
|
||||||
|
if client.difficulty != Difficulty.PEACEFUL \
|
||||||
|
and client.gamemode != Gamemode.SPECTATOR:
|
||||||
|
client.in_game = True
|
||||||
|
else:
|
||||||
|
client.in_game = False
|
||||||
|
client._logger.info(
|
||||||
|
"Reloading world: %s (%s) in %s",
|
||||||
|
client.dimension.name,
|
||||||
|
client.difficulty.name,
|
||||||
|
client.gamemode.name
|
||||||
|
)
|
||||||
|
|
||||||
|
@client.on_packet(PacketLogin)
|
||||||
|
async def player_joining_cb(packet:PacketLogin):
|
||||||
|
client.gamemode = Gamemode(packet.gameMode)
|
||||||
|
client.dimension = Dimension(packet.dimension)
|
||||||
|
client.difficulty = Difficulty(packet.difficulty)
|
||||||
|
if client.difficulty != Difficulty.PEACEFUL \
|
||||||
|
and client.gamemode != Gamemode.SPECTATOR:
|
||||||
|
client.in_game = True
|
||||||
|
else:
|
||||||
|
client.in_game = False
|
||||||
|
client._logger.info(
|
||||||
|
"Joined world: %s (%s) in %s",
|
||||||
|
client.dimension.name,
|
||||||
|
client.difficulty.name,
|
||||||
|
client.gamemode.name
|
||||||
|
)
|
||||||
|
client.run_callbacks(TreepuncherEvents.IN_GAME)
|
||||||
|
|
||||||
|
@client.on_packet(PacketPosition)
|
||||||
|
async def player_rubberband_cb(packet:PacketPosition):
|
||||||
|
client._logger.info("Position synchronized")
|
||||||
|
client.position = Position(packet.x, packet.y, packet.z)
|
||||||
|
await client.dispatcher.write(
|
||||||
|
PacketTeleportConfirm(
|
||||||
|
client.dispatcher.proto,
|
||||||
|
teleportId=packet.teleportId
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
@client.on_packet(PacketUpdateHealth)
|
||||||
|
async def player_hp_cb(packet:PacketUpdateHealth):
|
||||||
|
if packet.health != client.hp and packet.health <= 0:
|
||||||
|
client._logger.info("Dead, respawning...")
|
||||||
|
await client.dispatcher.write(
|
||||||
|
PacketClientCommand(client.dispatcher.proto, actionId=0) # respawn
|
||||||
|
)
|
||||||
|
client.run_callbacks(TreepuncherEvents.DIED)
|
||||||
|
client.hp = packet.health
|
||||||
|
client.food = packet.food
|
||||||
|
|
||||||
|
@client.on_packet(PacketExperience)
|
||||||
|
async def player_xp_cb(packet:PacketExperience):
|
||||||
|
if packet.level != client.lvl:
|
||||||
|
client._logger.info("Level up : %d", packet.level)
|
||||||
|
client.xp = packet.experienceBar
|
||||||
|
client.lvl = packet.level
|
||||||
|
client.total_xp = packet.totalExperience
|
||||||
|
|
11
treepuncher/modules/module.py
Normal file
11
treepuncher/modules/module.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
class LogicModule:
|
||||||
|
def register(self, client:'Treepuncher') -> None:
|
||||||
|
pass # override to register callbacks on client
|
||||||
|
|
||||||
|
async def initialize(self, client:'Treepuncher') -> None:
|
||||||
|
pass # override to register stuff on client start
|
||||||
|
|
||||||
|
async def cleanup(self, client:'Treepuncher') -> None:
|
||||||
|
pass # override to register stuff on client stop
|
||||||
|
|
Loading…
Reference in a new issue