コード例 #1
0
        public void Update(StartUserProjectileServerMessage m)
        {
            var newEntity = new ProjectileEntity(m.Id, m.OwnerId, GetOrPlaceholder(m.OwnerId), m.Start,
                                                 m.Start.GetHeading(m.Finish), m.Finish, (int)m.Speed, m.Time.Ticks);

            Register(newEntity);
        }
コード例 #2
0
	public override void HandleOnTargetHit(ProjectileEntity source, EntityComponent target)
	{
		base.HandleOnTargetHit(source, target);
		
		target.Damage(Magnitude, MyEntityComponent);		
		target.BroadcastMessage("BeingAttacked", this.MyEntityComponent);
	}
コード例 #3
0
        protected override void OnTick(float interval)
        {
            if (ShootingEnemy.GetComponent <ShootingEnemyComponent>().AmmoLeft <= 0)
            {
                EventManager.Instance.QueueEvent(new OutOfAmmoEvent(ShootingEnemy));
                return;
            }
            if (!Engine.GetEntities().Contains(ShootingEnemy))
            {
                Kill();
                return;
            }

            TransformComponent transformComp           = ShootingEnemy.GetComponent <TransformComponent>();
            Vector2            shootingEnemyDirection  = new Vector2((float)Math.Cos(ShootingEnemy.GetComponent <TransformComponent>().Rotation), (float)Math.Sin(ShootingEnemy.GetComponent <TransformComponent>().Rotation));
            Entity             projectile              = ProjectileEntity.Create(Engine, Vector2.Zero, shootingEnemyDirection);
            TransformComponent projectileTransformComp = projectile.GetComponent <TransformComponent>();
            Vector2            projectilePosition      = shootingEnemyDirection * (_shootingEnemyTip * transformComp.Scale + _projectileLength * projectileTransformComp.Scale + _errorBuffer) + transformComp.Position;

            projectileTransformComp.SetPosition(projectilePosition, true);
            projectileTransformComp.SetRotation(transformComp.Rotation, true);

            EventManager.Instance.QueueEvent(new ProjectileFiredEvent());
            ShootingEnemy.GetComponent <ShootingEnemyComponent>().AmmoLeft -= 1;
        }
コード例 #4
0
    private ProjectileEntity CreateProjectile()
    {
        ProjectileEntity entity = new ProjectileEntity(this, direction);

        AddChild(entity);
        entity.GlobalPosition = caster.Entity.GlobalPosition;
        return(entity);
    }
コード例 #5
0
ファイル: Projectile.cs プロジェクト: pb0/ID0_Test
    public Projectile(GameInstance parent, float initX, float initY, FieldObjectEntity objectField, ProjectileEntity objectProjectile)
        : base(parent.Rect.point.layer, initX, objectField, parent.ToLeft)
    {
        Move(new Vector2(0, initY));

        this.objectProjectile = objectProjectile;
        this.parent = parent;
    }
コード例 #6
0
 public Projectile(Character target, Character owner, ProjectileEntity prefab, int damage, float speed)
 {
     m_target             = target;
     m_owner              = owner;
     m_prefab             = prefab;
     m_projectileDamage   = damage;
     m_projectileSpeed    = speed;
     m_projectileFinished = false;
 }
コード例 #7
0
    public void CreateEntity()
    {
        if (m_entity != null)
        {
            GameObject.Destroy(m_entity.gameObject);
        }

        m_entity = GameObject.Instantiate <ProjectileEntity>(m_prefab);
        m_entity.transform.SetParent(m_owner.Entity.transform, false);
        m_direction = Mathf.Abs(m_target.Entity.transform.position.x - m_owner.Entity.transform.position.x) / (m_target.Entity.transform.position.x - m_owner.Entity.transform.position.x);

        m_entity.transform.position = m_owner.Entity.transform.position;
    }
コード例 #8
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
 void DangerousTilesSetDanger(bool dangerous, ProjectileEntity proj)
 {
     foreach (Animator anim in proj.dangerousSprites)
     {
         if (dangerous)
         {
             anim.gameObject.tag = dangerousTag;
         }
         else
         {
             anim.gameObject.tag = untaggedTag;
         }
     }
 }
コード例 #9
0
	public virtual void HandleOnTargetHit(ProjectileEntity source, EntityComponent target)
	{
		//Apply our attack effects.
		if (target != null && target.Alive)
		{
			foreach (EntityModifier modifier in actionModifiers.Values)
			{
				modifier.DeepClone().Attach(target);
			}
		}		
		
		//Let any listeners know
		if (OnTargetHitEvent != null)
			OnTargetHitEvent(MyEntityComponent, MyActionManager.myBehaviorManager.CurrentTarget);
	}
