internal static void CheckPrefabDictionaries() { //// This debug is for when we need to dump prefab names for enums. //// Only needs to be run on updates. //SL_ShootBlast.DebugBlastNames(); //SL_ShootProjectile.DebugProjectileNames(); //SL_PlayVFX.DebugVfxNames(); // Once names have been dumped after an update and enums built, we only need this. SL_ShootBlast.BuildBlastsDictionary(); SL_ShootProjectile.BuildProjectileDictionary(); SL_PlayVFX.BuildPrefabDictionary(); foreach (var vfx in SL_ShootProjectile.ProjectilePrefabCache.Values) { vfx.transform.parent = SL.CloneHolder; } foreach (var vfx in SL_PlayVFX.VfxPrefabCache.Values) { vfx.transform.parent = SL.CloneHolder; } foreach (var vfx in SL_ShootBlast.BlastPrefabCache.Values) { vfx.transform.parent = SL.CloneHolder; } SL.Log("Built FX prefab dictionaries"); }
public override void SerializeItem(Item item) { base.SerializeItem(item); var skill = item as Skill; Cooldown = skill.Cooldown; StaminaCost = skill.StaminaCost; ManaCost = skill.ManaCost; DurabilityCost = skill.DurabilityCost; DurabilityCostPercent = skill.DurabilityCostPercent; HealthCost = skill.HealthCost; VFXOnStart = skill.VFXOnStart; StopStartVFXOnEnd = skill.StopVFX; RequiredPlayerType = skill.RequiredPType; if (skill.StartVFX) { StartVFX = SL_PlayVFX.GetVFXSystemEnum(skill.StartVFX); } if (skill.RequiredItems != null) { var list = new List <SkillItemReq>(); foreach (Skill.ItemRequired itemReq in skill.RequiredItems) { if (itemReq.Item != null) { list.Add(new SkillItemReq { ItemID = itemReq.Item.ItemID, Consume = itemReq.Consume, Quantity = itemReq.Quantity }); } } RequiredItems = list.ToArray(); } }
public override void ApplyToItem(Item item) { base.ApplyToItem(item); SLPackManager.AddLateApplyListener(OnLateApply, item); var skill = item as Skill; if (this.Cooldown != null) { skill.Cooldown = (float)this.Cooldown; } if (this.ManaCost != null) { skill.ManaCost = (float)this.ManaCost; } if (this.StaminaCost != null) { skill.StaminaCost = (float)this.StaminaCost; } if (this.DurabilityCost != null) { skill.DurabilityCost = (float)this.DurabilityCost; } if (this.DurabilityCostPercent != null) { skill.DurabilityCostPercent = (float)this.DurabilityCostPercent; } if (this.VFXOnStart != null) { skill.VFXOnStart = (bool)this.VFXOnStart; } if (this.StopStartVFXOnEnd != null) { skill.StopVFX = (bool)this.StopStartVFXOnEnd; } if (this.HealthCost != null) { skill.HealthCost = (float)this.HealthCost; } if (this.StartVFX != null) { if (this.StartVFX == SL_PlayVFX.VFXPrefabs.NONE) { skill.StartVFX = null; } else { var prefab = SL_PlayVFX.GetVfxSystem((SL_PlayVFX.VFXPrefabs) this.StartVFX); var copy = GameObject.Instantiate(prefab); GameObject.DontDestroyOnLoad(copy); copy.SetActive(false); skill.StartVFX = copy.GetComponent <VFXSystem>(); } } if (this.RequiredPlayerType != null) { skill.RequiredPType = (PlayerSystem.PlayerTypes) this.RequiredPlayerType; } // Add to internal dictionary of custom skills (for F3 menu fix) if (s_customSkills.ContainsKey(skill.ItemID)) { s_customSkills[skill.ItemID] = skill; } else { s_customSkills.Add(skill.ItemID, skill); } }
public virtual void SerializeStatus(StatusEffect status) { var preset = status.GetComponent <EffectPreset>(); this.NewStatusID = preset?.PresetID ?? -1; this.TargetStatusIdentifier = status.IdentifierName; this.StatusIdentifier = status.IdentifierName; this.IgnoreBuildupIfApplied = status.IgnoreBuildUpIfApplied; this.BuildupRecoverySpeed = status.BuildUpRecoverSpeed; this.DisplayedInHUD = status.DisplayInHud; this.IsHidden = status.IsHidden; this.Lifespan = status.StatusData.LifeSpan; this.RefreshRate = status.RefreshRate; this.AmplifiedStatusIdentifier = status.AmplifiedStatus?.IdentifierName ?? ""; this.PlayFXOnActivation = status.PlayFXOnActivation; this.ComplicationStatusIdentifier = status.ComplicationStatus?.IdentifierName; this.FXOffset = status.FxOffset; this.IgnoreBarrier = status.IgnoreBarrier; this.IsMalusEffect = status.IsMalusEffect; this.NormalizeDamageDisplay = status.NormalizeDamageDisplay; this.PlaySpecialFXOnStop = status.PlaySpecialFXOnStop; this.RemoveRequiredStatus = status.RemoveRequiredStatus; this.RequiredStatusIdentifier = status.RequiredStatus?.IdentifierName; this.SpecialSFX = status.SpecialSFX; this.VFXInstantiationType = status.FxInstantiation; this.ActionOnHit = status.ActionOnHit; this.Priority = (int)At.GetField(status, "m_priority"); this.DelayedDestroyTime = status.DelayedDestroyTime; this.Purgeable = status.Purgeable; CustomStatusEffects.GetStatusLocalization(status, out Name, out Description); var tags = At.GetField(status, "m_tagSource") as TagListSelectorComponent; if (tags) { Tags = tags.Tags.Select(it => it.TagName).ToArray(); } var vfx = status.FXPrefab?.GetComponent <VFXSystem>(); if (vfx) { VFXPrefab = SL_PlayVFX.GetVFXSystemEnum(vfx); } // PARSE EFFECT FAMILY FamilyMode = status.FamilyMode; if (status.EffectFamily != null) { if (FamilyMode == StatusEffect.FamilyModes.Bind) { BindFamily = SL_StatusEffectFamily.ParseEffectFamily(status.EffectFamily); } else { ReferenceFamilyUID = status.EffectFamily.UID; } } // For existing StatusEffects, the StatusData contains the real values, so we need to SetValue to each Effect. var statusData = status.StatusData.EffectsData; var components = status.GetComponentsInChildren <Effect>(); for (int i = 0; i < components.Length; i++) { var comp = components[i]; if (comp && comp.Signature.Length > 0) { comp.SetValue(statusData[i].Data); } } var effects = new List <SL_EffectTransform>(); Transform signature; if (status.transform.childCount > 0) { signature = status.transform.GetChild(0); if (signature.transform.childCount > 0) { foreach (Transform child in signature.transform) { var effectsChild = SL_EffectTransform.ParseTransform(child); if (effectsChild.HasContent) { effects.Add(effectsChild); } } } } Effects = effects.ToArray(); }
internal virtual void Internal_ApplyTemplate(StatusEffect status) { SL.Log("Applying Status Effect template: " + Name ?? status.name); SLPackManager.AddLateApplyListener(OnLateApply, status); CustomStatusEffects.SetStatusLocalization(status, Name, Description); if (status.StatusData == null) { status.StatusData = new StatusData(); } if (Lifespan != null) { status.StatusData.LifeSpan = (float)Lifespan; } if (RefreshRate != null) { status.RefreshRate = (float)RefreshRate; } if (this.Priority != null) { At.SetField(status, "m_priority", (int)this.Priority); } if (this.Purgeable != null) { At.SetField(status, "m_purgeable", (bool)this.Purgeable); } if (this.DelayedDestroyTime != null) { status.DelayedDestroyTime = (int)this.DelayedDestroyTime; } if (BuildupRecoverySpeed != null) { status.BuildUpRecoverSpeed = (float)BuildupRecoverySpeed; } if (IgnoreBuildupIfApplied != null) { status.IgnoreBuildUpIfApplied = (bool)IgnoreBuildupIfApplied; } if (DisplayedInHUD != null) { status.DisplayInHud = (bool)DisplayedInHUD; } if (IsHidden != null) { status.IsHidden = (bool)IsHidden; } if (IsMalusEffect != null) { status.IsMalusEffect = (bool)this.IsMalusEffect; } if (this.ActionOnHit != null) { At.SetField(status, "m_actionOnHit", (StatusEffect.ActionsOnHit) this.ActionOnHit); } if (this.RemoveRequiredStatus != null) { status.RemoveRequiredStatus = (bool)this.RemoveRequiredStatus; } if (this.NormalizeDamageDisplay != null) { status.NormalizeDamageDisplay = (bool)this.NormalizeDamageDisplay; } if (this.IgnoreBarrier != null) { status.IgnoreBarrier = (bool)this.IgnoreBarrier; } if (this.StatusIdentifier != this.TargetStatusIdentifier) { At.SetField(status, "m_effectType", new TagSourceSelector(Tag.None)); } if (Tags != null) { var tagSource = CustomTags.SetTagSource(status.gameObject, Tags, true); At.SetField(status, "m_tagSource", tagSource); } else if (!status.GetComponent <TagSource>()) { var tagSource = status.gameObject.AddComponent <TagSource>(); At.SetField(status, "m_tagSource", tagSource); } if (this.PlayFXOnActivation != null) { status.PlayFXOnActivation = (bool)this.PlayFXOnActivation; } if (this.VFXInstantiationType != null) { status.FxInstantiation = (StatusEffect.FXInstantiationTypes) this.VFXInstantiationType; } if (this.VFXPrefab != null) { if (this.VFXPrefab == SL_PlayVFX.VFXPrefabs.NONE) { status.FXPrefab = null; } else { var clone = GameObject.Instantiate(SL_PlayVFX.GetVfxSystem((SL_PlayVFX.VFXPrefabs) this.VFXPrefab)); GameObject.DontDestroyOnLoad(clone); status.FXPrefab = clone.transform; } } if (this.FXOffset != null) { status.FxOffset = (Vector3)this.FXOffset; } if (this.PlaySpecialFXOnStop != null) { status.PlaySpecialFXOnStop = (bool)this.PlaySpecialFXOnStop; } // setup family if (this.FamilyMode == null && this.StatusIdentifier != this.TargetStatusIdentifier) { // Creating a new status, but no unique bind family was declared. Create one. var family = new StatusEffectFamily { Name = this.StatusIdentifier + "_FAMILY", LengthType = StatusEffectFamily.LengthTypes.Short, MaxStackCount = 1, StackBehavior = StatusEffectFamily.StackBehaviors.IndependantUnique }; At.SetField(status, "m_bindFamily", family); At.SetField(status, "m_familyMode", StatusEffect.FamilyModes.Bind); } if (this.FamilyMode == StatusEffect.FamilyModes.Bind) { At.SetField(status, "m_familyMode", StatusEffect.FamilyModes.Bind); if (this.BindFamily != null) { At.SetField(status, "m_bindFamily", this.BindFamily.CreateAsBindFamily()); } } else if (this.FamilyMode == StatusEffect.FamilyModes.Reference) { At.SetField(status, "m_familyMode", StatusEffect.FamilyModes.Reference); if (this.ReferenceFamilyUID != null) { At.SetField(status, "m_stackingFamily", new StatusEffectFamilySelector() { SelectorValue = this.ReferenceFamilyUID }); } } // check for custom icon if (!string.IsNullOrEmpty(SerializedSLPackName) && !string.IsNullOrEmpty(SerializedSubfolderName) && SL.GetSLPack(SerializedSLPackName) is SLPack pack) { var dir = $@"{pack.GetPathForCategory<StatusCategory>()}\{SerializedSubfolderName}"; if (pack.FileExists(dir, "icon.png")) { var tex = pack.LoadTexture2D(dir, "icon.png"); var sprite = CustomTextures.CreateSprite(tex, CustomTextures.SpriteBorderTypes.NONE); status.OverrideIcon = sprite; At.SetField(status, "m_defaultStatusIcon", new StatusTypeIcon(Tag.None) { Icon = sprite }); } } }