Esempio n. 1
0
    public void ReceiveKnockback(DamageTag knockbackTag, KnockbackParameters knockbackParams, Vector3 dir)
    {
        if (knockbackTag != DamageTag.Environment && knockbackTag == damageTag)
        {
            return;
        }

        if (damageTag == DamageTag.Disc && !knockbackParams.canKnockbackDiscs)
        {
            return;
        }

        if (knockbackParams.IsNull)
        {
            return;
        }

        currentStartKnockbackForce = knockbackParams.knockbackForce;
        currentKnockbackForce      = currentStartKnockbackForce;

        knockbackDurationSystem.ChangeTimerValue(knockbackParams.knockbackDuration);
        knockbackDurationSystem.StartTimer();
        knockbackAttenuationDurationSystem.ChangeTimerValue(knockbackParams.knockbackAttenuationDuration);
        knockbackAttenuationDurationSystem.StartTimer();
        knockbackAttenuationDurationSystem.SetUp(EndKnockback);

        currentKnockbackDirection = dir;
    }
Esempio n. 2
0
    public void ReceiveDamage(DamageTag sourceDamageTag, DamagesParameters damagesParameters)
    {
        if (sourceDamageTag != DamageTag.Environment && sourceDamageTag == damageTag)
        {
            return;
        }

        if (damagesParameters._damages == 0)
        {
            return;
        }
        if (!_isPlayer)
        {
            TimeManager.Instance.StartFreezeFrame();
        }

        OnReceivedDamages?.Invoke(currentLifeAmount - Mathf.Abs(damagesParameters._damages), -Mathf.Abs(damagesParameters._damages));

        LoseLife(damagesParameters._damages);


        if (damagesParameters._numberOfStunedTurns > 0)
        {
            //Debug.Log(name + " is stuned for " + damagesParameters._numberOfStunedTurns + " turn" + (damagesParameters._numberOfStunedTurns > 1 ? "s" : ""));
            OnReceivedStun?.Invoke(damagesParameters._numberOfStunedTurns);
        }
    }
Esempio n. 3
0
 public void Shoot(ShootParameters shootParameters, DamageTag damageTag)
 {
     foreach (ShootOriginScript origin in shootOrigins)
     {
         origin.Shoot(shootParameters, damageTag);
     }
 }
    public void SetUp(DamageTag dmgTag, bool instantiateWeapon)
    {
        currentShootParameters = baseWeaponParameters.GetShootParameters;
        cadenceTimerSystem     = new TimerSystem(currentShootParameters.GetShootCadence, null);

        serialShotTimerSystem = new TimerSystem(currentShootParameters.GetTimeBetweenEachSerialShot, EndShooting, currentShootParameters.GetNumberOfSerialShots - 1, Shoot);

        if (instantiateWeapon)
        {
            InstantiateBaseWeapon();
        }

        damageTag = dmgTag;
    }
        public void TestEquality()
        {
            var tag1 = new DamageTag();
            var tag2 = new DamageTag();

            Assert.AreEqual(tag1, tag2);
            Assert.AreNotSame(tag1, tag2);

            tag1.Strength = 5;

            Assert.AreNotEqual(tag1, tag2);
            Assert.AreNotSame(tag1, tag2);

            var tag3 = tag1.Clone();

            Assert.AreNotSame(tag1, tag3);
            Assert.AreEqual(tag1, tag3);
        }
    public void Shoot(ShootParameters shootParameters, DamageTag damageTag)
    {
        int projectileIndex               = shootParameters.GetProjectilePrefab.GetPoolingIndex;
        ProjectileScript projPrefab       = shootParameters.GetProjectilePrefab;
        float            imprecisionAngle = shootParameters.GetImprecisionAngle;

        for (int i = 0; i < shootParameters.GetNumberOfProjectilesPerShot; i++)
        {
            ProjectileScript newProj = poolingManager.GetProjectileFromPool(projectileIndex);

            if (newProj == null)
            {
                break;
            }

            newProj.transform.position = transform.position;
            newProj.transform.rotation = Quaternion.identity;
            //ProjectileScript newProj = Instantiate(projPrefab, transform.position, Quaternion.identity);
            Vector3 shootDirection = Quaternion.Euler(0, 0, Random.Range(-imprecisionAngle / 2, imprecisionAngle / 2)) * GetTrueDirection;
            newProj.Shoot(shootParameters.GetProjectileParameters, shootDirection, damageTag);
        }
    }
Esempio n. 7
0
 public void SetUp(DamageTag dmgTag)
 {
     currentLifeAmount = maxLife;
     damageTag         = dmgTag;
 }
