Files
neonsr/game_server/handlers/DressRelicAvatarCsReq.py
2025-04-17 20:13:39 +08:00

63 lines
2.5 KiB
Python

import betterproto
from game_server.net.session import PlayerSession
from rail_proto.lib import (
DressRelicAvatarCsReq,
DressRelicAvatarScRsp
)
async def handle(session: PlayerSession, msg: DressRelicAvatarCsReq) -> betterproto.Message:
target_avatar = session.player.avatar_manager.get(msg.avatar_id)
if not target_avatar:
return DressRelicAvatarScRsp()
for relic_data in msg.switch_list:
relic = session.player.inventory_manager.get(relic_data.relic_unique_id)
if not relic:
continue
relic_sub_type = str(relic.sub_type)
current_relic_id = target_avatar.relic_ids.get(relic_sub_type, 0)
previous_avatar = session.player.avatar_manager.get(relic.equip_avatar)
if previous_avatar:
previous_relic_id = previous_avatar.relic_ids.get(relic_sub_type, 0)
if previous_relic_id > 0 and current_relic_id > 0:
current_relic = session.player.inventory_manager.get(current_relic_id)
previous_relic = session.player.inventory_manager.get(previous_relic_id)
if current_relic and previous_relic:
previous_avatar.relic_ids[relic_sub_type] = current_relic.unique_id
current_relic.equip_avatar = previous_avatar.avatar_id
target_avatar.relic_ids[relic_sub_type] = previous_relic.unique_id
previous_relic.equip_avatar = target_avatar.avatar_id
elif previous_relic_id > 0:
previous_relic = session.player.inventory_manager.get(previous_relic_id)
if previous_relic:
previous_relic.equip_avatar = 0
previous_avatar.relic_ids[relic_sub_type] = 0
elif current_relic_id > 0:
current_relic = session.player.inventory_manager.get(current_relic_id)
if current_relic:
current_relic.equip_avatar = 0
target_avatar.relic_ids[relic_sub_type] = 0
target_avatar.relic_ids[relic_sub_type] = relic.unique_id
relic.equip_avatar = target_avatar.avatar_id
else:
if current_relic_id > 0:
current_relic = session.player.inventory_manager.get(current_relic_id)
if current_relic:
current_relic.equip_avatar = 0
target_avatar.relic_ids[relic_sub_type] = relic.unique_id
relic.equip_avatar = target_avatar.avatar_id
session.pending_notify(session.player.PlayerSyncProto())
return DressRelicAvatarScRsp()