static void OnCreateFloatingObjectsCallback(ref FloatingObjectsCreateMsg msg, MyNetworkClient sender) { //MySandboxGame.Log.WriteLine("FloatingObjectsCreateMsg: " + msg.FloatingObjects.Count); foreach (var floatingObject in msg.FloatingObjects) { foreach (var instance in floatingObject.Instances) { System.Diagnostics.Debug.Assert(instance.Amount > 0); if (instance.Amount <= 0) { continue; } if (MyEntities.EntityExists(instance.Location.EntityId)) { continue; } var objectBuilder = new MyObjectBuilder_FloatingObject(); objectBuilder.Item = new MyObjectBuilder_InventoryItem(); objectBuilder.Item.Amount = instance.Amount; objectBuilder.Item.Content = MyObjectBuilderSerializer.CreateNewObject(((MyDefinitionId)floatingObject.TypeId).TypeId, ((MyDefinitionId)floatingObject.TypeId).SubtypeName); objectBuilder.EntityId = instance.Location.EntityId; objectBuilder.PositionAndOrientation = new MyPositionAndOrientation(instance.Location.Position, instance.Location.Forward, instance.Location.Up); objectBuilder.PersistentFlags = MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.CastShadows; MyFloatingObject floatingObjectAdded = (MyFloatingObject)MyEntities.CreateFromObjectBuilderAndAdd(objectBuilder); if (floatingObjectAdded.Physics != null) { floatingObjectAdded.Physics.LinearVelocity = instance.Location.LinearVelocity; floatingObjectAdded.Physics.AngularVelocity = instance.Location.AngularVelocity; } } } if (Sync.IsServer) { Sync.Layer.SendMessageToAllButOne(ref msg, sender.SteamUserId); } }
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()); //} }