コード例 #10
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
    public void DestroyProjectile(ProjectileEntity projectile)
    {
        for (int i = projectile.dangerousSprites.Count - 1; i >= 0; i--)
        {
            projectile.dangerousSprites[i].SetTrigger("Stop");
            Destroy(projectile.dangerousSprites[i].gameObject, 1f);
        }

        projectiles.Remove(projectile);
        gm.entityList.RemoveEntity(projectile.health);

        var particles = Instantiate(projectile.deathParticles, projectile.deathPosition, Quaternion.identity);

        Destroy(particles, 2);
        Destroy(projectile.gameObject);
    }
コード例 #11
0
    public void Fire()
    {
        if (coolDownTime == 0f)
        {
            projectile = Instantiate(projectilePrefab,
                                     transform.position + positionOffset,
                                     Quaternion.AngleAxis(aimController.aimDegrees, Vector3.forward),
                                     transform).GetComponent <ProjectileEntity>();

            //projectile.transform.position = aimController.transform.position;
            //projectile.transform.rotation = Quaternion.AngleAxis(aimController.aimDegrees, Vector3.forward);
            projectile.Fly(aimController.aimVector, range);

            coolDownTime = rateOfFire;
        }
    }
コード例 #12
0
 protected override void OnTick(float interval)
 {
     if (shootingEnemy.GetComponent <ShootingEnemyComponent>().ammoLeft <= 0)
     {
         EventManager.Instance.QueueEvent(new OutOfAmmoEvent(shootingEnemy));
         return;
     }
     if (!engine.GetEntities().Contains(shootingEnemy))
     {
         Kill();
         return;
     }
     ProjectileEntity.Create(engine, Content.Load <Texture2D>(Constants.Resources.TEXTURE_ENEMY_BULLET), shootingEnemy.GetComponent <TransformComponent>().Position, shootingEnemy.GetComponent <MovementComponent>().direction);
     EventManager.Instance.QueueEvent(new ProjectileFiredEvent());
     shootingEnemy.GetComponent <ShootingEnemyComponent>().ammoLeft -= 1;
     Console.WriteLine(shootingEnemy.GetComponent <ShootingEnemyComponent>().ammoLeft);
 }
コード例 #13
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
    IEnumerator CalculateDangerousTiles(ProjectileEntity proj)
    {
        if (proj.telegraphTurn)
        {
        }
        int wallOnWay = 10000000;

        for (int i = 0; i < proj.dangerousSprites.Count; i++)
        {
            if (wallOnWay > i)
            {
                Animator anim = proj.dangerousSprites[i];
                anim.gameObject.SetActive(false);
                anim.transform.position = proj.newPos + proj.direction * i;
                anim.transform.LookAt(anim.transform.position + proj.direction);

                RaycastHit hit;

                if (Physics.Raycast(proj.dangerousSprites[i].transform.position + Vector3.up * 5, Vector3.down, out hit, 10, gm.movementSystem.movementMask))
                {
                    if (hit.collider.tag == "Wall")
                    {
                        proj.wallOnWay     = true;
                        proj.deathPosition = proj.dangerousSprites[i].transform.position;
                        wallOnWay          = i;
                        //proj.stepsLast = 0;
                        proj.dangerousSprites[i].gameObject.SetActive(false);
                    }
                    else if (hit.collider.tag == "Unit" && hit.collider.gameObject != proj.master.gameObject)
                    {
                    }
                }
            }
        }


        for (int i = 0; i < proj.dangerousSprites.Count; i++)
        {
            if (wallOnWay > i)
            {
                proj.dangerousSprites[i].gameObject.SetActive(true);
                proj.dangerousSprites[i].SetTrigger("Reset");
                yield return(new WaitForSeconds(0.1f));
            }
        }
    }
コード例 #14
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
    public void MoveProjectile(ProjectileEntity proj)
    {
        if (!proj.telegraphTurn)
        {
            proj.master.npc.projectileToFire = null;
            Vector3 newPos = proj.transform.position + proj.direction * proj.movementSpeed;
            proj.newPos = newPos;

            proj.stepsLast--;

            StartCoroutine(MoveProjectileOverTime(proj));
        }
        else
        {
            proj.master.anim.SetTrigger("Attack");
            proj.telegraphTurn = false;
        }
    }
