protected override void SendGameStateNow()
        {
            if (Screen == null)
            {
                return;
            }

            packageCount = 0;

            NetworkDataTools.SetByteWithHighBits(out MSG_FORWARD[2], SessionID, 16);
            NetworkDataTools.SetByteWithLowBits(out MSG_FORWARD[3], SessionID, 16);
            NetworkDataTools.SetSplitByte(out MSG_FORWARD[4], SessionUserID, SessionSecret, 4, 12, 4, 4);
            NetworkDataTools.SetByteWithLowBits(out MSG_FORWARD[5], SessionSecret, 12);
            NetworkDataTools.SetSingle(out MSG_FORWARD[6], out MSG_FORWARD[7], out MSG_FORWARD[8], out MSG_FORWARD[9], Screen.LevelTime);

            int p = PACKAGE_FORWARD_HEADER_SIZE;

            SendForwardBulletCannons(ref p);
            SendForwardLaserCannons(ref p);
            SendForwardMiniguns(ref p);
            SendForwardShieldProjectors(ref p);
            SendForwardRelayCannons(ref p);
            SendForwardTrishotCannons(ref p);
            SendForwardBullets(ref p);
            SendAndReset(ref p);
        }
Ejemplo n.º 2
0
        protected void SendForwardShieldProjectors(ref int idx)
        {
            var data = Screen.GetEntities <ShieldProjectorCannon>().ToList();

            if (data.Count == 0)
            {
                return;
            }

            if (idx + 2 >= MAX_PACKAGE_SIZE_BYTES)
            {
                SendAndReset(ref idx);
            }

            MSG_FORWARD[idx] = AREA_SHIELDPROJECTORS;
            idx++;

            byte arrsize = (byte)((MAX_PACKAGE_SIZE_BYTES - idx - 2) / PLEN_SHIELDPROJECTOR);

            int posSize = idx;

            MSG_FORWARD[posSize] = 0xFF;
            idx++;

            int i = 0;

            foreach (var cannon in data)
            {
                if (!ShouldSendData(cannon))
                {
                    continue;
                }

                // [8: ID] [3: Fraction] [5: Boost] [32: RotationActual] [32: RotationTarget] [8: Health] [8:ChargeTime]

                NetworkDataTools.SetByte(out MSG_FORWARD[idx + 0], cannon.BlueprintCannonID);
                NetworkDataTools.SetSplitByte(out MSG_FORWARD[idx + 1], Screen.GetFractionID(cannon.Fraction), cannon.IntegerBoost, 3, 5, 3, 5);
                NetworkDataTools.SetSingle(out MSG_FORWARD[idx + 2], out MSG_FORWARD[idx + 3], out MSG_FORWARD[idx + 4], out MSG_FORWARD[idx + 5], cannon.Rotation.ActualValue);
                NetworkDataTools.SetSingle(out MSG_FORWARD[idx + 6], out MSG_FORWARD[idx + 7], out MSG_FORWARD[idx + 8], out MSG_FORWARD[idx + 9], cannon.Rotation.TargetValue);
                NetworkDataTools.SetByteFloor(out MSG_FORWARD[idx + 10], FloatMath.Clamp(cannon.CannonHealth.TargetValue, 0f, 1f) * 255);
                NetworkDataTools.SetByteFloor(out MSG_FORWARD[idx + 11], FloatMath.Clamp(cannon.ChargeTime / Cannon.SHIELDLASER_CHARGE_COOLDOWN_MAX, 0f, 1f) * 255);

                idx += PLEN_LASERCANNON;

                i++;
                if (i >= arrsize)
                {
                    MSG_FORWARD[posSize] = (byte)i;
                    SendAndReset(ref idx);
                    MSG_FORWARD[idx] = AREA_SHIELDPROJECTORS;
                    idx++;
                    i      -= arrsize;
                    arrsize = (byte)((MAX_PACKAGE_SIZE_BYTES - idx - 2) / PLEN_SHIELDPROJECTOR);
                    posSize = idx;
                    MSG_FORWARD[posSize] = 0xFF;
                    idx++;
                }
            }
            MSG_FORWARD[posSize] = (byte)i;
        }