Example #1
0
    public void OnPowerupSlotChanged(uint slotNumber, PowerupSlotContent slotContent, PowerupSlotChangedRequest.PowerupSlotData slotData)
    {
        PowerupSlot slot = slots[slotNumber];

        switch (slotContent)
        {
        case PowerupSlotContent.Empty:
            slot.SetScale(0);
            break;

        case PowerupSlotContent.Laser:
            slot.SetSprite(SerializedFields.singleton.laserPowerupSprite);
            slot.SetColor(SerializedFields.singleton.laserPowerupColor);

            PowerupSlotChangedRequest.LaserPowerupSlotData laserPowerupSlotData = (PowerupSlotChangedRequest.LaserPowerupSlotData)slotData;
            slot.SetScale(laserPowerupSlotData.RemainingShots * 1.0f / SerializedFields.singleton.laserPowerupShots);
            break;

        case PowerupSlotContent.Boost:
            slot.SetSprite(SerializedFields.singleton.boostPowerupSprite);
            slot.SetColor(SerializedFields.singleton.boostPowerupColor);
            slot.SetScale(1);
            break;

        case PowerupSlotContent.Shield:
            slot.SetSprite(SerializedFields.singleton.shieldPowerupSprite);
            slot.SetColor(SerializedFields.singleton.shieldPowerupColor);
            slot.SetScale(1);
            break;

        case PowerupSlotContent.Repair:
            slot.SetSprite(SerializedFields.singleton.repairPowerupSprite);
            slot.SetColor(SerializedFields.singleton.repairPowerupColor);
            slot.SetScale(1);
            break;

        case PowerupSlotContent.Missile:
            slot.SetSprite(SerializedFields.singleton.missilePowerupSprite);
            slot.SetColor(missileTargetClientSystem.MissileTargetPlayerId.HasValue ? SerializedFields.singleton.missilePowerupColor : SerializedFields.singleton.inactivePowerupColor);
            slot.SetScale(1);
            break;
        }
    }
