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)); }
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); }
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; } }); }
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)}"))); }
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) ); }
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); }
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; }
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(); }
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; } }
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); }
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); }); }
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); }
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); }
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); }
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); }
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); }
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); }
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."); } }
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); }
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); }
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); }
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); }
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; } }
protected override async Task Execute(IFieldObjUser user, FieldTemplate template, TemplateCommandArgs args) { var field = await _repository.Retrieve(template.ID); await field.Enter(user, 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; } }
protected override async Task <bool> Check(GameStageUser stageUser, IFieldObjUser user) => await base.Check(stageUser, user) && user.IsConversing;