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 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 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 ) { 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 ) { _ = 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); }
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 async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet) { _ = packet.ReadInt(); var templateID = packet.ReadInt(); var template = await stageUser.Stage.SkillTemplates.Retrieve(templateID); if (template == null) { return; } var job = template.ID / 10000; var jobLevel = (byte)GameConstants.GetJobLevel(job); // TODO: job checks if (jobLevel == 0) { var sp = Math.Min(user.Character.Level - 1, job == 3000 ? 9 : 6); for (var i = 0; i < 3; i++) { sp -= user.Character.GetSkillLevel(job * 1000 + 1000 + i); } if (sp > 0) { await user.ModifySkills(s => s.Add(templateID), true); } return; } if (GameConstants.IsExtendSPJob(job) && user.Character.GetExtendSP(jobLevel) <= 0) { return; } if (!GameConstants.IsExtendSPJob(job) && user.Character.SP <= 0) { return; } var maxLevel = template.MaxLevel; if (GameConstants.IsSkillNeedMasterLevel(templateID)) { maxLevel = (short)user.Character.GetSkillMasterLevel(templateID); } if (user.Character.GetSkillLevel(templateID) >= maxLevel) { return; } var increment = 1; await user.ModifyStats(s => { if (GameConstants.IsExtendSPJob(job)) { s.SetExtendSP(jobLevel, (byte)(s.GetExtendSP(jobLevel) - increment)); } else { s.SP--; } }); await user.ModifySkills(s => s.Add(templateID, increment), true); }
protected abstract Task Handle( GameStageUser stageUser, IFieldObjUser controller, T controlled, IPacketReader packet );