private void ThreadRun()
        {
            byte[] lenbuffer = new byte[2];

            while (true)
            {
                try
                {
                    byte[] d;
                    if (_sendData.TryDequeue(out d))
                    {
                        NetworkDataTools.SetUInt16(out lenbuffer[0], out lenbuffer[1], (ushort)d.Length);
                        mmOutStream.Write(lenbuffer, 0, 2);
                        mmOutStream.Write(d, 0, d.Length);
                    }
                    else
                    {
                        Thread.Sleep(0);
                    }
                }
                catch (Java.IO.IOException e)
                {
                    SAMLog.Warning("ABTA::ThreadSend_ConnLost", e.Message);
                    _adapter.ThreadMessage_ConnectionLost();
                    break;
                }
            }
        }
Esempio n. 2
0
        protected void SendForwardBullets(ref int idx)
        {
            if (idx + 2 >= MAX_PACKAGE_SIZE_BYTES)
            {
                SendAndReset(ref idx);
            }

            MSG_FORWARD[idx] = AREA_BULLETS;
            idx++;

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

            int posSize = idx;

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

            int i = 0;

            for (int bid = 0; bid < GDGameScreen.MAX_BULLET_ID; bid++)
            {
                if (Screen.BulletMapping[bid].Bullet == null)
                {
                    continue;
                }
                if (Screen.BulletMapping[bid].State != RemoteBullet.RemoteBulletState.Normal && Screen.BulletMapping[bid].RemainingPostDeathTransmitions <= 0)
                {
                    Screen.BulletMapping[bid].Bullet = null;                     // for GC
                    continue;
                }

                Screen.BulletMapping[bid].RemainingPostDeathTransmitions--;

                // [12: ID] [4: State] [16: PosX] [16: PosY] [10: VecRot] [11: VecLen] [3: Fraction] [8: Scale]

                var    b = Screen.BulletMapping[bid].Bullet;
                var    state = Screen.BulletMapping[bid].State;
                var    veloc = b.Velocity;
                ushort px, py;
                Screen.PositionTo2Byte(b.Position, out px, out py);
                ushort rot  = (ushort)((FloatMath.NormalizeAngle(veloc.ToAngle()) / FloatMath.TAU) * 1024);          // 10bit
                ushort len  = (ushort)FloatMath.IClamp(FloatMath.Round(veloc.Length() * 8), 0, 2048);                // 11bit (fac=8)
                byte   frac = Screen.GetFractionID(b.Fraction);


                NetworkDataTools.SetByteWithHighBits(out MSG_FORWARD[idx + 0], bid, 12);
                NetworkDataTools.SetSplitByte(out MSG_FORWARD[idx + 1], bid, (int)state, 12, 4, 4, 4);
                NetworkDataTools.SetUInt16(out MSG_FORWARD[idx + 2], out MSG_FORWARD[idx + 3], px);
                NetworkDataTools.SetUInt16(out MSG_FORWARD[idx + 4], out MSG_FORWARD[idx + 5], py);
                NetworkDataTools.SetByteWithHighBits(out MSG_FORWARD[idx + 6], rot, 10);
                NetworkDataTools.SetSplitByte(out MSG_FORWARD[idx + 7], rot, len, 10, 11, 2, 6);
                NetworkDataTools.SetSplitByte(out MSG_FORWARD[idx + 8], len, frac, 11, 3, 5, 3);
                NetworkDataTools.SetByteClamped(out MSG_FORWARD[idx + 9], (int)((b.Scale / 16f) * 255));

                idx += PLEN_BULLETS;

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