private void OnChunkBroken(object o) { var chunk = (FracturedGlassyChunk)o; var mapObject = MapObjectUtility.GetMapObjectOfFracturedChunk(chunk); if (mapObject == null) { var rawObj = chunk.FracturedObjectSource.gameObject; MapObjectUtility.StoreCreateMapObjMsg(MapObjectUtility.GetGameObjType(rawObj), MapObjectUtility.GetGameObjId(rawObj)); var evt = ChunkSyncEvent.Allocate(); evt.EType = TriggerObjectSyncEventType.BreakChunk; evt.ChunkId = chunk.ChunkId; MapObjectUtility.StoreTriggerObjectEvent(rawObj, evt); } if (mapObject != null && !SharedConfig.IsOffline) { //send to server only if the corresponding chunk is not broken on server-side. if (!mapObject.glassyData.IsBroken(chunk.ChunkId)) { var evt = ChunkSyncEvent.Allocate(); evt.EType = TriggerObjectSyncEventType.BreakChunk; evt.SourceObjectId = mapObject.entityKey.Value.EntityId; evt.ChunkId = chunk.ChunkId; if (!SharedConfig.IsServer) { MapObjectUtility.SendTriggerObjectEventToServer(mapObject, evt); } } } }
public void OnDetach(object o) { FracturedChunk chunk = o as FracturedChunk; var destructibleObject = MapObjectUtility.GetMapObjectOfFracturedChunk(chunk); if (destructibleObject == null) { var evt = ChunkSyncEvent.Allocate(); evt.EType = TriggerObjectSyncEventType.DetachChunk; evt.ChunkId = chunk.ChunkId; MapObjectUtility.StoreTriggerObjectEvent(chunk.FracturedObjectSource.gameObject, evt); } if (destructibleObject != null) { var data = destructibleObject.destructibleData; var chunkId = chunk.ChunkId; if (data.IsInDestructionState(chunkId)) { return; } data.SetDestruction(chunk.ChunkId); //synchronization delay for vehicle-collidable destructible object if (chunk.FracturedObjectSource.EnableVehicleCollision) { data.SyncDelay = SYNC_DELAY_TIME; } //notify server to destory destructible object SendDetachChunkEventToServer(destructibleObject, chunk.ChunkId); } }
private void SendDetachChunkEventToServer(MapObjectEntity destructibleObject, int chunkId) { var evt = ChunkSyncEvent.Allocate(); evt.EType = TriggerObjectSyncEventType.DetachChunk; evt.SourceObjectId = destructibleObject.entityKey.Value.EntityId; evt.ChunkId = chunkId; MapObjectUtility.SendTriggerObjectEventToServer(destructibleObject, evt); }
private void ProcessDetachChunkEvent(MapObjectEntity sceneObject, ChunkSyncEvent evt) { var go = sceneObject.rawGameObject.Value; var fracturedObject = go.GetComponent <FracturedObject>(); if (fracturedObject != null) { var data = sceneObject.destructibleData; if (!data.IsInDestructionState(evt.ChunkId)) { fracturedObject.CollapseChunk(evt.ChunkId); sceneObject.flagImmutability.LastModifyServerTime = _currentTime.CurrentTime; } } }
private void ProcessBreakChunkEvent(MapObjectEntity mapObject, ChunkSyncEvent evt) { var go = mapObject.rawGameObject.Value; var fracturedGlassyObject = go.GetComponent <FracturedGlassyObject>(); if (fracturedGlassyObject != null) { var data = mapObject.glassyData; var chunkId = evt.ChunkId; if (!data.IsBroken(chunkId)) { fracturedGlassyObject.PutToBrokenState(chunkId); data.SetBroken(chunkId); mapObject.flagImmutability.LastModifyServerTime = _currentTime.CurrentTime; } } }
public static TriggerObjectSyncEvent FromProtoBuf(TriggerObjectEventMessage message) { switch (message.EventType) { case (int)TriggerObjectSyncEventType.DetachChunk: case (int)TriggerObjectSyncEventType.BreakChunk: { var detachChunkEvent = ChunkSyncEvent.Allocate(); detachChunkEvent.EType = (TriggerObjectSyncEventType)message.EventType; detachChunkEvent.SourceObjectId = message.SourceId; detachChunkEvent.ChunkId = message.Ints[0]; return(detachChunkEvent); } default: throw new Exception("Unkown TriggerObjectSyncEventType : " + message.EventType); } }