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); }
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); }