diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml
new file mode 100644
index 0000000..080428f
--- /dev/null
+++ b/.github/workflows/msbuild.yml
@@ -0,0 +1,49 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+name: MSBuild
+
+on:
+ push:
+ branches: [ "main" ]
+
+env:
+ # Path to the solution file relative to the root of the project.
+ SOLUTION_FILE_PATH: .
+
+ # Configuration type to build.
+ # You can convert this to a build matrix if you need coverage of multiple configuration types.
+ # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
+ BUILD_CONFIGURATION: Release
+
+permissions:
+ contents: write
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/setup-msbuild@v1.0.2
+
+ - name: Restore NuGet packages
+ working-directory: ${{env.GITHUB_WORKSPACE}}
+ run: nuget restore ${{env.SOLUTION_FILE_PATH}}
+
+ - name: Build
+ working-directory: ${{env.GITHUB_WORKSPACE}}
+ # Add additional options to the MSBuild command line here (like platform or verbosity level).
+ # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
+ run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
+
+ - name: Archive files
+ uses: actions/upload-artifact@v4
+ with:
+ name: arcdps_integration64
+ path: |
+ x64/arcdps_integration64.dll
diff --git a/GW2Nexus-ArcDPSBridge.vcxproj b/GW2Nexus-ArcDPSBridge.vcxproj
index db94361..1f27c7f 100644
--- a/GW2Nexus-ArcDPSBridge.vcxproj
+++ b/GW2Nexus-ArcDPSBridge.vcxproj
@@ -45,9 +45,13 @@
$(SolutionDir)$(Platform)\
+ $(Platform)\
+ arcdps_integration64
$(SolutionDir)$(Platform)\
+ $(Platform)\
+ arcdps_integration64
diff --git a/src/entry.cpp b/src/entry.cpp
index 217372c..5113cd7 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -33,12 +33,9 @@ struct EvCombatData
void AddonLoad(AddonAPI* aApi);
void AddonUnload();
-AddonDefinition* AddonDef = nullptr;
+AddonDefinition AddonDef = {};
AddonAPI* APIDefs = nullptr;
-std::mutex Mutex;
-std::vector evCombatEvents;
-
arcdps_exports arc_exports;
uint32_t cbtcount = 0;
extern "C" __declspec(dllexport) void* get_init_addr(char* arcversion, ImGuiContext* imguictx, void* id3dptr, HANDLE arcdll, void* mallocfn, void* freefn, uint32_t d3dversion);
@@ -51,20 +48,20 @@ uintptr_t mod_combat(const char* channel, cbtevent* ev, ag* src, ag* dst, char*
extern "C" __declspec(dllexport) AddonDefinition* GetAddonDef()
{
- AddonDef = new AddonDefinition();
- AddonDef->Signature = -19392669;
- AddonDef->APIVersion = NEXUS_API_VERSION;
- AddonDef->Name = "Nexus ArcDPS Bridge";
- AddonDef->Version.Major = 1;
- AddonDef->Version.Minor = 0;
- AddonDef->Version.Build = 0;
- AddonDef->Version.Revision = 1;
- AddonDef->Author = "Raidcore";
- AddonDef->Description = "Adds events for the ArcDPS combat API.";
- AddonDef->Load = AddonLoad;
- AddonDef->Unload = AddonUnload;
-
- return AddonDef;
+ AddonDef.Signature = -19392669;
+ AddonDef.APIVersion = NEXUS_API_VERSION;
+ AddonDef.Name = "Nexus ArcDPS Bridge";
+ AddonDef.Version.Major = 1;
+ AddonDef.Version.Minor = 0;
+ AddonDef.Version.Build = 0;
+ AddonDef.Version.Revision = 1;
+ AddonDef.Author = "Raidcore";
+ AddonDef.Description = "Raises Nexus Events from ArcDPS combat API callbacks.";
+ AddonDef.Load = AddonLoad;
+ AddonDef.Unload = AddonUnload;
+ AddonDef.Flags = EAddonFlags_DisableHotloading;
+
+ return &AddonDef;
}
void AddonLoad(AddonAPI* aApi)
@@ -118,103 +115,25 @@ uintptr_t mod_combat_local(cbtevent* ev, ag* src, ag* dst, char* skillname, uint
uintptr_t mod_combat(const char* channel, cbtevent* ev, ag* src, ag* dst, char* skillname, uint64_t id, uint64_t revision)
{
- /*Mutex.lock();
- if (evCombatEvents.size() > 1000)
- {
- for (size_t i = 0; i < 500; i++)
- {
- if (evCombatEvents[i]->src && evCombatEvents[i]->src->name)
- {
- delete[] evCombatEvents[i]->src->name;
- }
- if (evCombatEvents[i]->dst && evCombatEvents[i]->dst->name)
- {
- delete[] evCombatEvents[i]->dst->name;
- }
- if (evCombatEvents[i]->skillname)
- {
- delete[] evCombatEvents[i]->skillname;
- }
- if (evCombatEvents[i]->src)
- {
- delete evCombatEvents[i]->src;
- }
- if (evCombatEvents[i]->dst)
- {
- delete evCombatEvents[i]->dst;
- }
- delete evCombatEvents[i];
- }
-
- for (size_t i = 0; i < 500; i++)
- {
- evCombatEvents.erase(evCombatEvents.begin());
- }
- }
- Mutex.unlock();*/
-
- EvCombatData* evCbtData = new EvCombatData();
- evCbtData->ev = ev != nullptr ? new cbtevent(*ev) : nullptr;
- evCbtData->src = src != nullptr ? new ag(*src) : nullptr;
- if (evCbtData->src && evCbtData->src->name)
- {
- size_t szSrcName = strlen(src->name) + 1;
- if (szSrcName > 1)
- {
- char* sSrcName = new char[szSrcName];
- strcpy_s(sSrcName, szSrcName, src->name);
- evCbtData->src->name = sSrcName;
- }
- else
- {
- evCbtData->src->name = nullptr;
- }
- }
- evCbtData->dst = dst != nullptr ? new ag(*dst) : nullptr;
- if (evCbtData->dst && evCbtData->dst->name)
- {
- size_t szDstName = strlen(dst->name) + 1;
- if (szDstName > 1)
- {
- char* sDstName = new char[szDstName];
- strcpy_s(sDstName, szDstName, dst->name);
- evCbtData->dst->name = sDstName;
- }
- else
- {
- evCbtData->dst->name = nullptr;
- }
- }
- if (skillname)
+ EvCombatData evCbtData
{
- size_t szSkName = strlen(skillname) + 1;
- if (szSkName > 1)
- {
- char* sSkName = new char[szSkName];
- strcpy_s(sSkName, szSkName, skillname);
- evCbtData->skillname = sSkName;
- }
- else
- {
- evCbtData->skillname = nullptr;
- }
- }
- evCbtData->id = id;
- evCbtData->revision = revision;
-
- Mutex.lock();
- evCombatEvents.push_back(evCbtData);
- Mutex.unlock();
+ ev,
+ src,
+ dst,
+ skillname,
+ id,
+ revision
+ };
if (APIDefs != nullptr)
{
if (strcmp(channel, "local") == 0)
{
- APIDefs->RaiseEvent("EV_ARC_COMBATEVENT_LOCAL", evCbtData);
+ APIDefs->RaiseEvent("EV_ARCDPS_COMBATEVENT_LOCAL_RAW", &evCbtData);
}
else
{
- APIDefs->RaiseEvent("EV_ARC_COMBATEVENT_SQUAD", evCbtData);
+ APIDefs->RaiseEvent("EV_ARCDPS_COMBATEVENT_SQUAD_RAW", &evCbtData);
}
}