Hello! With plugin "Infinite Weapon Poison" (author meh321, Nexus link for plugin and its source- http://www.nexusmods.com/skyrim/mods/64142/?) I can replace and remove poisons on weapon and it is really cool! But Infinite shots break my mod that add in Alchemy a perk that give 10 poison shots (or more with more Alchemy points). Please, help me to edit this plugin and remove infinite poison shots. Or advice me how can I do it self? Below is the code of main.cpp from source of plugin "Infinite Weapon Poison". I modify it for two days, but was not able to remove infinite poison shots ((( --------------------- code ------------------------------------------------------------------------- typedef unsigned char UInt8; //!< An unsigned 8-bit integer value typedef unsigned short UInt16; //!< An unsigned 16-bit integer value typedef unsigned long UInt32; //!< An unsigned 32-bit integer value typedef unsigned long long UInt64; //!< An unsigned 64-bit integer value typedef signed char SInt8; //!< A signed 8-bit integer value typedef signed short SInt16; //!< A signed 16-bit integer value typedef signed long SInt32; //!< A signed 32-bit integer value typedef signed long long SInt64; //!< A signed 64-bit integer value typedef float Float32; //!< A 32-bit floating point value typedef double Float64; //!< A 64-bit floating point value #include "Windows.h" #include "skse/PluginAPI.h" #include "skse/skse_version.h" int allowOverwrite1 = 0x7462CD; int allowOverwrite2 = 0x7462D4; int isPoison1 = 0x4757B0; int reducePoison1 = 0x475810; int reduceCharge1 = 0x410711; int reduceCharge2 = 0x410719; int doRemove = 0; extern "C" { bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info) { // populate info structure info->infoVersion = PluginInfo::kInfoVersion; info->name = "item poison plugin"; info->version = 1; if (skse->isEditor || skse->runtimeVersion != RUNTIME_VERSION_1_9_32_0) return false; return true; } bool SKSEPlugin_Load(const SKSEInterface * skse) { void * jumpAddress1 = NULL; void * jumpAddress2 = NULL; _asm { mov jumpAddress1, offset IPCodeStart jmp IPCodeEnd IPCodeStart: mov ecx, esi mov doRemove, 1 call reducePoison1 mov ecx, esi call isPoison1 test eax, eax jmp allowOverwrite2 IPCodeEnd: } _asm { mov jumpAddress2, offset RPCodeStart jmp RPCodeEnd RPCodeStart: test ecx, ecx jbe RPBack cmp doRemove, 0 je RPBack mov doRemove, 0 mov ecx, 0 mov [eax+8], ecx RPBack: jmp reduceCharge2 RPCodeEnd: } DWORD oldProtect = 0; int len2 = allowOverwrite2 - allowOverwrite1; if (VirtualProtect((void *)allowOverwrite1, len2, PAGE_EXECUTE_READWRITE, &oldProtect)) { *((unsigned char *)allowOverwrite1) = (unsigned char)0xE9; *((int *)(allowOverwrite1 + 1)) = (int)jumpAddress1 - allowOverwrite1 - 5; for (int i = 5; i < len2; i++) *((unsigned char *)(i + allowOverwrite1)) = (unsigned char)0x90; VirtualProtect((void *)allowOverwrite1, len2, oldProtect, &oldProtect); } int len1 = reduceCharge2 - reduceCharge1; if (VirtualProtect((void *)reduceCharge1, len1, PAGE_EXECUTE_READWRITE, &oldProtect)) { *((unsigned char *)reduceCharge1) = (unsigned char)0xE9; *((int *)(reduceCharge1 + 1)) = (int)jumpAddress2 - reduceCharge1 - 5; for (int i = 5; i < len1; i++) *((unsigned char *)(i + reduceCharge1)) = (unsigned char)0x90; VirtualProtect((void *)reduceCharge1, len1, oldProtect, &oldProtect); } return true; } }; --------------------------------------------------------------------------------