Exemple #1
0
 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);
 }
Exemple #4
0
 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;
 }