public static void WriteAbilityCastData(this NetworkWriter writer, AbilityCastData castData)
        {
            AbilityCastIdentifier identifier = new AbilityCastIdentifier(
                castData.Caster,
                castData.CastTime,
                castData.AbilityCast.AbilityID,
                castData.MultiCastID);

            //Identifier
            writer.WriteAbilityCastIdentifier(identifier);

            //Resources Impacts
            writer.WriteInt32(castData.BaseResourcesImpacts.Length);
            for (int i = 0; i < castData.BaseResourcesImpacts.Length; i++)
            {
                writer.WriteAbilityResourceImpactData(castData.BaseResourcesImpacts[i]);
            }

            //Vec3
            writer.WriteVector3(castData.BaseKnockback);
            writer.WriteVector3(castData.BaseRecoil);
            writer.WriteVector3(castData.CastDirection);
            writer.WriteVector3(castData.Origin);

            if (_storedAbilityCastData.ContainsKey(identifier))
            {
                _storedAbilityCastData[identifier] = castData;
            }
            else
            {
                _storedAbilityCastData.Add(identifier, castData);
            }
        }
 public static void WriteAbilityCastIdentifier(this NetworkWriter writer, AbilityCastIdentifier identifier)
 {
     //In case of the caster's death
     if (identifier.Caster == null)
     {
         writer.WriteGameObject(null);
     }
     else
     {
         writer.WriteGameObject(identifier.Caster.gameObject);
     }
     writer.WriteDouble(identifier.CastTime);
     writer.WriteInt32(identifier.AbilityID);
     writer.WriteInt32(identifier.MultiCastID);
 }
        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 static AbilityCastData ReadAbilityCastData(this NetworkReader reader)
        {
            AbilityCastIdentifier identifier = ReadAbilityCastIdentifier(reader);

            if (_storedAbilityCastData.ContainsKey(identifier))
            {
                ReadAbilityCastDataBody(reader, _storedAbilityCastData[identifier]);
                return(_storedAbilityCastData[identifier]);
            }
            else
            {
                AbilityCastData castData = new AbilityCastData(
                    identifier.Caster,
                    (AbilityData)PinouApp.Resources.Data.Databases.GetItem(DatabaseType.Ability, identifier.AbilityID),
                    identifier.CastTime,
                    identifier.MultiCastID);

                ReadAbilityCastDataBody(reader, castData);

                _storedAbilityCastData.Add(identifier, castData);
                return(castData);
            }
        }