using System; using RoR2.Networking; using UnityEngine; using UnityEngine.Networking; namespace RoR2; [RequireComponent(typeof(PurchaseInteraction))] public class ShrineHealingBehavior : ShrineBehavior { public GameObject wardPrefab; private GameObject wardInstance; public float baseRadius; public float radiusBonusPerPurchase; public int maxPurchaseCount; public float costMultiplierPerPurchase; public Transform symbolTransform; private PurchaseInteraction purchaseInteraction; private float refreshTimer; private const float refreshDuration = 2f; private bool waitingForRefresh; private HealingWard healingWard; public int purchaseCount { get; private set; } public static event Action onActivated; public override int GetNetworkChannel() { return QosChannelIndex.defaultReliable.intVal; } private void Awake() { purchaseInteraction = GetComponent(); } public void FixedUpdate() { if (waitingForRefresh) { refreshTimer -= Time.fixedDeltaTime; if (refreshTimer <= 0f && purchaseCount < maxPurchaseCount) { purchaseInteraction.SetAvailable(newAvailable: true); purchaseInteraction.Networkcost = (int)((float)purchaseInteraction.cost * costMultiplierPerPurchase); waitingForRefresh = false; } } } [Server] private void SetWardEnabled(bool enableWard) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.ShrineHealingBehavior::SetWardEnabled(System.Boolean)' called on client"); } else if (enableWard != (bool)wardInstance) { if (enableWard) { wardInstance = UnityEngine.Object.Instantiate(wardPrefab, base.transform.position, base.transform.rotation); wardInstance.GetComponent().teamIndex = TeamIndex.Player; healingWard = wardInstance.GetComponent(); NetworkServer.Spawn(wardInstance); } else { UnityEngine.Object.Destroy(wardInstance); wardInstance = null; healingWard = null; } } } [Server] public void AddShrineStack(Interactor activator) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.ShrineHealingBehavior::AddShrineStack(RoR2.Interactor)' called on client"); return; } SetWardEnabled(enableWard: true); Chat.SendBroadcastChat(new Chat.SubjectFormatChatMessage { subjectAsCharacterBody = activator.gameObject.GetComponent(), baseToken = "SHRINE_HEALING_USE_MESSAGE" }); waitingForRefresh = true; purchaseCount++; float networkradius = baseRadius + radiusBonusPerPurchase * (float)(purchaseCount - 1); healingWard.Networkradius = networkradius; refreshTimer = 2f; EffectManager.SpawnEffect(LegacyResourcesAPI.Load("Prefabs/Effects/ShrineUseEffect"), new EffectData { origin = base.transform.position, rotation = Quaternion.identity, scale = 1f, color = Color.green }, transmit: true); if (purchaseCount >= maxPurchaseCount) { symbolTransform.gameObject.SetActive(value: false); CallRpcSetPingable(value: false); } ShrineHealingBehavior.onActivated?.Invoke(this, activator); } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { bool flag = base.OnSerialize(writer, forceAll); bool flag2 = default(bool); return flag2 || flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { base.OnDeserialize(reader, initialState); } public override void PreStartClient() { base.PreStartClient(); } }