diff --git a/client/src/bindings/ClientBindingsMain.cpp b/client/src/bindings/ClientBindingsMain.cpp index c646b481..9f1b96b8 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, v8Interior; + v8LocalPed, v8LocalVehicle, v8Font, v8WeaponObject, v8AudioOutput, v8AudioOutputFrontend, v8AudioOutputWorld, v8AudioOutputAttached, v8AudioCategory, v8Interior, v8InteriorRoom; extern V8Module altModule("alt", &sharedModule, { v8Player, @@ -1409,7 +1409,8 @@ extern V8Module altModule("alt", v8AudioOutputWorld, v8AudioOutputAttached, v8AudioCategory, - v8Interior }, + v8Interior, + v8InteriorRoom }, [](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 index 06b43c3a..a494b99a 100644 --- a/client/src/bindings/Interior.cpp +++ b/client/src/bindings/Interior.cpp @@ -4,28 +4,24 @@ static void Constructor(const v8::FunctionCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_CHECK_CONSTRUCTOR(); + V8_CHECK_CONSTRUCTOR() - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, interiorId); + 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"); + V8_CHECK(interior, "interior doesn't exist") - v8::Local interiorRef = v8::External::New(isolate, new std::weak_ptr(interior)); - - v8::Persistent persistent(isolate, info.This()); - persistent.SetWeak(); - - info.This()->SetInternalField(1, interiorRef); + 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); + V8_CHECK_ARGS_LEN(1) + V8_ARG_TO_UINT(1, interiorId) std::vector> args{ V8Helpers::JSValue(interiorId) }; @@ -33,60 +29,59 @@ static void GetForInteriorID(const v8::FunctionCallbackInfo& info) V8_RETURN(v8Interior.New(isolate->GetEnteredOrMicrotaskContext(), args)); } -static void GetRoomIndexByHash(const v8::FunctionCallbackInfo& info) +static void RoomCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, hash); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - V8_RETURN_INT(interior->GetRoomIndexByHash(hash)); + V8_RETURN_UINT(interior->GetRoomCount()); } -static void GetRoomName(const v8::FunctionCallbackInfo& info) +static void PortalCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, roomIndex); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - V8_RETURN_STRING(interior->GetRoomName(roomIndex)); + V8_RETURN_UINT(interior->GetPortalCount()); } -static void GetRoomFlag(const v8::FunctionCallbackInfo& info) +static void PositionGetter(v8::Local, const v8::PropertyCallbackInfo& info) { - V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_ISOLATE_CONTEXT_RESOURCE() + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, roomIndex); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - V8_RETURN_INT(interior->GetRoomFlag(roomIndex)); + V8_RETURN_VECTOR3(interior->GetPosition()); } -static void SetRoomFlag(const v8::FunctionCallbackInfo& info) +static void RotationGetter(v8::Local, const v8::PropertyCallbackInfo& info) { - V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_ISOLATE_CONTEXT_RESOURCE() + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, roomIndex); - V8_ARG_TO_UINT(1, roomFlag); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - interior->SetRoomFlag(roomIndex, roomFlag); + V8_RETURN_VECTOR3(interior->GetRotation()); } -static void GetRoomExtents(const v8::FunctionCallbackInfo& info) +static void EntitiesExtentsGetter(v8::Local, const v8::PropertyCallbackInfo& info) { - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_ISOLATE_CONTEXT_RESOURCE() + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, roomId); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - auto extentInfo = interior->GetRoomExtents(roomId); + auto extentInfo = interior->GetEntitiesExtents(); v8::Local obj = v8::Object::New(isolate); obj->Set(ctx, V8Helpers::JSValue("min"), resource->CreateVector3(extentInfo.min)); @@ -94,215 +89,57 @@ static void GetRoomExtents(const v8::FunctionCallbackInfo& info) V8_RETURN(obj); } -static void SetRoomExtents(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(3); - V8_ARG_TO_UINT(1, roomIndex); - V8_ARG_TO_VECTOR3(2, min); - V8_ARG_TO_VECTOR3(3, max); - - interior->SetRoomExtents(roomIndex, { min, max }); -} - -static void GetRoomTimecycle(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, roomIndex); - - V8_RETURN_UINT(interior->GetRoomTimecycle(roomIndex)); -} - -static void SetRoomTimecycle(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, roomIndex); - V8_ARG_TO_UINT(2, timecycleHash); - - interior->SetRoomTimecycle(roomIndex, timecycleHash); -} - -static void GetPortalCornerPosition(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, portalIndex); - V8_ARG_TO_UINT(2, cornerIndex); - - V8_RETURN_VECTOR3(interior->GetPortalCornerPosition(portalIndex, cornerIndex)); -} - -static void SetPortalCornerPosition(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(3); - V8_ARG_TO_UINT(1, portalIndex); - V8_ARG_TO_UINT(2, cornerIndex); - V8_ARG_TO_VECTOR3(3, position); - - interior->SetPortalCornerPosition(portalIndex, cornerIndex, position); -} - -static void GetPortalRoomFrom(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, portalIndex); - - V8_RETURN_INT(interior->GetPortalRoomFrom(portalIndex)); -} - -static void SetPortalRoomFrom(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, portalIndex); - V8_ARG_TO_INT(2, roomFrom); - - interior->SetPortalRoomFrom(portalIndex, roomFrom); -} - -static void GetPortalRoomTo(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, portalIndex); - - V8_RETURN_INT(interior->GetPortalRoomTo(portalIndex)); -} - -static void SetPortalRoomTo(const v8::FunctionCallbackInfo& info) +static void GetRoomByHash(const v8::FunctionCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, portalIndex); - V8_ARG_TO_INT(2, roomTo); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - interior->SetPortalRoomTo(portalIndex, roomTo); -} + V8_CHECK_ARGS_LEN(1) + V8_ARG_TO_UINT(1, roomHash) -static void GetPortalFlag(const v8::FunctionCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + std::vector> args{ V8Helpers::JSValue(interiorId), V8Helpers::JSValue(roomHash), V8Helpers::JSValue(false) }; - V8_CHECK_ARGS_LEN(1); - V8_ARG_TO_UINT(1, portalIndex); - - V8_RETURN_INT(interior->GetPortalFlag(portalIndex)); + extern V8Class v8InteriorRoom; + V8_RETURN(v8InteriorRoom.New(isolate->GetEnteredOrMicrotaskContext(), args)); } -static void SetPortalFlag(const v8::FunctionCallbackInfo& info) +static void GetRoomByIndex(const v8::FunctionCallbackInfo& info) { V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_CHECK_ARGS_LEN(2); - V8_ARG_TO_UINT(1, portalIndex); - V8_ARG_TO_INT(2, flag); - - interior->SetPortalFlag(portalIndex, flag); -} - -static void RoomCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_RETURN_UINT(interior->GetRoomCount()); -} - -static void PortalCountGetter(v8::Local, const v8::PropertyCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - V8_RETURN_UINT(interior->GetPortalCount()); -} + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) -static void PositionGetter(v8::Local, const v8::PropertyCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + auto interior = alt::ICore::Instance().GetInterior(interiorId); + V8_CHECK(interior, "interior doesn't exist") - V8_RETURN_VECTOR3(interior->GetPosition()); -} + V8_CHECK_ARGS_LEN(1) + V8_ARG_TO_UINT(1, roomIndex) -static void RotationGetter(v8::Local, const v8::PropertyCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); + std::vector> args{ V8Helpers::JSValue(interiorId), V8Helpers::JSValue(roomIndex), V8Helpers::JSValue(true) }; - V8_RETURN_VECTOR3(interior->GetRotation()); + extern V8Class v8InteriorRoom; + V8_RETURN(v8InteriorRoom.New(isolate->GetEnteredOrMicrotaskContext(), args)); } -static void EntitiesExtentsGetter(v8::Local, const v8::PropertyCallbackInfo& info) -{ - V8_GET_ISOLATE_CONTEXT_RESOURCE(); - V8_GET_THIS_INTERNAL_FIELD_EXTERNAL(1, interior, alt::IInterior); - - auto extentInfo = interior->GetEntitiesExtents(); - - v8::Local obj = v8::Object::New(isolate); - obj->Set(ctx, V8Helpers::JSValue("min"), resource->CreateVector3(extentInfo.min)); - obj->Set(ctx, V8Helpers::JSValue("max"), resource->CreateVector3(extentInfo.max)); - V8_RETURN(obj); -} - -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, "getRoomIndexByHash", &GetRoomIndexByHash); - V8Helpers::SetMethod(isolate, tpl, "getRoomName", &GetRoomName); - - V8Helpers::SetMethod(isolate, tpl, "getRoomFlag", &GetRoomFlag); - V8Helpers::SetMethod(isolate, tpl, "setRoomFlag", &SetRoomFlag); - - V8Helpers::SetMethod(isolate, tpl, "getRoomExtents", &GetRoomExtents); - V8Helpers::SetMethod(isolate, tpl, "setRoomExtents", &SetRoomExtents); - - V8Helpers::SetMethod(isolate, tpl, "getRoomTimecycle", &GetRoomTimecycle); - V8Helpers::SetMethod(isolate, tpl, "setRoomTimecycle", &SetRoomTimecycle); - - V8Helpers::SetMethod(isolate, tpl, "getPortalCornerPosition", &GetPortalCornerPosition); - V8Helpers::SetMethod(isolate, tpl, "setPortalCornerPosition", &SetPortalCornerPosition); - - V8Helpers::SetMethod(isolate, tpl, "getPortalRoomFrom", &GetPortalRoomFrom); - V8Helpers::SetMethod(isolate, tpl, "setPortalRoomFrom", &SetPortalRoomFrom); +extern V8Class v8Interior("Interior", + Constructor, + [](v8::Local tpl) + { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); - V8Helpers::SetMethod(isolate, tpl, "getPortalRoomTo", &GetPortalRoomTo); - V8Helpers::SetMethod(isolate, tpl, "setPortalRoomTo", &SetPortalRoomTo); + tpl->InstanceTemplate()->SetInternalFieldCount(static_cast(V8Class::InternalFields::COUNT)); - V8Helpers::SetMethod(isolate, tpl, "getPortalFlag", &GetPortalFlag); - V8Helpers::SetMethod(isolate, tpl, "setPortalFlag", &SetPortalFlag); + 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::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); -}); + V8Helpers::SetStaticMethod(isolate, tpl, "getForInteriorID", &GetForInteriorID); + }); diff --git a/client/src/bindings/InteriorRoom.cpp b/client/src/bindings/InteriorRoom.cpp new file mode 100644 index 00000000..de1e7be5 --- /dev/null +++ b/client/src/bindings/InteriorRoom.cpp @@ -0,0 +1,67 @@ +#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") + + if(isIndex) + { + std::shared_ptr room = interior->GetRoomByIndex(value); + V8_CHECK(interior, "room doesn't exist") + } + else + { + std::shared_ptr room = interior->GetRoomByHash(value); + V8_CHECK(interior, "room doesn't exist") + } + + V8Helpers::SetObjectClass(info.GetIsolate(), info.This(), V8Class::ObjectClass::INTERIOR_ROOM); + info.This()->SetInternalField(1, info[0]); + info.This()->SetInternalField(2, info[1]); + info.This()->SetInternalField(3, info[2]); +} + +static void GetRoomName(v8::Local, const v8::PropertyCallbackInfo& info) +{ + V8_GET_ISOLATE_CONTEXT(); + V8_GET_THIS_INTERNAL_FIELD_UINT32(1, interiorId) + V8_GET_THIS_INTERNAL_FIELD_UINT32(2, value) + V8_GET_THIS_INTERNAL_FIELD_BOOLEAN(3, isIndex) + + auto 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(interior, "room doesn't exist") + } + else + { + room = interior->GetRoomByHash(value); + V8_CHECK(interior, "room doesn't exist") + } + + V8_RETURN_STRING(room->GetName()); +} + +extern V8Class v8InteriorRoom("InteriorRoom", + Constructor, + [](v8::Local tpl) + { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + tpl->InstanceTemplate()->SetInternalFieldCount(4); + V8Helpers::SetAccessor(isolate, tpl, "name", &GetRoomName); + }); diff --git a/shared/V8Class.h b/shared/V8Class.h index c38c47b2..d4e3708f 100644 --- a/shared/V8Class.h +++ b/shared/V8Class.h @@ -44,6 +44,8 @@ class V8Class 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 45a82a3a..aaa0a1c4 160000 --- a/shared/deps/cpp-sdk +++ b/shared/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit 45a82a3ae3cbed371a46f6390db261377a59693d +Subproject commit aaa0a1c40cf7a1cbb9e4043b9f157159d9727009 diff --git a/shared/helpers/Macros.h b/shared/helpers/Macros.h index b0604b5c..26f965a4 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();