Example #2
0
    protected override void OnUpdate()
    {
        Entities.WithNone <SendRpcCommandRequestComponent>().ForEach((Entity reqEnt, ref UsePowerupRequest req, ref ReceiveRpcCommandRequestComponent reqSrc) =>
        {
            var playerId = EntityManager.GetComponentData <NetworkIdComponent>(reqSrc.SourceConnection).Value;

            uint slotNumber = req.slotNumber;

            Entities.ForEach((Entity carEntity, DynamicBuffer <PowerupSlotElement> powerupSlots, ref HealthComponent healthComponent, ref ShieldComponent shieldComponent, ref SynchronizedCarComponent carComponent, ref Translation position, ref Rotation rotation) => {
                if (carComponent.PlayerId == playerId && healthComponent.Health > 0)
                {
                    if (slotNumber < SerializedFields.singleton.numberOfPowerupSlots)
                    {
                        switch (powerupSlots[(int)slotNumber].Content)
                        {
                        case PowerupSlotContent.Laser:
                            var laserPowerupSlots = EntityManager.GetBuffer <LaserPowerupSlotElement>(carEntity);

                            for (int i = 0; i < laserPowerupSlots.Length; i++)
                            {
                                if (laserPowerupSlots[i].SlotNumber == slotNumber)
                                {
                                    var ghostCollection = GetSingleton <GhostPrefabCollectionComponent>();
                                    var ghostId         = SerpentineGhostSerializerCollection.FindGhostType <ProjectileSnapshotData>();
                                    var prefab          = EntityManager.GetBuffer <GhostPrefabBuffer>(ghostCollection.serverPrefabs)[ghostId].Value;

                                    var projectile = PostUpdateCommands.Instantiate(prefab);
                                    PostUpdateCommands.SetComponent(projectile, new OwnerComponent {
                                        OwnerPlayerId = carComponent.PlayerId
                                    });

                                    PostUpdateCommands.SetComponent(projectile, new Translation {
                                        Value = position.Value + math.forward(rotation.Value) * 3f
                                    });
                                    PostUpdateCommands.SetComponent(projectile, new Rotation {
                                        Value = rotation.Value
                                    });
                                    PostUpdateCommands.SetComponent(projectile, new PhysicsVelocity {
                                        Angular = float3.zero, Linear = math.forward(rotation.Value) * SerializedFields.singleton.projectileRelativeSpeed + EntityManager.GetComponentData <PhysicsVelocity>(carEntity).Linear
                                    });

                                    if (laserPowerupSlots[i].RemainingShots > 1)
                                    {
                                        laserPowerupSlots[i] = new LaserPowerupSlotElement
                                        {
                                            SlotNumber     = laserPowerupSlots[i].SlotNumber,
                                            RemainingShots = laserPowerupSlots[i].RemainingShots - 1
                                        };

                                        void *slotData           = UnsafeUtility.Malloc(sizeof(PowerupSlotChangedRequest.LaserPowerupSlotData), sizeof(PowerupSlotChangedRequest.LaserPowerupSlotData), Unity.Collections.Allocator.Persistent);
                                        var laserPowerupSlotData = new PowerupSlotChangedRequest.LaserPowerupSlotData {
                                            RemainingShots = laserPowerupSlots[i].RemainingShots
                                        };
                                        UnsafeUtility.CopyStructureToPtr(ref laserPowerupSlotData, slotData);

                                        Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                                        {
                                            if (id.Value == playerId)
                                            {
                                                var request = PostUpdateCommands.CreateEntity();
                                                PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                                    SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Laser, SlotData = slotData
                                                });
                                                PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                                    TargetConnection = ent
                                                });
                                            }
                                        });
                                    }
                                    else
                                    {
                                        powerupSlots[(int)slotNumber] = new PowerupSlotElement {
                                            Content = PowerupSlotContent.Empty
                                        };

                                        laserPowerupSlots.RemoveAt(i);

                                        Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                                        {
                                            if (id.Value == playerId)
                                            {
                                                var request = PostUpdateCommands.CreateEntity();
                                                PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                                    SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Empty
                                                });
                                                PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                                    TargetConnection = ent
                                                });
                                            }
                                        });
                                    }

                                    break;
                                }
                            }

                            break;

                        case PowerupSlotContent.Boost:
                            if (Utils.GetPlayerPlacement(carComponent.PlayerId, GameSession.serverSession.numberOfPlayers, EntityManager, Entities, this) != 1)
                            {
                                powerupSlots[(int)slotNumber] = new PowerupSlotElement {
                                    Content = PowerupSlotContent.Empty
                                };

                                var boostComponent = EntityManager.GetComponentData <BoostComponent>(carEntity);

                                boostComponent.RemainingTime = math.max(boostComponent.RemainingTime, SerializedFields.singleton.boostPowerupDuration);

                                EntityManager.SetComponentData(carEntity, boostComponent);

                                Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                                {
                                    if (id.Value == playerId)
                                    {
                                        var request = PostUpdateCommands.CreateEntity();
                                        PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                            SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Empty
                                        });
                                        PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                            TargetConnection = ent
                                        });
                                    }
                                });
                            }

                            break;

                        case PowerupSlotContent.Shield:
                            powerupSlots[(int)slotNumber] = new PowerupSlotElement {
                                Content = PowerupSlotContent.Empty
                            };

                            carComponent.IsShieldActive   = true;
                            shieldComponent.RemainingTime = math.max(SerializedFields.singleton.shieldPowerupDuration, shieldComponent.RemainingTime);

                            Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                            {
                                if (id.Value == playerId)
                                {
                                    var request = PostUpdateCommands.CreateEntity();
                                    PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                        SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Empty
                                    });
                                    PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                        TargetConnection = ent
                                    });
                                }
                            });

                            break;

                        case PowerupSlotContent.Repair:
                            powerupSlots[(int)slotNumber] = new PowerupSlotElement {
                                Content = PowerupSlotContent.Empty
                            };

                            healthComponent.Health += SerializedFields.singleton.repairPowerupHealth;
                            if (healthComponent.Health > SerializedFields.singleton.maxHealth)
                            {
                                healthComponent.Health = SerializedFields.singleton.maxHealth;
                            }

                            Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                            {
                                if (id.Value == playerId)
                                {
                                    var request = PostUpdateCommands.CreateEntity();
                                    PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                        SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Empty
                                    });
                                    PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                        TargetConnection = ent
                                    });
                                }
                            });

                            break;

                        case PowerupSlotContent.Missile:
                            if (EntityManager.GetComponentData <MissileScopeComponent>(carEntity).TargetPlayerId.HasValue)
                            {
                                powerupSlots[(int)slotNumber] = new PowerupSlotElement
                                {
                                    Content = PowerupSlotContent.Empty
                                };

                                var ghostCollection = GetSingleton <GhostPrefabCollectionComponent>();
                                var ghostId         = SerpentineGhostSerializerCollection.FindGhostType <MissileSnapshotData>();
                                var prefab          = EntityManager.GetBuffer <GhostPrefabBuffer>(ghostCollection.serverPrefabs)[ghostId].Value;

                                float3 carTransformRight   = math.mul(rotation.Value, new float3(1, 0, 0));
                                float3 carTransformUp      = math.mul(rotation.Value, new float3(0, 1, 0));
                                float3 carTransformForward = math.mul(rotation.Value, new float3(0, 0, 1));
                                quaternion rotateUpward    = Quaternion.AngleAxis(-30, carTransformRight);

                                for (int i = 0; i < SerializedFields.singleton.numberOfMissilesOnShot; i++)
                                {
                                    var missile = PostUpdateCommands.Instantiate(prefab);
                                    PostUpdateCommands.SetComponent(missile, new OwnerComponent {
                                        OwnerPlayerId = carComponent.PlayerId
                                    });

                                    PostUpdateCommands.SetComponent(missile, new Translation {
                                        Value = position.Value + carTransformUp * 2f + carTransformForward * 1f
                                    });
                                    PostUpdateCommands.SetComponent(missile, new Rotation {
                                        Value = math.mul(Quaternion.AngleAxis((i - (SerializedFields.singleton.numberOfMissilesOnShot - 1) / 2f) * 10f, carTransformUp), math.mul(Quaternion.AngleAxis(90, carTransformRight), math.mul(rotateUpward, rotation.Value)))
                                    });
                                    PostUpdateCommands.SetComponent(missile, new PhysicsVelocity {
                                        Angular = float3.zero, Linear = math.mul(Quaternion.AngleAxis((i - (SerializedFields.singleton.numberOfMissilesOnShot - 1) / 2f) * 10f, carTransformUp), math.mul(rotateUpward, carTransformForward) * (SerializedFields.singleton.missileRelativeSpeed + math.max(0, math.dot(EntityManager.GetComponentData <PhysicsVelocity>(carEntity).Linear, carTransformForward))))
                                    });

                                    Entities.ForEach((Entity otherCarEntity, ref SynchronizedCarComponent synchronizedCarComponent) =>
                                    {
                                        if (synchronizedCarComponent.PlayerId == EntityManager.GetComponentData <MissileScopeComponent>(carEntity).TargetPlayerId.Value)
                                        {
                                            PostUpdateCommands.SetComponent(missile, new MissileTargetComponent {
                                                TargetEntity = otherCarEntity, RemainingTime = SerializedFields.singleton.missileLifetime
                                            });
                                        }
                                    });
                                }

                                Entities.ForEach((Entity ent, ref NetworkIdComponent id) =>
                                {
                                    if (id.Value == playerId)
                                    {
                                        var request = PostUpdateCommands.CreateEntity();
                                        PostUpdateCommands.AddComponent(request, new PowerupSlotChangedRequest {
                                            SlotNumber = slotNumber, SlotContent = PowerupSlotContent.Empty
                                        });
                                        PostUpdateCommands.AddComponent(request, new SendRpcCommandRequestComponent {
                                            TargetConnection = ent
                                        });
                                    }
                                });
                            }

                            break;
                        }
                    }
                }
            });

            PostUpdateCommands.DestroyEntity(reqEnt);
        });
    }
