示例#1
0
        public Task Enter(IFieldObjUser user)
        {
            var items = Info.Items.Values
                        .OrderBy(i => i.ID)
                        .ToList();
            var packet = new UnstructuredOutgoingPacket(PacketSendOperations.OpenShopDlg);

            packet.WriteInt(TemplateID);
            packet.WriteShort((short)items.Count);

            items.ForEach(i =>
            {
                packet.WriteInt(i.TemplateID);
                packet.WriteInt(i.Price);
                packet.WriteByte(i.DiscountRate);
                packet.WriteInt(i.TokenTemplateID);
                packet.WriteInt(i.TokenPrice);
                packet.WriteInt(i.ItemPeriod);
                packet.WriteInt(i.LevelLimited);

                if (GameConstants.IsRechargeableItem(i.TemplateID))
                {
                    packet.WriteDouble(i.UnitPrice);
                }
                else
                {
                    packet.WriteShort((short)i.Quantity);
                }

                packet.WriteShort(i.MaxPerSlot);
            });

            return(user.Dispatch(packet));
        }
示例#2
0
        public override async Task Execute(IFieldObjUser user, string[] args)
        {
            var contiMoves = await _contiMoveRepository.RetrieveAll();

            var contiMoveID = await user.Prompt(target => target.AskMenu(
                                                    "Here are the ship schedules",
                                                    contiMoves.ToDictionary(
                                                        c => c.ID,
                                                        c =>
            {
                var ret = $"{c.Info.Name} ({c.State})";

                if (c.State == ContiMoveState.Event)
                {
                    ret += " #r(Event ongoing)#b";
                }

                return(ret);
            }
                                                        )
                                                    ));

            var contiMove = await _contiMoveRepository.Retrieve(contiMoveID);

            await contiMove.Enter(user);
        }
示例#3
0
        public override async Task Execute(IFieldObjUser user, ForcedStatCommandArgs args)
        {
            await user.ModifyForcedStats(s => {
                switch (args.Type)
                {
                case ModifyForcedStatType.STR:
                    s.STR = args.Value;
                    break;

                case ModifyForcedStatType.DEX:
                    s.DEX = args.Value;
                    break;

                case ModifyForcedStatType.INT:
                    s.INT = args.Value;
                    break;

                case ModifyForcedStatType.LUK:
                    s.LUK = args.Value;
                    break;

                case ModifyForcedStatType.PAD:
                    s.PAD = args.Value;
                    break;

                case ModifyForcedStatType.PDD:
                    s.PDD = args.Value;
                    break;

                case ModifyForcedStatType.MAD:
                    s.MAD = args.Value;
                    break;

                case ModifyForcedStatType.MDD:
                    s.MDD = args.Value;
                    break;

                case ModifyForcedStatType.ACC:
                    s.ACC = args.Value;
                    break;

                case ModifyForcedStatType.EVA:
                    s.EVA = args.Value;
                    break;

                case ModifyForcedStatType.Speed:
                    s.Speed = (byte)args.Value;
                    break;

                case ModifyForcedStatType.Jump:
                    s.Jump = (byte)args.Value;
                    break;

                case ModifyForcedStatType.SpeedMax:
                    s.SpeedMax = (byte)args.Value;
                    break;
                }
            });
        }
示例#4
0
        public override async Task Execute(IFieldObjUser user, string[] args)
        {
            await user.Message("Available command aliases:");

            await Task.WhenAll(_processor.Commands
                               .Where(c => c.Aliases.Count > 0)
                               .Select(c => user.Message($"{c.Name} - {string.Join(", ", c.Aliases)}")));
        }
示例#5
0
 public override async Task Execute(IFieldObjUser user, SkillRecordCommandArgs args)
 {
     await user.ModifySkills(s => s.Set(
                                 (int)args.Skill,
                                 args.Level,
                                 GameConstants.IsSkillNeedMasterLevel((int)args.Skill) ? args.MasterLevel : null)
                             );
 }
示例#6
0
 public override async Task Execute(IFieldObjUser user, MobStatCommandArgs args)
 {
     await Task.WhenAll(
         user.FieldSplit
         .GetObjects <IFieldObjMob>()
         .Select(m => m.ModifyMobStats(s => s.Set(args.Type, args.Value, args.Reason)))
         );
 }
        protected override Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            for (var i = 0; i < 8; i++)
            {
                user.Character.QuickSlotKeys[i] = new CharacterQuickSlotKey(packet.ReadInt());
            }

            return(Task.CompletedTask);
        }
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            _ = packet.ReadInt();
            var type     = (ItemInventoryType)packet.ReadByte();
            var response = new UnstructuredOutgoingPacket(PacketSendOperations.GatherItemResult);

            response.WriteBool(false);
            response.WriteByte((byte)type);

            await user.ModifyInventory(i => i[type].Gather(), true);

            await user.Dispatch(response);
        }
