private void SyncAbilityHit(SyncableVariable var, NetworkReader reader) { if (References.NetworkIdentity.isServer) { _nextSyncResults = new List <AbilityCastResult>(); } int resultsCount = reader.ReadInt32(); for (int i = 0; i < resultsCount; i++) { AbilityCastResult result = reader.ReadAbilityCastResult(); if (References.NetworkIdentity.isServer) { OnReceiveAbilityHit.Invoke(this, result); result.CastData.FillResult(result); _nextSyncResults.Add(result); PinouNetworkManager.MainBehaviour.SetDirty(gameObject, SyncableVariable.EntityAbilityHit); } else if (References.NetworkIdentity.hasAuthority) { OnReceiveAbilityHit.Invoke(this, result); result.CastData.FillResult(result); } if (result.CastData.Caster == this) { return; } OnAbilityHitResult.Invoke(this, result); } }
private void MakeText(GameObject model, AbilityCastResult result, AbilityResourceImpactData impactData) { GameObject textGo = PinouApp.Pooler.Retrieve(model, transform); UI_DamageText dmgTxt = textGo.GetComponent <UI_DamageText>(); dmgTxt.Build(result, impactData); _damageTexts.Add(dmgTxt); }
public override void ReceiveAbilityHit(AbilityCastResult result) { OnReceiveAbilityHit.Invoke(this, result); result.CastData.FillResult(result); OnAbilityHitResult.Invoke(this, result); _nextSyncResults.Add(result); PinouNetworkManager.MainBehaviour.SetDirty(gameObject, SyncableVariable.EntityAbilityHit); }
protected override void OnDeath(Entity entity, AbilityCastResult killingResult) { if (team != EntityTeam.Players) { base.OnDeath(entity, killingResult); } else { //Prevent pooling to prevent authority issues in multiplayer gameObject.SetActive(false); gameObject.Destroy(1f); } }
private void OnEntityAbilityHitResult(Entity ent, AbilityCastResult result) { EntityType receivingEntityType = GetEntityType(ent); EntityType inflictingEntityType = GetEntityType(result.CastData.Caster); AbilityResourceImpactData[] resourcesChanges = result.ResourcesChanges; for (int i = 0; i < resourcesChanges.Length; i++) { bool positive = resourcesChanges[i].ResourceChange >= 0; if (ShouldMakeText(resourcesChanges[i].ResourceType, receivingEntityType, inflictingEntityType, positive)) { GameObject model = GetModel(resourcesChanges[i].ResourceType, receivingEntityType, inflictingEntityType, positive); MakeText(model, result, resourcesChanges[i]); } } }
public void Build(AbilityCastResult result, AbilityResourceImpactData impactData) { _moveStartTime = Time.time; _worldPos = result.Impact; RectTransform.anchoredPosition = Camera.main.WorldToScreenPoint(result.Impact) * (1920f / Screen.width); Vector2 impactScreenPoint = Camera.main.WorldToScreenPoint(result.Impact); Vector2 directionScreenPoint; if (result.KnockbackApplied.sqrMagnitude > 0f) { directionScreenPoint = Camera.main.WorldToScreenPoint(result.Impact + result.KnockbackApplied.normalized); } else { directionScreenPoint = Camera.main.WorldToScreenPoint(result.Impact + result.CastData.CastDirection); } Vector2 textDirection = (directionScreenPoint - impactScreenPoint); if (textDirection.sqrMagnitude > 0f) { textDirection.Normalize(); } else { textDirection = Vector2.right; } float angle = (textDirection.y > 0 ? Mathf.Acos(textDirection.x) : -Mathf.Acos(textDirection.x)) * Mathf.Rad2Deg; RectTransform.rotation = Quaternion.Euler(0, 0, angle); _textTransform.rotation = Quaternion.Euler(0, 0, 0); float dmgValue = Mathf.Abs(impactData.ResourceChange); if (dmgValue < 1f) { _text.text = dmgValue.ToString("0.0"); } else { _text.text = Mathf.FloorToInt(dmgValue).ToString(); } }
public static void WriteAbilityCastResult(this NetworkWriter writer, AbilityCastResult result) { //CastData writer.WriteAbilityCastData(result.CastData); //Main writer.WriteInt32((int)result.ResultType); writer.WriteGameObject(result.Victim.gameObject); writer.WriteVector3(result.Impact); writer.WriteVector3(result.KnockbackApplied); //Resources Changes AbilityResourceImpactData[] resourceChanges = result.ResourcesChanges; writer.WriteInt32(resourceChanges.Length); for (int i = 0; i < resourceChanges.Length; i++) { writer.WriteAbilityResourceImpactData(resourceChanges[i]); } }
public static AbilityCastResult ReadAbilityCastResult(this NetworkReader reader) { //CastData AbilityCastData castData; AbilityCastIdentifier identifier = ReadAbilityCastIdentifier(reader); if (_storedAbilityCastData.ContainsKey(identifier)) { castData = _storedAbilityCastData[identifier]; } else { castData = new AbilityCastData( identifier.Caster, (AbilityData)PinouApp.Resources.Data.Databases.GetItem(DatabaseType.Ability, identifier.AbilityID), identifier.CastTime, identifier.MultiCastID); _storedAbilityCastData.Add(identifier, castData); } ReadAbilityCastDataBody(reader, castData); AbilityCastResult result = new AbilityCastResult(castData); //Main _ = reader.ReadInt32();//Discards ResultType result.FillVictim(reader.ReadGameObject().GetComponent <Entity>()); result.FillImpact(reader.ReadVector3()); result.FillKnockbackApplied(reader.ReadVector3()); //Resources Changes int resourceChangesLength = reader.ReadInt32(); AbilityResourceImpactData[] resourceChanges = new AbilityResourceImpactData[resourceChangesLength]; for (int i = 0; i < resourceChangesLength; i++) { resourceChanges[i] = reader.ReadAbilityResourceImpactData(); } result.SetResourceChanges(resourceChanges); return(result); }
public abstract void StartFX(AbilityCastResult result);