From a3ba89ca864e22a2b9559e646c5e5b3786f8d562 Mon Sep 17 00:00:00 2001 From: Till Schreiber Date: Thu, 7 Nov 2024 12:05:01 +0100 Subject: [PATCH 1/5] Altv 426 (#329) * feat: add Interior API * store weak ptr * ALTV-426 refactore for api changes * add interior bindings (#328) * ALTV-426 update sdk * update submodule --------- Co-authored-by: xLuxy <67131061+xLuxy@users.noreply.github.com> Co-authored-by: xshady <54737754+xxshady@users.noreply.github.com> --- client/src/bindings/ClientBindingsMain.cpp | 7 +- client/src/bindings/Interior.cpp | 160 +++++++++++++++++++ client/src/bindings/InteriorPortal.cpp | 177 +++++++++++++++++++++ client/src/bindings/InteriorRoom.cpp | 128 +++++++++++++++ shared/V8Class.h | 3 + shared/deps/cpp-sdk | 2 +- shared/helpers/Macros.h | 27 ++++ 7 files changed, 501 insertions(+), 3 deletions(-) create mode 100644 client/src/bindings/Interior.cpp create mode 100644 client/src/bindings/InteriorPortal.cpp create mode 100644 client/src/bindings/InteriorRoom.cpp diff --git a/client/src/bindings/ClientBindingsMain.cpp b/client/src/bindings/ClientBindingsMain.cpp index 4e445435..95a9d08c 100644 --- a/client/src/bindings/ClientBindingsMain.cpp +++ b/client/src/bindings/ClientBindingsMain.cpp @@ -1360,7 +1360,7 @@ extern V8Module sharedModule; extern V8Class v8Player, v8Player, v8Vehicle, v8WebView, v8HandlingData, v8LocalStorage, v8MemoryBuffer, v8MapZoomData, v8Discord, v8Voice, v8WebSocketClient, v8Checkpoint, v8HttpClient, v8Audio, v8LocalPlayer, v8Profiler, v8Worker, v8RmlDocument, v8RmlElement, v8WeaponData, v8FocusData, v8LocalObject, v8TextEncoder, v8TextDecoder, v8Object, v8VirtualEntityGroup, v8VirtualEntity, v8AudioFilter, v8Marker, v8Ped, v8Colshape, v8ColshapeCylinder, v8ColshapeSphere, v8ColshapeCircle, v8ColshapeCuboid, v8ColshapeRectangle, v8ColshapePolygon, v8TextLabel, - v8LocalPed, v8LocalVehicle, v8Font, v8WeaponObject, v8AudioOutput, v8AudioOutputFrontend, v8AudioOutputWorld, v8AudioOutputAttached, v8AudioCategory; + v8LocalPed, v8LocalVehicle, v8Font, v8WeaponObject, v8AudioOutput, v8AudioOutputFrontend, v8AudioOutputWorld, v8AudioOutputAttached, v8AudioCategory, v8Interior, v8InteriorRoom, v8InteriorPortal; extern V8Module altModule("alt", &sharedModule, { v8Player, @@ -1408,7 +1408,10 @@ extern V8Module altModule("alt", v8AudioOutputFrontend, v8AudioOutputWorld, v8AudioOutputAttached, - v8AudioCategory }, + v8AudioCategory, + v8Interior, + v8InteriorRoom, + v8InteriorPortal }, [](v8::Local ctx, v8::Local exports) { v8::Isolate* isolate = ctx->GetIsolate(); diff --git a/client/src/bindings/Interior.cpp b/client/src/bindings/Interior.cpp new file mode 100644 index 00000000..08c1f8b1 --- /dev/null +++ b/client/src/bindings/Interior.cpp @@ -0,0 +1,160 @@ +#include "../CV8Resource.h" +#include "V8Class.h" + +static void Constructor(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_CHECK_CONSTRUCTOR(); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, interiorId); + + std::shared_ptr interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8Helpers::SetObjectClass(info.GetIsolate(), info.This(), V8Class::ObjectClass::INTERIOR); + info.This()->SetInternalField(1, info[0]); +} + +static void GetForInteriorID(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, interiorId); + std::vector> args{ V8Helpers::JSValue(interiorId) }; + + extern V8Class v8Interior; + V8_RETURN(v8Interior.New(isolate->GetEnteredOrMicrotaskContext(), args)); +} + +static void RoomCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_RETURN_UINT(interior->GetRoomCount()); +} + +static void PortalCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_RETURN_UINT(interior->GetPortalCount()); +} + +static void PositionGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT_RESOURCE(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_RETURN_VECTOR3(interior->GetPosition()); +} + +static void RotationGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT_RESOURCE(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_RETURN_VECTOR3(interior->GetRotation()); +} + +static void EntitiesExtentsGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT_RESOURCE(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + auto extentInfo = interior->GetEntitiesExtents(); + INTERIOR_EXTENT_TO_OBJECT(extentInfo, obj); + V8_RETURN(obj); +} + +static void GetRoomByHash(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, roomHash); + + // 3 args: (interiorId: uint, value: uint, valueIsRoomIndex: bool) + std::vector> args{ V8Helpers::JSValue(interiorId), V8Helpers::JSValue(roomHash), V8Helpers::JSValue(false) }; + + extern V8Class v8InteriorRoom; + V8_RETURN(v8InteriorRoom.New(isolate->GetEnteredOrMicrotaskContext(), args)); +} + +static void GetRoomByIndex(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, roomIndex); + + // 3 args: (interiorId: uint, value: uint, valueIsRoomIndex: bool) + std::vector> args{ V8Helpers::JSValue(interiorId), V8Helpers::JSValue(roomIndex), V8Helpers::JSValue(true) }; + + extern V8Class v8InteriorRoom; + V8_RETURN(v8InteriorRoom.New(isolate->GetEnteredOrMicrotaskContext(), args)); +} + +static void GetPortalByIndex(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, portalIndex); + + std::vector> args{ V8Helpers::JSValue(interiorId), V8Helpers::JSValue(portalIndex) }; + + extern V8Class v8InteriorPortal; + V8_RETURN(v8InteriorPortal.New(isolate->GetEnteredOrMicrotaskContext(), args)); +} + +extern V8Class v8Interior("Interior", + Constructor, + [](v8::Local tpl) + { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + tpl->InstanceTemplate()->SetInternalFieldCount(static_cast(V8Class::InternalFields::COUNT)); + + V8Helpers::SetMethod(isolate, tpl, "getRoomByHash", &GetRoomByHash); + V8Helpers::SetMethod(isolate, tpl, "getRoomByIndex", &GetRoomByIndex); + V8Helpers::SetMethod(isolate, tpl, "getPortalByIndex", &GetPortalByIndex); + + V8Helpers::SetAccessor(isolate, tpl, "roomCount", &RoomCountGetter); + V8Helpers::SetAccessor(isolate, tpl, "portalCount", &PortalCountGetter); + V8Helpers::SetAccessor(isolate, tpl, "pos", &PositionGetter); + V8Helpers::SetAccessor(isolate, tpl, "rot", &RotationGetter); + V8Helpers::SetAccessor(isolate, tpl, "entitiesExtents", &EntitiesExtentsGetter); + + V8Helpers::SetStaticMethod(isolate, tpl, "getForInteriorID", &GetForInteriorID); + }); diff --git a/client/src/bindings/InteriorPortal.cpp b/client/src/bindings/InteriorPortal.cpp new file mode 100644 index 00000000..0bb929b5 --- /dev/null +++ b/client/src/bindings/InteriorPortal.cpp @@ -0,0 +1,177 @@ +#include "../CV8Resource.h" +#include "V8Class.h" +#include "cpp-sdk/script-objects/IInteriorPortal.h" + +static void Constructor(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_CHECK_CONSTRUCTOR() + + V8_CHECK_ARGS_LEN(3) + V8_ARG_TO_UINT(1, interiorId) + V8_ARG_TO_UINT(2, portalIndex) + + std::shared_ptr interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") + + std::shared_ptr portal = interior->GetPortalByIndex(portalIndex); + V8_CHECK(portal, "interior portal doesn't exist"); + + V8Helpers::SetObjectClass(info.GetIsolate(), info.This(), V8Class::ObjectClass::INTERIOR_PORTAL); + info.This()->SetInternalField(1, info[0]); + info.This()->SetInternalField(2, info[1]); +} + +static void IndexGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(2, portalIndex); + V8_RETURN_UINT(portalIndex); +} + +static void RoomFromGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + // TODO: is is expected that it returns uint but setter takes int? (and same for RoomTo, same for Flag) + V8_RETURN_INT(portal->GetRoomFrom()); +} + +static void RoomFromSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_TO_UINT(value, roomFrom); + portal->SetRoomFrom(roomFrom); +} + +static void RoomToGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_RETURN_INT(portal->GetRoomTo()); +} + +static void RoomToSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_TO_UINT(value, roomTo); + portal->SetRoomTo(roomTo); +} + +static void FlagGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_RETURN_INT(portal->GetFlag()); +} + +static void FlagSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_TO_UINT(value, flag); + portal->SetFlag(flag); +} + +static void CornerCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_RETURN_UINT(portal->GetCornerCount()); +} + +static void GetEntityArchetype(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, entityIndex); + V8_RETURN_UINT(portal->GetEntityArcheType(entityIndex)); +} + +static void GetEntityFlag(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_INT(1, entityIndex); + V8_RETURN_INT(portal->GetEntityFlag(entityIndex)); +} + +static void SetEntityFlag(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(2); + V8_ARG_TO_INT(1, entityIndex); + V8_ARG_TO_INT(2, flag); + portal->SetEntityFlag(entityIndex, flag); +} + +static void GetEntityPos(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_INT(1, entityIndex); + V8_GET_RESOURCE(); + V8_RETURN_VECTOR3(portal->GetEntityPosition(entityIndex)); +} + +static void GetEntityRot(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_INT(1, entityIndex); + V8_GET_RESOURCE(); + V8_RETURN_VECTOR3(portal->GetEntityRotation(entityIndex)); +} + +static void GetCornerPos(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(1); + V8_ARG_TO_UINT(1, cornerIndex); + V8_GET_RESOURCE(); + V8_RETURN_VECTOR3(portal->GetCornerPosition(cornerIndex)); +} + + +static void SetCornerPos(const v8::FunctionCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_CHECK_ARGS_LEN(2); + V8_ARG_TO_INT(1, cornerIndex); + V8_ARG_TO_VECTOR3(2, pos); + portal->SetCornerPosition(cornerIndex, pos); +} + +extern V8Class v8InteriorPortal("InteriorPortal", + Constructor, + [](v8::Local tpl) + { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + // TODO: not sure about this one + tpl->InstanceTemplate()->SetInternalFieldCount(3); + + V8Helpers::SetAccessor(isolate, tpl, "index", &IndexGetter); + V8Helpers::SetAccessor(isolate, tpl, "cornerCount", &CornerCountGetter); + V8Helpers::SetAccessor(isolate, tpl, "roomFrom", &RoomFromGetter, &RoomFromSetter); + V8Helpers::SetAccessor(isolate, tpl, "roomTo", &RoomToGetter, &RoomToSetter); + V8Helpers::SetAccessor(isolate, tpl, "flag", &FlagGetter, &FlagSetter); + + V8Helpers::SetMethod(isolate, tpl, "getCornerPos", &GetCornerPos); + V8Helpers::SetMethod(isolate, tpl, "getEntityArchetype", &GetEntityArchetype); + V8Helpers::SetMethod(isolate, tpl, "getEntityFlag", &GetEntityFlag); + V8Helpers::SetMethod(isolate, tpl, "setEntityFlag", &SetEntityFlag); + V8Helpers::SetMethod(isolate, tpl, "getEntityPos", &GetEntityPos); + V8Helpers::SetMethod(isolate, tpl, "getEntityRot", &GetEntityRot); + + V8Helpers::SetMethod(isolate, tpl, "setCornerPos", &SetCornerPos); + }); diff --git a/client/src/bindings/InteriorRoom.cpp b/client/src/bindings/InteriorRoom.cpp new file mode 100644 index 00000000..ef19a595 --- /dev/null +++ b/client/src/bindings/InteriorRoom.cpp @@ -0,0 +1,128 @@ +#include "../CV8Resource.h" +#include "V8Class.h" +#include "cpp-sdk/script-objects/IInteriorRoom.h" + +static void Constructor(const v8::FunctionCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_CHECK_CONSTRUCTOR(); + + V8_CHECK_ARGS_LEN(3); + V8_ARG_TO_UINT(1, interiorId); + V8_ARG_TO_UINT(2, value); + V8_ARG_TO_BOOLEAN(3, isIndex); + + std::shared_ptr interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist"); + + std::shared_ptr room; + if(isIndex) + { + room = interior->GetRoomByIndex(value); + V8_CHECK(room, "interior room doesn't exist"); + } + else + { + room = interior->GetRoomByHash(value); + } + V8_CHECK(room, "interior room doesn't exist"); + + uint32_t roomIndex = room->GetIndex(); + + V8Helpers::SetObjectClass(info.GetIsolate(), info.This(), V8Class::ObjectClass::INTERIOR_ROOM); + info.This()->SetInternalField(1, info[0]); + info.This()->SetInternalField(2, V8Helpers::JSValue(roomIndex)); +} + +static void IndexGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(2, roomIndex); + V8_RETURN_UINT(roomIndex); +} + +static void NameGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_RETURN_STRING(room->GetName()); +} + +static void NameHashGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_RETURN_UINT(room->GetNameHash()); +} + +static void FlagGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_RETURN_INT(room->GetFlag()); +} + +static void FlagSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_TO_UINT(value, flag); + room->SetFlag(flag); +} + +static void TimecycleGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_RETURN_UINT(room->GetTimecycle()); +} + +static void TimecycleSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_TO_UINT(value, timecycle); + room->SetTimecycle(timecycle); +} + +static void ExtentsGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + auto extentInfo = room->GetExtents(); + V8_GET_RESOURCE(); + INTERIOR_EXTENT_TO_OBJECT(extentInfo, obj); + V8_RETURN(obj); +} + +static void ExtentsSetter(v8::Local, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_ROOM(room); + + V8_TO_OBJECT(value, extentInfo); + + auto minRaw = extentInfo->Get(ctx, v8::String::NewFromUtf8(isolate, "min").ToLocalChecked()).ToLocalChecked(); + V8_TO_VECTOR3(minRaw, min); + + auto maxRaw = extentInfo->Get(ctx, v8::String::NewFromUtf8(isolate, "max").ToLocalChecked()).ToLocalChecked(); + V8_TO_VECTOR3(maxRaw, max); + + room->SetExtents({ min, max }); +} + +extern V8Class v8InteriorRoom("InteriorRoom", + Constructor, + [](v8::Local tpl) + { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + // TODO: not sure about this one + tpl->InstanceTemplate()->SetInternalFieldCount(3); + + V8Helpers::SetAccessor(isolate, tpl, "index", &IndexGetter); + V8Helpers::SetAccessor(isolate, tpl, "name", &NameGetter); + V8Helpers::SetAccessor(isolate, tpl, "nameHash", &NameHashGetter); + V8Helpers::SetAccessor(isolate, tpl, "flag", &FlagGetter, FlagSetter); + V8Helpers::SetAccessor(isolate, tpl, "timecycle", &TimecycleGetter, TimecycleSetter); + V8Helpers::SetAccessor(isolate, tpl, "extents", &ExtentsGetter, ExtentsSetter); + }); diff --git a/shared/V8Class.h b/shared/V8Class.h index 4bda0eb1..d4e3708f 100644 --- a/shared/V8Class.h +++ b/shared/V8Class.h @@ -43,6 +43,9 @@ class V8Class AUDIO_CATEGORY, HANDLING, HANDLING_DATA, + INTERIOR, + INTERIOR_ROOM, + INTERIOR_PORTAL, MAP_ZOOM_DATA, WEAPON_DATA }; diff --git a/shared/deps/cpp-sdk b/shared/deps/cpp-sdk index b7825258..1c7ace86 160000 --- a/shared/deps/cpp-sdk +++ b/shared/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit b7825258fafcb6d9aa3906b41e27cfe2d8bf93af +Subproject commit 1c7ace86d575b156f098ba5f0ca01128536502c5 diff --git a/shared/helpers/Macros.h b/shared/helpers/Macros.h index b0604b5c..68d21e3e 100644 --- a/shared/helpers/Macros.h +++ b/shared/helpers/Macros.h @@ -66,6 +66,10 @@ V8_CHECK(val, "baseobject is not of type " #type); \ } +#define V8_GET_THIS_INTERNAL_FIELD_BOOLEAN(idx, val) \ + V8_CHECK(info.This()->InternalFieldCount() > idx - 1, "Invalid internal field count (is the 'this' context correct?)"); \ + auto val = info.This()->GetInternalField(idx).As()->BooleanValue(isolate); + #define V8_GET_THIS_INTERNAL_FIELD_INTEGER(idx, val) \ V8_CHECK(info.This()->InternalFieldCount() > idx - 1, "Invalid internal field count (is the 'this' context correct?)"); \ auto val = info.This()->GetInternalField(idx).As()->IntegerValue(ctx).ToChecked(); @@ -372,3 +376,26 @@ Log::Warning << V8Helpers::SourceLocation::GetCurrent(isolate, resource).ToString(isolate) << " " << oldName << " is deprecated and will be removed in future versions. Consider using " \ << newName << " instead" << Log::Endl; \ } + +#define GET_THIS_INTERIOR_PORTAL(val) \ + V8_GET_ISOLATE_CONTEXT(); \ + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); \ + V8_GET_THIS_INTERNAL_FIELD_UINT32(2, portalIndex); \ + auto interior = alt::ICore::Instance().GetInterior(interiorId); \ + V8_CHECK(interior, "interior doesn't exist"); \ + std::shared_ptr portal = interior->GetPortalByIndex(portalIndex); \ + V8_CHECK(portal, "interior portal doesn't exist") + +#define GET_THIS_INTERIOR_ROOM(val) \ + V8_GET_ISOLATE_CONTEXT(); \ + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); \ + V8_GET_THIS_INTERNAL_FIELD_UINT32(2, roomIndex); \ + auto interior = alt::ICore::Instance().GetInterior(interiorId); \ + V8_CHECK(interior, "interior doesn't exist"); \ + std::shared_ptr val = interior->GetRoomByIndex(roomIndex); \ + V8_CHECK(val, "interior room doesn't exist") + +#define INTERIOR_EXTENT_TO_OBJECT(extentInfo, val) \ + v8::Local val = v8::Object::New(isolate); \ + val->Set(ctx, V8Helpers::JSValue("min"), resource->CreateVector3(extentInfo.min)); \ + val->Set(ctx, V8Helpers::JSValue("max"), resource->CreateVector3(extentInfo.max)); \ From 6492b151554d8512712cd51ff1f31eabeef62540 Mon Sep 17 00:00:00 2001 From: Till Schreiber Date: Thu, 14 Nov 2024 15:11:12 +0100 Subject: [PATCH 2/5] ALTV-502 - Add DamageType --- server/src/bindings/Main.cpp | 1 + shared/deps/cpp-sdk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/bindings/Main.cpp b/server/src/bindings/Main.cpp index fd23028e..5d66483d 100644 --- a/server/src/bindings/Main.cpp +++ b/server/src/bindings/Main.cpp @@ -584,6 +584,7 @@ static void GetWeaponModelByHash(const v8::FunctionCallbackInfo& info infoObj->Set(ctx, V8Helpers::JSValue("skillAbove50MaxAmmoMp"), V8Helpers::JSValue(modelInfo.skillAbove50MaxAmmoMp)); infoObj->Set(ctx, V8Helpers::JSValue("maxSkillMaxAmmoMp"), V8Helpers::JSValue(modelInfo.maxSkillMaxAmmoMp)); infoObj->Set(ctx, V8Helpers::JSValue("bonusMaxAmmoMp"), V8Helpers::JSValue(modelInfo.bonusMaxAmmoMp)); + infoObj->Set(ctx, V8Helpers::JSValue("damageType"), V8Helpers::JSValue(modelInfo.damageType)); V8_RETURN(infoObj); } diff --git a/shared/deps/cpp-sdk b/shared/deps/cpp-sdk index 1c7ace86..e2966f42 160000 --- a/shared/deps/cpp-sdk +++ b/shared/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit 1c7ace86d575b156f098ba5f0ca01128536502c5 +Subproject commit e2966f42c4509f6a6836c18b9766c26ef23a87af From 8bb66e74b0918d89d465e4ca15f3be63e77126a8 Mon Sep 17 00:00:00 2001 From: xshady <54737754+xxshady@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:31:04 +0300 Subject: [PATCH 3/5] Interior API additions (#332) * chore(client): remove unneeded check it's checked after `if` anyway * feat(client): add Interior id getter * fix(client): InteriorPortal constructor * fix(client): typo * fix(client): id getter --- client/src/bindings/Interior.cpp | 8 ++++++++ client/src/bindings/InteriorPortal.cpp | 10 +++++----- client/src/bindings/InteriorRoom.cpp | 1 - 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/client/src/bindings/Interior.cpp b/client/src/bindings/Interior.cpp index 08c1f8b1..051b9fc4 100644 --- a/client/src/bindings/Interior.cpp +++ b/client/src/bindings/Interior.cpp @@ -138,6 +138,13 @@ static void GetPortalByIndex(const v8::FunctionCallbackInfo& info) V8_RETURN(v8InteriorPortal.New(isolate->GetEnteredOrMicrotaskContext(), args)); } +static void IdGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId); + V8_RETURN_UINT(interiorId); +} + extern V8Class v8Interior("Interior", Constructor, [](v8::Local tpl) @@ -155,6 +162,7 @@ extern V8Class v8Interior("Interior", V8Helpers::SetAccessor(isolate, tpl, "pos", &PositionGetter); V8Helpers::SetAccessor(isolate, tpl, "rot", &RotationGetter); V8Helpers::SetAccessor(isolate, tpl, "entitiesExtents", &EntitiesExtentsGetter); + V8Helpers::SetAccessor(isolate, tpl, "id", &IdGetter); V8Helpers::SetStaticMethod(isolate, tpl, "getForInteriorID", &GetForInteriorID); }); diff --git a/client/src/bindings/InteriorPortal.cpp b/client/src/bindings/InteriorPortal.cpp index 0bb929b5..58c62cbb 100644 --- a/client/src/bindings/InteriorPortal.cpp +++ b/client/src/bindings/InteriorPortal.cpp @@ -5,14 +5,14 @@ static void Constructor(const v8::FunctionCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_CHECK_CONSTRUCTOR() + V8_CHECK_CONSTRUCTOR(); - V8_CHECK_ARGS_LEN(3) - V8_ARG_TO_UINT(1, interiorId) - V8_ARG_TO_UINT(2, portalIndex) + V8_CHECK_ARGS_LEN(2); + V8_ARG_TO_UINT(1, interiorId); + V8_ARG_TO_UINT(2, portalIndex); std::shared_ptr interior = alt::ICore::Instance().GetInterior(interiorId); - V8_CHECK(interior, "interior doesn't exist") + V8_CHECK(interior, "interior doesn't exist"); std::shared_ptr portal = interior->GetPortalByIndex(portalIndex); V8_CHECK(portal, "interior portal doesn't exist"); diff --git a/client/src/bindings/InteriorRoom.cpp b/client/src/bindings/InteriorRoom.cpp index ef19a595..c5bd1644 100644 --- a/client/src/bindings/InteriorRoom.cpp +++ b/client/src/bindings/InteriorRoom.cpp @@ -19,7 +19,6 @@ static void Constructor(const v8::FunctionCallbackInfo& info) if(isIndex) { room = interior->GetRoomByIndex(value); - V8_CHECK(room, "interior room doesn't exist"); } else { From 48c4f7181dd19160f37ec9aa1eb7fb77697d7029 Mon Sep 17 00:00:00 2001 From: xshady <54737754+xxshady@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:39:33 +0300 Subject: [PATCH 4/5] feat(client): add InteriorPortal entityCount (#333) --- client/src/bindings/InteriorPortal.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/src/bindings/InteriorPortal.cpp b/client/src/bindings/InteriorPortal.cpp index 58c62cbb..a461f209 100644 --- a/client/src/bindings/InteriorPortal.cpp +++ b/client/src/bindings/InteriorPortal.cpp @@ -141,6 +141,13 @@ static void GetCornerPos(const v8::FunctionCallbackInfo& info) } +static void EntityCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) +{ + GET_THIS_INTERIOR_PORTAL(portal); + + V8_RETURN_UINT(portal->GetEntityCount()); +} + static void SetCornerPos(const v8::FunctionCallbackInfo& info) { GET_THIS_INTERIOR_PORTAL(portal); @@ -165,6 +172,7 @@ extern V8Class v8InteriorPortal("InteriorPortal", V8Helpers::SetAccessor(isolate, tpl, "roomFrom", &RoomFromGetter, &RoomFromSetter); V8Helpers::SetAccessor(isolate, tpl, "roomTo", &RoomToGetter, &RoomToSetter); V8Helpers::SetAccessor(isolate, tpl, "flag", &FlagGetter, &FlagSetter); + V8Helpers::SetAccessor(isolate, tpl, "entityCount", &EntityCountGetter); V8Helpers::SetMethod(isolate, tpl, "getCornerPos", &GetCornerPos); V8Helpers::SetMethod(isolate, tpl, "getEntityArchetype", &GetEntityArchetype); From bac7246dc6543170ceab5ef38126b3af7155e63c Mon Sep 17 00:00:00 2001 From: Till Schreiber Date: Tue, 19 Nov 2024 12:37:24 +0100 Subject: [PATCH 5/5] ALTV-520 - update sdk --- shared/deps/cpp-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/deps/cpp-sdk b/shared/deps/cpp-sdk index e2966f42..f18e52bb 160000 --- a/shared/deps/cpp-sdk +++ b/shared/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit e2966f42c4509f6a6836c18b9766c26ef23a87af +Subproject commit f18e52bbb7fd9cc57efa66f6c40449b41cdc13a0