public bool Run(params object[] args) { const int QuestID = 30; NWPlaceable crystal = Object.OBJECT_SELF; NWPlayer player = _.GetLastUsedBy(); // Check player's current quest state. If they aren't on stage 2 of the quest only show a message. var status = DataService.Single <PCQuestStatus>(x => x.PlayerID == player.GlobalID && x.QuestID == QuestID); var currentState = DataService.Single <QuestState>(x => x.ID == status.CurrentQuestStateID); if (currentState.Sequence != 2) { player.SendMessage("The crystal glows quietly..."); return(false); } // Player is on stage 2, so they're able to click the crystal, get a cluster, complete the quest, and teleport back to the cavern. int type = crystal.GetLocalInt("CRYSTAL_COLOR_TYPE"); string cluster; switch (type) { case 1: cluster = "c_cluster_blue"; break; // Blue case 2: cluster = "c_cluster_red"; break; // Red case 3: cluster = "c_cluster_green"; break; // Green case 4: cluster = "c_cluster_yellow"; break; // Yellow default: throw new Exception("Invalid crystal color type."); } _.CreateItemOnObject(cluster, player); QuestService.AdvanceQuestState(player, crystal, QuestID); // Hide the "Source of Power?" placeable so the player can't use it again. ObjectVisibilityService.AdjustVisibility(player, "81533EBB-2084-4C97-B004-8E1D8C395F56", false); NWObject tpWP = _.GetObjectByTag("FORCE_QUEST_LANDING"); player.AssignCommand(() => _.ActionJumpToLocation(tpWP.Location)); // Notify the player that new lightsaber perks have unlocked. player.FloatingText("You have unlocked the Lightsaber Blueprints perk. Find this under the Engineering category in your perks menu."); return(true); }
public void Main() { NWPlaceable overridePlaceable = NWGameObject.OBJECT_SELF; NWObject door = _.GetNearestObjectByTag("aban_director_exit", overridePlaceable); NWPlayer player = _.GetLastUsedBy(); door.AssignCommand(() => _.SetLocked(door, _.FALSE)); int questID = overridePlaceable.GetLocalInt("QUEST_ID_1"); _.SpeakString("The tractor beam has been disabled. A door in this room has unlocked."); NWArea mainLevel = overridePlaceable.Area.GetLocalObject("MAIN_LEVEL"); NWArea restrictedLevel = overridePlaceable.Area.GetLocalObject("RESTRICTED_LEVEL"); NWArea directorsChambers = overridePlaceable.Area.GetLocalObject("DIRECTORS_CHAMBERS"); // Enable the shuttle back to Viscara object. NWPlaceable teleportObject = _.GetNearestObjectByTag("aban_shuttle_exit", mainLevel); teleportObject.IsUseable = true; // Advance each party member's quest progression if they are in one of these three instance areas. foreach (var member in player.PartyMembers) { // Not in one of the three areas? Move to the next member. NWArea area = member.Area; if (area != mainLevel && area != restrictedLevel && area != directorsChambers) { continue; } QuestService.AdvanceQuestState(member.Object, overridePlaceable, questID); } // Disable this placeable from being used again for this instance. overridePlaceable.IsUseable = false; }
public static bool Check(params object[] args) { using (new Profiler(nameof(QuestCanAccept))) { int index = (int)args[0]; NWPlayer player = _.GetPCSpeaker(); NWObject talkTo = Object.OBJECT_SELF; int questID = talkTo.GetLocalInt("QUEST_ID_" + index); if (questID <= 0) { questID = talkTo.GetLocalInt("QST_ID_" + index); } if (DataService.GetAll <Data.Entity.Quest>().All(x => x.ID != questID)) { _.SpeakString("ERROR: Quest #" + index + " is improperly configured. Please notify an admin"); return(false); } QuestService.AdvanceQuestState(player, talkTo, questID); } return(true); }
public void Main() { NWPlaceable container = NWGameObject.OBJECT_SELF; NWObject owner = container.GetLocalObject("QUEST_OWNER"); NWPlayer player = _.GetLastDisturbed(); NWItem item = _.GetInventoryDisturbItem(); int disturbType = _.GetInventoryDisturbType(); string crafterPlayerID = item.GetLocalString("CRAFTER_PLAYER_ID"); Guid? crafterPlayerGUID = null; if (!string.IsNullOrWhiteSpace(crafterPlayerID)) { crafterPlayerGUID = new Guid(crafterPlayerID); } if (disturbType == _.INVENTORY_DISTURB_TYPE_ADDED) { int questID = container.GetLocalInt("QUEST_ID"); PCQuestStatus status = DataService.PCQuestStatus.GetByPlayerAndQuestID(player.GlobalID, questID); PCQuestItemProgress progress = DataService.PCQuestItemProgress.GetByPCQuestStatusIDAndResrefOrDefault(status.ID, item.Resref); DatabaseActionType action = DatabaseActionType.Update; if (progress == null) { _.CopyItem(item, player, _.TRUE); player.SendMessage(ColorTokenService.Red("That item is not required for this quest.")); } else if (progress.MustBeCraftedByPlayer && crafterPlayerGUID != player.GlobalID) { _.CopyItem(item, player, _.TRUE); player.SendMessage(ColorTokenService.Red("You may only submit items which you have personally created for this quest.")); } else { progress.Remaining--; if (progress.Remaining <= 0) { var progressCopy = progress; progress = DataService.PCQuestItemProgress.GetByID(progressCopy.ID); action = DatabaseActionType.Delete; } DataService.SubmitDataChange(progress, action); // Recalc the remaining items needed. int remainingCount = DataService.PCQuestItemProgress.GetCountByPCQuestStatusID(status.ID); if (remainingCount <= 0) { QuestService.AdvanceQuestState(player, owner, questID); } player.SendMessage("You need " + progress.Remaining + "x " + item.Name + " for this quest."); } item.Destroy(); var questItemProgresses = DataService.PCQuestItemProgress.GetAllByPCQuestStatusID(status.ID); if (!questItemProgresses.Any()) { string conversation = _.GetLocalString(owner, "CONVERSATION"); // Either start a SWLOR conversation if (!string.IsNullOrWhiteSpace(conversation)) { DialogService.StartConversation(player, owner, conversation); } // Or a regular NWN conversation. else { player.AssignCommand(() => { _.ActionStartConversation(owner, "", _.TRUE, _.FALSE); }); } } } }