private static void OnModuleNWNXChat() { NWPlayer pc = NWNXChat.GetSender(); string newName = NWNXChat.GetMessage(); if (!CanHandleChat(pc)) { return; } NWNXChat.SkipMessage(); NWItem renameItem = pc.GetLocalObject("CRAFT_RENAMING_ITEM_OBJECT"); pc.DeleteLocalInt("CRAFT_RENAMING_ITEM"); pc.DeleteLocalObject("CRAFT_RENAMING_ITEM_OBJECT"); if (!renameItem.IsValid) { pc.SendMessage("Cannot find the item you were renaming."); return; } if (newName.Length < 3 || newName.Length > 64) { pc.SendMessage("Item names must be between 3 and 64 characters long."); return; } renameItem.Name = newName; pc.FloatingText("New name set!"); }
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."); }
public override void EndDialog() { NWPlayer player = GetPC(); player.DeleteLocalObject("ITEM_BEING_RENAMED"); player.DeleteLocalInt("ITEM_RENAMING_LISTENING"); player.DeleteLocalString("RENAMED_ITEM_NEW_NAME"); }
public bool Run(params object[] args) { NWPlayer player = NWPlayer.Wrap(Object.OBJECT_SELF); NWPlaceable forge = NWPlaceable.Wrap(player.GetLocalObject("FORGE")); string resref = forge.GetLocalString("FORGE_ORE"); forge.DeleteLocalObject("FORGE_USER"); player.DeleteLocalObject("FORGE"); forge.DeleteLocalString("FORGE_ORE"); player.IsBusy = false; PCSkill pcSkill = _skill.GetPCSkill(player, SkillType.Engineering); int level = _craft.GetIngotLevel(resref); string ingotResref = _craft.GetIngotResref(resref); if (pcSkill == null || level < 0 || string.IsNullOrWhiteSpace(ingotResref)) { return(false); } int delta = pcSkill.Rank - level; int count = 2; if (delta > 2) { count = delta; } if (count > 6) { count = 6; } if (_random.Random(100) + 1 <= _perk.GetPCPerkLevel(player, PerkType.Lucky)) { count++; } if (_random.Random(100) + 1 <= _perk.GetPCPerkLevel(player, PerkType.ProcessingEfficiency) * 10) { count++; } for (int x = 1; x <= count; x++) { _.CreateItemOnObject(ingotResref, player.Object); } int xp = (int)_skill.CalculateRegisteredSkillLevelAdjustedXP(100, level, pcSkill.Rank); _skill.GiveSkillXP(player, SkillType.Engineering, xp); if (_random.Random(100) + 1 <= 3) { _food.DecreaseHungerLevel(player, 1); } return(true); }
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 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"); } }