Exemple #1
0
        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));
        }