コード例 #15
0
	public override void HandleOnTargetHit(ProjectileEntity source, EntityComponent target)
	{
		base.HandleOnTargetHit(source, target);
		
		Collider[] colliders = Physics.OverlapSphere(target.transform.position, Radius, layerMask);
		
		//Loop through all resulting colliders, seeing if we can snatch an EntityComponent from them that is of our target type
		//Then damage it if that is the case!
		foreach (Collider collider in colliders)
		{
			EntityComponent entity = collider.gameObject.GetComponent<EntityComponent>();
			
			if (entity != null && entity.GetType() == myTargetType)
			{
				entity.Damage(Magnitude, MyEntityComponent);		
				entity.BroadcastMessage("BeingAttacked", this.MyEntityComponent);				
			}			
		}		
	}
コード例 #16
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
    IEnumerator MoveProjectileOverTime(ProjectileEntity proj)
    {
        Vector3 newPos = proj.newPos;

        if (proj.damagedObject)
        {
            newPos = proj.damagedObject.transform.position;
        }
        else if (proj.wallOnWay)
        {
            newPos = proj.deathPosition;
        }

        for (int t = 0; t < 8; t++)
        {
            if (proj != null)
            {
                proj.transform.position = Vector3.Lerp(proj.transform.position, newPos, 0.2f);
                yield return(new WaitForSeconds(0.01f));
            }
            else
            {
                break;
            }
        }

        if (proj != null)
        {
            proj.transform.position = proj.newPos;

            if (!proj.wallOnWay)
            {
                proj.deathPosition = proj.newPos;
            }

            if (proj.stepsLast > 0 && !proj.damagedObject)
            {
                StartCoroutine(CalculateDangerousTiles(proj));
            }
        }
    }
コード例 #17
0
    private void SpreadProjectile()
    {
        // TODO make better Spread projectile physics using better formula.

        float radSpace = 0.04f * Mathf.Sqrt(physicist.ProjectileCount);
        float rad      = radSpace;
        float count    = physicist.ProjectileCount;

        if (physicist.ProjectileCount % 2 != 0)
        {
            CreateProjectile();
            count--;
        }

        for (int i = 0; i < count; i++)
        {
            ProjectileEntity projectile = CreateProjectile();
            projectile.Rotate(rad);
            projectile.Direction = projectile.Direction.Rotated(rad);
            rad += rad > 0 ? radSpace : -radSpace;
            rad *= -1;
        }
    }
コード例 #18
0
        public Entity createProjectile(string name, ProjectileController controller, Vector2 pos, ref Sprite sprite)
        {
            // Entity entity = createEntity("Entity");
            ProjectileEntity waveProjectile = new ProjectileEntity(name, controller, ProjectileType.WAVE);

            //Hardcoding position adjustments
            //pos.X += 16;
            waveProjectile.position = pos;

            //Attach Sprite
            sprite.setRenderLayer(1);
            waveProjectile.addComponent <Sprite>(sprite);

            //Attack physics
            PhysicsHandler physicsHandler = new PhysicsHandler(controller.collisionResult);

            physicsHandler.isProjectile = true;
            physicsHandler.applyGravity = false;
            waveProjectile.addComponent <PhysicsHandler>(physicsHandler);

            //Attach hit detection
            CircleCollider circleCollider = new CircleCollider(sprite.width);

            waveProjectile.addComponent <CircleCollider>(circleCollider);
            Flags.setFlagExclusive(ref circleCollider.collidesWithLayers, 0); //Prevent collisions on layer 0
            Flags.setFlagExclusive(ref circleCollider.physicsLayer, 2);       //

            //Attack mover
            Mover mover = new Mover();

            waveProjectile.addComponent <Mover>(mover);

            entity.scene.addEntity <ProjectileEntity>(waveProjectile);

            return(waveProjectile);
        }
コード例 #19
0
ファイル: Projectile.cs プロジェクト: pb0/ID0_Test
    public ProjectileCustom(GameInstance parent, float initX, float initY, FieldObjectEntity objectField, ProjectileEntity objectProjectile, Action2 action)
        : base(parent, initX, initY, objectField, objectProjectile)
    {
        List<VectorEntity> pattern = VectorGenerator.Custom(objectProjectile.speed, objectProjectile.speedY, objectProjectile.gravity, parent.ToLeft);
        //pattern.Add(new LinearVelocity(parent.Velocity));
        SetMove(pattern);

        InitAction(action);
    }
コード例 #20
0
 public bool Equals(ProjectileEntity other)
 {
     return(Id.Equals(other?.Id));
 }
