Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
6ab9bb7
Fix FunctionHook destructor (#1827)
jhett12321 Apr 18, 2025
b634bdd
Creature: add GetNumberOfBonusSpells(), ModifyNumberBonusSpells() (#1…
hendrikgit Apr 18, 2025
137a438
ELC: Fix ability score calculation from class stat bonuses (#1706)
jhett12321 Apr 18, 2025
292a2c0
Weapon: change the log level to debug for NWNX_WEAPON_SETDATA_DC_BYPA…
hendrikgit Apr 18, 2025
b5f5ddd
Clear the read message where appropriate to avoid ASSERTing all over …
Daztek Apr 19, 2025
35f127d
Fixed typo in Deserialize() (#1829)
nelak2 Apr 21, 2025
d3ed98a
Events: NWNX_ON_ITEM_AMMO_RELOAD can SetEventResult to item in contai…
hendrikgit May 23, 2025
a22fc5e
Add livegrep to Awesome markdown (#1831)
julien-lecomte May 26, 2025
f9e3739
Damage: Add bRangedAttack to the NWNX_Damage_AttackEventData struct (…
hendrikgit Jul 8, 2025
5e02b36
Events: Add NWNX_ON_ABILITY_CHANGE (#1835)
hendrikgit Jul 12, 2025
1616ef4
add sslmode option (default: disable) to PG connect string (#1832)
ELadner Jul 24, 2025
ae0e10b
Creature Crit mods- Add UpdateCombatInformation Call (#1836)
WilliamDraco Jul 30, 2025
3b11fcf
Fix some English spelling (#1834)
julien-lecomte Jul 30, 2025
8e31bbc
Added messagebus support for the InitOnFirstSubscribe function (#1838)
Cjreek Aug 26, 2025
4bd5b11
Delete NWNX_Lua and NWNX_SpellChecker (#1841)
Daztek Sep 6, 2025
fb9f0f7
Update CI/Docker to Debian Bookworm (#1842)
Daztek Sep 6, 2025
431fbf9
Tileset: only hook the TileOverride hooks when needed (#1844)
Daztek Sep 7, 2025
f539dfd
Bump some min cmake required versions (#1845)
Daztek Sep 7, 2025
18cffdb
Sorting the characterlist by last played date (#1839)
Cjreek Sep 9, 2025
11d7614
Pin SWIG package to 4.0.2. Restore package compile (#1848)
jhett12321 Sep 10, 2025
d768032
Added skipable events NWNX_ON_DECREMENT_REMAINING_FEAT_USES_{BEFORE|A…
Cjreek Sep 11, 2025
86747b7
Add ID to the NWNX_ON_ITEMPROPERTY_EFFECT_* events (#1849)
cgtudor Sep 17, 2025
f666a11
Update API and bump version for 8193.37-17 (#1843)
Daztek Oct 8, 2025
73cf6ab
Fix NWNX_TWEAKS_RESIST_ENERGY_STACKS_WITH_EPIC_ENERGY_RESISTANCE to w…
hendrikgit Oct 24, 2025
ab5ac90
NWNX_TWEAKS_RESIST_ENERGY_STACKS_WITH_EPIC_ENERGY_RESISTANCE: correct…
hendrikgit Jan 24, 2026
91630d8
Fix NWNX_TWEAKS_SNEAK_ATTACK_IGNORE_CRIT_IMMUNITY to work with up to …
hendrikgit Jan 24, 2026
fdf77ab
Add silent console functionnality (#1850)
julien-lecomte Jan 24, 2026
3f504d0
Add new Store functionality (#1860)
julien-lecomte Jan 24, 2026
3cdcae7
Replace Discord contact with Zulip link (#1864)
mtijanic Mar 11, 2026
51baea6
Partially revert "Add new Store functionality (#1860)" (#1863)
julien-lecomte Mar 11, 2026
6256809
DotNET: Replace nethost search with static linked library. (#1869)
jhett12321 Apr 3, 2026
27a6ef9
Merge remote-tracking branch 'upstream/master' into feature/sync-upst…
james-gre Apr 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@ on:
- 'docgen/**'
- 'builder.Dockerfile'

env:
CC: gcc-7 -m64
CXX: g++-7 -m64

concurrency:
concurrency:
group: "build"
cancel-in-progress: false

Expand Down
1 change: 1 addition & 0 deletions Awesome-NWNX.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ A curated list of awesome NWNX projects and shiny things, and other adjacent NWN
- [NWNFileFormats](https://github.com/Liareth/NWNFileFormats) - For developers - a modern (and hopefully fast?) C++ API to read NWN / Aurora engine file formats
- [nwn_sqlite](https://github.com/hendrikgit/nwn_sqlite#nwn_sqlite) - Writes information from a module, gff, 2da to a sqlite database file
- [NWScript: EE Language Server](https://github.com/PhilippeChab/nwscript-ee-language-server) - A Visual Studio Code extension LSP for the NWScript language.
- [NWN Livegrep](https://livegrep.nwn.ovh) - Code search through the core NWScript files, several frameworks and modules.

## Frameworks

Expand Down
16 changes: 13 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,42 @@ https://github.com/nwnxee/unified/compare/build8193.37.13...HEAD
### Added
- Tweaks: added `NWNX_TWEAKS_RESIST_ENERGY_STACKS_WITH_EPIC_ENERGY_RESISTANCE` to make Resist Energy feats stack with Epic Energy Resistance.
- Tweaks: added `NWNX_TWEAKS_UNHARDCODE_SPECIAL_ABILITY_TARGET_TYPE` to allow special abilities to be used on target types other than creatures.
- Events: Added events `NWNX_ON_ABILITY_CHANGE_{BEFORE|AFTER}` which fire when an ability of a player changes.
- Events: Added `NWNX_EVENT_INIT_ON_FIRST_SUBSCRIBE` messagebus message as a wrapper for the `InitOnFirstSubscribe` function. Broadcasts `NWNX_EVENT_INIT_ON_FIRST_SUBSCRIBE_CALLBACK` message when a registered event gets subscribed to.
- Tweaks: Added `NWNX_TWEAKS_CHARLIST_SORT_BY_LAST_PLAYED_DATE` to enable character list sorting by last played date
- Events: Added events `NWNX_ON_DECREMENT_REMAINING_FEAT_USES_{BEFORE|AFTER}` which fire when the remaining uses of a feat are decremented

##### New Plugins
- N/A

##### New NWScript Functions
- Player: GetOpenStore()
- Creature: GetNumberOfBonusSpells(), ModifyNumberBonusSpells()
- Store: GetBlackMarket(), SetBlackMarket()

### Changed
- N/A
- Damage: Added bRangedAttack to the NWNX_Damage_AttackEventData struct.
- Events: Added ID to the NWNX_ON_ITEMPROPERTY_EFFECT_* events data.
- Utils: Change LOG_INFO to LOG_DEBUG for console commands.

### Deprecated
- N/A

### Removed
- N/A
- Removed NWNX_Lua and NWNX_SpellChecker due to presumably being unused and bitrotten.

### Fixed
- Fixed `NWNX_TWEAKS_SETAREA_CALLS_SETPOSITION` not working with `NWNX_ON_MATERIALCHANGE_*`.
- MaxLevel: Fixed returning an invalid number of known spells in some cases.
- Fixed `NWNX_TWEAKS_RESIST_ENERGY_STACKS_WITH_EPIC_ENERGY_RESISTANCE` not working correctly when the character has more than one resist energy feat.
- Fixed `NWNX_TWEAKS_SNEAK_ATTACK_IGNORE_CRIT_IMMUNITY` only considering 3 classes for determining the level difference of attacker and defender.

## 8193.37.13
https://github.com/nwnxee/unified/compare/build8193.36.10...build8193.37.13

**Notice: NWNX API Update**

The NWNX API has been updated, resulting in the removal of nwnx.nss. All nwnx_*.nss files have been modified to use the new API functions.
The NWNX API has been updated, resulting in the removal of nwnx.nss. All nwnx_*.nss files have been modified to use the new API functions.

What You Need to Do:

Expand Down
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.2)
cmake_minimum_required(VERSION 3.10)
project(NWNX-Unified)

if(NOT CMAKE_BUILD_TYPE)
Expand Down Expand Up @@ -27,7 +27,7 @@ find_package(Sanitizers)
execute_process(COMMAND git rev-parse --short HEAD OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE SHORT_HASH)
set(TARGET_NWN_BUILD 8193)
set(TARGET_NWN_BUILD_REVISION 37)
set(TARGET_NWN_BUILD_POSTFIX 15)
set(TARGET_NWN_BUILD_POSTFIX 17)
set(NWNX_BUILD_SHA ${SHORT_HASH})
set(PLUGIN_PREFIX NWNX_)

Expand Down
8 changes: 4 additions & 4 deletions NWNXLib/API/API/CExoString.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ struct CExoString
{
return m_nStringLength;
}
void Insert(const CExoString & string, uint32_t position);
void Insert(const CExoString & string, int32_t position);
BOOL IsEmpty() const { return GetLength() == 0; }
CExoString Left(uint32_t count) const;
CExoString Left(int32_t count) const;
CExoString LowerCase() const;
CExoString Right(uint32_t count) const;
CExoString SubString(uint32_t start, uint32_t count=~0) const;
CExoString Right(int32_t count) const;
CExoString SubString(int32_t start, int32_t count=-1) const;
CExoString UpperCase() const;
BOOL CompareNoCase(const CExoString & sString) const;
BOOL ComparePrefixNoCase(const CExoString & sString, int32_t nSize) const;
Expand Down
2 changes: 1 addition & 1 deletion NWNXLib/API/API/CNWCreatureStatsUpdate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ struct CNWCreatureStatsUpdate
char m_nFortSave;
char m_nWillSave;
char m_nReflexSave;
char m_nNegativeLevels[3];
char m_nNegativeLevels[8];
int16_t m_nCurrentHP;
int16_t m_nMaxHP;
uint32_t m_nCurrentXP;
Expand Down
17 changes: 11 additions & 6 deletions NWNXLib/API/API/CScriptCompiler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,19 @@ typedef int BOOL;

// Removes any functions that cannot possibly be called by any codepath
#define CSCRIPTCOMPILER_OPTIMIZE_DEAD_FUNCTIONS 0x00000001
// Merges constant expressions into a single constant where possible.
// Note: Only affects runtime expressions, assignments to const variables are always folded.
#define CSCRIPTCOMPILER_OPTIMIZE_FOLD_CONSTANTS 0x00000002
// Post processes generated instructions to merge sequences into shorter equivalents
#define CSCRIPTCOMPILER_OPTIMIZE_MELD_INSTRUCTIONS 0x00000004
#define CSCRIPTCOMPILER_OPTIMIZE_MELD_INSTRUCTIONS 0x00000002
// Removes the jump and the dead branches in if (CONST) constructs
#define CSCRIPTCOMPILER_OPTIMIZE_DEAD_BRANCHES 0x00000004

// Optimization groups - roughly corresponding to -O0, -O1, -O2, -O3. Each group includes the previous one.
// Safe - Known good, used by the game and toolset
// Aggressive - Probably good, used by the external compiler
// Experimental - Untested or known to break something
#define CSCRIPTCOMPILER_OPTIMIZE_NOTHING 0x00000000
#define CSCRIPTCOMPILER_OPTIMIZE_EVERYTHING 0xFFFFFFFF
#define CSCRIPTCOMPILER_OPTIMIZE_SAFE (CSCRIPTCOMPILER_OPTIMIZE_DEAD_FUNCTIONS)
#define CSCRIPTCOMPILER_OPTIMIZE_AGGRESSIVE (CSCRIPTCOMPILER_OPTIMIZE_SAFE | CSCRIPTCOMPILER_OPTIMIZE_DEAD_BRANCHES)
#define CSCRIPTCOMPILER_OPTIMIZE_EXPERIMENTAL (CSCRIPTCOMPILER_OPTIMIZE_AGGRESSIVE | CSCRIPTCOMPILER_OPTIMIZE_MELD_INSTRUCTIONS)

struct CScriptCompilerAPI
{
Expand Down Expand Up @@ -297,7 +302,7 @@ struct CScriptCompiler
int32_t GetStructureSize(const CExoString & sStructureName);
int32_t GetIdentifierByName(const CExoString & sIdentifierName);
int32_t AddToGlobalVariableList(CScriptParseTreeNode * pGlobalVariableNode);
BOOL ConstantFoldNode(CScriptParseTreeNode *pNode, BOOL bForce = false);
BOOL ConstantFoldNode(CScriptParseTreeNode *pNode);
CScriptParseTreeNode *TrimParseTree(CScriptParseTreeNode *pNode);
void InitializeSwitchLabelList();
int32_t TraverseTreeForSwitchLabels(CScriptParseTreeNode * pNode);
Expand Down
8 changes: 7 additions & 1 deletion NWNXLib/API/Constants/Messages.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,12 @@ namespace MessageMajor
GuiEvent = 0x35,
Device = 0x36,
Nui = 0x37,
SetShaderUniform = 0x38,
TargetingData = 0x39,
AudioStream = 0x40,
};
constexpr int32_t MIN = 0;
constexpr int32_t MAX = 0x37;
constexpr int32_t MAX = 0x40;

constexpr const char* ToString(const unsigned value)
{
Expand Down Expand Up @@ -128,6 +131,9 @@ namespace MessageMajor
"GuiEvent",
"Device",
"Nui",
"SetShaderUniform",
"TargetingData",
"AudioStream",
};

return (value > MAX) ? "(invalid)" : TYPE_STRINGS[value];
Expand Down
2 changes: 1 addition & 1 deletion NWNXLib/External/funchook/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# GIT_SHALLOW requires cmake 3.6.
cmake_minimum_required(VERSION 3.6)
cmake_minimum_required(VERSION 3.10)

project(funchook VERSION 2.0.0 LANGUAGES C ASM)

Expand Down
2 changes: 1 addition & 1 deletion NWNXLib/External/funchook/capstone/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.10)
project(capstone)

set(VERSION_MAJOR 4)
Expand Down
2 changes: 1 addition & 1 deletion NWNXLib/External/funchook/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.10)
project(libfunchook_test LANGUAGES C CXX ASM)

set(FUNCHOOK_CPU ${CMAKE_SYSTEM_PROCESSOR})
Expand Down
77 changes: 50 additions & 27 deletions NWNXLib/Hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,53 +13,76 @@ namespace NWNXLib::Hooks
FunctionHook::FunctionHook(void* originalFunction, void* newFunction, int32_t order)
: m_originalFunction(originalFunction), m_newFunction(newFunction), m_order(order)
{
auto &v = s_hooks[originalFunction];
if (order == Order::Final && v.size() > 0 && v[0]->m_order == Order::Final)
m_trampoline = nullptr;
m_funchook = nullptr;

auto &funcHooks = s_hooks[originalFunction];
if (order == Order::Final && !funcHooks.empty() && funcHooks[0]->m_order == Order::Final)
throw std::runtime_error("Multiple hooks with final ordering requested");

int32_t insert = v.size();
for (int32_t i = 0; i < (int32_t)v.size(); i++)
auto insert = static_cast<int32_t>(funcHooks.size());
for (int32_t i = 0; i < static_cast<int32_t>(funcHooks.size()); i++)
{
if (v[i]->m_order < m_order)
if (funcHooks[i]->m_order < m_order)
{
insert = i;
break;
}
if (v[i]->m_order == m_order)
if (funcHooks[i]->m_order == m_order)
m_order--;
}

for (int32_t i = v.size() - 1; i >= insert; i--)
{
ASSERT(!funchook_uninstall((funchook_t*) v[i]->m_funchook, 0));
ASSERT(!funchook_destroy((funchook_t*) v[i]->m_funchook));
}

v.insert(v.begin() + insert, this);

for (int32_t i = insert; i < (int32_t)v.size(); i++)
UpdateHookList(originalFunction, funcHooks, insert, [&funcHooks, insert, this]
{
v[i]->m_trampoline = (void*)originalFunction;
v[i]->m_funchook = (funchook_t*)funchook_create();
ASSERT(v[i]->m_funchook);
ASSERT(!funchook_prepare((funchook_t*)v[i]->m_funchook, &v[i]->m_trampoline, v[i]->m_newFunction));
ASSERT(!funchook_install((funchook_t*)v[i]->m_funchook, 0));
}
funcHooks.insert(funcHooks.begin() + insert, this);
});
}

FunctionHook::~FunctionHook()
{
auto &v = s_hooks[m_originalFunction];
for (auto it = v.begin(); it != v.end(); it++)
auto &funcHooks = s_hooks[m_originalFunction];

int32_t remove = -1;
for (int32_t i = 0; i < static_cast<int32_t>(funcHooks.size()); i++)
{
if (*it == this)
if (funcHooks[i] == this)
{
v.erase(it);
remove = i;
break;
}
}
funchook_uninstall((funchook_t*)m_funchook, 0);
funchook_destroy((funchook_t*)m_funchook);

if (remove == -1)
{
LOG_WARNING("Attempt to remove unknown function hook.");
return;
}

UpdateHookList(m_originalFunction, funcHooks, remove, [&funcHooks, remove]
{
funcHooks.erase(funcHooks.begin() + remove);
});
}

template <typename F>
void FunctionHook::UpdateHookList(void* originalFunction, const std::vector<FunctionHook*>& hookList, const int32_t index, F&& hookOperation)
{
for (int32_t i = static_cast<int32_t>(hookList.size()) - 1; i >= index; i--)
{
ASSERT(!funchook_uninstall(static_cast<funchook_t*>(hookList[i]->m_funchook), 0));
ASSERT(!funchook_destroy(static_cast<funchook_t*>(hookList[i]->m_funchook)));
}

hookOperation();

for (int32_t i = index; i < static_cast<int32_t>(hookList.size()); i++)
{
hookList[i]->m_trampoline = originalFunction;
hookList[i]->m_funchook = funchook_create();
ASSERT(hookList[i]->m_funchook);
ASSERT(!funchook_prepare(static_cast<funchook_t*>(hookList[i]->m_funchook), &hookList[i]->m_trampoline, hookList[i]->m_newFunction));
ASSERT(!funchook_install(static_cast<funchook_t*>(hookList[i]->m_funchook), 0));
}
}

};
2 changes: 1 addition & 1 deletion NWNXLib/POS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ class ObjectStorage
{
if (m_IntMap) m_IntMap->clear();
if (m_FloatMap) m_FloatMap->clear();
if (m_StringMap) m_IntMap->clear();
if (m_StringMap) m_StringMap->clear();
if (m_PointerMap) m_PointerMap->clear();

#define SSCANF_OR_ABORT(s, fmt, val) \
Expand Down
10 changes: 10 additions & 0 deletions NWNXLib/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -572,4 +572,14 @@ void UpdateClientObject(ObjectID oidObject)
}
}

void ClearReadMessage()
{
if (auto* pMessage = Globals::AppManager()->m_pServerExoApp->GetNWSMessage())
{
pMessage->m_nReadBufferPtr = pMessage->m_nReadBufferSize;
pMessage->m_nReadFragmentsBufferPtr = pMessage->m_nReadFragmentsBufferSize;
pMessage->m_nCurReadBit = pMessage->m_nLastByteBits;
}
}

}
4 changes: 4 additions & 0 deletions NWNXLib/nwnx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ namespace Hooks
void* m_trampoline;

static inline std::unordered_map<void*, std::vector<FunctionHook*>> s_hooks;

template <typename F>
static void UpdateHookList(void* originalFunction, const std::vector<FunctionHook*>& hookList, int32_t index, F&& hookOperation);
};

using Hook = std::unique_ptr<FunctionHook>;
Expand Down Expand Up @@ -256,6 +259,7 @@ namespace Utils
int32_t NWScriptObjectTypeToEngineObjectType(int32_t nwscriptObjectType);
void UpdateClientObject(ObjectID oidObject);
void UpdateClientObjectForPlayer(ObjectID oidObject, CNWSPlayer* oidPlayer);
void ClearReadMessage();
}

namespace POS
Expand Down
4 changes: 2 additions & 2 deletions Plugins/Area/NWScript/nwnx_area.nss
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ int NWNX_Area_GetAreaSpotModifier(object area);
/// @sa NWNX_SkillRanks_SetAreaModifier() to change any skill modifier.
void NWNX_Area_SetAreaSpotModifier(object area, int spotModifier);

/// @brief Get the listen modifer of area
/// @brief Get the listen modifier of area
/// @param area The area object.
/// @return The value of the Listen skill modifier for this area.
int NWNX_Area_GetAreaListenModifier(object area);
Expand Down Expand Up @@ -343,7 +343,7 @@ struct NWNX_Area_AreaWind NWNX_Area_GetAreaWind(object oArea);

/// @brief Set the default discoverability mask for objects in an area.
/// @param oArea The area or OBJECT_INVALID to set a global mask for all areas. Per area masks will override the global mask.
/// @param nObjectTypes A mask of OBJECT_TYPE_* constants or OBJECT_TYPE_ALL for all suitable object types. Currently only works on Creatures, Doors (Hilite only), Items and Useable Placeables.
/// @param nObjectTypes A mask of OBJECT_TYPE_* constants or OBJECT_TYPE_ALL for all suitable object types. Currently only works on Creatures, Doors (Hilite only), Items and Usable Placeables.
/// @param nMask A mask of OBJECT_UI_DISCOVERY_*
/// @param bForceUpdate If TRUE, will update the discovery mask of ALL objects in the area or module(if oArea == OBJECT_INVALID), according to the current mask. Use with care.
void NWNX_Area_SetDefaultObjectUiDiscoveryMask(object oArea, int nObjectTypes, int nMask, int bForceUpdate = FALSE);
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Compiler/Compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static std::unique_ptr<CScriptCompiler> CreateAndConfigureCompiler(const CExoStr
auto scriptCompiler = std::make_unique<CScriptCompiler>(Constants::ResRefType::NSS, Constants::ResRefType::NCS, Constants::ResRefType::NDB);

scriptCompiler->SetGenerateDebuggerOutput(Config::Get<int>("GENERATE_DEBUGGER_OUTPUT", 0));
scriptCompiler->SetOptimizationFlags(Config::Get<uint32_t>("OPTIMIZATION_FLAGS", CSCRIPTCOMPILER_OPTIMIZE_EVERYTHING));
scriptCompiler->SetOptimizationFlags(Config::Get<uint32_t>("OPTIMIZATION_FLAGS", CSCRIPTCOMPILER_OPTIMIZE_AGGRESSIVE));
scriptCompiler->SetIdentifierSpecification("nwscript");
scriptCompiler->SetCompileConditionalOrMain(true);
scriptCompiler->SetCompileConditionalFile(true);
Expand Down
Loading
Loading