private void ProcessForwardBullets(ref int p, byte[] d, long bseq, float sendertime) { int count = d[p]; p++; for (int i = 0; i < count; i++) { var id = NetworkDataTools.GetSplitBits(d[p + 0], d[p + 1], 8, 4); var state = (RemoteBullet.RemoteBulletState)NetworkDataTools.GetLowBits(d[p + 1], 4); var ipx = NetworkDataTools.GetUInt16(d[p + 2], d[p + 3]); var ipy = NetworkDataTools.GetUInt16(d[p + 4], d[p + 5]); Screen.DoubleByteToPosition(ipx, ipy, out float px, out float py); var rot = NetworkDataTools.ConvertToRadians(NetworkDataTools.GetSplitBits(d[p + 6], d[p + 7], 8, 2), 10); var len = NetworkDataTools.GetSplitBits(d[p + 7], d[p + 8], 6, 5) / 8f; var veloc = new Vector2(len, 0).Rotate(rot); var fraction = Screen.GetFractionByID(NetworkDataTools.GetLowBits(d[p + 8], 3)); var scale = 16 * (d[p + 9] / 255f); var bullet = Screen.RemoteBulletMapping[id]; switch (state) { case RemoteBullet.RemoteBulletState.Normal: if (bullet != null) { bullet.RemoteUpdate(state, px, py, veloc, fraction, scale, bseq, sendertime); } else { Screen.RemoteBulletMapping[id] = new RemoteBullet(Screen, new FPoint(px, py), veloc, id, scale, fraction, bseq); Screen.RemoteBulletMapping[id].RemoteState = state; Screen.Entities.AddEntity(Screen.RemoteBulletMapping[id]); Screen.RemoteBulletMapping[id].RemoteUpdate(state, px, py, veloc, fraction, scale, bseq, sendertime); Screen.RemoteBulletMapping[id].ClientPredictionMiss = false; } break; case RemoteBullet.RemoteBulletState.Dying_Explosion: case RemoteBullet.RemoteBulletState.Dying_ShrinkSlow: case RemoteBullet.RemoteBulletState.Dying_ShrinkFast: case RemoteBullet.RemoteBulletState.Dying_Fade: case RemoteBullet.RemoteBulletState.Dying_Instant: case RemoteBullet.RemoteBulletState.Dying_FadeSlow: if (bullet != null && bullet.RemoteState != state) { bullet.RemoteUpdate(state, px, py, veloc, fraction, scale, bseq, sendertime); } break; default: SAMLog.Error("GDMC::EnumSwitch_PFB", "Unknown enum value: " + state); break; } p += PLEN_BULLETS; } for (int i = 0; i < GDGameScreen.MAX_BULLET_ID; i++) { if (Screen.RemoteBulletMapping[i] != null && bseq - Screen.RemoteBulletMapping[i].LastUpdateBigSeq > REMOTE_BULLET_UPDATELESS_LIFETIME) { if (Screen.RemoteBulletMapping[i].RemoteState == RemoteBullet.RemoteBulletState.Normal) { SAMLog.Debug("Mercykill Bullet: " + i); Screen.RemoteBulletMapping[i].Alive = false; } else { // all ok - its dying } } } }
private void ThreadRun() { byte[] buffer = new byte[SAMNetworkConnection.MAX_PACKAGE_SIZE_BYTES * 3]; ushort currentLen = 0; int currentOffset = 0; // Keep listening to the InputStream while connected while (true) { try { // Read from the InputStream var bytes = mmInStream.Read(buffer, currentOffset, SAMNetworkConnection.MAX_PACKAGE_SIZE_BYTES); if (currentLen == 0) { if (bytes >= 2) { currentLen = NetworkDataTools.GetUInt16(buffer[0], buffer[1]); if (currentLen == 0) { SAMLog.Warning("ABTA::NullLen", "BT recieved 0 len package"); currentOffset = 0; } } currentOffset += bytes; } else { currentOffset += bytes; } while (currentLen > 0 && currentLen + 2 <= currentOffset) { _adapter.ThreadMessage_DataRead(buffer, 2, currentLen); for (int i = currentLen + 2; i < currentOffset; i++) { buffer[i - (currentLen + 2)] = buffer[i]; } currentOffset -= (currentLen + 2); if (currentOffset > 2) { currentLen = NetworkDataTools.GetUInt16(buffer[0], buffer[1]); } else { currentLen = 0; } } } catch (Java.IO.IOException e) { SAMLog.Warning("ABTA::ThreadRecieve_ConnLost", e.Message); _adapter.ThreadMessage_ConnectionLost(); break; } } }