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 PCCustomEffect RunPCCustomEffectProcess(NWPlayer oPC, PCCustomEffect effect) { NWCreature caster = oPC; if (!string.IsNullOrWhiteSpace(effect.CasterNWNObjectID)) { var obj = NWNXObject.StringToObject(effect.CasterNWNObjectID); if (obj.IsValid) { caster = obj.Object; } } if (effect.Ticks > 0) { effect.Ticks = effect.Ticks - 1; } if (effect.Ticks == 0) { return(null); } ICustomEffectHandler handler = CustomEffectService.GetCustomEffectHandler(effect.CustomEffectID); if (!string.IsNullOrWhiteSpace(handler.ContinueMessage) && effect.Ticks % 6 == 0) // Only show the message once every six seconds { oPC.SendMessage(handler.ContinueMessage); } handler?.Tick(caster, oPC, effect.Ticks, effect.EffectiveLevel, effect.Data); return(effect); }
private static void OnModuleUseFeat() { NWPlayer pc = _.OBJECT_SELF; int featID = Convert.ToInt32(NWNXEvents.GetEventData("FEAT_ID")); if (featID != (int)Feat.ChatCommandTargeter) { return; } var target = NWNXObject.StringToObject(NWNXEvents.GetEventData("TARGET_OBJECT_ID")); var targetPositionX = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_X")); var targetPositionY = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_Y")); var targetPositionZ = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_Z")); var targetPosition = Vector(targetPositionX, targetPositionY, targetPositionZ); var targetArea = NWNXObject.StringToObject(NWNXEvents.GetEventData("AREA_OBJECT_ID")); var targetLocation = Location(targetArea, targetPosition, 0.0f); string command = pc.GetLocalString("CHAT_COMMAND"); string args = pc.GetLocalString("CHAT_COMMAND_ARGS"); if (string.IsNullOrWhiteSpace(command)) { pc.SendMessage("Please enter a chat command and then use this feat. Type /help to learn more about the available chat commands."); return; } IChatCommand chatCommand = GetChatCommandHandler(command); ProcessChatCommand(chatCommand, pc, target, targetLocation, args); pc.DeleteLocalString("CHAT_COMMAND"); pc.DeleteLocalString("CHAT_COMMAND_ARGS"); }
public static void CopyVariables(NWObject oSource, NWObject oCopy) { int variableCount = NWNXObject.GetLocalVariableCount(oSource); for (int variableIndex = 0; variableIndex < variableCount - 1; variableIndex++) { NWNXObject.LocalVariable stCurVar = NWNXObject.GetLocalVariable(oSource, variableIndex); switch (stCurVar.Type) { case LocalVariableType.Int: oCopy.SetLocalInt(stCurVar.Key, oSource.GetLocalInt(stCurVar.Key)); break; case LocalVariableType.Float: oCopy.SetLocalFloat(stCurVar.Key, oSource.GetLocalFloat(stCurVar.Key)); break; case LocalVariableType.String: oCopy.SetLocalString(stCurVar.Key, oSource.GetLocalString(stCurVar.Key)); break; case LocalVariableType.Object: oCopy.SetLocalObject(stCurVar.Key, oSource.GetLocalObject(stCurVar.Key)); break; case LocalVariableType.Location: oCopy.SetLocalLocation(stCurVar.Key, oSource.GetLocalLocation(stCurVar.Key)); break; } } }
/// <summary> /// Processes all feats which are linked to perks. /// </summary> private static void OnModuleUseFeat() { // Activator is the creature who used the feat. // Target is who the activator selected to use this feat on. NWCreature activator = _.OBJECT_SELF; NWCreature target = NWNXObject.StringToObject(NWNXEvents.GetEventData("TARGET_OBJECT_ID")); var featID = (Feat)Convert.ToInt32(NWNXEvents.GetEventData("FEAT_ID")); // Ensure this perk feat can be activated. if (!CanUsePerkFeat(activator, target, featID)) { return; } // Retrieve information necessary for activation of perk feat. var perkFeat = DataService.PerkFeat.GetByFeatID((int)featID); Data.Entity.Perk perk = DataService.Perk.GetByID(perkFeat.PerkID); int creaturePerkLevel = PerkService.GetCreaturePerkLevel(activator, perk.ID); var handler = PerkService.GetPerkHandler(perkFeat.PerkID); SendAOEMessage(activator, activator.Name + " readies " + perk.Name + "."); // Force Abilities (aka Spells) if (perk.ExecutionTypeID == PerkExecutionType.ForceAbility) { target.SetLocalInt(LAST_ATTACK + activator.GlobalID, ATTACK_FORCE); ActivateAbility(activator, target, perk, handler, creaturePerkLevel, PerkExecutionType.ForceAbility, perkFeat.PerkLevelUnlocked); } // Combat Abilities else if (perk.ExecutionTypeID == PerkExecutionType.CombatAbility) { target.SetLocalInt(LAST_ATTACK + activator.GlobalID, ATTACK_PHYSICAL); ActivateAbility(activator, target, perk, handler, creaturePerkLevel, PerkExecutionType.CombatAbility, perkFeat.PerkLevelUnlocked); } // Queued Weapon Skills else if (perk.ExecutionTypeID == PerkExecutionType.QueuedWeaponSkill) { target.SetLocalInt(LAST_ATTACK + activator.GlobalID, ATTACK_PHYSICAL); HandleQueueWeaponSkill(activator, perk, handler, featID); } // Stances else if (perk.ExecutionTypeID == PerkExecutionType.Stance) { target.SetLocalInt(LAST_ATTACK + activator.GlobalID, ATTACK_COMBATABILITY); ActivateAbility(activator, target, perk, handler, creaturePerkLevel, PerkExecutionType.Stance, perkFeat.PerkLevelUnlocked); } // Concentration Abilities else if (perk.ExecutionTypeID == PerkExecutionType.ConcentrationAbility) { target.SetLocalInt(LAST_ATTACK + activator.GlobalID, ATTACK_FORCE); ActivateAbility(activator, target, perk, handler, creaturePerkLevel, PerkExecutionType.ConcentrationAbility, perkFeat.PerkLevelUnlocked); } }
// ReSharper disable once UnusedMember.Local public static void Main() { // Breaking the rules for the examine event because the result of the services is used in the following // service call. We still signal an event for this, but in general all of the logic should go into this method. using (new Profiler(nameof(mod_on_examine))) { NWPlayer examiner = (_.OBJECT_SELF); NWObject examinedObject = NWNXObject.StringToObject(NWNXEvents.GetEventData("EXAMINEE_OBJECT_ID")); if (ExaminationService.OnModuleExamine(examiner, examinedObject)) { MessageHub.Instance.Publish(new OnModuleExamine()); return; } string description; if (_.GetIsPC(examinedObject.Object) == true) { // https://github.com/zunath/SWLOR_NWN/issues/853 // safest probably to get the modified (non-original) description only for players // may want to always get the modified description for later flexibility? description = _.GetDescription(examinedObject.Object, false) + "\n\n"; } else { description = _.GetDescription(examinedObject.Object, true) + "\n\n"; } if (examinedObject.IsCreature) { var racialID = Convert.ToInt32(_.Get2DAString("racialtypes", "Name", (int)_.GetRacialType(examinedObject))); string racialtype = _.GetStringByStrRef(racialID); if (!description.Contains(ColorTokenService.Green("Racial Type: ") + racialtype)) { description += ColorTokenService.Green("Racial Type: ") + racialtype; } } description = ModService.OnModuleExamine(description, examiner, examinedObject); description = ItemService.OnModuleExamine(description, examinedObject); description = DurabilityService.OnModuleExamine(description, examinedObject); if (!string.IsNullOrWhiteSpace(description)) { _.SetDescription(examinedObject.Object, description, false); _.SetDescription(examinedObject.Object, description); } } MessageHub.Instance.Publish(new OnModuleExamine()); }
public static NWItem DeserializeItem(string base64String, Location targetLocation) { if (targetLocation == null) { throw new ArgumentException("Invalid target location during item deserialization."); } NWItem item = NWNXObject.Deserialize(base64String); item.Location = targetLocation; return(item); }
public static NWCreature DeserializeCreature(string base64String, Location location) { if (location == null) { throw new ArgumentException("Invalid target location during creature deserialization."); } NWCreature creature = NWNXObject.Deserialize(base64String); creature.Location = location; return(creature); }
public virtual void OnConversation(NWCreature self) { string convo = self.GetLocalString("CONVERSATION"); if (!string.IsNullOrWhiteSpace(convo)) { NWPlayer player = (GetLastSpeaker()); DialogService.StartConversation(player, self, convo); } else if (!string.IsNullOrWhiteSpace(NWNXObject.GetDialogResref(self))) { BeginConversation(NWNXObject.GetDialogResref(self)); } }
public static NWItem DeserializeItem(string base64String, NWCreature target) { if (target == null || !target.IsValid) { throw new ArgumentException("Invalid target creature during item deserialization."); } NWItem item = NWNXObject.Deserialize(base64String); var result = _.CopyItem(item.Object, target.Object, true); item.Destroy(); return(result); }
public static NWItem DeserializeItem(string base64String, NWPlaceable target) { if (target == null || !target.IsValid) { throw new ArgumentException("Invalid target placeable during item deserialization."); } NWItem item = NWNXObject.Deserialize(base64String).Object; if (item.Object == null) { throw new NullReferenceException("Unable to deserialize item."); } var result = _.CopyItem(item.Object, target.Object, TRUE); item.Destroy(); return(result); }
private static string ProcessEventAndBuildDetails(int eventID) { string details = string.Empty; NWObject target; int amount; switch (eventID) { case 1: // Spawn Creature var area = NWNXObject.StringToObject(NWNXEvents.GetEventData("AREA")); string areaName = GetName(area); NWCreature creature = NWNXObject.StringToObject(NWNXEvents.GetEventData("OBJECT")); int objectTypeID = Convert.ToInt32(NWNXEvents.GetEventData("OBJECT_TYPE")); float x = (float)Convert.ToDouble(NWNXEvents.GetEventData("POS_X")); float y = (float)Convert.ToDouble(NWNXEvents.GetEventData("POS_Y")); float z = (float)Convert.ToDouble(NWNXEvents.GetEventData("POS_Z")); SetLocalBool(creature, "DM_SPAWNED", true); details = areaName + "," + creature.Name + "," + objectTypeID + "," + x + "," + y + "," + z; break; case 22: // Give XP amount = Convert.ToInt32(NWNXEvents.GetEventData("AMOUNT")); target = NWNXObject.StringToObject(NWNXEvents.GetEventData("OBJECT")); details = amount + "," + target.Name; break; case 23: // Give Level amount = Convert.ToInt32(NWNXEvents.GetEventData("AMOUNT")); target = NWNXObject.StringToObject(NWNXEvents.GetEventData("OBJECT")); details = amount + "," + target.Name; break; case 24: // Give Gold amount = Convert.ToInt32(NWNXEvents.GetEventData("AMOUNT")); target = NWNXObject.StringToObject(NWNXEvents.GetEventData("OBJECT")); details = amount + "," + target.Name; break; } return(details); }
/// <summary> /// Retrieves all local string variables on an object matching a given prefix. /// Returns a list containing the scripts to run sequentially. /// </summary> /// <param name="target">The object to pull variables from</param> /// <param name="prefix">The prefix to look for</param> /// <returns>A list of scripts to run, ordered from lowest to highest</returns> public static IEnumerable <string> FindByPrefix(NWGameObject target, string prefix) { var variableCount = NWNXObject.GetLocalVariableCount(target); var variableList = new SortedList <int, string>(); for (int x = 0; x < variableCount; x++) { var variable = NWNXObject.GetLocalVariable(target, x); if (variable.Type == LocalVariableType.String && variable.Key.StartsWith(prefix)) { // If the rest of the variable key can be converted to an int, add it to the list. var skipCharacters = prefix.Length; var orderSubstring = variable.Key.Substring(skipCharacters); if (!int.TryParse(orderSubstring, out var order)) { // Couldn't parse an integer out of the key name. Move to the next variable. continue; } // If the variable ID has already been assigned, skip to the next variable. if (variableList.ContainsKey(order)) { Log.Warning($"Variable '{prefix}' for ID {order} already exists. Ignoring second entry."); continue; } // Add the script to the list. var value = GetLocalString(target, variable.Key); variableList.Add(order, value); } } return(variableList.Values.ToList()); }
public bool Run(params object[] args) { int type = _.GetInventoryDisturbType(); if (type != INVENTORY_DISTURB_TYPE_ADDED) { return(true); } NWPlaceable device = Object.OBJECT_SELF; NWPlayer player = _.GetLastDisturbed(); NWItem item = _.GetInventoryDisturbItem(); var componentIP = item.ItemProperties.FirstOrDefault(x => _.GetItemPropertyType(x) == (int)CustomItemPropertyType.ComponentType); // Not a component. Return the item. if (componentIP == null) { ItemService.ReturnItem(player, item); player.FloatingText("You cannot scrap this item."); return(false); } // Item is a component but it was crafted. Cannot scrap crafted items. if (!string.IsNullOrWhiteSpace(item.GetLocalString("CRAFTER_PLAYER_ID"))) { ItemService.ReturnItem(player, item); player.FloatingText("You cannot scrap crafted items."); return(false); } // Remove the item properties foreach (var ip in item.ItemProperties) { var ipType = _.GetItemPropertyType(ip); if (ipType != (int)CustomItemPropertyType.ComponentType) { _.RemoveItemProperty(item, ip); } } // Remove local variables (except the global ID) int varCount = NWNXObject.GetLocalVariableCount(item); for (int index = varCount - 1; index >= 0; index--) { var localVar = NWNXObject.GetLocalVariable(item, index); if (localVar.Key != "GLOBAL_ID") { switch (localVar.Type) { case LocalVariableType.Int: item.DeleteLocalInt(localVar.Key); break; case LocalVariableType.Float: item.DeleteLocalFloat(localVar.Key); break; case LocalVariableType.String: item.DeleteLocalString(localVar.Key); break; case LocalVariableType.Object: item.DeleteLocalObject(localVar.Key); break; case LocalVariableType.Location: item.DeleteLocalLocation(localVar.Key); break; default: throw new ArgumentOutOfRangeException(); } } } if (!item.Name.Contains("(SCRAPPED)")) { item.Name = item.Name + " (SCRAPPED)"; } device.AssignCommand(() => { _.ActionGiveItem(item, player); }); return(true); }
public static string Serialize(NWObject @object) { return(NWNXObject.Serialize(@object.Object)); }
private static void OnItemUsed() { NWPlayer user = _.OBJECT_SELF; NWItem oItem = NWNXObject.StringToObject(NWNXEvents.GetEventData("ITEM_OBJECT_ID")); NWObject target = NWNXObject.StringToObject(NWNXEvents.GetEventData("TARGET_OBJECT_ID")); var targetPositionX = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_X")); var targetPositionY = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_Y")); var targetPositionZ = (float)Convert.ToDouble(NWNXEvents.GetEventData("TARGET_POSITION_Z")); var targetPosition = Vector(targetPositionX, targetPositionY, targetPositionZ); Location targetLocation = Location(user.Area, targetPosition, 0.0f); string className = oItem.GetLocalString("SCRIPT"); if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("ACTIVATE_SCRIPT"); } if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("ACTION_SCRIPT"); } if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("SCRIPT"); } // Legacy events follow. We can't remove these because of backwards compatibility issues with existing items. if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("JAVA_SCRIPT"); } if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("ACTIVATE_JAVA_SCRIPT"); } if (string.IsNullOrWhiteSpace(className)) { className = oItem.GetLocalString("JAVA_ACTION_SCRIPT"); } if (string.IsNullOrWhiteSpace(className)) { return; } // Bypass the NWN "item use" animation. NWNXEvents.SkipEvent(); user.ClearAllActions(); if (user.IsBusy) { user.SendMessage("You are busy."); return; } // Remove "Item." prefix if it exists. if (className.StartsWith("Item.")) { className = className.Substring(5); } IActionItem item = GetActionItemHandler(className); string invalidTargetMessage = item.IsValidTarget(user, oItem, target, targetLocation); if (!string.IsNullOrWhiteSpace(invalidTargetMessage)) { user.SendMessage(invalidTargetMessage); return; } // NOTE - these checks are duplicated in FinishActionItem. Keep both in sync. float maxDistance = item.MaxDistance(user, oItem, target, targetLocation); if (maxDistance > 0.0f) { NWObject owner = GetItemPossessor(target); if (target.IsValid && owner.IsValid) { // We are okay - we have targeted an item in our inventory (we can't target someone // else's inventory, so no need to actually check distance). } else if (target.Object == _.OBJECT_SELF) { // Also okay. } else if (target.IsValid && (GetDistanceBetween(user.Object, target.Object) > maxDistance || user.Area.Resref != target.Area.Resref)) { user.SendMessage("Your target is too far away."); return; } else if (!target.IsValid && (GetDistanceBetweenLocations(user.Location, targetLocation) > maxDistance || user.Area.Resref != ((NWArea)GetAreaFromLocation(targetLocation)).Resref)) { user.SendMessage("That location is too far away."); return; } } CustomData customData = item.StartUseItem(user, oItem, target, targetLocation); float delay = item.Seconds(user, oItem, target, targetLocation, customData); var animationID = item.AnimationID(); bool faceTarget = item.FaceTarget(); Vector userPosition = user.Position; user.AssignCommand(() => { user.IsBusy = true; if (faceTarget) { SetFacingPoint(!target.IsValid ? GetPositionFromLocation(targetLocation) : target.Position); } if (animationID > 0) { ActionPlayAnimation(animationID, 1.0f, delay); } }); if (delay > 0.0f) { NWNXPlayer.StartGuiTimingBar(user, delay, string.Empty); } var @event = new OnFinishActionItem(className, user, oItem, target, targetLocation, userPosition, customData); user.DelayEvent(delay, @event); }