protected override void OnUpdate()
    {
        var playerQuery  = GetEntityQuery(typeof(PlayerStates));
        var playerEntity = playerQuery.GetSingletonEntity();
        var playerStates = GetComponentDataFromEntity <PlayerStates>()[playerEntity];

        if (!PlayerUtility.IsLevelDownProtection(playerStates))
        {
            return;
        }

        var deltaTime          = TimeUtility.GetLimitedDeltaTime();
        var flashRenderingData = GetComponentDataFromEntity <FlashRenderingData>()[playerEntity];

        flashRenderingData.TimeLeftToSwitchRenderer = math.max(0, flashRenderingData.TimeLeftToSwitchRenderer - deltaTime);
        if (flashRenderingData.TimeLeftToSwitchRenderer <= 0f)
        {
            flashRenderingData.TimeLeftToSwitchRenderer = GameEntry.Instance.Config.Global.PlayerLevelDownProtectionRendering.FlashingPeriod;
            // TODO: This doesn't work right now.
            if (GetComponentDataFromEntity <MaterialColor>().HasComponent(playerEntity))
            {
                EntityManager.RemoveComponent(playerEntity, typeof(MaterialColor));
            }
            else
            {
                EntityManager.AddComponent <MaterialColor>(playerEntity);
            }
        }

        EntityManager.SetComponentData(playerEntity, flashRenderingData);
    }
示例#2
0
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        var commandBuffer           = m_CommandBufferSystem.CreateCommandBuffer().ToConcurrent();
        var deadPlayerGenerator     = GetEntityQuery(typeof(DeadPlayerCharacterGeneratorData)).GetSingletonEntity();
        var deadPlayerGeneratorData = GetComponentDataFromEntity <DeadPlayerCharacterGeneratorData>()[deadPlayerGenerator];
        var consequenceQueue        = new NativeQueue <PlayerConsequence>(Allocator.Temp);
        var consequenceQueueWriter  = consequenceQueue.AsParallelWriter();
        var jobHandle = Entities
                        .WithAll <PlayerTag>()
                        .ForEach((int entityInQueryIndex, Entity playerEntity,
                                  ref PlayerAttackedByEnemyData attackData,
                                  ref PlayerStates playerStates,
                                  ref MovementData movementData,
                                  in Translation translation) =>
        {
            if (attackData.EnemyAttackType == EnemyAttackType.None)
            {
                return;
            }

            if (playerStates.Main == PlayerMainStatus.Dying || PlayerUtility.IsLevelDownProtection(playerStates))
            {
                attackData.EnemyAttackType = EnemyAttackType.None;
                return;
            }

            attackData.EnemyAttackType = EnemyAttackType.None;
            if (playerStates.Level != PlayerLevel.Default)
            {
                playerStates.NextLevel = PlayerLevel.Default;
                consequenceQueueWriter.Enqueue(new PlayerConsequence {
                    LevelDownOrDead = true, NewLevel = playerStates.NextLevel
                });
            }
            else
            {
                consequenceQueueWriter.Enqueue(new PlayerConsequence {
                    LevelDownOrDead = false, DeadPosition = translation.Value
                });
                commandBuffer.DestroyEntity(entityInQueryIndex, playerEntity);
            }
        }).Schedule(inputDeps);

        jobHandle.Complete();

        if (consequenceQueue.TryDequeue(out var playerConsequence))
        {
            if (playerConsequence.LevelDownOrDead)
            {
                var eventArgs = GameEntry.Instance.RefPool.GetOrAdd <PlayerLevelChangeEventArgs>().Acquire();
                eventArgs.Level = playerConsequence.NewLevel;
                GameEntry.Instance.Event.SendEvent(this, eventArgs);
            }
            else
            {
                var position              = playerConsequence.DeadPosition;
                var deadPlayerEntity      = EntityManager.Instantiate(deadPlayerGeneratorData.PrefabEntity);
                var deadPlayerTranslation = GetComponentDataFromEntity <Translation>()[deadPlayerEntity];
                deadPlayerTranslation.Value.x = position.x;
                deadPlayerTranslation.Value.y = position.y;
                EntityManager.SetComponentData(deadPlayerEntity, deadPlayerTranslation);
                GameEntry.Instance.PlayerData.Die();
            }
        }

        consequenceQueue.Dispose();
        return(jobHandle);
    }