示例#9
0
 public CalculatedStats(
     IFieldObjUser user,
     ITemplateRepository <ItemTemplate> itemTemplates,
     ITemplateRepository <ItemOptionTemplate> optionTemplates,
     ITemplateRepository <ItemSetTemplate> setTemplates,
     ITemplateRepository <SkillTemplate> skillTemplates
     )
 {
     _user            = user;
     _itemTemplates   = itemTemplates;
     _optionTemplates = optionTemplates;
     _setTemplates    = setTemplates;
     _skillTemplates  = skillTemplates;
 }
示例#10
0
        public async Task Unwatch(IFieldObjUser user)
        {
            lock (_watcherLock)
            {
                _watchers.Remove(user);
                user.Watching.Remove(this);
            }

            await Task.WhenAll(GetObjects()
                               .Where(o => o != user)
                               .Select(o => user.Dispatch(o.GetLeaveFieldPacket())));

            UpdateControlledObjects();
        }
示例#11
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            _ = packet.ReadInt();

            var type = (GroupMessageType)packet.ReadByte();

            var recipientCount = packet.ReadByte();
            var recipients     = new int[recipientCount];

            for (var i = 0; i < recipientCount; i++)
            {
                recipients[i] = packet.ReadInt();
            }

            var text = packet.ReadString();

            switch (type)
            {
            case GroupMessageType.Party:
            {
                if (user.Party == null)
                {
                    return;
                }

                var partyChat = new UnstructuredOutgoingPacket(PacketSendOperations.GroupMessage);

                partyChat.WriteByte((byte)GroupMessageType.Party);
                partyChat.WriteString(user.Character.Name);
                partyChat.WriteString(text);

                var dispatchRequest = new DispatchToCharactersRequest {
                    Data = ByteString.CopyFrom(partyChat.Buffer)
                };

                dispatchRequest.Characters.Add(user.Party.Members
                                               .Select(m => m.ID)
                                               .Where(m => m != user.ID)
                                               );

                await stageUser.Stage.DispatchService.DispatchToCharacters(dispatchRequest);

                break;
            }

            default:
                stageUser.Stage.Logger.LogWarning($"Unhandled group message type: {type}");
                break;
            }
        }
示例#12
0
        public override async Task Execute(IFieldObjUser user, NPCShopCommandArgs args)
        {
            var template = await _templates.Retrieve(args.TemplateID);

            if (template == null)
            {
                await user.Message($"The specified NPC Shop: {args.TemplateID}, does not exist.");

                return;
            }

            var shop = new ShopDialog(template.ID, template);

            await user.Dialog(shop);
        }
示例#13
0
        public override async Task Execute(IFieldObjUser user, string[] args)
        {
            await user.ModifyStats(s =>
            {
                s.Level = 200;
                s.STR   = 10_000;
                s.DEX   = 10_000;
                s.INT   = 10_000;
                s.LUK   = 10_000;

                s.SP = 999;
                s.SetExtendSP(0, 100);
                s.SetExtendSP(1, 100);
                s.SetExtendSP(2, 100);
                s.SetExtendSP(3, 100);
                s.SetExtendSP(4, 100);
                s.SetExtendSP(5, 100);
                s.SetExtendSP(6, 100);
                s.SetExtendSP(7, 100);
                s.SetExtendSP(8, 100);
            });

            await user.ModifyInventory(i =>
            {
                i.Add(01302059);
                i.Add(01402037);
                i.Add(01312030);
                i.Add(01412026);
                i.Add(01322062);
                i.Add(01422027);
                i.Add(01452060);
                i.Add(01462039);
                i.Add(01472052);
                i.Add(01332050);
                i.Add(01332049);
                i.Add(01432038);
                i.Add(01442045);
                i.Add(01372032);
                i.Add(01382036);
                i.Add(01482013);
                i.Add(01492012);

                i.Add(02070016, 5);
                i.Add(02060000, 5);
                i.Add(02061000, 5);
                i.Add(02330005, 5);
            });
        }
