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/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/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..e2966f42 160000 --- a/shared/deps/cpp-sdk +++ b/shared/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit b7825258fafcb6d9aa3906b41e27cfe2d8bf93af +Subproject commit e2966f42c4509f6a6836c18b9766c26ef23a87af 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)); \