void ISerializer <FloatingObjectsCreateMsg> .Deserialize(ByteStream source, out FloatingObjectsCreateMsg msg) { msg = new FloatingObjectsCreateMsg(); msg.FloatingObjects = new List <CreatedFloatingObject>(); int count; BlitSerializer <int> .Default.Deserialize(source, out count); for (int i = 0; i < count; i++) { CreatedFloatingObject data = new CreatedFloatingObject(); data.Instances = new List <CreatedFloatingObjectInstance>(); BlitSerializer <DefinitionIdBlit> .Default.Deserialize(source, out data.TypeId); int instancesCount; BlitSerializer <int> .Default.Deserialize(source, out instancesCount); for (int j = 0; j < instancesCount; j++) { CreatedFloatingObjectInstance instance = new CreatedFloatingObjectInstance(); instance.Location = new FloatingObjectPositionUpdateMsg(); BlitSerializer <MyFixedPoint> .Default.Deserialize(source, out instance.Amount); BlitSerializer <long> .Default.Deserialize(source, out instance.Location.EntityId); BlitSerializer <Vector3D> .Default.Deserialize(source, out instance.Location.Position); BlitSerializer <Vector3> .Default.Deserialize(source, out instance.Location.Forward); BlitSerializer <Vector3> .Default.Deserialize(source, out instance.Location.Up); BlitSerializer <Vector3> .Default.Deserialize(source, out instance.Location.LinearVelocity); BlitSerializer <Vector3> .Default.Deserialize(source, out instance.Location.AngularVelocity); data.Instances.Add(instance); } msg.FloatingObjects.Add(data); } }
public void OnCreateFloatingObjects(List <MyFloatingObject> floatingObjects) { if (floatingObjects.Count == 0) { return; } foreach (var floatingObject in floatingObjects) { int key = (int)floatingObject.Item.Content.TypeId.GetHashCode() ^ floatingObject.Item.Content.SubtypeId.GetHashCode(); FloatingObjectsData data; if (!m_sortingMap.TryGetValue(key, out data)) { data = new FloatingObjectsData(); data.Instances = new List <MyFloatingObject>(); data.TypeId = new DefinitionIdBlit(floatingObject.Item.Content.TypeId, floatingObject.Item.Content.SubtypeId); m_sortingMap[key] = data; } data.Instances.Add(floatingObject); } FloatingObjectsCreateMsg msg = new FloatingObjectsCreateMsg(); msg.FloatingObjects = new List <CreatedFloatingObject>(); foreach (FloatingObjectsData data in m_sortingMap.Values) { if (data.Instances.Count > 0) { CreatedFloatingObject createMsg = new CreatedFloatingObject(); createMsg.TypeId = data.TypeId; createMsg.Instances = new List <CreatedFloatingObjectInstance>(); foreach (var floatingObject in data.Instances) { // Object may be reduced/damaged meanwhile? if (floatingObject.Item.Amount <= 0) { continue; } CreatedFloatingObjectInstance instanceData = new CreatedFloatingObjectInstance(); instanceData.Location = new FloatingObjectPositionUpdateMsg(); System.Diagnostics.Debug.Assert(floatingObject.Item.Amount > 0, "Floating object amount must be > 0"); instanceData.Amount = floatingObject.Item.Amount; instanceData.Location.Position = floatingObject.PositionComp.GetPosition(); instanceData.Location.Forward = floatingObject.WorldMatrix.Forward; instanceData.Location.Up = floatingObject.WorldMatrix.Up; instanceData.Location.EntityId = floatingObject.EntityId; if (floatingObject.Physics != null) { instanceData.Location.LinearVelocity = floatingObject.Physics.LinearVelocity; instanceData.Location.AngularVelocity = floatingObject.Physics.AngularVelocity; } createMsg.Instances.Add(instanceData); } msg.FloatingObjects.Add(createMsg); } } foreach (var data in m_sortingMap.Values) { data.Instances.Clear(); } MySession.Static.SyncLayer.SendMessageToAll(ref msg); //foreach (var floatingObject in floatingObjects) //{ // MySyncCreate.SendEntityCreated(floatingObject.GetObjectBuilder()); //} }