示例#14
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var contimove = await stageUser.Stage.ContiMoveRepository.RetrieveByField(user.Field);

            if (contimove == null)
            {
                return;
            }

            var response = new UnstructuredOutgoingPacket(PacketSendOperations.CONTISTATE);

            response.WriteByte((byte)contimove.State);
            response.WriteBool(contimove.State == ContiMoveState.Event);

            await user.Dispatch(response);
        }
示例#15
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            _ = packet.ReadInt();
            var targetID = packet.ReadInt();
            var target   = user.Watching
                           .SelectMany(w => w.GetObjects <IFieldObjUser>())
                           .Where(o => o.ID == targetID)
                           .FirstOrDefault();

            if (target == null)
            {
                return;
            }

            var response = new UnstructuredOutgoingPacket(PacketSendOperations.CharacterInfo);

            response.WriteInt(target.ID);
            response.WriteByte(target.Character.Level);
            response.WriteShort(target.Character.Job);
            response.WriteShort(target.Character.POP);

            response.WriteByte(0);

            response.WriteString(target?.Guild?.Name ?? "");
            response.WriteString("");  // sAlliance

            response.WriteByte(0);     // Medal?

            response.WriteBool(false); // Pets

            response.WriteByte(0);     // TamingMobInfo
            response.WriteByte(0);     // Wishlist

            response.WriteInt(0);      // MedalAchievementInfo
            response.WriteShort(0);

            var chairs = target.Character.Inventories[ItemInventoryType.Install].Items
                         .Select(kv => kv.Value)
                         .Select(i => i.TemplateID)
                         .Where(i => i / 10000 == 301)
                         .ToList();

            response.WriteInt(chairs.Count);
            chairs.ForEach(i => response.WriteInt(i));

            await user.Dispatch(response);
        }
示例#16
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var emotion      = packet.ReadInt();
            var duration     = packet.ReadInt();
            var byItemOption = packet.ReadBool();

            // TODO item option check

            var response = new UnstructuredOutgoingPacket(PacketSendOperations.UserEmotion);

            response.WriteInt(user.ID);
            response.WriteInt(emotion);
            response.WriteInt(duration);
            response.WriteBool(byItemOption);

            await user.FieldSplit.Dispatch(user, response);
        }
示例#17
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            _ = packet.ReadInt();
            var type   = (ItemInventoryType)packet.ReadByte();
            var from   = packet.ReadShort();
            var to     = packet.ReadShort();
            var number = packet.ReadShort();

            if (to == 0)
            {
                await user.ModifyInventory(exclRequest : true); // TODO: drops

                return;
            }

            // TODO: checks
            await user.ModifyInventory(i => i[type].Move(from, to), true);
        }
示例#18
0
        public override async Task Execute(IFieldObjUser user, string[] args)
        {
            var def = new CommandLineArgumentsDefinition(typeof(TArgs))
            {
                ExeName = Name
            };

            try
            {
                var parsed = Args.Parse <TArgs>(args);

                await Execute(user, parsed);
            }
            catch (ArgException e)
            {
                await user.Message(e.Message);

                await user.Message($"Usage: {def.UsageSummary}");
            }
        }
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var objID = packet.ReadInt();
            var obj   = user.Field.GetPool(Type).GetObject(objID);

            if (obj is not T controlled)
            {
                return;
            }

            if (controlled == null)
            {
                return;
            }
            if (controlled.Controller != user)
            {
                return;
            }

            await Handle(stageUser, user, controlled, packet);
        }
示例#20
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            _ = packet.ReadInt();
            var message     = packet.ReadString();
            var onlyBalloon = packet.ReadBool();

            if (message.StartsWith("!") || message.StartsWith("@")) // TODO: config?
            {
                await stageUser.Stage.CommandProcessor.Process(user, message.Substring(1));

                return;
            }

            var chatPacket1 = new UnstructuredOutgoingPacket(PacketSendOperations.UserChat);

            chatPacket1.WriteInt(user.ID);
            chatPacket1.WriteBool(user.Account.GradeCode > 0 || user.Account.SubGradeCode > 0); // TODO: proper gm chat checks
            chatPacket1.WriteString(message);
            chatPacket1.WriteBool(onlyBalloon);

            await user.FieldSplit.Dispatch(chatPacket1);

            if (onlyBalloon)
            {
                return;
            }

            var chatPacket2 = new UnstructuredOutgoingPacket(PacketSendOperations.UserChatNLCPQ);

            chatPacket2.WriteInt(user.ID);
            chatPacket2.WriteBool(user.Account.GradeCode > 0 || user.Account.SubGradeCode > 0); // TODO: proper gm chat checks
            chatPacket2.WriteString(message);
            chatPacket2.WriteBool(onlyBalloon);
            chatPacket2.WriteString(user.Character.Name);

            await Task.WhenAll(user.Field
                               .GetUsers()
                               .Except(user.FieldSplit.GetWatchers())
                               .Select(u => u.Dispatch(chatPacket2)));
        }
        protected override async Task Handle(
            GameStageUser stageUser,
            IFieldObjUser user,
            IPacketReader packet
            )
        {
            var channelID = packet.ReadByte();

            // TODO checks, error handling

            var gameServerRequest = new DescribeServerByMetadataRequest();

            gameServerRequest.Metadata.Add("Type", Enum.GetName(ServerStageType.Game));
            gameServerRequest.Metadata.Add("WorldID", stageUser.Stage.WorldID.ToString());

            var gameServers = (await stageUser.Stage.ServerRegistry.DescribeByMetadata(gameServerRequest)).Servers
                              .OrderBy(g => g.Metadata["ChannelID"])
                              .ToList();
            var gameServer = gameServers[channelID];

            await stageUser.MigrateTo(gameServer);
        }
