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; }
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); } }
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); } }
public void SetUp(DamageTag dmgTag) { currentLifeAmount = maxLife; damageTag = dmgTag; }
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); }