Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 6
0
        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);
            }
        }