private static void ProcessQuestCommand(GameSession session, string command) { if (command == "") { session.SendNotice("Type a quest id."); return; } if (!int.TryParse(command, out int questId)) { return; } QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { return; } questStatus.Completed = true; questStatus.CompleteTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); session.Player.Levels.GainExp(questStatus.Reward.Exp); session.Player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new Item(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(session.Player.Job) || newItem.RecommendJobs.Contains(0)) { InventoryController.Add(session, newItem, true); } } session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <KeyValuePair <int, QuestMetadata> > questList = QuestMetadataStorage.GetAllQuests().Where(x => x.Value.Require.RequiredQuests.Contains(questId)); foreach (KeyValuePair <int, QuestMetadata> kvp in questList) { session.Player.QuestList.Add(new QuestStatus(kvp.Value)); } }
// Example: "item id:20000027" private static void ProcessItemCommand(GameSession session, string command) { Dictionary <string, string> config = command.ToMap(); int.TryParse(config.GetValueOrDefault("id", "20000027"), out int itemId); if (!ItemMetadataStorage.IsValid(itemId)) { session.SendNotice("Invalid item: " + itemId); return; } // Add some bonus attributes to equips and pets ItemStats stats = new ItemStats(); if (ItemMetadataStorage.GetTab(itemId) == InventoryTab.Gear || ItemMetadataStorage.GetTab(itemId) == InventoryTab.Pets) { Random rng = new Random(); stats.BonusAttributes.Add(ItemStat.Of((ItemAttribute)rng.Next(35), 0.01f)); stats.BonusAttributes.Add(ItemStat.Of((ItemAttribute)rng.Next(35), 0.01f)); } Item item = new Item(itemId) { CreationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), TransferFlag = TransferFlag.Splitable | TransferFlag.Tradeable, Stats = stats, PlayCount = itemId.ToString().StartsWith("35") ? 10 : 0 }; int rarity = 0; int.TryParse(config.GetValueOrDefault("rarity", "5"), out rarity); if (rarity > 0) { item.Rarity = rarity; } int.TryParse(config.GetValueOrDefault("amount", "1"), out item.Amount); // Simulate looting item InventoryController.Add(session, item, true); /*if (session.Player.Inventory.Add(item)) * { * session.Send(ItemInventoryPacket.Add(item)); * session.Send(ItemInventoryPacket.MarkItemNew(item, item.Amount)); * }*/ }