public static BitsByte[] ComposeBitsBytesChain(bool optimizeLength, params bool[] flags) { int length1 = flags.Length; int length2 = 0; while (length1 > 0) { ++length2; length1 -= 7; } BitsByte[] array = new BitsByte[length2]; int index1 = 0; int index2 = 0; for (int index3 = 0; index3 < flags.Length; ++index3) { array[index2][index1] = flags[index3]; ++index1; if (index1 == 7 && index2 < length2 - 1) { array[index2][index1] = true; index1 = 0; ++index2; } } if (optimizeLength) { int index3; for (index3 = array.Length - 1; (int)(byte)array[index3] == 0 && index3 > 0; --index3) { array[index3 - 1][7] = false; } Array.Resize <BitsByte>(ref array, index3 + 1); } return(array); }
public static BitsByte TrackCollision(ref Vector2 Position, ref Vector2 Velocity, ref Vector2 lastBoost, int Width, int Height, bool followDown, bool followUp, int fallStart, bool trackOnly) { int num; int num1; Matrix matrix; Minecart.TrackState trackState; if (followDown && followUp) { followDown = false; followUp = false; } Vector2 vector2 = new Vector2((float)(Width / 2) - 25f, (float)(Height / 2)); Vector2 position = Position + new Vector2((float)(Width / 2) - 25f, (float)(Height / 2)); Vector2 vector21 = position + Minecart._trackMagnetOffset; Vector2 velocity = Velocity; float x = velocity.Length(); velocity.Normalize(); Vector2 y = vector21; Tile tile = null; bool flag = false; bool flag1 = true; int num2 = -1; int num3 = -1; int num4 = -1; Minecart.TrackState trackState1 = Minecart.TrackState.NoTrack; bool flag2 = false; bool flag3 = false; bool flag4 = false; bool flag5 = false; Vector2 zero = Vector2.Zero; Vector2 zero1 = Vector2.Zero; BitsByte bitsByte = new BitsByte(); while (true) { int x1 = (int)(y.X / 16f); int y1 = (int)(y.Y / 16f); int x2 = (int)y.X % 16 / 2; if (flag1) { num4 = x2; } bool flag6 = x2 != num4; if ((trackState1 == Minecart.TrackState.OnBack || trackState1 == Minecart.TrackState.OnTrack || trackState1 == Minecart.TrackState.OnFront) && x1 != num2) { num = (trackState1 != Minecart.TrackState.OnBack ? tile.FrontTrack() : tile.BackTrack()); num1 = (velocity.X >= 0f ? Minecart._rightSideConnection[num] : Minecart._leftSideConnection[num]); switch (num1) { case 0: { y1--; y.Y = y.Y - 2f; break; } case 2: { y1++; y.Y = y.Y + 2f; break; } } } Minecart.TrackState trackState2 = Minecart.TrackState.NoTrack; bool flag7 = false; if (x1 != num2 || y1 != num3) { if (!flag1) { flag7 = true; } else { flag1 = false; } tile = Main.tile[x1, y1]; if (tile == null) { tile = new Tile(); Main.tile[x1, y1] = tile; } flag = (!tile.nactive() || tile.type != 314 ? false : true); } if (flag) { Minecart.TrackState trackState3 = Minecart.TrackState.NoTrack; int num5 = tile.FrontTrack(); int num6 = tile.BackTrack(); int num7 = Minecart._tileHeight[num5][x2]; switch (num7) { case -4: { if (trackState1 != Minecart.TrackState.OnFront) { break; } if (!trackOnly) { trackState2 = Minecart.TrackState.NoTrack; flag4 = true; break; } else { y = y - zero1; x = 0f; trackState2 = Minecart.TrackState.OnFront; flag5 = true; break; } } case -3: { if (trackState1 != Minecart.TrackState.OnFront) { break; } trackState1 = Minecart.TrackState.NoTrack; if (Velocity.X <= 0f) { matrix = (Minecart._rightSideConnection[num5] != 2 ? Matrix.CreateRotationZ(-0.7853982f) : Matrix.CreateRotationZ(0.7853982f)); } else { matrix = (Minecart._leftSideConnection[num5] != 2 ? Matrix.CreateRotationZ(0.7853982f) : Matrix.CreateRotationZ(-0.7853982f)); } zero = Vector2.Transform(new Vector2(Velocity.X, 0f), matrix); zero.X = Velocity.X; flag3 = true; x = 0f; break; } case -2: { if (trackState1 != Minecart.TrackState.OnFront) { break; } if (!trackOnly) { if (velocity.X < 0f) { float single = (float)(x1 * 16 + (x2 + 1) * 2) - y.X; y.X = y.X + single; x = x + single / velocity.X; } velocity.X = -velocity.X; bitsByte[1] = true; trackState2 = Minecart.TrackState.OnFront; break; } else { y = y - zero1; x = 0f; trackState2 = Minecart.TrackState.OnFront; flag5 = true; break; } } case -1: { if (trackState1 != Minecart.TrackState.OnFront) { break; } y = y - zero1; x = 0f; trackState2 = Minecart.TrackState.OnFront; flag5 = true; break; } default: { float single1 = (float)(y1 * 16 + num7); if (x1 != num2 && trackState1 == Minecart.TrackState.NoTrack && y.Y > single1 && y.Y - single1 < 2f) { flag7 = false; trackState1 = Minecart.TrackState.AboveFront; } if (y.Y >= single1) { trackState = (y.Y <= single1 ? Minecart.TrackState.OnTrack : Minecart.TrackState.BelowTrack); } else { trackState = Minecart.TrackState.AboveTrack; } if (num6 != -1) { float single2 = (float)(y1 * 16 + Minecart._tileHeight[num6][x2]); if (y.Y >= single2) { trackState3 = (y.Y <= single2 ? Minecart.TrackState.OnTrack : Minecart.TrackState.BelowTrack); } else { trackState3 = Minecart.TrackState.AboveTrack; } } switch (trackState) { case Minecart.TrackState.AboveTrack: { switch (trackState3) { case Minecart.TrackState.AboveTrack: { trackState2 = Minecart.TrackState.AboveTrack; break; } case Minecart.TrackState.OnTrack: { trackState2 = Minecart.TrackState.OnBack; break; } case Minecart.TrackState.BelowTrack: { trackState2 = Minecart.TrackState.AboveFront; break; } default: { trackState2 = Minecart.TrackState.AboveFront; break; } } break; } case Minecart.TrackState.OnTrack: { trackState2 = (trackState3 != Minecart.TrackState.OnTrack ? Minecart.TrackState.OnFront : Minecart.TrackState.OnTrack); break; } case Minecart.TrackState.BelowTrack: { switch (trackState3) { case Minecart.TrackState.AboveTrack: { trackState2 = Minecart.TrackState.AboveBack; break; } case Minecart.TrackState.OnTrack: { trackState2 = Minecart.TrackState.OnBack; break; } case Minecart.TrackState.BelowTrack: { trackState2 = Minecart.TrackState.BelowTrack; break; } default: { trackState2 = Minecart.TrackState.BelowTrack; break; } } break; } } break; } } } if (!flag7) { if (trackState1 != trackState2) { bool flag8 = false; if (flag6 || velocity.Y > 0f) { switch (trackState1) { case Minecart.TrackState.AboveTrack: { switch (trackState2) { case Minecart.TrackState.AboveTrack: { trackState2 = Minecart.TrackState.OnTrack; break; } case Minecart.TrackState.AboveFront: { trackState2 = Minecart.TrackState.OnBack; break; } case Minecart.TrackState.AboveBack: { trackState2 = Minecart.TrackState.OnFront; break; } default: { break; } } goto case Minecart.TrackState.BelowTrack; } case Minecart.TrackState.OnTrack: { int num8 = Minecart._tileHeight[tile.FrontTrack()][x2]; int num9 = Minecart._tileHeight[tile.BackTrack()][x2]; if (followDown) { trackState2 = (num8 >= num9 ? Minecart.TrackState.OnFront : Minecart.TrackState.OnBack); } else if (!followUp) { trackState2 = Minecart.TrackState.OnFront; } else { trackState2 = (num8 >= num9 ? Minecart.TrackState.OnBack : Minecart.TrackState.OnFront); } flag8 = true; goto case Minecart.TrackState.BelowTrack; } case Minecart.TrackState.BelowTrack: { int num10 = -1; Minecart.TrackState trackState4 = trackState2; if (trackState4 != Minecart.TrackState.OnTrack) { switch (trackState4) { case Minecart.TrackState.OnFront: { break; } case Minecart.TrackState.OnBack: { num10 = tile.BackTrack(); goto Label1; } default: { goto Label1; } } } num10 = tile.FrontTrack(); Label1: if (num10 == -1) { break; } if (trackState1 == Minecart.TrackState.AboveFront && Minecart._trackType[num10] == 1) { flag2 = true; } velocity.Y = 0f; y.Y = (float)(y1 * 16 + Minecart._tileHeight[num10][x2]); break; } case Minecart.TrackState.AboveFront: { if (trackState2 != Minecart.TrackState.BelowTrack) { goto case Minecart.TrackState.BelowTrack; } trackState2 = Minecart.TrackState.OnFront; goto case Minecart.TrackState.BelowTrack; } case Minecart.TrackState.AboveBack: { if (trackState2 != Minecart.TrackState.BelowTrack) { goto case Minecart.TrackState.BelowTrack; } trackState2 = Minecart.TrackState.OnBack; goto case Minecart.TrackState.BelowTrack; } case Minecart.TrackState.OnFront: { trackState2 = Minecart.TrackState.OnFront; flag8 = true; goto case Minecart.TrackState.BelowTrack; } case Minecart.TrackState.OnBack: { trackState2 = Minecart.TrackState.OnBack; flag8 = true; goto case Minecart.TrackState.BelowTrack; } default: { goto case Minecart.TrackState.BelowTrack; } } } } } else if (trackState2 == Minecart.TrackState.OnFront || trackState2 == Minecart.TrackState.OnBack || trackState2 == Minecart.TrackState.OnTrack) { if (flag && Minecart._trackType[tile.FrontTrack()] == 1) { flag2 = true; } velocity.Y = 0f; } if (trackState2 == Minecart.TrackState.OnFront) { int num11 = tile.FrontTrack(); if (Minecart._trackType[num11] == 2 && lastBoost.X == 0f && lastBoost.Y == 0f) { lastBoost = new Vector2((float)x1, (float)y1); if (!Minecart._boostLeft[num11]) { bitsByte[5] = true; } else { bitsByte[4] = true; } } } num4 = x2; trackState1 = trackState2; num2 = x1; num3 = y1; if (x <= 0f) { if (lastBoost.X == (float)num2 && lastBoost.Y == (float)num3) { break; } lastBoost = Vector2.Zero; break; } else { float x3 = y.X % 2f; float y2 = y.Y % 2f; float single3 = 3f; float single4 = 3f; if (velocity.X < 0f) { single3 = x3 + 0.125f; } else if (velocity.X > 0f) { single3 = 2f - x3; } if (velocity.Y < 0f) { single4 = y2 + 0.125f; } else if (velocity.Y > 0f) { single4 = 2f - y2; } if (single3 == 3f && single4 == 3f) { break; } float single5 = Math.Abs(single3 / velocity.X); float single6 = Math.Abs(single4 / velocity.Y); float single7 = (single5 < single6 ? single5 : single6); if (single7 <= x) { zero1 = velocity * single7; x = x - single7; } else { zero1 = velocity * x; x = 0f; } y = y + zero1; } } if (flag2) { bitsByte[3] = true; } if (flag4) { Velocity.X = y.X - vector21.X; Velocity.Y = Player.defaultGravity; } else if (flag3) { bitsByte[2] = true; Velocity = zero; } else if (!bitsByte[1]) { if (flag5) { Velocity.X = y.X - vector21.X; } if (velocity.Y == 0f) { Velocity.Y = 0f; } } else { Velocity.X = -Velocity.X; Position.X = y.X - Minecart._trackMagnetOffset.X - vector2.X - Velocity.X; if (velocity.Y == 0f) { Velocity.Y = 0f; } } Position.Y = Position.Y + (y.Y - vector21.Y - Velocity.Y); Position.Y = (float)Math.Round((double)Position.Y, 2); Minecart.TrackState trackState5 = trackState1; if (trackState5 != Minecart.TrackState.OnTrack) { switch (trackState5) { case Minecart.TrackState.OnFront: case Minecart.TrackState.OnBack: { break; } default: { return bitsByte; } } } bitsByte[0] = true; return bitsByte; }
//in Terraria.NetMessage.SendData at end of case 27 call // ProjectileLoader.SendExtraAI(projectile, writer, ref bb14); internal static void SendExtraAI(Projectile projectile, BinaryWriter writer, ref BitsByte flags) { if (IsModProjectile(projectile)) { byte[] data; using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter modWriter = new BinaryWriter(stream)) { projectile.modProjectile.SendExtraAI(modWriter); modWriter.Flush(); data = stream.ToArray(); } } if (data.Length > 0) { flags[Projectile.maxAI + 1] = true; writer.Write((byte)data.Length); writer.Write(data); } } }
//in Terraria.MessageBuffer.GetData for case 27 after reading all data add // byte[] extraAI = ProjectileLoader.ReadExtraAI(reader, bitsByte14); internal static byte[] ReadExtraAI(BinaryReader reader, BitsByte flags) { if (flags[Projectile.maxAI + 1]) { return reader.ReadBytes(reader.ReadByte()); } return new byte[0]; }
public override void Pack(Stream stream) { BinaryWriter writer = new BinaryWriter(stream); writer.Write(Time); BitsByte worldinfo = new BitsByte(DayTime, BloodMoon, Eclipse); writer.Write(worldinfo); writer.Write(MoonPhase); writer.Write(MaxTilesX); writer.Write(MaxTilesY); writer.Write(SpawnX); writer.Write(SpawnY); writer.Write(WorldSurface); writer.Write(RockLayer); writer.Write(WorldID); writer.Write(WorldName); writer.Write(MoonType); writer.Write(SetBG0); writer.Write(SetBG1); writer.Write(SetBG2); writer.Write(SetBG3); writer.Write(SetBG4); writer.Write(SetBG5); writer.Write(SetBG6); writer.Write(SetBG7); writer.Write(IceBackStyle); writer.Write(JungleBackStyle); writer.Write(HellBackStyle); writer.Write(WindSpeed); writer.Write(NumberOfClouds); writer.Write(TreeX0); writer.Write(TreeX1); writer.Write(TreeX2); writer.Write(TreeStyle0); writer.Write(TreeStyle1); writer.Write(TreeStyle2); writer.Write(TreeStyle3); writer.Write(CaveBackX0); writer.Write(CaveBackX1); writer.Write(CaveBackX2); writer.Write(CaveBackStyle0); writer.Write(CaveBackStyle1); writer.Write(CaveBackStyle2); writer.Write(CaveBackStyle3); writer.Write(Rain); BitsByte bosses1 = new BitsByte((BossFlags & BossFlags.OrbSmashed) == BossFlags.OrbSmashed, (BossFlags & BossFlags.DownedBoss1) == BossFlags.DownedBoss1, (BossFlags & BossFlags.DownedBoss2) == BossFlags.DownedBoss2, (BossFlags & BossFlags.DownedBoss3) == BossFlags.DownedBoss3, (BossFlags & BossFlags.HardMode) == BossFlags.HardMode, (BossFlags & BossFlags.DownedClown) == BossFlags.DownedClown, (BossFlags & BossFlags.ServerSideCharacter) == BossFlags.ServerSideCharacter, (BossFlags & BossFlags.DownedPlantBoss) == BossFlags.DownedPlantBoss); writer.Write(bosses1); BitsByte bosses2 = new BitsByte((BossFlags2 & BossFlags2.DownedMechBoss1) == BossFlags2.DownedMechBoss1, (BossFlags2 & BossFlags2.DownedMechBoss2) == BossFlags2.DownedMechBoss2, (BossFlags2 & BossFlags2.DownedMechBoss3) == BossFlags2.DownedMechBoss3, (BossFlags2 & BossFlags2.DownedMechBossAny) == BossFlags2.DownedMechBossAny, (BossFlags2 & BossFlags2.CloudBg) == BossFlags2.CloudBg, (BossFlags2 & BossFlags2.Crimson) == BossFlags2.Crimson, (BossFlags2 & BossFlags2.PumpkinMoon) == BossFlags2.PumpkinMoon, (BossFlags2 & BossFlags2.SnowMoon) == BossFlags2.SnowMoon); writer.Write(bosses2); BitsByte bosses3 = new BitsByte((BossFlags3 & BossFlags3.ExpertMode) == BossFlags3.ExpertMode, (BossFlags3 & BossFlags3.FastForwardTime) == BossFlags3.FastForwardTime, (BossFlags3 & BossFlags3.SlimeRain) == BossFlags3.SlimeRain, (BossFlags3 & BossFlags3.DownedKingSlime) == BossFlags3.DownedKingSlime, (BossFlags3 & BossFlags3.DownedQueenBee) == BossFlags3.DownedQueenBee, (BossFlags3 & BossFlags3.DownedFishron) == BossFlags3.DownedFishron, (BossFlags3 & BossFlags3.DownedMartians) == BossFlags3.DownedMartians, (BossFlags3 & BossFlags3.DownedAncientCultist) == BossFlags3.DownedAncientCultist); writer.Write(bosses3); BitsByte bosses4 = new BitsByte((BossFlags4 & BossFlags4.DownedMoonLord) == BossFlags4.DownedMoonLord, (BossFlags4 & BossFlags4.DownedHalloweenKing) == BossFlags4.DownedHalloweenKing, (BossFlags4 & BossFlags4.DownedHalloweenTree) == BossFlags4.DownedHalloweenTree, (BossFlags4 & BossFlags4.DownedChristmasIceQueen) == BossFlags4.DownedChristmasIceQueen, (BossFlags4 & BossFlags4.DownedChristmasSantank) == BossFlags4.DownedChristmasSantank, (BossFlags4 & BossFlags4.DownedChristmasTree) == BossFlags4.DownedChristmasTree); writer.Write(bosses4); writer.Write((sbyte)Main.invasionType); writer.Write(Main.LobbyId); }
public void Pack(Stream stream) { var bits = new BitsByte(); if ((Active) && (!Inactive)) bits[0] = true; if (HasWall) bits[2] = true; if (HasLiquid) bits[3] = true; if (Wire) bits[4] = true; if (IsHalf) bits[5] = true; if (IsActuator) bits[6] = true; if (Inactive) { bits[7] = true; } stream.WriteInt8((byte) bits); bits = new BitsByte(); if ((Wire2)) bits[0] = true; if (Wire3) bits[1] = true; if (HasColor) bits[2] = true; if (HasWallColor) bits[3] = true; if (Slope) bits[4] = true; if (Slope2) bits[5] = true; if (Slope3) bits[6] = true; stream.WriteInt8((byte)bits); if (HasColor) { stream.WriteByte(TileColor); } if (HasWallColor) { stream.WriteByte(WallColor); } if (Active) { stream.WriteInt16((short)Type); if (FrameImportant) { stream.WriteInt16(FrameX); stream.WriteInt16(FrameY); } } if (HasWall) stream.WriteInt8(Wall); if (HasLiquid) { stream.WriteInt8(Liquid); stream.WriteInt8(LiquidType); } }
public override void Pack(Stream stream) { BinaryWriter writer = new BinaryWriter(stream); writer.Write(Time); BitsByte worldinfo = new BitsByte(DayTime, BloodMoon, Eclipse); writer.Write(worldinfo); writer.Write(MoonPhase); writer.Write(MaxTilesX); writer.Write(MaxTilesY); writer.Write(SpawnX); writer.Write(SpawnY); writer.Write(WorldSurface); writer.Write(RockLayer); writer.Write(WorldID); writer.Write(WorldName); writer.Write(MoonType); writer.Write(SetBG0); writer.Write(SetBG1); writer.Write(SetBG2); writer.Write(SetBG3); writer.Write(SetBG4); writer.Write(SetBG5); writer.Write(SetBG6); writer.Write(SetBG7); writer.Write(IceBackStyle); writer.Write(JungleBackStyle); writer.Write(HellBackStyle); writer.Write(WindSpeed); writer.Write(NumberOfClouds); writer.Write(TreeX0); writer.Write(TreeX1); writer.Write(TreeX2); writer.Write(TreeStyle0); writer.Write(TreeStyle1); writer.Write(TreeStyle2); writer.Write(TreeStyle3); writer.Write(CaveBackX0); writer.Write(CaveBackX1); writer.Write(CaveBackX2); writer.Write(CaveBackStyle0); writer.Write(CaveBackStyle1); writer.Write(CaveBackStyle2); writer.Write(CaveBackStyle3); writer.Write(Rain); BitsByte bosses1 = new BitsByte((BossFlags & BossFlags.OrbSmashed) == BossFlags.OrbSmashed, (BossFlags & BossFlags.DownedBoss1) == BossFlags.DownedBoss1, (BossFlags & BossFlags.DownedBoss2) == BossFlags.DownedBoss2, (BossFlags & BossFlags.DownedBoss3) == BossFlags.DownedBoss3, (BossFlags & BossFlags.HardMode) == BossFlags.HardMode, (BossFlags & BossFlags.DownedClown) == BossFlags.DownedClown, (BossFlags & BossFlags.ServerSideCharacter) == BossFlags.ServerSideCharacter, (BossFlags & BossFlags.DownedPlantBoss) == BossFlags.DownedPlantBoss); writer.Write(bosses1); BitsByte bosses2 = new BitsByte((BossFlags2 & BossFlags2.DownedMechBoss1) == BossFlags2.DownedMechBoss1, (BossFlags2 & BossFlags2.DownedMechBoss2) == BossFlags2.DownedMechBoss2, (BossFlags2 & BossFlags2.DownedMechBoss3) == BossFlags2.DownedMechBoss3, (BossFlags2 & BossFlags2.DownedMechBossAny) == BossFlags2.DownedMechBossAny, (BossFlags2 & BossFlags2.CloudBg) == BossFlags2.CloudBg, (BossFlags2 & BossFlags2.Crimson) == BossFlags2.Crimson, (BossFlags2 & BossFlags2.PumpkinMoon) == BossFlags2.PumpkinMoon, (BossFlags2 & BossFlags2.SnowMoon) == BossFlags2.SnowMoon); writer.Write(bosses2); }
public override void NetSend(BinaryWriter writer) { BitsByte flags = new BitsByte(); flags[0] = downedAbomination; flags[1] = downedPuritySpirit; writer.Write(flags); //If you prefer, you can use the BitsByte constructor approach as well. //writer.Write(saveVersion); //BitsByte flags = new BitsByte(downedAbomination, downedPuritySpirit); //writer.Write(flags); // This is another way to do the same thing, but with bitmasks and the bitwise OR assignment operator (the |=) // Note that 1 and 2 here are bit masks. The next values in the pattern are 4,8,16,32,64,128. If you require more than 8 flags, make another byte. //writer.Write(saveVersion); //byte flags = 0; //if (downedAbomination) //{ // flags |= 1; //} //if (downedPuritySpirit) //{ // flags |= 2; //} //writer.Write(flags); }