public override bool ParseBytesAndExecute(byte[] data) { DataStream ds = new DataStream(data); DataReader dr = new DataReader(ds); Location pos = Location.FromDoubleBytes(dr.ReadBytes(24), 0); Location vel = Location.FromDoubleBytes(dr.ReadBytes(24), 0); long cid = dr.ReadLong(); for (int i = 0; i < TheClient.TheRegion.Clouds.Count; i++) { if (TheClient.TheRegion.Clouds[i].CID == cid) { TheClient.TheRegion.Clouds.RemoveAt(i); break; } } Cloud cloud = new Cloud(TheClient.TheRegion, pos); cloud.Velocity = vel; cloud.CID = cid; int count = dr.ReadInt(); for (int i = 0; i < count; i++) { cloud.Points.Add(Location.FromDoubleBytes(dr.ReadBytes(24), 0)); cloud.Sizes.Add(dr.ReadFloat()); cloud.EndSizes.Add(dr.ReadFloat()); } TheClient.TheRegion.Clouds.Add(cloud); dr.Close(); return true; }
public override bool ParseBytesAndExecute(byte[] data) { if (data.Length < 4) { return false; } DataStream datums = new DataStream(data); DataReader dr = new DataReader(datums); int len = dr.ReadInt(); List<Location> locs = new List<Location>(); List<ushort> mats = new List<ushort>(); for (int i = 0; i < len; i++) { locs.Add(Location.FromDoubleBytes(dr.ReadBytes(24), 0)); } for (int i = 0; i < len; i++) { mats.Add(Utilities.BytesToUshort(dr.ReadBytes(2))); } byte[] dats = dr.ReadBytes(len); byte[] paints = dr.ReadBytes(len); for (int i = 0; i < len; i++) { TheClient.TheRegion.SetBlockMaterial(locs[i], mats[i], dats[i], paints[i], true); // TODO: Regen in PBAE not SBM. } return true; }
void ParseData(byte[] data, DataReader dr, int x, int y, int z, int posMult) { byte[] reach = dr.ReadBytes((int)ChunkReachability.COUNT); int csize = Chunk.CHUNK_SIZE / posMult; byte[] data_unzipped = dr.ReadBytes(data.Length - 16); byte[] data_orig = FileHandler.Uncompress(data_unzipped); if (posMult == 1) { if (data_orig.Length != Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * 4) { SysConsole.Output(OutputType.WARNING, "Invalid chunk size! Expected " + (Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * 3) + ", got " + data_orig.Length + ")"); lock (TheClient.TheRegion.PreppingNow) { TheClient.TheRegion.PreppingNow.Remove(new Vector3i(x, y, z)); } return; } } else if (data_orig.Length != csize * csize * csize * 2) { SysConsole.Output(OutputType.WARNING, "Invalid LOD'ed chunk size! (LOD = " + posMult + ", Expected " + (csize * csize * csize * 2) + ", got " + data_orig.Length + ")"); lock (TheClient.TheRegion.PreppingNow) { TheClient.TheRegion.PreppingNow.Remove(new Vector3i(x, y, z)); } return; } Action act = () => { Chunk chk = TheClient.TheRegion.LoadChunk(new Vector3i(x, y, z), posMult); for (int i = 0; i < reach.Length; i++) { chk.Reachability[i] = reach[i] == 1; } chk.LOADING = true; chk.PROCESSED = false; lock (TheClient.TheRegion.PreppingNow) { TheClient.Schedule.StartASyncTask(() => { try { parsechunk2(chk, data_orig, posMult); } catch (Exception ex) { Utilities.CheckException(ex); SysConsole.Output(ex); lock (TheClient.TheRegion.PreppingNow) { TheClient.TheRegion.PreppingNow.Remove(chk.WorldPosition); } } }); } }; TheClient.Schedule.ScheduleSyncTask(act); }
public byte[] LoadWAVE(DataStream stream, out int channels, out int bits, out int rate) { DataReader dr = new DataReader(stream); string signature = new string(dr.ReadChars(4)); if (signature != "RIFF") { throw new NotSupportedException("Not a RIFF .wav file: " + signature); } /*int riff_chunk_size = */dr.ReadInt32(); string format = new string(dr.ReadChars(4)); if (format != "WAVE") { throw new NotSupportedException("Not a WAVE .wav file: " + format); } string format_signature = new string(dr.ReadChars(4)); if (format_signature != "fmt ") { throw new NotSupportedException("Not a 'fmt ' .wav file: " + format_signature); } /*int format_chunk_size = */dr.ReadInt32(); /*int audio_format = */dr.ReadInt16(); int num_channels = dr.ReadInt16(); if (num_channels != 1 && num_channels != 2) { throw new NotSupportedException("Invalid number of channels: " + num_channels); } int sample_rate = dr.ReadInt32(); /*int byte_rate = */dr.ReadInt32(); /*int block_align = */dr.ReadInt16(); int bits_per_sample = dr.ReadInt16(); string data_signature = new string(dr.ReadChars(4)); if (data_signature != "data") { throw new NotSupportedException("Not a DATA .wav file: " + data_signature); } /*int data_chunk_size = */dr.ReadInt32(); channels = num_channels; bits = bits_per_sample; rate = sample_rate; return dr.ReadBytes((int)dr.BaseStream.Length); }
public override Entity Create(Region tregion, byte[] data) { DataStream ds = new DataStream(data); DataReader dr = new DataReader(ds); GenericCharacterEntity ent = new GenericCharacterEntity(tregion); ent.SetPosition(Location.FromDoubleBytes(dr.ReadBytes(24), 0)); ent.SetOrientation(new BEPUutilities.Quaternion(dr.ReadFloat(), dr.ReadFloat(), dr.ReadFloat(), dr.ReadFloat())); ent.SetMass(dr.ReadFloat()); ent.CBAirForce = dr.ReadFloat(); ent.CBAirSpeed = dr.ReadFloat(); ent.CBCrouchSpeed = dr.ReadFloat(); ent.CBDownStepHeight = dr.ReadFloat(); ent.CBGlueForce = dr.ReadFloat(); ent.CBHHeight = dr.ReadFloat(); ent.CBJumpSpeed = dr.ReadFloat(); ent.CBMargin = dr.ReadFloat(); ent.CBMaxSupportSlope = dr.ReadFloat(); ent.CBMaxTractionSlope = dr.ReadFloat(); ent.CBProneSpeed = dr.ReadFloat(); ent.CBRadius = dr.ReadFloat(); ent.CBSlideForce = dr.ReadFloat(); ent.CBSlideJumpSpeed = dr.ReadFloat(); ent.CBSlideSpeed = dr.ReadFloat(); ent.CBStandSpeed = dr.ReadFloat(); ent.CBStepHeight = dr.ReadFloat(); ent.CBTractionForce = dr.ReadFloat(); ent.PreRot *= Matrix4d.CreateRotationX(dr.ReadFloat() * Utilities.PI180); ent.PreRot *= Matrix4d.CreateRotationY(dr.ReadFloat() * Utilities.PI180); ent.PreRot *= Matrix4d.CreateRotationZ(dr.ReadFloat() * Utilities.PI180); ent.mod_scale = dr.ReadFloat(); ent.PreRot = Matrix4d.Scale(ent.mod_scale) * ent.PreRot; ent.color = System.Drawing.Color.FromArgb(dr.ReadInt()); byte dtx = dr.ReadByte(); ent.Visible = (dtx & 1) == 1; int solidity = (dtx & (2 | 4 | 8)); if (solidity == 2) { ent.CGroup = CollisionUtil.Solid; } else if (solidity == 4) { ent.CGroup = CollisionUtil.NonSolid; } else if (solidity == (2 | 4)) { ent.CGroup = CollisionUtil.Item; } else if (solidity == 8) { ent.CGroup = CollisionUtil.Player; } else if (solidity == (2 | 8)) { ent.CGroup = CollisionUtil.Water; } else if (solidity == (2 | 4 | 8)) { ent.CGroup = CollisionUtil.WorldSolid; } else if (solidity == 16) { ent.CGroup = CollisionUtil.Character; } ent.model = tregion.TheClient.Models.GetModel(tregion.TheClient.Network.Strings.StringForIndex(dr.ReadInt())); dr.Close(); return ent; }