public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JArray jarray = JArray.Load(reader); if (jarray == null) { return(null); } var output = new List <CharacterTalent>(jarray.Count); foreach (JToken token in jarray) { string data = token.ToString(); CharacterTalent value = (CharacterTalent)JsonConvert.DeserializeObject <CharacterTalent>(data); JToken glyphs = token["glyphs"]; data = glyphs["minor"].ToString(); value.MinorGlyphs = (List <TalentGlyph>)JsonConvert.DeserializeObject <List <TalentGlyph> >(data); data = glyphs["major"].ToString(); value.MajorGlyphs = (List <TalentGlyph>)JsonConvert.DeserializeObject <List <TalentGlyph> >(data); output.Add(value); } return(output.Count > 0 ? output : null); }
public static List <Affliction> ParseAfflictions(CharacterTalent characterTalent, XElement afflictionElements) { if (afflictionElements == null) { DebugConsole.ThrowError("Affliction list was not found in talent " + characterTalent.DebugIdentifier); return(null); } List <Affliction> afflictions = new List <Affliction>(); // similar logic to affliction creation in statuseffects // might be worth unifying foreach (XElement afflictionElement in afflictionElements.Elements()) { string afflictionIdentifier = afflictionElement.GetAttributeString("identifier", "").ToLowerInvariant(); AfflictionPrefab afflictionPrefab = AfflictionPrefab.List.FirstOrDefault(ap => ap.Identifier.ToLowerInvariant() == afflictionIdentifier); if (afflictionPrefab == null) { DebugConsole.ThrowError("Error in CharacterTalent (" + characterTalent.DebugIdentifier + ") - Affliction prefab with the identifier \"" + afflictionIdentifier + "\" not found."); continue; } Affliction afflictionInstance = afflictionPrefab.Instantiate(afflictionElement.GetAttributeFloat(1.0f, "amount", "strength")); afflictionInstance.Probability = afflictionElement.GetAttributeFloat(1.0f, "probability"); afflictions.Add(afflictionInstance); } return(afflictions); }
public CharacterAbilityGroupInterval(AbilityEffectType abilityEffectType, CharacterTalent characterTalent, XElement abilityElementGroup) : base(abilityEffectType, characterTalent, abilityElementGroup) { // too many overlapping intervals could cause hitching? maybe randomize a little interval = abilityElementGroup.GetAttributeFloat("interval", 0f); effectDelay = abilityElementGroup.GetAttributeFloat("effectdelay", 0f); }
public AbilityConditionHasStatusTag(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { tag = conditionElement.GetAttributeString("tag", ""); if (string.IsNullOrEmpty(tag)) { DebugConsole.AddWarning($"Error in talent \"{characterTalent.Prefab.OriginalName}\" - tag not defined in AbilityConditionHasStatusTag."); } }
public AbilityConditionLocation(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { if (conditionElement.Attribute("hasoutpost") != null) { hasOutpost = conditionElement.GetAttributeBool("hasoutpost", false); } locationIdentifiers = conditionElement.GetAttributeStringArray("locationtype", new string[0]); }
public AbilityConditionHasPermanentStat(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { statIdentifier = conditionElement.GetAttributeString("statidentifier", string.Empty); if (string.IsNullOrEmpty(statIdentifier)) { DebugConsole.ThrowError($"No stat identifier defined for {this} in talent {characterTalent.DebugIdentifier}!"); } string statTypeName = conditionElement.GetAttributeString("stattype", string.Empty); statType = string.IsNullOrEmpty(statTypeName) ? StatTypes.None : CharacterAbilityGroup.ParseStatType(statTypeName, characterTalent.DebugIdentifier); min = conditionElement.GetAttributeFloat("min", 0f); }
private CharacterAbility ConstructAbility(XElement abilityElement, CharacterTalent characterTalent) { CharacterAbility newAbility = CharacterAbility.Load(abilityElement, this); if (newAbility == null) { DebugConsole.ThrowError($"Unable to create an ability for {characterTalent.DebugIdentifier}!"); return(null); } return(newAbility); }
public AbilityConditionIsAiming(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { hittingCountsAsAiming = conditionElement.GetAttributeBool("hittingcountsasaiming", false); switch (conditionElement.GetAttributeString("weapontype", "")) { case "melee": weapontype = WeaponType.Melee; break; case "ranged": weapontype = WeaponType.Ranged; break; } }
public AbilityConditionMission(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { string missionTypeString = conditionElement.GetAttributeString("missiontype", "None"); if (!Enum.TryParse(missionTypeString, out missionType)) { DebugConsole.ThrowError("Error in AbilityConditionMission \"" + characterTalent.DebugIdentifier + "\" - \"" + missionTypeString + "\" is not a valid mission type."); return; } if (missionType == MissionType.None) { DebugConsole.ThrowError("Error in AbilityConditionMission \"" + characterTalent.DebugIdentifier + "\" - mission type cannot be none."); return; } }
public AbilityConditionAttackData(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { itemIdentifier = conditionElement.GetAttributeString("itemidentifier", ""); tags = conditionElement.GetAttributeStringArray("tags", new string[0], convertToLowerInvariant: true); switch (conditionElement.GetAttributeString("weapontype", "")) { case "melee": weapontype = WeaponType.Melee; break; case "ranged": weapontype = WeaponType.Ranged; break; } }
// XML private AbilityCondition ConstructCondition(CharacterTalent characterTalent, XElement conditionElement, bool errorMessages = true) { AbilityCondition newCondition = null; Type conditionType; string type = conditionElement.Name.ToString().ToLowerInvariant(); try { conditionType = Type.GetType("Barotrauma.Abilities." + type + "", false, true); if (conditionType == null) { if (errorMessages) { DebugConsole.ThrowError("Could not find the component \"" + type + "\" (" + characterTalent.DebugIdentifier + ")"); } return(null); } } catch (Exception e) { if (errorMessages) { DebugConsole.ThrowError("Could not find the component \"" + type + "\" (" + characterTalent.DebugIdentifier + ")", e); } return(null); } object[] args = { characterTalent, conditionElement }; try { newCondition = (AbilityCondition)Activator.CreateInstance(conditionType, args); } catch (TargetInvocationException e) { DebugConsole.ThrowError("Error while creating an instance of an ability condition of the type " + conditionType + ".", e.InnerException); return(null); } if (newCondition == null) { DebugConsole.ThrowError("Error while creating an instance of an ability condition of the type " + conditionType + ", instance was null"); return(null); } return(newCondition); }
public static List <StatusEffect> ParseStatusEffects(CharacterTalent characterTalent, XElement statusEffectElements) { if (statusEffectElements == null) { DebugConsole.ThrowError("StatusEffect list was not found in talent " + characterTalent.DebugIdentifier); return(null); } List <StatusEffect> statusEffects = new List <StatusEffect>(); foreach (XElement statusEffectElement in statusEffectElements.Elements()) { var statusEffect = StatusEffect.Load(statusEffectElement, characterTalent.DebugIdentifier); statusEffects.Add(statusEffect); } return(statusEffects); }
public CharacterAbilityGroup(AbilityEffectType abilityEffectType, CharacterTalent characterTalent, XElement abilityElementGroup) { AbilityEffectType = abilityEffectType; CharacterTalent = characterTalent; Character = CharacterTalent.Character; maxTriggerCount = abilityElementGroup.GetAttributeInt("maxtriggercount", int.MaxValue); foreach (XElement subElement in abilityElementGroup.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "abilities": LoadAbilities(subElement); break; case "conditions": LoadConditions(subElement); break; } } }
public AbilityConditionAttackResult(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { targetTypes = ParseTargetTypes(conditionElement.GetAttributeStringArray("targettypes", new string[0], convertToLowerInvariant: true)); afflictions = conditionElement.GetAttributeStringArray("afflictions", new string[0], convertToLowerInvariant: true); }
public AbilityConditionNoCrewDied(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionCrouched(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionHasItem(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { tags = conditionElement.GetAttributeStringArray("tags", new string[0], convertToLowerInvariant: true); requireAll = conditionElement.GetAttributeBool("requireall", false); //this.invSlotType = invSlotType; }
public AbilityConditionOnMission(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { afflictions = conditionElement.GetAttributeStringArray("afflictions", new string[0], convertToLowerInvariant: true); }
public AbilityConditionInHull(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionAlliesAboveVitality(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { vitalityPercentage = conditionElement.GetAttributeFloat("vitalitypercentage", 0f); }
public AbilityConditionDataless(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionRagdolled(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionHasAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { afflictionIdentifier = conditionElement.GetAttributeString("afflictionidentifier", ""); minimumPercentage = conditionElement.GetAttributeFloat("minimumpercentage", 0f); }
public AbilityConditionReduceAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { allowedTypes = conditionElement.GetAttributeStringArray("allowedtypes", new string[0], convertToLowerInvariant: true); identifier = conditionElement.GetAttributeString("identifier", ""); }
public AbilityConditionItemOutsideSubmarine(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityCondition(CharacterTalent characterTalent, XElement conditionElement) { this.characterTalent = characterTalent; character = characterTalent.Character; invert = conditionElement.GetAttributeBool("invert", false); }
public AbilityConditionLevelsBehindHighest(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { levelsBehind = conditionElement.GetAttributeInt("levelsbehind", 0); }
public AbilityConditionGeneHarvester(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { }
public AbilityConditionHasSkill(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement) { skillIdentifier = conditionElement.GetAttributeString("skillidentifier", string.Empty); minValue = conditionElement.GetAttributeFloat("minvalue", 0f); }