public void Patch()
        {
            HelperClass.SetLogger(logger);

            MethodDefinition initChunkCluster = HelperClass.findMember <MethodDefinition>(module, "ChunkCluster", false,
                                                                                          HelperClass.MemberNameComparer <MethodDefinition>("Init"),
                                                                                          HelperClass.MethodParametersComparer("EnumChunkProviderId"));

            if (initChunkCluster == null)
            {
                return;
            }
            {
                int[] jumpsToDefault = HelperClass.FindOPCodePattern(initChunkCluster, new OpCode[] { OpCodes.Switch, OpCodes.Br }, 1);
                if (jumpsToDefault.Length == 0)
                {
                    logger.Error("ChunkCluster.Init has no switch (am I outdated?)!");
                    return;
                }
                if (jumpsToDefault.Length > 1)
                {
                    logger.Error("ChunkCluster.Init has multiple switches (am I outdated?)!");
                    return;
                }
                MethodBody body        = initChunkCluster.Body;
                int        targetIndex = body.Instructions.IndexOf((Instruction)body.Instructions[jumpsToDefault[0]].Operand);
                if (!HelperClass.MethodOPCodeComparer(new int[] { targetIndex, targetIndex + 1, targetIndex + 2 }, new OpCode[] { OpCodes.Ldarg_0, OpCodes.Ldnull, OpCodes.Stfld }, null).Execute(initChunkCluster))
                {
                    logger.Error("ChunkCluster.Init's default case is unknown (I am outdated!)!");
                    return;
                }

                ILProcessor        proc = body.GetILProcessor();
                List <Instruction> hook = HookHelper.Instance.prepareEventHook(initChunkCluster, "UnknownChunkProviderEvent", new Instruction[][] {
                    new Instruction[] { proc.Create(OpCodes.Ldarg_0) },
                    new Instruction[] { proc.Create(OpCodes.Ldc_I4_0), proc.Create(OpCodes.Box, module.Import(mscorlibModule.GetType("System.Boolean"))) },
                    new Instruction[] { proc.Create(OpCodes.Ldarg_1), proc.Create(OpCodes.Box, module.Import(mscorlibModule.GetType("System.Int32"))) },
                    new Instruction[] { proc.Create(OpCodes.Ldnull) },
                }); hook.Insert(0, proc.Create(OpCodes.Ldarg_0));
                hook.Add(proc.Create(OpCodes.Dup));
                hook.Add(proc.Create(OpCodes.Ldc_I4_1));
                hook.Add(proc.Create(OpCodes.Ldelem_Ref));
                hook.Add(proc.Create(OpCodes.Unbox_Any, module.Import(mscorlibModule.GetType("System.Boolean"))));
                int jmp1_sindex = hook.Count; hook.Add(null);                 //brtrue
                hook.Add(proc.Create(OpCodes.Pop));
                hook.Add(proc.Create(OpCodes.Br, body.Instructions[targetIndex + 1]));
                int jmp1_tindex = hook.Count;
                hook.Add(proc.Create(OpCodes.Ldc_I4_2));
                hook.Add(proc.Create(OpCodes.Ldelem_Ref));
                hook.Add(proc.Create(OpCodes.Br, body.Instructions[targetIndex + 2]));

                hook.RemoveAt(jmp1_sindex); hook.Insert(jmp1_sindex, proc.Create(OpCodes.Brtrue, hook[jmp1_tindex]));

                HookHelper.insertAt(body, targetIndex, hook.ToArray());
                body.Instructions[jumpsToDefault[0]].Operand = hook[0];
            }
        }