Esempio n. 8
0
        private IToolImpact BlockHit(IDynamicEntity owner)
        {
            var impact = new BlockToolImpact {
                SrcBlueprintId = BluePrintId,
                Position       = owner.EntityState.PickedBlockPosition
            };

            var cursor = LandscapeManager.GetCursor(owner.EntityState.PickedBlockPosition);

            if (cursor == null)
            {
                //Impossible to find chunk, chunk not existing, event dropped
                impact.Message = "Block not existing, event dropped";
                impact.Dropped = true;
                return(impact);
            }
            cursor.OwnerDynamicId = owner.DynamicId;

            if (cursor.PeekProfile().Indestructible)
            {
                impact.Message = "Indestrutible cube, cannot be removed !";
                return(impact);
            }

            DamageTag damage;

            var cube = cursor.Read(out damage);

            if (cube != WorldConfiguration.CubeId.Air)
            {
                impact.CubeId = cube;
                var profile  = cursor.PeekProfile();
                var hardness = profile.Hardness;

                if (damage == null)
                {
                    damage = new DamageTag {
                        Strength      = (int)hardness,
                        TotalStrength = (int)hardness
                    };
                }

                var toolBlockDamage = Damage;

                if (SpecialDamages != null)
                {
                    var index = SpecialDamages.FindIndex(cd => cd.CubeId == cube);

                    if (index != -1)
                    {
                        toolBlockDamage = SpecialDamages[index].Damage;
                    }
                }

                damage.Strength -= toolBlockDamage;

                if (toolBlockDamage > 0 && SoundEngine != null)
                {
                    if (profile.HitSounds.Count > 0)
                    {
                        var random = new Random();
                        var sound  = profile.HitSounds[random.Next(0, profile.HitSounds.Count)];
                        SoundEngine.StartPlay3D(sound, owner.EntityState.PickedBlockPosition + new Vector3(0.5f));
                    }
                }

                if (damage.Strength <= 0)
                {
                    var chunk = LandscapeManager.GetChunkFromBlock(owner.EntityState.PickedBlockPosition);
                    if (chunk == null)
                    {
                        //Impossible to find chunk, chunk not existing, event dropped
                        impact.Message = "Chunk is not existing, event dropped";
                        impact.Dropped = true;
                        return(impact);
                    }
                    chunk.Entities.RemoveAll <BlockLinkedItem>(e => e.Linked && e.LinkedCube == owner.EntityState.PickedBlockPosition, owner.DynamicId);
                    cursor.Write(WorldConfiguration.CubeId.Air);

                    #region TreeSoul remove logic
                    foreach (var treeSoul in EntityFactory.LandscapeManager.AroundEntities(owner.EntityState.PickedBlockPosition, 16).OfType <TreeSoul>())
                    {
                        var treeBp = EntityFactory.Config.TreeBluePrintsDico[treeSoul.TreeTypeId];

                        if (cube != treeBp.FoliageBlock && cube != treeBp.TrunkBlock)
                        {
                            continue;
                        }

                        var treeLSystem = new TreeLSystem();

                        var treeBlocks = treeLSystem.Generate(treeSoul.TreeRndSeed, (Vector3I)treeSoul.Position, treeBp);

                        // did we remove the block of the tree?
                        if (treeBlocks.Exists(b => b.WorldPosition == owner.EntityState.PickedBlockPosition))
                        {
                            treeSoul.IsDamaged = true;

                            // count removed trunk blocks
                            var totalTrunks = treeBlocks.Count(b => b.BlockId == treeBp.TrunkBlock);

                            var existsTrunks = treeBlocks.Count(b =>
                            {
                                if (b.BlockId == treeBp.TrunkBlock)
                                {
                                    cursor.GlobalPosition = b.WorldPosition;
                                    return(cursor.Read() == treeBp.TrunkBlock);
                                }
                                return(false);
                            });

                            if (existsTrunks < totalTrunks / 2)
                            {
                                treeSoul.IsDying = true;
                            }
                        }
                    }
                    #endregion

                    if (SoundEngine != null && EntityFactory.Config.ResourceTake != null)
                    {
                        SoundEngine.StartPlay3D(EntityFactory.Config.ResourceTake, owner.EntityState.PickedBlockPosition + new Vector3(0.5f));
                    }

                    var charEntity = owner as CharacterEntity;
                    if (charEntity == null)
                    {
                        impact.Message = "Charater entity is expected";
                        return(impact);
                    }

                    var putItems = new List <KeyValuePair <IItem, int> >();
                    putItems.Add(new KeyValuePair <IItem, int>((IItem)EntityFactory.CreateFromBluePrint(cube), 1));

                    if (profile.Transformations != null)
                    {
                        var random = new FastRandom(owner.EntityState.PickedEntityPosition.GetHashCode() ^ owner.EntityState.Entropy);
                        foreach (var itemTransformation in profile.Transformations)
                        {
                            if (random.NextDouble() < itemTransformation.TransformChance)
                            {
                                // don't give the block
                                putItems.Clear();
                                foreach (var slot in itemTransformation.GeneratedItems)
                                {
                                    putItems.Add(new KeyValuePair <IItem, int>((Item)EntityFactory.CreateFromBluePrint(slot.BlueprintId), slot.Count));
                                }
                                break;
                            }
                        }
                    }

                    // in case of infinite resources we will not add more than 1 block entity
                    var existingSlot = charEntity.FindSlot(s => s.Item.BluePrintId == cube);

                    if (!EntityFactory.Config.IsInfiniteResources || existingSlot == null)
                    {
                        if (!charEntity.Inventory.PutMany(putItems))
                        {
                            impact.Message = "Can't put the item(s) to inventory";
                        }
                    }

                    impact.CubeId = WorldConfiguration.CubeId.Air;
                }
                else if (damage.Strength >= hardness)
                {
                    cursor.Write(cube);
                }
                else
                {
                    cursor.Write(cube, damage);
                }

                impact.Success = true;
                return(impact);
            }

            impact.Message = "Cannot hit air block";
            return(impact);
        }