コード例 #21
0
        void HandleBounceCollision(Entity reflector, Entity bouncer)
        {
            if (reflector.HasComponent <EdgeComponent>())
            {
                if (bouncer.HasComponent <ProjectileComponent>() && bouncer.HasComponent <MovementComponent>())
                {
                    EventManager.Instance.QueueEvent(new ProjectileBouncedEvent(bouncer, bouncer.GetComponent <TransformComponent>().Position, reflector));
                    bouncer.GetComponent <ProjectileComponent>().BouncesLeft -= 1;

                    if (bouncer.GetComponent <ProjectileComponent>().BouncesLeft <= 0)
                    {
                        Color color = Color.White;
                        if (bouncer.HasComponent <ColoredExplosionComponent>())
                        {
                            color = bouncer.GetComponent <ColoredExplosionComponent>().Color;
                        }
                        EventManager.Instance.QueueEvent(new CreateExplosionEvent(bouncer.GetComponent <TransformComponent>().Position, color, false));
                        Engine.DestroyEntity(bouncer);
                    }
                }

                if (bouncer != null && bouncer.HasComponent <MovementComponent>())
                {
                    Vector2 bounceDirection = bouncer.GetComponent <MovementComponent>().MovementVector;
                    if (bounceDirection.Length() == 0)
                    {
                        // Length is zero
                        bounceDirection = new Vector2(0, 0);
                    }
                    else
                    {
                        bounceDirection.Normalize();
                    }

                    bouncer.GetComponent <MovementComponent>().MovementVector = getReflectionVector(
                        bounceDirection, reflector.GetComponent <EdgeComponent>().Normal)
                                                                                * bouncer.GetComponent <MovementComponent>().MovementVector.Length();
                }
            }
            if (reflector.HasComponent <PlayerShieldComponent>())
            {
                EventManager.Instance.QueueEvent(new ProjectileBouncedEvent(bouncer, bouncer.GetComponent <TransformComponent>().Position, reflector));
                Entity playerShip = reflector.GetComponent <PlayerShieldComponent>().ShipEntity;

                TransformComponent shipTransformComp   = playerShip.GetComponent <TransformComponent>();
                TransformComponent shieldTransformComp = reflector.GetComponent <TransformComponent>();

                Vector2 shieldNormal = shieldTransformComp.Position - shipTransformComp.Position;
                shieldNormal.Normalize();

                Vector2 bouncerDirection = bouncer.GetComponent <MovementComponent>().MovementVector;
                if (bouncerDirection.Length() == 0)
                {
                    // Length is zero
                    bouncerDirection = new Vector2(0, 0);
                }
                else
                {
                    bouncerDirection.Normalize();
                }

                if (Vector2.Dot(shieldNormal, bouncerDirection) < 0)
                {
                    bouncerDirection = getReflectionVector(bouncerDirection, shieldNormal);
                }
                bouncer.GetComponent <MovementComponent>().MovementVector = bouncerDirection * (bouncer.GetComponent <MovementComponent>().MovementVector.Length() + playerShip.GetComponent <MovementComponent>().MovementVector.Length());

                if (bouncer.HasComponent <ProjectileComponent>() &&
                    reflector.HasComponent <PlayerShieldComponent>())
                {
                    ProjectileEntity.ConvertToFriendlyProjectile(bouncer);
                    bouncer.GetComponent <ProjectileComponent>().LastBouncedBy
                        = reflector.GetComponent <PlayerShieldComponent>().ShipEntity.GetComponent <PlayerComponent>().Player;
                }
            }
            if (reflector.HasComponent <PlayerShipComponent>() && bouncer.HasComponent <PlayerShipComponent>())
            {
                Vector2 ref2bounce = bouncer.GetComponent <TransformComponent>().Position - reflector.GetComponent <TransformComponent>().Position;
                Vector2 bounce2ref = reflector.GetComponent <TransformComponent>().Position - bouncer.GetComponent <TransformComponent>().Position;

                ref2bounce.Normalize();
                bounce2ref.Normalize();

                if (Vector2.Dot(ref2bounce, bounce2ref) < 0)
                {
                    ref2bounce = getReflectionVector(ref2bounce, bounce2ref);
                    reflector.GetComponent <MovementComponent>().MovementVector = ref2bounce *
                                                                                  (bouncer.GetComponent <MovementComponent>().MovementVector.Length() + reflector.GetComponent <MovementComponent>().MovementVector.Length()) / 2;
                    bounce2ref = getReflectionVector(bounce2ref, ref2bounce);
                    bouncer.GetComponent <MovementComponent>().MovementVector = bounce2ref *
                                                                                (bouncer.GetComponent <MovementComponent>().MovementVector.Length() + reflector.GetComponent <MovementComponent>().MovementVector.Length()) / 2;
                }
            }
        }
