protected override void OnUpdate() { Entities.WithNone <SendRpcCommandRequestComponent>().ForEach((Entity reqEnt, ref PowerupSlotChangedRequest req, ref ReceiveRpcCommandRequestComponent reqSrc) => { PostUpdateCommands.DestroyEntity(reqEnt); var previousSlotContent = slots[req.SlotNumber]; slots[req.SlotNumber] = req.SlotContent; PowerupSlotChangedRequest.PowerupSlotData slotData = null; switch (req.SlotContent) { case PowerupSlotContent.Laser: UnsafeUtility.CopyPtrToStructure(req.SlotData, out PowerupSlotChangedRequest.LaserPowerupSlotData laserPowerupSlotData); slotData = laserPowerupSlotData; break; } if (req.SlotData != null) { UnsafeUtility.Free(req.SlotData, Unity.Collections.Allocator.Persistent); } OnPowerupSlotChanged?.Invoke(req.SlotNumber, req.SlotContent, slotData); if (req.SlotContent == PowerupSlotContent.Missile) { OnMissilePowerupAcquired?.Invoke(); } else if (previousSlotContent == PowerupSlotContent.Missile) { bool hasMissilePowerups = false; foreach (var slot in slots) { if (slot == PowerupSlotContent.Missile) { hasMissilePowerups = true; break; } } if (!hasMissilePowerups) { OnAllMissilePowerupsUsed?.Invoke(); } } }); }
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; } }