示例#22
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var npc = user.Field.GetPool(FieldObjType.NPC).GetObject <IFieldObjNPC>(packet.ReadInt());

            if (npc == null)
            {
                return;
            }
            if (!user.Watching.Any(w => w == npc.FieldSplit))
            {
                return;
            }

            var scriptName = npc.Info.Script;

            if (string.IsNullOrWhiteSpace(scriptName))
            {
                return;
            }

            try
            {
                var script = await stageUser.Stage.ScriptEngine.CreateFromFile(scriptName);

                var context      = new ConversationContext(user);
                var conversation = new ScriptedConversation(
                    context,
                    new BasicSpeaker(context, templateID: npc.Info.ID),
                    new BasicSpeaker(context, flags: ConversationSpeakerFlags.NPCReplacedByUser),
                    script
                    );

                await user.Converse(conversation);
            }
            catch (FileNotFoundException)
            {
                await user.Message($"The '{scriptName}' script does not exist.");
            }
        }
示例#23
0
        protected override async Task Handle(
            GameStageUser stageUser,
            IFieldObjUser controller,
            IFieldObjNPC controlled,
            IPacketReader packet
            )
        {
            var movement = new UnstructuredOutgoingPacket(PacketSendOperations.NpcMove);

            movement.WriteInt(controlled.ID);
            movement.WriteByte(packet.ReadByte()); // TODO: actions
            movement.WriteByte(packet.ReadByte());

            if (controlled.Info.Move)
            {
                var path = packet.Read(new MovePath());

                movement.Write(path);
                await controlled.Move(path);
            }

            await controlled.FieldSplit.Dispatch(movement);
        }
示例#24
0
        protected override Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var v3 = packet.ReadInt();

            if (v3 > 0)
            {
                return(Task.CompletedTask);
            }
            var count = packet.ReadInt();

            for (var i = 0; i < count; i++)
            {
                var key = packet.ReadInt();

                user.Character.FunctionKeys[key] = new CharacterFunctionKey
                {
                    Type   = packet.ReadByte(),
                    Action = packet.ReadInt()
                };
            }

            return(Task.CompletedTask);
        }
示例#25
0
        protected override async Task Handle(
            GameStageUser stageUser,
            IFieldObjUser user,
            IPacketReader packet
            )
        {
            _ = packet.ReadLong();
            _ = packet.ReadByte();
            _ = packet.ReadLong();
            _ = packet.ReadInt();
            _ = packet.ReadInt();
            _ = packet.ReadInt();

            var path     = packet.Read(new MovePath());
            var movement = new UnstructuredOutgoingPacket(PacketSendOperations.UserMove);

            movement.WriteInt(user.ID);
            movement.Write(path);

            await user.Move(path);

            await user.FieldSplit.Dispatch(user, movement);
        }
示例#26
0
        public override async Task Execute(IFieldObjUser user, DebugCommandArgs args)
        {
            var affectedArea = new FieldObjAffectedArea
            {
                AffectedAreaType = AffectedAreaType.Buff,
                OwnerID          = user.ID,
                Area             = new Rect2D(user.Position, new Size2D(150, 100)),
                SkillID          = 5281000,
                DateExpire       = DateTime.UtcNow.AddSeconds(3)
            };

            await user.Field.Enter(affectedArea);

            var messageBox = new FieldObjMessageBox
            {
                ItemID     = 5080000,
                Hope       = "Welcome to Edelstein!",
                Name       = "Edelstein Team",
                Position   = user.Position,
                DateExpire = DateTime.UtcNow.AddSeconds(10)
            };

            await user.Field.Enter(messageBox);
        }
