Ejemplo n.º 1
0
    public void Execute(int index)
    {
        var arrow = arrows[index];

        // Check if the arrow is fired
        if (arrow.active)
        {
            arrow.position   += arrow.velocity * dt;
            arrow.velocity.y += SimulationState.Gravity * dt;

            // Check if we hit something
            int i    = 0;
            int hash = MinionSystem.Hash(arrow.position);
            NativeMultiHashMapIterator <int> iterator;
            bool found      = buckets.TryGetFirstValue(hash, out i, out iterator);
            int  iterations = 0;

            while (found)
            {
                if (iterations++ > 3)
                {
                    break;
                }

                // This freezes :/
                var relative = arrow.position - allMinionTransforms[i].Position;
                var distance = math.length(relative);

                if (distance < 1f)
                {
                    if ((arrow.IsFriendly == 1) != minionConstData[i].IsFriendly)
                    {
                        // Deal damage and deactivate the arrow
                        AttackCommands.Enqueue(new AttackCommand(arrowEntities[index], minionEntities[i], 34));

                        // Send it to the end of the earth
                        arrow.active   = false;
                        arrow.position = Vector3.one * -1000000;
                        queueForKillingEntities.Enqueue(arrowEntities[index]);

                        break;
                    }
                }

                found = buckets.TryGetNextValue(out i, ref iterator);
            }

            if (arrow.active)
            {
                raycastCommands[index] = RaycastHelper.CreateRaycastCommand(arrow.position);
            }
            arrows[index] = arrow;
        }
    }
Ejemplo n.º 2
0
    void Start()
    {
        minionSys = GetComponent<MinionSystem> ();
        minionSys.init ();

        moveSpeed = minionSys.minion.speed;
        moveSpeed_val = moveSpeed;
        selected = false;

        myTransform = transform;							// sets myTransform to this GameObject.transform
        destinationPosition = myTransform.position;			// prevents myTransform reset
    }
    public void Execute()
    {
        for (int i = 0; i < transforms.Length; i++)
        {
            if (!minionBitmask[i].IsSpawned)
            {
                continue;
            }

            var hash = MinionSystem.Hash(transforms[i].Position);

            buckets.Add(hash, i);
        }
    }
    public void Execute(int index)
    {
        if (!minionBitmask[index].IsSpawned)
        {
            return;
        }

        const float radius            = 1f;
        const float radiusSqr         = radius * radius;
        const float maxForce          = 200f;
        const float damping           = 8f;
        const float attackDistanceSqr = 1.1f * 1.1f;
        const float maxVelocity       = 3.5f;
        const float maxVelocitySqr    = maxVelocity * maxVelocity;

        var currentTransform = transforms[index];
        var currentMinion    = minionVelocities[index];
        var attackData       = minionAttackData[index];

        attackData.targetEntity = new Entity();

        var velocity = currentMinion.Velocity.xz;

        //if (velocity.x <= 0f && velocity.y <= 0f) velocity = 0f;

        int i    = 0;
        int hash = MinionSystem.Hash(currentTransform.Position);
        NativeMultiHashMapIterator <int> iterator;
        bool found = buckets.TryGetFirstValue(hash, out i, out iterator);

        int iterations = 0;

        bool attacked    = false;
        int  closestDone = 0;

        const int maxIterations = 6;

        while (found)
        {
            if (i == index)
            {
                // Exclude self
                found = buckets.TryGetNextValue(out i, ref iterator);
                continue;
            }

            var epsilon = 0.00001f;

            // Construct the force direction
            var relative = currentTransform.Position.xz - transforms[i].Position.xz;

            if (mathx.lengthSqr(relative) < epsilon || !math.any(relative))
            {
                relative = new float2(1, 0);
            }

            float distanceSqr = mathx.lengthSqr(relative);

            // Update velocity data
            float str = math.max(0, radiusSqr - distanceSqr) / radiusSqr;
            velocity += math.normalize(relative) * str * maxForce * dt;

            // Take attack distance into consideration
            if (currentTransform.UnitType != 2 && distanceSqr <= attackDistanceSqr && !attacked)
            {
                //Check if we can attack someone
                if (minionBitmask[index].IsFriendly != minionBitmask[i].IsFriendly)
                {
                    attackData.targetEntity   = entities[i];
                    attackData.attackPosition = transforms[i].Position;

                    attacked = true;
                }
            }

            // Next iteration
            found = buckets.TryGetNextValue(out i, ref iterator);

            // We will check 3 cells in the corner
            if (!found && closestDone < 3)
            {
                var position        = currentTransform.Position.xz / MinionSystem.step;
                var flooredPosition = new int2(math.floor(position));

                var nextQuantizedPosition = new int2(math.round(2f * position - (flooredPosition + new float2(0.5f))));
                if (nextQuantizedPosition.x == flooredPosition.x)
                {
                    nextQuantizedPosition.x -= 1;
                }
                if (nextQuantizedPosition.y == flooredPosition.y)
                {
                    nextQuantizedPosition.y -= 1;
                }

                if (closestDone == 1)
                {
                    nextQuantizedPosition.x = flooredPosition.x;
                }
                else if (closestDone == 2)
                {
                    nextQuantizedPosition.y = flooredPosition.y;
                }

                int nextHash = nextQuantizedPosition.x + MinionSystem.fieldWidthHalf + (nextQuantizedPosition.y + MinionSystem.fieldHeightHalf) * MinionSystem.fieldWidth;

                found = buckets.TryGetFirstValue(nextHash, out i, out iterator);

                closestDone++;
            }

            if (++iterations > maxIterations)
            {
                break;
            }
        }

        var dampingStr = velocity * damping * dt;

        velocity -= dampingStr;

        currentMinion.Velocity = new float3(velocity.x, 0, velocity.y);
        if (math.dot(currentMinion.Velocity, currentMinion.Velocity) > maxVelocitySqr)
        {
            currentMinion.Velocity = math.normalize(currentMinion.Velocity) * maxVelocity;
        }

        minionVelocities[index] = currentMinion;
        minionAttackData[index] = attackData;
    }