public Task <bool> OnHandle(MessageContext context, CAvatarChangeReqMessage message) { var session = context.GetSession <Session>(); var plr = session.Player; var room = plr.Room; var logger = plr.AddContextToLogger(_logger); // Can only change characters in lobby, during half time or when not ready if (plr.State != PlayerState.Lobby && room.GameRule.StateMachine.TimeState != GameTimeState.HalfTime || plr.IsReady) { plr.Disconnect(); return(Task.FromResult(true)); } logger.Debug("Avatar sync unk1={Unk1}", message.Unk1); if (message.Unk2.Length > 0) { logger.Warning("Avatar sync unk2={Unk2}", (object)message.Unk2); } room.Broadcast(new SAvatarChangeAckMessage(message.Unk1, message.Unk2)); return(Task.FromResult(true)); }
public void CAvatarChangeReq(GameSession session, CAvatarChangeReqMessage message) { var plr = session.Player; Logger.Debug() .Account(session) .Message($"Avatar sync - {JsonConvert.SerializeObject(message.Unk1, Formatting.Indented)}") .Write(); if (message.Unk2.Length > 0) { Logger.Warn() .Account(session) .Message($"Unk2: {JsonConvert.SerializeObject(message.Unk2, Formatting.Indented)}") .Write(); } var @char = plr.CharacterManager.CurrentCharacter; var unk1 = new ChangeAvatarUnk1Dto { AccountId = plr.Account.Id, Skills = @char.Skills.GetItems().Select(item => item?.ItemNumber ?? 0).ToArray(), Weapons = @char.Weapons.GetItems().Select(item => item?.ItemNumber ?? 0).ToArray(), Costumes = new ItemNumber[(int)CostumeSlot.Max], Unk5 = message.Unk1.Unk5, Unk6 = message.Unk1.Unk6, Unk7 = message.Unk1.Unk7, Unk8 = message.Unk1.Unk8, Gender = plr.CharacterManager.CurrentCharacter.Gender, HP = plr.GetMaxHP(), Unk11 = message.Unk1.Unk11 }; // If no item equipped use the default item the character was created with for (CostumeSlot slot = 0; slot < CostumeSlot.Max; slot++) { var item = plr.CharacterManager.CurrentCharacter.Costumes.GetItem(slot)?.ItemNumber ?? 0; switch (slot) { case CostumeSlot.Hair: if (item == 0) { item = @char.Hair.ItemNumber; } break; case CostumeSlot.Face: if (item == 0) { item = @char.Face.ItemNumber; } break; case CostumeSlot.Shirt: if (item == 0) { item = @char.Shirt.ItemNumber; } break; case CostumeSlot.Pants: if (item == 0) { item = @char.Pants.ItemNumber; } break; case CostumeSlot.Gloves: if (item == 0) { item = @char.Gloves.ItemNumber; } break; case CostumeSlot.Shoes: if (item == 0) { item = @char.Shoes.ItemNumber; } break; } unk1.Costumes[(int)slot] = item; } plr.Room.Broadcast(new SAvatarChangeAckMessage(unk1, message.Unk2)); }