private IEnumerable <object> CreateAIHusk(Character character) { character.Enabled = false; Entity.Spawner.AddToRemoveQueue(character); var configFile = Character.GetConfigFile("humanhusk"); if (string.IsNullOrEmpty(configFile)) { DebugConsole.ThrowError("Failed to turn character \"" + character.Name + "\" into a husk - husk config file not found."); yield return(CoroutineStatus.Success); } //XDocument doc = XMLExtensions.TryLoadXml(configFile); //if (doc?.Root == null) //{ // DebugConsole.ThrowError("Failed to turn character \"" + character.Name + "\" into a husk - husk config file ("+configFile+") could not be read."); // yield return CoroutineStatus.Success; //} //character.Info.Ragdoll = null; //character.Info.SourceElement = doc.Root; var husk = Character.Create(configFile, character.WorldPosition, character.Info.Name, character.Info, isRemotePlayer: false, hasAi: true); foreach (Limb limb in husk.AnimController.Limbs) { if (limb.type == LimbType.None) { limb.body.SetTransform(character.SimPosition, 0.0f); continue; } var matchingLimb = character.AnimController.GetLimb(limb.type); if (matchingLimb?.body != null) { limb.body.SetTransform(matchingLimb.SimPosition, matchingLimb.Rotation); limb.body.LinearVelocity = matchingLimb.LinearVelocity; limb.body.AngularVelocity = matchingLimb.body.AngularVelocity; } } if (character.Inventory.Items.Length != husk.Inventory.Items.Length) { string errorMsg = "Failed to move items from a human's inventory into a humanhusk's inventory (inventory sizes don't match)"; DebugConsole.ThrowError(errorMsg); GameAnalyticsManager.AddErrorEventOnce("AfflictionHusk.CreateAIHusk:InventoryMismatch", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); yield return(CoroutineStatus.Success); } for (int i = 0; i < character.Inventory.Items.Length && i < husk.Inventory.Items.Length; i++) { if (character.Inventory.Items[i] == null) { continue; } husk.Inventory.TryPutItem(character.Inventory.Items[i], i, true, false, null); } yield return(CoroutineStatus.Success); }
public static string GetFolder(string speciesName) { var folder = XMLExtensions.TryLoadXml(Character.GetConfigFile(speciesName))?.Root?.Element("ragdolls")?.GetAttributeString("folder", string.Empty); if (string.IsNullOrEmpty(folder) || folder.ToLowerInvariant() == "default") { folder = GetDefaultFolder(speciesName); } return(folder); }
public static string GetFolder(string speciesName, ContentPackage contentPackage = null) { string configFilePath = Character.GetConfigFile(speciesName, contentPackage); var folder = XMLExtensions.TryLoadXml(configFilePath)?.Root?.Element("ragdolls")?.GetAttributeString("folder", string.Empty); if (string.IsNullOrEmpty(folder) || folder.ToLowerInvariant() == "default") { folder = Path.Combine(Path.GetDirectoryName(configFilePath), "Ragdolls") + Path.DirectorySeparatorChar; } return(folder); }
public static string GetFolder(string speciesName, ContentPackage contentPackage = null) { var folder = XMLExtensions.TryLoadXml(Character.GetConfigFile(speciesName, contentPackage))?.Root?.Element("ragdolls")?.GetAttributeString("folder", string.Empty); if (string.IsNullOrEmpty(folder) || folder.ToLowerInvariant() == "default") { //DebugConsole.NewMessage("[RagollParams] Using the default folder."); folder = GetDefaultFolder(speciesName); } return(folder); }
public static List <Limb> AttachHuskAppendage(Character character, Ragdoll ragdoll = null) { var huskDoc = XMLExtensions.TryLoadXml(Character.GetConfigFile("humanhusk")); string pathToAppendage = huskDoc.Root.Element("huskappendage").GetAttributeString("path", string.Empty); XDocument doc = XMLExtensions.TryLoadXml(pathToAppendage); if (doc == null || doc.Root == null) { return(null); } if (ragdoll == null) { ragdoll = character.AnimController; } if (ragdoll.Dir < 1.0f) { ragdoll.Flip(); } var huskAppendages = new List <Limb>(); var limbElements = doc.Root.Elements("limb").ToDictionary(e => e.GetAttributeString("id", null), e => e); foreach (var jointElement in doc.Root.Elements("joint")) { if (limbElements.TryGetValue(jointElement.GetAttributeString("limb2", null), out XElement limbElement)) { JointParams jointParams = new JointParams(jointElement, ragdoll.RagdollParams); Limb attachLimb = ragdoll.Limbs[jointParams.Limb1]; Limb huskAppendage = new Limb(ragdoll, character, new LimbParams(limbElement, ragdoll.RagdollParams)); huskAppendage.body.Submarine = character.Submarine; huskAppendage.body.SetTransform(attachLimb.SimPosition, attachLimb.Rotation); ragdoll.AddLimb(huskAppendage); ragdoll.AddJoint(jointParams); huskAppendages.Add(huskAppendage); } } return(huskAppendages); }