コード例 #22
0
	protected static void SetProjectileSettings(ProjectileEntity projectile, XmlNode node)
	{		
		float speed = 10f, minDistanceToTarget = 10f;
		Vector2 projectileOffset = Vector2.zero;
		
		if (node.SelectSingleNode("./speed") != null)
		{
			float.TryParse(node.SelectSingleNode("./speed").InnerText, NumberStyles.Float, CultureInfo.InvariantCulture, out speed);	
		}
		
		if (node.SelectSingleNode("./minDistanceToTarget") != null)
		{
			float.TryParse(node.SelectSingleNode("./minDistanceToTarget").InnerText, NumberStyles.Float, CultureInfo.InvariantCulture, out minDistanceToTarget);	
		}
		
		if (node.SelectSingleNode("./offset") != null)
		{			
			float x = 0, y = 0;	
			
			float.TryParse(node.SelectSingleNode("./offset").Attributes["x"].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out x);
			float.TryParse(node.SelectSingleNode("./offset").Attributes["y"].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out y);
			
			projectileOffset = new Vector2(x, y);
		}
		
		projectile.speed = speed;
		projectile.minDistanceToTarget = minDistanceToTarget;
		projectile.FiringOffset = projectileOffset;
	}
コード例 #23
0
	void HandleOnTargetHit(ProjectileEntity source, EntityComponent target)
	{
		//If it was hit by a projectile then unsubscribe from its event.
		if (source != null)
		{
			source.OnProjectileHitTargetEvent -= HandleOnTargetHit;
		}
		
		if (audioInfo.audioClipNames.ContainsKey("attackHit"))
			SoundEffectManager.PlayClipAtLocation(audioInfo.audioClipNames["attackHit"], target.transform.position);
		
		if (target != null && target.Alive)
			target.Damage(attackDamage, myEntityComponent);		
		
		//Apply our attack effects.
		if (target != null && target.Alive)
		{
			foreach (EntityModifier modifier in attackModifiers.Values)
			{
				modifier.DeepClone().Attach(target);
			}
		}
		
		if (OnTargetHitEvent != null)
			OnTargetHitEvent(myEntityComponent, target);
	}
コード例 #24
0
ファイル: AttackSystem.cs プロジェクト: Daneelgames/turnBased
    public void NpcAttack(NpcEntity npc) // NPC
    {
        if (npc.health.health <= 0)
        {
            // do nothing
        }
        else // NPC ACT
        {
            gm.movementSystem.SavePosition(npc);
            var he = npc.health;
            // enemies attack
            if (he.npc && he.npc.weaponEntity)
            {
                he.npc.attackTarget = gm.player;

                if (he.npc.weaponEntity.aimType == WeaponEntity.AimType.Cross)
                {
                    if (Mathf.Round(he.transform.position.x) == Mathf.Round(gm.player.transform.position.x) || Mathf.Round(he.transform.position.z) == Mathf.Round(gm.player.transform.position.z))
                    {
                        ProjectileEntity projectile = Instantiate(he.npc.weaponEntity.projectile, he.transform.position, Quaternion.identity);
                        projectile.master = he;

                        HealthEntity projectileHealth = projectile.GetComponent <HealthEntity>();
                        projectile.health     = projectileHealth;
                        projectileHealth.proj = projectile;

                        gm.entityList.AddObject(projectileHealth);

                        if (gm.player.transform.position.x > projectile.transform.position.x)
                        {
                            projectile.direction = new Vector3(1, 0, 0);
                        }
                        else if (gm.player.transform.position.x < projectile.transform.position.x)
                        {
                            projectile.direction = new Vector3(-1, 0, 0);
                        }
                        else if (gm.player.transform.position.z < projectile.transform.position.z)
                        {
                            projectile.direction = new Vector3(0, 0, -1);
                        }
                        else if (gm.player.transform.position.z > projectile.transform.position.z)
                        {
                            projectile.direction = new Vector3(0, 0, 1);
                        }

                        projectile.newPos          = projectile.transform.position;
                        he.npc.shotCooldownCurrent = he.npc.shotCooldownMax;
                        projectiles.Add(projectile);
                        projectile.telegraphTurn = true;
                        npc.projectileToFire     = projectile;

                        for (int i = 0; i <= projectile.movementSpeed; i++)
                        {
                            Animator newDangerousSprite = Instantiate(projectile.dangerousSprite, projectile.transform.position, Quaternion.identity);
                            projectile.dangerousSprites.Add(newDangerousSprite);
                        }
                        npc.moveCooldown = 1;
                        StartCoroutine(CalculateDangerousTiles(projectile));
                    }
                }
            }
        }
    }