public static void SetMapPin(NWPlayer oPC, string text, float positionX, float positionY, NWArea area, string tag) { int numberOfMapPins = GetNumberOfMapPins(oPC); int storeAtIndex = -1; for (int index = 0; index < numberOfMapPins; index++) { MapPin mapPin = GetMapPin(oPC, index); if (string.IsNullOrWhiteSpace(mapPin.Text)) { storeAtIndex = index; break; } } if (storeAtIndex == -1) { numberOfMapPins++; storeAtIndex = numberOfMapPins - 1; } storeAtIndex++; oPC.SetLocalString("NW_MAP_PIN_NTRY_" + storeAtIndex, text); oPC.SetLocalFloat("NW_MAP_PIN_XPOS_" + storeAtIndex, positionX); oPC.SetLocalFloat("NW_MAP_PIN_YPOS_" + storeAtIndex, positionY); oPC.SetLocalObject("NW_MAP_PIN_AREA_" + storeAtIndex, area.Object); oPC.SetLocalInt("NW_TOTAL_MAP_PINS", numberOfMapPins); if (tag != null) { oPC.SetLocalString("CUSTOM_NW_MAP_PIN_TAG_" + storeAtIndex, tag); } }
private static void OnModuleUseFeat() { NWPlayer pc = _.OBJECT_SELF; int featID = Convert.ToInt32(NWNXEvents.GetEventData("FEAT_ID")); if (featID != (int)Feat.RenameCraftedItem) { return; } pc.ClearAllActions(); bool isSetting = GetLocalBool(pc, "CRAFT_RENAMING_ITEM") == true; NWItem renameItem = NWNXObject.StringToObject(NWNXEvents.GetEventData("TARGET_OBJECT_ID")); if (isSetting) { pc.SendMessage("You are no longer naming an item."); pc.DeleteLocalInt("CRAFT_RENAMING_ITEM"); pc.DeleteLocalObject("CRAFT_RENAMING_ITEM_OBJECT"); return; } string crafterPlayerID = renameItem.GetLocalString("CRAFTER_PLAYER_ID"); if (string.IsNullOrWhiteSpace(crafterPlayerID) || new Guid(crafterPlayerID) != pc.GlobalID) { pc.SendMessage("You may only rename items which you have personally crafted."); return; } SetLocalBool(pc, "CRAFT_RENAMING_ITEM", true); pc.SetLocalObject("CRAFT_RENAMING_ITEM_OBJECT", renameItem); pc.SendMessage("Please enter in a name for this item. Length should be between 3 and 64 characters. Use this feat again to cancel this procedure."); }
private static void OnModuleUseFeat() { NWPlayer pc = Object.OBJECT_SELF; int featID = NWNXEvents.OnFeatUsed_GetFeatID(); if (featID != (int)CustomFeatType.RenameCraftedItem) { return; } pc.ClearAllActions(); bool isSetting = pc.GetLocalInt("CRAFT_RENAMING_ITEM") == TRUE; NWItem renameItem = NWNXEvents.OnFeatUsed_GetTarget().Object; if (isSetting) { pc.SendMessage("You are no longer naming an item."); pc.DeleteLocalInt("CRAFT_RENAMING_ITEM"); pc.DeleteLocalObject("CRAFT_RENAMING_ITEM_OBJECT"); return; } string crafterPlayerID = renameItem.GetLocalString("CRAFTER_PLAYER_ID"); if (string.IsNullOrWhiteSpace(crafterPlayerID) || new Guid(crafterPlayerID) != pc.GlobalID) { pc.SendMessage("You may only rename items which you have personally crafted."); return; } pc.SetLocalInt("CRAFT_RENAMING_ITEM", TRUE); pc.SetLocalObject("CRAFT_RENAMING_ITEM_OBJECT", renameItem); pc.SendMessage("Please enter in a name for this item. Length should be between 3 and 64 characters. Use this feat again to cancel this procedure."); }
private void startSmelt(NWPlaceable forge, NWPlayer pc, NWItem item) { int charges = forge.GetLocalInt("FORGE_CHARGES"); if (item.Resref == "coal") { item.Destroy(); charges += 10 + CalculatePerkCoalBonusCharges(pc); forge.SetLocalInt("FORGE_CHARGES", charges); NWPlaceable flames = NWPlaceable.Wrap(forge.GetLocalObject("FORGE_FLAMES")); if (!flames.IsValid) { Vector flamePosition = _biowarePosition.GetChangedPosition(forge.Position, 0.36f, forge.Facing); Location flameLocation = _.Location(forge.Area.Object, flamePosition, 0.0f); flames = NWPlaceable.Wrap(_.CreateObject(OBJECT_TYPE_PLACEABLE, "forge_flame", flameLocation)); forge.SetLocalObject("FORGE_FLAMES", flames.Object); } return; } else if (charges <= 0) { ReturnItemToPC(pc, item, "You must light the forge with coal before smelting."); return; } item.Destroy(); // Ready to smelt float baseCraftDelay = 18.0f - (_perk.GetPCPerkLevel(pc, PerkType.SpeedySmelter) * 0.1f); pc.IsBusy = true; forge.SetLocalObject("FORGE_USER", pc.Object); pc.SetLocalObject("FORGE", forge.Object); forge.SetLocalString("FORGE_ORE", item.Resref); _nwnxPlayer.StartGuiTimingBar(pc, baseCraftDelay, "cft_finish_smelt"); _.ApplyEffectToObject(DURATION_TYPE_TEMPORARY, _.EffectCutsceneImmobilize(), pc.Object, baseCraftDelay); pc.AssignCommand(() => _.ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0f, baseCraftDelay)); }
public override void DoAction(NWPlayer player, string pageName, int responseID) { switch (pageName) { case "MainPage": switch (responseID) { // Open Overflow Inventory case 1: NWObject storage = NWObject.Wrap(_.CreateObject(NWScript.OBJECT_TYPE_PLACEABLE, "overflow_storage", player.Location)); player.AssignCommand(() => _.ActionInteractObject(storage.Object)); break; // View Skills case 2: SwitchConversation("ViewSkills"); break; // View Perks case 3: SwitchConversation("ViewPerks"); break; // View Blueprints case 4: SwitchConversation("ViewBlueprints"); break; // Dice Bag case 5: player.SetLocalObject("dmfi_univ_target", player.Object); player.SetLocalLocation("dmfi_univ_location", player.Location); player.SetLocalString("dmfi_univ_conv", "pc_dicebag"); player.AssignCommand(() => { _.ClearAllActions(); _.ActionStartConversation(player.Object, "dmfi_universal", 1, 0); }); break; // Emote Menu case 6: player.SetLocalObject("dmfi_univ_target", player.Object); player.SetLocalLocation("dmfi_univ_location", player.Location); player.SetLocalString("dmfi_univ_conv", "pc_emote"); player.AssignCommand(() => { _.ClearAllActions(); _.ActionStartConversation(player.Object, "dmfi_universal", 1, 0); }); break; // Key Item Categories Page case 7: SwitchConversation("KeyItems"); break; // Modify Clothes case 8: player.AssignCommand(() => _.ActionStartConversation(player.Object, "x0_skill_ctrap", 1, 0)); break; // Character Management case 9: SwitchConversation("CharacterManagement"); break; // Open Trash Can (Destroy Items) case 10: EndConversation(); NWPlaceable trashCan = NWPlaceable.Wrap(_.CreateObject(NWScript.OBJECT_TYPE_PLACEABLE, "reo_trash_can", player.Location)); player.AssignCommand(() => _.ActionInteractObject(trashCan.Object)); _.DelayCommand(0.2f, () => trashCan.IsUseable = false); break; } break; } }
public bool Run(params object[] args) { NWPlaceable resource = NWPlaceable.Wrap(Object.OBJECT_SELF); NWPlayer oPC = NWPlayer.Wrap(_.GetLastDamager(resource.Object)); if (oPC.GetLocalInt("NOT_USING_CORRECT_WEAPON") == 1) { oPC.DeleteLocalInt("NOT_USING_CORRECT_WEAPON"); return(true); } PlayerCharacter pcEntity = _db.PlayerCharacters.Single(x => x.PlayerID == oPC.GlobalID); NWItem oWeapon = NWItem.Wrap(_.GetLastWeaponUsed(oPC.Object)); Location location = oPC.Location; string resourceItemResref = resource.GetLocalString("RESOURCE_RESREF"); int activityID = resource.GetLocalInt("RESOURCE_ACTIVITY"); string resourceName = resource.GetLocalString("RESOURCE_NAME"); int resourceCount = resource.GetLocalInt("RESOURCE_COUNT"); int difficultyRating = resource.GetLocalInt("RESOURCE_DIFFICULTY_RATING"); int weaponChanceBonus; SkillType skillType; int perkChanceBonus; int secondResourceChance; int durabilityChanceReduction = 0; int hasteChance; int lucky = _perk.GetPCPerkLevel(oPC, PerkType.Lucky) + oPC.EffectiveLuckBonus; bool hasBaggerPerk; if (activityID == 1) // 1 = Logging { weaponChanceBonus = oWeapon.LoggingBonus; if (weaponChanceBonus > 0) { weaponChanceBonus += _perk.GetPCPerkLevel(oPC, PerkType.LoggingAxeExpert) * 5; durabilityChanceReduction = _perk.GetPCPerkLevel(oPC, PerkType.LoggingAxeExpert) * 10 + lucky; } skillType = SkillType.Logging; perkChanceBonus = _perk.GetPCPerkLevel(oPC, PerkType.Lumberjack) * 5 + lucky; secondResourceChance = _perk.GetPCPerkLevel(oPC, PerkType.PrecisionLogging) * 10; hasteChance = _perk.GetPCPerkLevel(oPC, PerkType.SpeedyLogger) * 10 + lucky; if (pcEntity.BackgroundID == (int)BackgroundType.Lumberjack) { hasteChance += 10; } hasBaggerPerk = _perk.GetPCPerkLevel(oPC, PerkType.WoodBagger) > 0; } else if (activityID == 2) // Mining { weaponChanceBonus = oWeapon.MiningBonus; if (weaponChanceBonus > 0) { weaponChanceBonus += _perk.GetPCPerkLevel(oPC, PerkType.PickaxeExpert) * 5; durabilityChanceReduction = _perk.GetPCPerkLevel(oPC, PerkType.PickaxeExpert) * 10 + lucky; } skillType = SkillType.Mining; perkChanceBonus = _perk.GetPCPerkLevel(oPC, PerkType.Miner) * 5 + lucky; secondResourceChance = _perk.GetPCPerkLevel(oPC, PerkType.PrecisionMining) * 10; hasteChance = _perk.GetPCPerkLevel(oPC, PerkType.SpeedyMiner) * 10 + lucky; if (pcEntity.BackgroundID == (int)BackgroundType.Miner) { hasteChance += 10; } hasBaggerPerk = _perk.GetPCPerkLevel(oPC, PerkType.OreBagger) > 0; } else { return(false); } PCSkill skill = _skill.GetPCSkillByID(oPC.GlobalID, (int)skillType); int durabilityLossChance = 100 - durabilityChanceReduction; if (_random.Random(100) <= durabilityLossChance) { _durability.RunItemDecay(oPC, oWeapon); } int baseChance = 10; int chance = baseChance + weaponChanceBonus; chance += CalculateSuccessChanceDeltaModifier(difficultyRating, skill.Rank); chance += perkChanceBonus; bool givePityItem = false; if (chance > 0) { if (_random.Random(100) + 1 <= hasteChance) { _.ApplyEffectToObject(DURATION_TYPE_TEMPORARY, _.EffectHaste(), oPC.Object, 8.0f); } // Give an item if the player hasn't gotten anything after 6-8 attempts. int attemptFailureCount = oPC.GetLocalInt("RESOURCE_ATTEMPT_FAILURE_COUNT") + 1; NWObject failureResource = NWObject.Wrap(oPC.GetLocalObject("RESOURCE_ATTEMPT_FAILURE_OBJECT")); if (!failureResource.IsValid || !Equals(failureResource, resource)) { failureResource = resource; attemptFailureCount = 1; } int pityItemChance = 0; if (attemptFailureCount == 6) { pityItemChance = 60; } else if (attemptFailureCount == 7) { pityItemChance = 80; } else if (attemptFailureCount >= 8) { pityItemChance = 100; } if (_random.Random(100) + 1 <= pityItemChance) { givePityItem = true; attemptFailureCount = 0; } oPC.SetLocalInt("RESOURCE_ATTEMPT_FAILURE_COUNT", attemptFailureCount); oPC.SetLocalObject("RESOURCE_ATTEMPT_FAILURE_OBJECT", failureResource.Object); } if (chance <= 0) { oPC.FloatingText("You do not have enough skill to harvest this resource..."); } else if (_random.Random(100) <= chance || givePityItem) { if (hasBaggerPerk) { _.CreateItemOnObject(resourceItemResref, oPC.Object); } else { _.CreateObject(OBJECT_TYPE_ITEM, resourceItemResref, location); } oPC.FloatingText("You break off some " + resourceName + "."); resource.SetLocalInt("RESOURCE_COUNT", --resourceCount); _.ApplyEffectToObject(DURATION_TYPE_INSTANT, _.EffectHeal(10000), resource.Object); if (_random.Random(100) + 1 <= secondResourceChance) { oPC.FloatingText("You break off a second piece."); if (hasBaggerPerk) { _.CreateItemOnObject(resourceItemResref, oPC.Object); } else { _.CreateObject(OBJECT_TYPE_ITEM, resourceItemResref, location); } } float deltaModifier = CalculateXPDeltaModifier(difficultyRating, skill.Rank); float baseXP = (100 + _random.Random(20)) * deltaModifier; int xp = (int)_skill.CalculateRegisteredSkillLevelAdjustedXP(baseXP, oWeapon.RecommendedLevel, skill.Rank); _skill.GiveSkillXP(oPC, skillType, xp); oPC.DeleteLocalInt("RESOURCE_ATTEMPT_FAILURE_COUNT"); oPC.DeleteLocalObject("RESOURCE_ATTEMPT_FAILURE_OBJECT"); } if (resourceCount <= 0) { SpawnSeed(resource, oPC); NWObject prop = NWObject.Wrap(resource.GetLocalObject("RESOURCE_PROP_OBJ")); if (prop.IsValid) { prop.Destroy(); } resource.Destroy(); } return(true); }
public static void SetCallReceiver(NWPlayer player, NWPlayer receiver) { player.SetLocalObject("HOLOCOM_CALL_RECEIVER_OBJECT", receiver); }
public static void SetCallSender(NWPlayer player, NWPlayer sender) { player.SetLocalObject("HOLOCOM_CALL_SENDER_OBJECT", sender); }
public static void SetIsInCall(NWPlayer sender, NWPlayer receiver, bool value = true) { if (value) // START CALL { SetLocalBool(sender, "HOLOCOM_CALL_CONNECTED", true); SetLocalBool(receiver, "HOLOCOM_CALL_CONNECTED", true); sender.SetLocalObject("HOLOCOM_CALL_CONNECTED_WITH", receiver); receiver.SetLocalObject("HOLOCOM_CALL_CONNECTED_WITH", sender); string message = "Call Connected. (Use the HoloCom or the chat command /endcall to terminate the call)"; SendMessageToPC(sender, message); SendMessageToPC(receiver, message); var effectImmobilized = EffectCutsceneImmobilize(); TagEffect(effectImmobilized, "HOLOCOM_CALL_IMMOBILIZE"); ApplyEffectToObject(DurationType.Permanent, effectImmobilized, sender); ApplyEffectToObject(DurationType.Permanent, effectImmobilized, receiver); var holosender = CopyObject(sender, VectorService.MoveLocation(receiver.Location, GetFacing(receiver), 2.0f, 180)); var holoreceiver = CopyObject(receiver, VectorService.MoveLocation(sender.Location, GetFacing(sender), 2.0f, 180)); ApplyEffectToObject(DurationType.Permanent, EffectVisualEffect(VisualEffect.Vfx_Dur_Ghostly_Visage_No_Sound, false), holosender); ApplyEffectToObject(DurationType.Permanent, EffectVisualEffect(VisualEffect.Vfx_Dur_Ghostly_Visage_No_Sound, false), holoreceiver); SetPlotFlag(holoreceiver, true); SetPlotFlag(holosender, true); sender.SetLocalObject("HOLOCOM_HOLOGRAM", holosender); receiver.SetLocalObject("HOLOCOM_HOLOGRAM", holoreceiver); SetLocalObject(holosender, "HOLOGRAM_OWNER", sender); SetLocalObject(holoreceiver, "HOLOGRAM_OWNER", receiver); sender.AssignCommand(() => { PlaySound("hologram_on"); }); receiver.AssignCommand(() => { PlaySound("hologram_on"); }); /* * Console.WriteLine("SENDERS PERSPECTIVE:"); * Console.WriteLine("Sender Name: " + HoloComService.GetCallSender(sender).Name); * Console.WriteLine("Receiver Name: " + HoloComService.GetCallReceiver(sender).Name); * Console.WriteLine("Sender Call Attempts: " + HoloComService.GetCallAttempt(sender)); * Console.WriteLine("Sender Connected With: " + HoloComService.GetTargetForActiveCall(sender)); * Console.WriteLine("RECEIVERS PERSPECTIVE:"); * Console.WriteLine("Sender Name: " + HoloComService.GetCallSender(receiver).Name); * Console.WriteLine("Receiver Name: " + HoloComService.GetCallReceiver(receiver).Name); * Console.WriteLine("Sender Call Attempts: " + HoloComService.GetCallAttempt(GetCallSender(receiver))); * Console.WriteLine("Receiver Connected With:" + HoloComService.GetTargetForActiveCall(receiver)); */ } else // END CALL { foreach (var effect in sender.Effects) { if (_.GetIsEffectValid(effect) == true) { var effectType = GetEffectType(effect); if (effectType == EffectTypeScript.CutsceneImmobilize) { RemoveEffect(sender.Object, effect); } } } foreach (var effect in receiver.Effects) { if (_.GetIsEffectValid(effect) == true) { var effectType = GetEffectType(effect); if (effectType == EffectTypeScript.CutsceneImmobilize) { RemoveEffect(receiver.Object, effect); } } } sender.AssignCommand(() => { PlaySound("hologram_off"); }); receiver.AssignCommand(() => { PlaySound("hologram_off"); }); DestroyObject(GetHoloGram(sender)); DestroyObject(GetHoloGram(receiver)); sender.DeleteLocalInt("HOLOCOM_CALL_CONNECTED"); receiver.DeleteLocalInt("HOLOCOM_CALL_CONNECTED"); sender.DeleteLocalInt("HOLOCOM_CALL_SENDER"); receiver.DeleteLocalInt("HOLOCOM_CALL_SENDER"); sender.DeleteLocalInt("HOLOCOM_CALL_RECEIVER"); receiver.DeleteLocalInt("HOLOCOM_CALL_RECEIVER"); sender.DeleteLocalObject("HOLOCOM_CALL_CONNECTED_WITH"); receiver.DeleteLocalObject("HOLOCOM_CALL_CONNECTED_WITH"); sender.DeleteLocalObject("HOLOCOM_HOLOGRAM"); receiver.DeleteLocalObject("HOLOCOM_HOLOGRAM"); sender.DeleteLocalInt("HOLOCOM_CALL_ATTEMPT"); receiver.DeleteLocalInt("HOLOCOM_CALL_ATTEMPT"); sender.DeleteLocalObject("HOLOCOM_CALL_RECEIVER_OBJECT"); receiver.DeleteLocalObject("HOLOCOM_CALL_RECEIVER_OBJECT"); sender.DeleteLocalObject("HOLOCOM_CALL_SENDER_OBJECT"); receiver.DeleteLocalObject("HOLOCOM_CALL_SENDER_OBJECT"); } }