圣遗物装备卸下修复

This commit is contained in:
UnKownOwO
2023-02-13 20:10:08 +08:00
parent c23a75b802
commit d38569468c
2 changed files with 86 additions and 60 deletions

View File

@@ -69,7 +69,10 @@ func (g *GameManager) TakeoffEquipReq(player *model.Player, payloadMsg pb.Messag
// 卸下圣遗物 // 卸下圣遗物
player.TakeOffReliquary(avatar.AvatarId, reliquary.ReliquaryId) player.TakeOffReliquary(avatar.AvatarId, reliquary.ReliquaryId)
// 更新玩家装备 // 更新玩家装备
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByReliquary(avatar, reliquary) avatarEquipChangeNotify := &proto.AvatarEquipChangeNotify{
AvatarGuid: avatar.Guid,
EquipType: req.Slot,
}
g.SendMsg(cmd.AvatarEquipChangeNotify, player.PlayerID, player.ClientSeq, avatarEquipChangeNotify) g.SendMsg(cmd.AvatarEquipChangeNotify, player.PlayerID, player.ClientSeq, avatarEquipChangeNotify)
takeoffEquipRsp := &proto.TakeoffEquipRsp{ takeoffEquipRsp := &proto.TakeoffEquipRsp{
@@ -125,9 +128,16 @@ func (g *GameManager) WearUserAvatarReliquary(userId uint32, avatarId uint32, re
logger.Error("player is nil, uid: %v", userId) logger.Error("player is nil, uid: %v", userId)
return return
} }
avatar := player.AvatarMap[avatarId] avatar, ok := player.AvatarMap[avatarId]
reliquary := player.ReliquaryMap[reliquaryId] if !ok {
logger.Error("avatar error, avatarId: %v", avatarId)
return
}
reliquary, ok := player.ReliquaryMap[reliquaryId]
if !ok {
logger.Error("reliquary error, reliquaryId: %v", reliquaryId)
return
}
// 获取圣遗物配置表 // 获取圣遗物配置表
reliquaryConfig := gdconf.GetItemDataById(int32(reliquary.ItemId)) reliquaryConfig := gdconf.GetItemDataById(int32(reliquary.ItemId))
if reliquaryConfig == nil { if reliquaryConfig == nil {
@@ -135,30 +145,35 @@ func (g *GameManager) WearUserAvatarReliquary(userId uint32, avatarId uint32, re
return return
} }
// 角色已装备的圣遗物 // 角色已装备的圣遗物
avatarCurReliquary := avatar.EquipReliquaryMap[uint8(reliquaryConfig.ReliquaryType)] avatarCurReliquary, ok := avatar.EquipReliquaryMap[uint8(reliquaryConfig.ReliquaryType)]
if ok {
if reliquary.AvatarId != 0 {
// 圣遗物在别的角色身上
targetReliquaryAvatar, ok := player.AvatarMap[reliquary.AvatarId]
if !ok {
logger.Error("avatar error, avatarId: %v", reliquary.AvatarId)
return
}
// 卸下角色已装备的圣遗物
player.TakeOffReliquary(avatarId, avatarCurReliquary.ReliquaryId)
if reliquary.AvatarId != 0 { // 将目标圣遗物的角色卸下圣遗物
// 圣遗物在别的角色身上 player.TakeOffReliquary(targetReliquaryAvatar.AvatarId, reliquary.ReliquaryId)
weakAvatarId := reliquary.AvatarId // 将目标圣遗物的角色装备当前角色曾装备的圣遗物
weakReliquaryId := reliquaryId player.WearReliquary(targetReliquaryAvatar.AvatarId, avatarCurReliquary.ReliquaryId)
strongAvatarId := avatarId
strongReliquaryId := avatarCurReliquary.ReliquaryId
player.TakeOffReliquary(weakAvatarId, weakReliquaryId)
player.TakeOffReliquary(strongAvatarId, strongReliquaryId)
player.WearReliquary(weakAvatarId, strongReliquaryId)
player.WearReliquary(strongAvatarId, weakReliquaryId)
weakAvatar := player.AvatarMap[weakAvatarId] // 更新目标圣遗物角色的装备
weakReliquary := weakAvatar.EquipReliquaryMap[uint8(reliquaryConfig.ReliquaryType)] avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByReliquary(targetReliquaryAvatar, avatarCurReliquary)
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByReliquary(weakAvatar, weakReliquary) } else {
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify) // 角色当前有圣遗物则卸下
} else if avatarCurReliquary != nil { player.TakeOffReliquary(avatarId, avatarCurReliquary.ReliquaryId)
// 角色当前有圣遗物 }
player.TakeOffReliquary(avatarId, avatarCurReliquary.ReliquaryId)
player.WearReliquary(avatarId, reliquaryId)
} }
// 角色装备圣遗物
player.WearReliquary(avatarId, reliquaryId)
// 更新角色装备
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByReliquary(avatar, reliquary) avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByReliquary(avatar, reliquary)
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify) g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
} }
@@ -170,53 +185,63 @@ func (g *GameManager) WearUserAvatarWeapon(userId uint32, avatarId uint32, weapo
logger.Error("player is nil, uid: %v", userId) logger.Error("player is nil, uid: %v", userId)
return return
} }
avatar := player.AvatarMap[avatarId] avatar, ok := player.AvatarMap[avatarId]
weapon := player.WeaponMap[weaponId] if !ok {
logger.Error("avatar error, avatarId: %v", avatarId)
return
}
weapon, ok := player.WeaponMap[weaponId]
if !ok {
logger.Error("weapon error, weaponId: %v", weaponId)
return
}
world := WORLD_MANAGER.GetWorldByID(player.WorldId) world := WORLD_MANAGER.GetWorldByID(player.WorldId)
scene := world.GetSceneById(player.SceneId) if world == nil {
logger.Error("world is nil, worldId: %v", player.WorldId)
return
}
// 角色已装备的武器
avatarCurWeapon := avatar.EquipWeapon
if avatarCurWeapon != nil {
if weapon.AvatarId != 0 {
// 武器在别的角色身上
targetWeaponAvatar, ok := player.AvatarMap[weapon.AvatarId]
if !ok {
logger.Error("avatar error, avatarId: %v", weapon.AvatarId)
return
}
// 卸下角色已装备的武器
player.TakeOffWeapon(avatarId, avatarCurWeapon.WeaponId)
if weapon.AvatarId != 0 { // 将目标武器的角色卸下武器
// 武器在别的角色身上 player.TakeOffWeapon(targetWeaponAvatar.AvatarId, weapon.WeaponId)
weakAvatarId := weapon.AvatarId // 将目标武器的角色装备当前角色曾装备的武器
weakWeaponId := weaponId player.WearWeapon(targetWeaponAvatar.AvatarId, avatarCurWeapon.WeaponId)
strongAvatarId := avatarId
strongWeaponId := avatar.EquipWeapon.WeaponId
player.TakeOffWeapon(weakAvatarId, weakWeaponId)
player.TakeOffWeapon(strongAvatarId, strongWeaponId)
player.WearWeapon(weakAvatarId, strongWeaponId)
player.WearWeapon(strongAvatarId, weakWeaponId)
weakAvatar := player.AvatarMap[weakAvatarId] // 更新目标武器角色的装备
weakWeapon := weakAvatar.EquipWeapon weaponEntityId := uint32(0)
worldAvatar := world.GetPlayerWorldAvatar(player, targetWeaponAvatar.AvatarId)
weakWorldAvatar := world.GetPlayerWorldAvatar(player, weakAvatarId) if worldAvatar != nil {
if weakWorldAvatar != nil { weaponEntityId = worldAvatar.GetWeaponEntityId()
weakWorldAvatar.SetWeaponEntityId(scene.CreateEntityWeapon()) }
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(weakAvatar, weakWeapon, weakWorldAvatar.GetWeaponEntityId()) avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(targetWeaponAvatar, avatarCurWeapon, weaponEntityId)
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify) g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
} else { } else {
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(weakAvatar, weakWeapon, 0) // 角色当前有武器则卸下
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify) player.TakeOffWeapon(avatarId, avatarCurWeapon.WeaponId)
} }
} else if avatar.EquipWeapon != nil {
// 角色当前有武器
player.TakeOffWeapon(avatarId, avatar.EquipWeapon.WeaponId)
player.WearWeapon(avatarId, weaponId)
} else {
// 是新角色还没有武器
player.WearWeapon(avatarId, weaponId)
} }
// 角色装备武器
player.WearWeapon(avatarId, weaponId)
// 更新角色装备
weaponEntityId := uint32(0)
worldAvatar := world.GetPlayerWorldAvatar(player, avatarId) worldAvatar := world.GetPlayerWorldAvatar(player, avatarId)
if worldAvatar != nil { if worldAvatar != nil {
worldAvatar.SetWeaponEntityId(scene.CreateEntityWeapon()) weaponEntityId = worldAvatar.GetWeaponEntityId()
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(avatar, weapon, worldAvatar.GetWeaponEntityId())
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
} else {
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(avatar, weapon, 0)
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
} }
avatarEquipChangeNotify := g.PacketAvatarEquipChangeNotifyByWeapon(avatar, weapon, weaponEntityId)
g.SendMsg(cmd.AvatarEquipChangeNotify, userId, player.ClientSeq, avatarEquipChangeNotify)
} }
func (g *GameManager) PacketAvatarEquipChangeNotifyByReliquary(avatar *model.Avatar, reliquary *model.Reliquary) *proto.AvatarEquipChangeNotify { func (g *GameManager) PacketAvatarEquipChangeNotifyByReliquary(avatar *model.Avatar, reliquary *model.Reliquary) *proto.AvatarEquipChangeNotify {

View File

@@ -48,6 +48,7 @@ func (p *Player) InitAvatar(avatar *Avatar) {
avatar.Guid = p.GetNextGameObjectGuid() avatar.Guid = p.GetNextGameObjectGuid()
p.GameObjectGuidMap[avatar.Guid] = GameObject(avatar) p.GameObjectGuidMap[avatar.Guid] = GameObject(avatar)
avatar.EquipGuidMap = make(map[uint64]uint64) avatar.EquipGuidMap = make(map[uint64]uint64)
avatar.EquipReliquaryMap = make(map[uint8]*Reliquary)
p.AvatarMap[avatar.AvatarId] = avatar p.AvatarMap[avatar.AvatarId] = avatar
return return
} }