示例#27
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var stage = stageUser.Stage;
            var flag  = (WhisperFlags)packet.ReadByte();

            switch (flag)
            {
            case WhisperFlags.Whisper | WhisperFlags.Request:
            {
                _ = packet.ReadInt();
                var name = packet.ReadString();
                var text = packet.ReadString();

                if (name.Equals(user.Character.Name, StringComparison.CurrentCultureIgnoreCase))
                {
                    return;
                }

                var allowed = false;
                var target  = await stage.CharacterRepository.RetrieveByName(name);

                var response = new UnstructuredOutgoingPacket(PacketSendOperations.Whisper);

                if (target != null)
                {
                    var sessionRequest = new DescribeSessionByCharacterRequest {
                        Character = target.ID
                    };
                    var sessionResponse = await stage.SessionRegistry.DescribeByCharacter(sessionRequest);

                    if (sessionResponse.Session.State == SessionState.LoggedIn)
                    {
                        allowed = true;
                    }
                }

                response.WriteByte((byte)(WhisperFlags.Whisper | WhisperFlags.Result));
                response.WriteString(allowed ? target.Name : name);
                response.WriteBool(allowed);

                if (allowed)
                {
                    var whisper = new UnstructuredOutgoingPacket(PacketSendOperations.Whisper)
                                  .WriteByte((byte)(WhisperFlags.Whisper | WhisperFlags.Receive))
                                  .WriteString(user.Character.Name)
                                  .WriteByte((byte)stage.ChannelID)
                                  .WriteBool(false) // bFromAdmin
                                  .WriteString(text);
                    var whisperRequest = new DispatchToCharactersRequest {
                        Data = ByteString.CopyFrom(whisper.Buffer)
                    };

                    whisperRequest.Characters.Add(target.ID);

                    await stage.DispatchService.DispatchToCharacters(whisperRequest);
                }

                await user.Dispatch(response);

                break;
            }

            default:
                stage.Logger.LogWarning($"Unhandled whisper flag: {flag}");
                break;
            }
        }
示例#28
0
        protected override async Task Execute(IFieldObjUser user, FieldTemplate template, TemplateCommandArgs args)
        {
            var field = await _repository.Retrieve(template.ID);

            await field.Enter(user, 0);
        }
示例#29
0
        protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet)
        {
            var type = (ConversationRequestType)packet.ReadByte();

            if (!user.IsConversing)
            {
                return;
            }

            var context = user.CurrentConversation.Context;

            if (type == ConversationRequestType.AskQuiz ||
                type == ConversationRequestType.AskSpeedQuiz)
            {
                await context.Respond(
                    new ConversationResponse <string>(type, packet.ReadString())
                    );

                return;
            }

            var answer = packet.ReadByte();

            if (
                type != ConversationRequestType.Say &&
                type != ConversationRequestType.AskYesNo &&
                type != ConversationRequestType.AskAccept &&
                answer == byte.MinValue ||
                (type == ConversationRequestType.Say ||
                 type == ConversationRequestType.AskYesNo ||
                 type == ConversationRequestType.AskAccept) && answer == byte.MaxValue
                )
            {
                await user.EndConversation();

                return;
            }

            switch (type)
            {
            case ConversationRequestType.AskText:
            case ConversationRequestType.AskBoxText:
                await context.Respond(
                    new ConversationResponse <string>(type, packet.ReadString())
                    );

                break;

            case ConversationRequestType.AskNumber:
            case ConversationRequestType.AskMenu:
            case ConversationRequestType.AskSlideMenu:
                await context.Respond(
                    new ConversationResponse <int>(type, packet.ReadInt())
                    );

                break;

            case ConversationRequestType.AskAvatar:
            case ConversationRequestType.AskMemberShopAvatar:
                await context.Respond(
                    new ConversationResponse <byte>(type, packet.ReadByte())
                    );

                break;

            case ConversationRequestType.AskYesNo:
            case ConversationRequestType.AskAccept:
                await context.Respond(
                    new ConversationResponse <bool>(type, Convert.ToBoolean(answer))
                    );

                break;

            default:
                await context.Respond(
                    new ConversationResponse <byte>(type, answer)
                    );

                break;
            }
        }
示例#30
0
 protected override async Task <bool> Check(GameStageUser stageUser, IFieldObjUser user)
 => await base.Check(stageUser, user) && user.IsConversing;