Example #3
0
    protected override void OnUpdate()
    {
        Entities.ForEach((Entity interactionEntity, ref PowerupCarInteractionComponent interaction) => {
            PostUpdateCommands.DestroyEntity(interactionEntity);

            if (EntityManager.GetComponentData <ActiveComponent>(interaction.Powerup).IsActive)
            {
                DynamicBuffer <PowerupSlotElement> powerupSlots = EntityManager.GetBuffer <PowerupSlotElement>(interaction.Car);

                for (uint slotNumber = 0; slotNumber < powerupSlots.Length; slotNumber++)
                {
                    if (powerupSlots[(int)slotNumber].Content == PowerupSlotContent.Empty)
                    {
                        var powerupId = EntityManager.GetComponentData <PowerupIdComponent>(interaction.Powerup).PowerupId;

                        EntityManager.SetComponentData(interaction.Powerup, new ActiveComponent {
                            IsActive = false
                        });
                        PostUpdateCommands.AddComponent(interaction.Powerup, typeof(Disabled));
                        var ghostRespawnEntity = PostUpdateCommands.CreateEntity();
                        PostUpdateCommands.AddComponent(ghostRespawnEntity, new PowerupRespawnComponent {
                            PowerupId = powerupId, RemainingTime = SerializedFields.singleton.powerupRespawnTime
                        });

                        PowerupSlotContent slotContent = (PowerupSlotContent)((int)EntityManager.GetComponentData <PowerupComponent>(interaction.Powerup).Powerup);

                        unsafe
                        {
                            void *powerupSlotData = null;

                            switch (slotContent)
                            {
                            case PowerupSlotContent.Laser:
                                PostUpdateCommands.AppendToBuffer(interaction.Car, new LaserPowerupSlotElement {
                                    SlotNumber = slotNumber, RemainingShots = SerializedFields.singleton.laserPowerupShots
                                });

                                var laserPowerupSlotData = new PowerupSlotChangedRequest.LaserPowerupSlotData {
                                    RemainingShots = SerializedFields.singleton.laserPowerupShots
                                };
                                powerupSlotData = UnsafeUtility.Malloc(sizeof(PowerupSlotChangedRequest.LaserPowerupSlotData), sizeof(PowerupSlotChangedRequest.LaserPowerupSlotData), Unity.Collections.Allocator.Persistent);
                                UnsafeUtility.CopyStructureToPtr(ref laserPowerupSlotData, powerupSlotData);
                                break;
                            }

                            powerupSlots[(int)slotNumber] = new PowerupSlotElement {
                                Content = slotContent
                            };

                            var car = interaction.Car;

                            Entities.ForEach((Entity connectionEntity, ref NetworkIdComponent id) =>
                            {
                                var ghostEnabledRequest = PostUpdateCommands.CreateEntity();
                                PostUpdateCommands.AddComponent(ghostEnabledRequest, new PowerupEnabledRequest {
                                    PowerupId = powerupId, Enabled = false
                                });
                                PostUpdateCommands.AddComponent(ghostEnabledRequest, new SendRpcCommandRequestComponent {
                                    TargetConnection = connectionEntity
                                });

                                if (id.Value == EntityManager.GetComponentData <SynchronizedCarComponent>(car).PlayerId)
                                {
                                    var powerupSlotChangedRequest = PostUpdateCommands.CreateEntity();
                                    PostUpdateCommands.AddComponent(powerupSlotChangedRequest, new PowerupSlotChangedRequest {
                                        SlotNumber = slotNumber, SlotContent = slotContent, SlotData = powerupSlotData
                                    });
                                    PostUpdateCommands.AddComponent(powerupSlotChangedRequest, new SendRpcCommandRequestComponent {
                                        TargetConnection = connectionEntity
                                    });
                                }
                            });
                        }

                        break;
                    }
                }
            }
        });
    }