示例#1
0
        private static void RemoveAllBlocks(BlockManager __instance, BlockManager.RemoveAllAction option)
        {
            Tank tank = (Tank)IngressPoint.tank.GetValue(__instance);

            if (tank.rbody.isKinematic)
            {
                tank.rbody.isKinematic = false;
            }
            IngressPoint.m_RemoveBlockRecursionCounter.SetValue(__instance, 1);
            List <TankBlock>         allBlocks      = (List <TankBlock>)IngressPoint.allBlocks.GetValue(__instance);
            Action <Tank, TankBlock> DetachCallback = (Action <Tank, TankBlock>)IngressPoint.m_DetachCallback.GetValue(__instance);

            foreach (TankBlock tankBlock in allBlocks)
            {
                bool flag = option != BlockManager.RemoveAllAction.Recycle;
                tankBlock.OnDetach(tank, flag, flag);
                tank.NotifyBlock(tankBlock, false);
                tankBlock.RemoveLinks(null, true);
                if (DetachCallback != null)
                {
                    DetachCallback(tank, tankBlock);
                }
                switch (option)
                {
                case BlockManager.RemoveAllAction.ApplyPhysicsKick:
                    tankBlock.trans.parent = null;
                    tankBlock.trans.Recycle(true);
                    break;

                case BlockManager.RemoveAllAction.Recycle:
                    tankBlock.trans.Recycle(true);
                    break;

                case BlockManager.RemoveAllAction.HandOff:
                    tankBlock.trans.parent = null;
                    tankBlock.trans.Recycle(true);
                    break;

                default:
                    d.LogError("BlockManager.RemoveAllBlocks - No remove action found for " + option);
                    break;
                }
            }
            IngressPoint.m_RemoveBlockRecursionCounter.SetValue(__instance, 0);
            allBlocks.Clear();

            TankBlock[,,] l_blockTable = (TankBlock[, , ])IngressPoint.blockTable.GetValue(__instance);
            byte[,,] l_m_APbitfield    = (byte[, , ])IngressPoint.m_APbitfield.GetValue(__instance);

            Array.Clear(l_blockTable, 0, l_blockTable.Length);
            Array.Clear(l_m_APbitfield, 0, l_m_APbitfield.Length);
            IngressPoint.changed.SetValue(__instance, false);
            IngressPoint.rootBlock.SetValue(__instance, null);
            IngressPoint._blockCentreBounds.SetValue(__instance, IngressPoint.k_InvalidBounds);
        }
示例#2
0
        private static void HostRemoveAllBlocks(BlockManager __instance, BlockManager.RemoveAllAction option)
        {
            d.Assert(ManNetwork.IsHost, "Can't call HostRemoveAllBlocks on client");
            Tank tank = (Tank)IngressPoint.tank.GetValue(__instance);

            if (ManNetwork.IsNetworked && tank.netTech != null)
            {
                RemoveAllBlocksMessage message = new RemoveAllBlocksMessage
                {
                    m_Action = option
                };
                Singleton.Manager <ManNetwork> .inst.SendToAllExceptClient(-1, TTMsgType.RemoveAllBlocksFromTech, message, tank.netTech.netId, true);

                IngressPoint.RemoveAllBlocks(__instance, option);
                return;
            }
            IngressPoint.RemoveAllBlocks(__instance, option);
        }