forked from gcdsfh/PMDT
first submle
This commit is contained in:
Executable
+39
@@ -0,0 +1,39 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libdobby
|
||||
LOCAL_SRC_FILES := Dobby/libdobby.a
|
||||
include $(PREBUILT_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := HOOK
|
||||
LOCAL_SRC_FILES := \
|
||||
主程序.cpp \
|
||||
imgui/imgui.cpp \
|
||||
imgui/imgui_draw.cpp \
|
||||
imgui/imgui_tables.cpp \
|
||||
imgui/imgui_widgets.cpp \
|
||||
imgui/imgui_impl_android.cpp \
|
||||
imgui/imgui_impl_opengl3.cpp \
|
||||
android_native_app_glue.c \
|
||||
结构体/数据/SDK/PUBGM_Basic.cpp \
|
||||
结构体/数据/SDK/PUBGM_Basic_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_CoreUObject_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_Engine_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_ShadowTrackerExtra_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_UnrealArchExt_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_Gameplay_functions.cpp \
|
||||
结构体/数据/SDK/PUBGM_Client_functions.cpp \
|
||||
|
||||
LOCAL_CFLAGS := -w -s -Wno-error=format-security -fvisibility=hidden -fpermissive -fexceptions
|
||||
LOCAL_CPPFLAGS := -w -s -Wno-error=format-security -fvisibility=hidden -std=c++17
|
||||
LOCAL_CPPFLAGS += -Wno-error=c++11-narrowing -fpermissive -Wall -fexceptions
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/imgui
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/App
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/SDK
|
||||
LOCAL_LDFLAGS := -Wl,--gc-sections,--strip-all
|
||||
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM -lGLESv2 -lGLESv3 -lm -ldl -lz
|
||||
LOCAL_STATIC_LIBRARIES := libdobby
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
$(call import-module,android/native_app_glue)
|
||||
Executable
+6
@@ -0,0 +1,6 @@
|
||||
APP_ABI := armeabi-v7a
|
||||
APP_PLATFORM := android-21
|
||||
APP_STL := c++_static
|
||||
|
||||
# 设置优化模式为 release 或 debug
|
||||
APP_OPTIM := release # 可选值:release 或 debug
|
||||
Executable
BIN
Binary file not shown.
@@ -0,0 +1,871 @@
|
||||
#define W2S(w, s) UGameplayStatics::ProjectWorldToScreen(localController, w, true, s)
|
||||
|
||||
// 辅助函数:检查是否应该跳过该玩家
|
||||
bool ShouldSkipPlayer(ASTExtraPlayerCharacter* Player, ASTExtraPlayerController* localController, ASTExtraPlayerCharacter* localPlayer) {
|
||||
float Distance = localPlayer->GetDistanceTo(Player) / 100.0f;
|
||||
|
||||
// 跳过条件
|
||||
if (Distance > 600.0f) return true;
|
||||
if (Player->PlayerKey == localController->PlayerKey) return true;
|
||||
if (Player->bDead) return true;
|
||||
if (Config.PlayerESP.NoBot && Player->bIsAI) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// 辅助函数:绘制iOS风格预警指示器
|
||||
void DrawAlertIndicator(ImDrawList* draw, ASTExtraPlayerCharacter* Player,
|
||||
ASTExtraPlayerCharacter* localPlayer,
|
||||
ASTExtraPlayerController* localController,
|
||||
ImColor borderColor, ImColor fillColor,
|
||||
int screenWidth, int screenHeight) {
|
||||
FVector MyPosition, EnemyPosition;
|
||||
|
||||
// 获取位置
|
||||
ASTExtraVehicleBase* CurrentVehiclea = Player->CurrentVehicle;
|
||||
if (CurrentVehiclea) {
|
||||
MyPosition = CurrentVehiclea->RootComponent->RelativeLocation;
|
||||
} else {
|
||||
MyPosition = Player->RootComponent->RelativeLocation;
|
||||
}
|
||||
|
||||
ASTExtraVehicleBase* CurrentVehicle = localPlayer->CurrentVehicle;
|
||||
if (CurrentVehicle) {
|
||||
EnemyPosition = CurrentVehicle->RootComponent->RelativeLocation;
|
||||
} else {
|
||||
EnemyPosition = localPlayer->RootComponent->RelativeLocation;
|
||||
}
|
||||
|
||||
// 计算雷达位置
|
||||
bool shit = false;
|
||||
FVector EntityPos = WorldToRadar(localController->PlayerCameraManager->CameraCache.POV.Rotation.Yaw,
|
||||
MyPosition, EnemyPosition, NULL, NULL,
|
||||
Vector3(screenWidth, screenHeight, 0), shit);
|
||||
|
||||
// 计算角度
|
||||
FVector angle = FVector();
|
||||
Vector3 forward = Vector3((float)(screenWidth / 2) - EntityPos.X,
|
||||
(float)(screenHeight / 2) - EntityPos.Y, 0.0f);
|
||||
VectorAnglesRadar(forward, angle);
|
||||
|
||||
// 绘制iOS风格三角形指示器
|
||||
const auto angle_yaw_rad = DEG2RAD(angle.Y + 180.f);
|
||||
const auto new_point_x = (screenWidth / 2) + 55 * 4 * cosf(angle_yaw_rad);
|
||||
const auto new_point_y = (screenHeight / 2) + 55 * 4 * sinf(angle_yaw_rad);
|
||||
|
||||
std::array<Vector3, 3> points {
|
||||
Vector3(new_point_x - 12, new_point_y - 12, 0.f),
|
||||
Vector3(new_point_x + 12, new_point_y, 0.f),
|
||||
Vector3(new_point_x - 12, new_point_y + 12, 0.f)
|
||||
};
|
||||
|
||||
RotateTriangle(points, angle.Y + 180.f);
|
||||
|
||||
// iOS风格渐变填充
|
||||
draw->AddTriangleFilled(ImVec2(points.at(0).X, points.at(0).Y),
|
||||
ImVec2(points.at(1).X, points.at(1).Y),
|
||||
ImVec2(points.at(2).X, points.at(2).Y),
|
||||
fillColor);
|
||||
|
||||
// 细边框
|
||||
draw->AddTriangle(ImVec2(points.at(0).X, points.at(0).Y),
|
||||
ImVec2(points.at(1).X, points.at(1).Y),
|
||||
ImVec2(points.at(2).X, points.at(2).Y),
|
||||
borderColor, 1.0f);
|
||||
}
|
||||
|
||||
// 辅助函数:绘制iOS风格玩家方框
|
||||
void DrawPlayerBox(ImDrawList* draw, ImVec2 headPos, ImVec2 rootPos, ImColor color, bool isMonster = false) {
|
||||
if (isMonster) {
|
||||
// 怪物方框:更大,填满怪物
|
||||
float boxHeight = abs(headPos.y - rootPos.y) * 1.5f; // 怪物更高
|
||||
float boxWidth = boxHeight * 0.8f; // 怪物更宽
|
||||
|
||||
// 调整怪物方框位置,确保居中
|
||||
float centerY = headPos.y - (headPos.y - rootPos.y) / 2.0f;
|
||||
ImVec2 boxTop = ImVec2(headPos.x - (boxWidth / 2), centerY - boxHeight / 2);
|
||||
ImVec2 boxBottom = ImVec2(headPos.x + (boxWidth / 2), centerY + boxHeight / 2);
|
||||
|
||||
// 怪物使用更醒目的方框
|
||||
draw->AddRectFilled(boxTop, boxBottom,
|
||||
IM_COL32((int)(color.Value.x * 255), (int)(color.Value.y * 255),
|
||||
(int)(color.Value.z * 255), 30),
|
||||
4.0f);
|
||||
draw->AddRect(boxTop, boxBottom, color, 4.0f, ImDrawFlags_RoundCornersAll, 2.5f);
|
||||
} else {
|
||||
// 玩家方框:iOS风格
|
||||
float boxHeight = abs(headPos.y - rootPos.y);
|
||||
float boxWidth = boxHeight * 0.6f;
|
||||
|
||||
ImVec2 boxTop = ImVec2(headPos.x - (boxWidth / 2), headPos.y);
|
||||
ImVec2 boxBottom = ImVec2(headPos.x + (boxWidth / 2), rootPos.y);
|
||||
|
||||
// iOS风格半透明填充
|
||||
draw->AddRectFilled(boxTop, boxBottom,
|
||||
IM_COL32((int)(color.Value.x * 255), (int)(color.Value.y * 255),
|
||||
(int)(color.Value.z * 255), 20),
|
||||
4.0f);
|
||||
// iOS风格细边框
|
||||
draw->AddRect(boxTop, boxBottom, color, 4.0f, ImDrawFlags_RoundCornersAll, 1.5f);
|
||||
}
|
||||
}
|
||||
|
||||
// 辅助函数:绘制iOS风格血量条
|
||||
void DrawHealthBar(ImDrawList* draw, ASTExtraPlayerCharacter* Player,
|
||||
ImVec2 headPosSC, ASTExtraPlayerController* localController,
|
||||
FVector HeadPos, bool isMonster = false) {
|
||||
float PercentHP = (Player->Health / Player->HealthMax) * 100;
|
||||
|
||||
// 调整血条大小
|
||||
float barWidth, barHeight, barX, barY;
|
||||
|
||||
if (isMonster) {
|
||||
// 怪物血条:更大
|
||||
barWidth = 80.0f;
|
||||
barHeight = 8.0f;
|
||||
} else {
|
||||
// 玩家血条
|
||||
barWidth = 60.0f;
|
||||
barHeight = 6.0f;
|
||||
}
|
||||
|
||||
barX = headPosSC.x - barWidth / 2;
|
||||
barY = headPosSC.y - 25.0f; // 调整位置,为玩家信息留出空间
|
||||
|
||||
// iOS风格毛玻璃背景
|
||||
draw->AddRectFilled(ImVec2(barX, barY),
|
||||
ImVec2(barX + barWidth, barY + barHeight),
|
||||
ImColor(40, 40, 40, 200), barHeight / 2);
|
||||
|
||||
// 计算血量颜色
|
||||
ImColor healthColor;
|
||||
if (!localController->LineOfSightTo(localController->PlayerCameraManager, HeadPos, true)) {
|
||||
healthColor = ImColor(0, 122, 255, 220); // iOS蓝色
|
||||
} else {
|
||||
// 根据血量渐变
|
||||
if (PercentHP > 70) healthColor = ImColor(52, 199, 89, 220); // iOS绿色
|
||||
else if (PercentHP > 30) healthColor = ImColor(255, 149, 0, 220); // iOS橙色
|
||||
else healthColor = ImColor(255, 59, 48, 220); // iOS红色
|
||||
}
|
||||
|
||||
// 血量填充
|
||||
float fillWidth = (barWidth * PercentHP) / 100.0f;
|
||||
if (fillWidth > 0) {
|
||||
draw->AddRectFilled(ImVec2(barX, barY),
|
||||
ImVec2(barX + fillWidth, barY + barHeight),
|
||||
healthColor, barHeight / 2);
|
||||
}
|
||||
|
||||
// 细边框
|
||||
draw->AddRect(ImVec2(barX, barY),
|
||||
ImVec2(barX + barWidth, barY + barHeight),
|
||||
ImColor(255, 255, 255, 80), barHeight / 2, 0, 0.8f);
|
||||
}
|
||||
|
||||
// 辅助函数:绘制iOS风格玩家信息
|
||||
void DrawPlayerInfo(ImDrawList* draw, ASTExtraPlayerCharacter* Player,
|
||||
ImVec2 headPosSC, ImVec2 rootPosSC, float Distance, bool isMonster = false) {
|
||||
// iOS风格字体和颜色
|
||||
ImColor textColor = ImColor(255, 255, 255, 240);
|
||||
ImColor shadowColor = ImColor(0, 0, 0, 180);
|
||||
float fontSize = isMonster ? 18.0f : 16.0f;
|
||||
|
||||
// 1. 显示玩家指针(调试用)
|
||||
if (世界) {
|
||||
auto MySelf = getPointer(getPointer(UE4 + 0x4634ef0) + 0x0) + 0x20;
|
||||
char extra[50];
|
||||
sprintf(extra, "%p", MySelf);
|
||||
绘制加粗文本(22, headPosSC.x, headPosSC.y + 10, textColor, shadowColor, extra);
|
||||
}
|
||||
|
||||
// 2. 显示玩家名称和类型(带背景)
|
||||
if (Config.PlayerESP.名字) {
|
||||
std::string info;
|
||||
|
||||
if (isMonster) {
|
||||
info = "年兽";
|
||||
} else if (Player->bIsAI) {
|
||||
info = "AI";
|
||||
} else {
|
||||
info = "玩家";
|
||||
}
|
||||
|
||||
// 添加队伍ID
|
||||
info = std::to_string((int)Player->TeamID) + " · " + info;
|
||||
|
||||
auto textSize = ImGui::CalcTextSize(info.c_str());
|
||||
|
||||
// iOS风格文本背景
|
||||
float padding = 6.0f;
|
||||
ImVec2 textPos = ImVec2(headPosSC.x - (textSize.x / 2.0f), headPosSC.y - 35.0f);
|
||||
ImVec2 bgMin = ImVec2(textPos.x - padding, textPos.y - padding/2);
|
||||
ImVec2 bgMax = ImVec2(textPos.x + textSize.x + padding, textPos.y + textSize.y + padding/2);
|
||||
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 160), 6.0f);
|
||||
|
||||
// 绘制文本
|
||||
绘制加粗文本(fontSize, textPos.x, textPos.y, textColor, shadowColor, info.c_str());
|
||||
}
|
||||
|
||||
// 3. 显示距离(带背景)
|
||||
if (Config.PlayerESP.距离) {
|
||||
std::string distanceStr = std::to_string((int)Distance) + "M";
|
||||
|
||||
auto textSize = ImGui::CalcTextSize(distanceStr.c_str());
|
||||
|
||||
// iOS风格文本背景
|
||||
float padding = 4.0f;
|
||||
ImVec2 textPos = ImVec2(rootPosSC.x - (textSize.x / 2.0f), rootPosSC.y + 5.0f);
|
||||
ImVec2 bgMin = ImVec2(textPos.x - padding, textPos.y - padding/2);
|
||||
ImVec2 bgMax = ImVec2(textPos.x + textSize.x + padding, textPos.y + textSize.y + padding/2);
|
||||
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 160), 4.0f);
|
||||
|
||||
// 绘制文本
|
||||
ImColor distanceColor = isMonster ? ImColor(255, 149, 0, 240) : ImColor(0, 122, 255, 240);
|
||||
绘制加粗文本(fontSize-2, textPos.x, textPos.y, distanceColor, shadowColor, distanceStr.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// 辅助函数:绘制玩家ESP(修复怪物绘制问题)
|
||||
void DrawPlayerESP(ImDrawList* draw, ASTExtraPlayerCharacter* Player,
|
||||
ASTExtraPlayerCharacter* localPlayer,
|
||||
ASTExtraPlayerController* localController,
|
||||
int screenWidth, int screenHeight) {
|
||||
|
||||
float Distance = localPlayer->GetDistanceTo(Player) / 100.0f;
|
||||
|
||||
// 特殊处理怪物(年兽)
|
||||
bool isMonster = (Player->bIsAI &&
|
||||
(Player->GetName().find("Monster") != std::string::npos ||
|
||||
Player->GetName().find("Beast") != std::string::npos ||
|
||||
Player->GetName().find("年兽") != std::string::npos));
|
||||
|
||||
// 1. 获取位置
|
||||
FVector HeadPos, RootPos;
|
||||
|
||||
if (isMonster) {
|
||||
// 对于怪物,使用更准确的位置计算
|
||||
HeadPos = Player->K2_GetActorLocation();
|
||||
HeadPos.Z += 180.0f; // 怪物高度调整
|
||||
RootPos = Player->K2_GetActorLocation();
|
||||
RootPos.Z -= 60.0f; // 怪物底部调整
|
||||
} else {
|
||||
// 正常玩家/人机
|
||||
HeadPos = Player->GetBonePos("Head");
|
||||
RootPos = Player->GetBonePos("Root");
|
||||
}
|
||||
|
||||
ImVec2 headPosSC, RootPosSC;
|
||||
|
||||
// 检查位置是否可见
|
||||
bool positionsVisible = W2S(HeadPos, (FVector2D*)&headPosSC) &&
|
||||
W2S(RootPos, (FVector2D*)&RootPosSC);
|
||||
|
||||
if (!positionsVisible) {
|
||||
// 如果不可见,尝试使用更简单的方法
|
||||
FVector actorPos = Player->K2_GetActorLocation();
|
||||
if (!W2S(actorPos, (FVector2D*)&headPosSC)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isMonster) {
|
||||
// 怪物:创建合适的方框高度
|
||||
RootPosSC = ImVec2(headPosSC.x, headPosSC.y + 100.0f);
|
||||
} else {
|
||||
RootPosSC = ImVec2(headPosSC.x, headPosSC.y + 50.0f);
|
||||
}
|
||||
}
|
||||
|
||||
// 调整怪物位置:确保方框正确居中
|
||||
if (isMonster) {
|
||||
// 调整头部位置,使方框更准确
|
||||
float boxHeight = abs(headPosSC.y - RootPosSC.y);
|
||||
headPosSC.y = headPosSC.y - boxHeight * 0.2f; // 向上调整
|
||||
}
|
||||
|
||||
// 2. 确定颜色
|
||||
bool IsVisible = localController->LineOfSightTo(Player, {0, 0, 0}, true);
|
||||
ImColor PlayerBoxClrCf, PlayerBoxClrCf2, SkeletonColor;
|
||||
|
||||
if (isMonster) {
|
||||
// 怪物使用特殊颜色
|
||||
PlayerBoxClrCf = ImColor(255, 149, 0, 255); // iOS橙色
|
||||
PlayerBoxClrCf2 = ImColor(255, 149, 0, 80);
|
||||
SkeletonColor = ImColor(255, 149, 0, 200);
|
||||
} else if (IsVisible) {
|
||||
if (Player->bIsAI) {
|
||||
PlayerBoxClrCf = ImColor(52, 199, 89, 255); // iOS绿色
|
||||
SkeletonColor = ImColor(52, 199, 89, 200);
|
||||
} else {
|
||||
PlayerBoxClrCf = ImColor(255, 59, 48, 255); // iOS红色
|
||||
SkeletonColor = ImColor(255, 59, 48, 200);
|
||||
}
|
||||
PlayerBoxClrCf2 = ImColor(IM_COL32((int)(PlayerBoxClrCf.Value.x * 255), (int)(PlayerBoxClrCf.Value.y * 255), (int)(PlayerBoxClrCf.Value.z * 255), 80));
|
||||
} else {
|
||||
PlayerBoxClrCf = ImColor(142, 142, 147, 255); // iOS灰色
|
||||
PlayerBoxClrCf2 = ImColor(142, 142, 147, 80);
|
||||
SkeletonColor = ImColor(142, 142, 147, 200);
|
||||
}
|
||||
|
||||
// 3. 绘制各种ESP元素
|
||||
// 3.1 预警指示器
|
||||
if (Config.PlayerESP.Alert) {
|
||||
DrawAlertIndicator(draw, Player, localPlayer, localController, PlayerBoxClrCf, PlayerBoxClrCf2, screenWidth, screenHeight);
|
||||
}
|
||||
|
||||
// 3.2 连线
|
||||
if (Config.PlayerESP.Line) {
|
||||
draw->AddLine(ImVec2((float)screenWidth / 2, (float)screenHeight / 8),
|
||||
ImVec2(headPosSC.x, headPosSC.y - 15.0f),
|
||||
PlayerBoxClrCf, 1.5f);
|
||||
}
|
||||
|
||||
// 3.3 方框
|
||||
if (Config.PlayerESP.Box) {
|
||||
DrawPlayerBox(draw, headPosSC, RootPosSC, PlayerBoxClrCf, isMonster);
|
||||
}
|
||||
|
||||
// 3.4 骨骼(仅对非怪物绘制)
|
||||
if (Config.PlayerESP.Skeleton && !isMonster) {
|
||||
// 获取其他骨骼位置
|
||||
ImVec2 upper_rPoSC, lowerarm_rPoSC, hand_rPoSC;
|
||||
ImVec2 upper_lPoSC, lowerarm_lSC, hand_lPoSC;
|
||||
ImVec2 thigh_lPoSC, calf_lPoSC, foot_lPoSC;
|
||||
ImVec2 thigh_rPoSC, calf_rPoSC, foot_rPoSC;
|
||||
ImVec2 neck_01PoSC, pelvisPoSC;
|
||||
|
||||
// 检查骨骼是否可见
|
||||
FVector bonePositions[] = {
|
||||
Player->GetBonePos("upperarm_r"), Player->GetBonePos("lowerarm_r"),
|
||||
Player->GetBonePos("hand_r"), Player->GetBonePos("upperarm_l"),
|
||||
Player->GetBonePos("lowerarm_l"), Player->GetBonePos("hand_l"),
|
||||
Player->GetBonePos("thigh_l"), Player->GetBonePos("calf_l"),
|
||||
Player->GetBonePos("foot_l"), Player->GetBonePos("thigh_r"),
|
||||
Player->GetBonePos("calf_r"), Player->GetBonePos("foot_r"),
|
||||
Player->GetBonePos("neck_01"), Player->GetBonePos("pelvis")
|
||||
};
|
||||
|
||||
if (W2S(bonePositions[0], (FVector2D*)&upper_rPoSC) &&
|
||||
W2S(bonePositions[1], (FVector2D*)&lowerarm_rPoSC) &&
|
||||
W2S(bonePositions[2], (FVector2D*)&hand_rPoSC) &&
|
||||
W2S(bonePositions[3], (FVector2D*)&upper_lPoSC) &&
|
||||
W2S(bonePositions[4], (FVector2D*)&lowerarm_lSC) &&
|
||||
W2S(bonePositions[5], (FVector2D*)&hand_lPoSC) &&
|
||||
W2S(bonePositions[6], (FVector2D*)&thigh_lPoSC) &&
|
||||
W2S(bonePositions[7], (FVector2D*)&calf_lPoSC) &&
|
||||
W2S(bonePositions[8], (FVector2D*)&foot_lPoSC) &&
|
||||
W2S(bonePositions[9], (FVector2D*)&thigh_rPoSC) &&
|
||||
W2S(bonePositions[10], (FVector2D*)&calf_rPoSC) &&
|
||||
W2S(bonePositions[11], (FVector2D*)&foot_rPoSC) &&
|
||||
W2S(bonePositions[12], (FVector2D*)&neck_01PoSC) &&
|
||||
W2S(bonePositions[13], (FVector2D*)&pelvisPoSC)) {
|
||||
|
||||
// 绘制骨骼连线
|
||||
draw->AddLine(upper_rPoSC, neck_01PoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(upper_lPoSC, neck_01PoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(upper_rPoSC, lowerarm_rPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(lowerarm_rPoSC, hand_rPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(upper_lPoSC, lowerarm_lSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(lowerarm_lSC, hand_lPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(thigh_rPoSC, thigh_lPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(thigh_lPoSC, calf_lPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(calf_lPoSC, foot_lPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(thigh_rPoSC, calf_rPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(calf_rPoSC, foot_rPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(neck_01PoSC, pelvisPoSC, SkeletonColor, 1.8f);
|
||||
draw->AddLine(neck_01PoSC, headPosSC, SkeletonColor, 1.8f);
|
||||
}
|
||||
}
|
||||
|
||||
// 3.5 血量条
|
||||
if (Config.PlayerESP.血量) {
|
||||
DrawHealthBar(draw, Player, headPosSC, localController, HeadPos, isMonster);
|
||||
}
|
||||
|
||||
// 3.6 玩家信息
|
||||
DrawPlayerInfo(draw, Player, headPosSC, RootPosSC, Distance, isMonster);
|
||||
}
|
||||
|
||||
// 武器相关辅助函数
|
||||
void ApplyWeaponDamageMultiplier(ASTExtraPlayerCharacter* localPlayer) {
|
||||
auto WeaponManagerComponent = localPlayer->WeaponManagerComponent;
|
||||
if (!WeaponManagerComponent) return;
|
||||
|
||||
auto propSlot = WeaponManagerComponent->GetCurrentUsingPropSlot();
|
||||
if ((int)propSlot.GetValue() < 1 || (int)propSlot.GetValue() > 3) return;
|
||||
|
||||
auto CurrentWeaponReplicated = (ASTExtraShootWeapon*)WeaponManagerComponent->CurrentWeaponReplicated;
|
||||
if (!CurrentWeaponReplicated) return;
|
||||
|
||||
auto ShootWeaponComponent = CurrentWeaponReplicated->ShootWeaponComponent;
|
||||
if (!ShootWeaponComponent) return;
|
||||
|
||||
UShootWeaponEntity* ShootWeaponEntityComponent = ShootWeaponComponent->ShootWeaponEntityComponent;
|
||||
if (!ShootWeaponEntityComponent) return;
|
||||
|
||||
ShootWeaponEntityComponent->BulletNumSingleShot = 50;
|
||||
}
|
||||
|
||||
void ApplyWeaponRecoilControl(ASTExtraPlayerCharacter* localPlayer) {
|
||||
auto WeaponManagerComponent = localPlayer->WeaponManagerComponent;
|
||||
if (!WeaponManagerComponent) return;
|
||||
|
||||
auto Slot = WeaponManagerComponent->GetCurrentUsingPropSlot();
|
||||
if ((int)Slot.GetValue() < 1 || (int)Slot.GetValue() > 3) return;
|
||||
|
||||
auto CurrentWeaponReplicated = (ASTExtraShootWeapon*)WeaponManagerComponent->CurrentWeaponReplicated;
|
||||
if (!CurrentWeaponReplicated) return;
|
||||
|
||||
auto ShootWeaponEntityComp = CurrentWeaponReplicated->ShootWeaponEntityComp;
|
||||
auto ShootWeaponEffectComp = CurrentWeaponReplicated->ShootWeaponEffectComp;
|
||||
|
||||
if (!ShootWeaponEntityComp || !ShootWeaponEffectComp) return;
|
||||
|
||||
// 重置后坐力
|
||||
memset(&ShootWeaponEntityComp->RecoilInfo, 0, sizeof(FSRecoilInfo));
|
||||
ShootWeaponEntityComp->AccessoriesVRecoilFactor = 0.0f;
|
||||
ShootWeaponEntityComp->AccessoriesHRecoilFactor = 0.0f;
|
||||
ShootWeaponEntityComp->AccessoriesRecoveryFactor = 0.0f;
|
||||
|
||||
// 重置偏差
|
||||
memset(&ShootWeaponEntityComp->DeviationInfo, 0, sizeof(FSDeviation));
|
||||
ShootWeaponEntityComp->ShotGunVerticalSpread = 0.0f;
|
||||
ShootWeaponEntityComp->ShotGunHorizontalSpread = 0.0f;
|
||||
ShootWeaponEntityComp->GameDeviationFactor = 0.0f;
|
||||
ShootWeaponEntityComp->GameDeviationAccuracy = 0.0f;
|
||||
|
||||
// 重置准星
|
||||
ShootWeaponEntityComp->CrossHairInitialSize = 0.0f;
|
||||
ShootWeaponEntityComp->CrossHairBurstSpeed = 0.0f;
|
||||
ShootWeaponEntityComp->CrossHairBurstIncreaseSpeed = 0.0f;
|
||||
ShootWeaponEntityComp->RecoilKickADS = 0.0f;
|
||||
|
||||
// 重置相机抖动
|
||||
ShootWeaponEffectComp->CameraShakeInnerRadius = 0.0f;
|
||||
ShootWeaponEffectComp->CameraShakeOuterRadius = 0.0f;
|
||||
ShootWeaponEffectComp->CameraShakFalloff = 0.0f;
|
||||
}
|
||||
|
||||
void ApplyWeaponScale(ASTExtraPlayerCharacter* localPlayer) {
|
||||
auto WeaponManagerComponent = localPlayer->WeaponManagerComponent;
|
||||
if (!WeaponManagerComponent) return;
|
||||
|
||||
auto Slot = WeaponManagerComponent->GetCurrentUsingPropSlot();
|
||||
if ((int)Slot.GetValue() < 1 || (int)Slot.GetValue() > 3) return;
|
||||
|
||||
auto CurrentWeaponReplicated = (ASTExtraShootWeapon*)WeaponManagerComponent->CurrentWeaponReplicated;
|
||||
if (!CurrentWeaponReplicated) return;
|
||||
|
||||
CurrentWeaponReplicated->RootComponent->RelativeScale3D.Y = Gun_Size;
|
||||
CurrentWeaponReplicated->RootComponent->RelativeScale3D.Z = Gun_Size;
|
||||
CurrentWeaponReplicated->RootComponent->RelativeScale3D.X = Gun_Size;
|
||||
}
|
||||
|
||||
void ApplyWeaponDamage(ASTExtraPlayerCharacter* localPlayer) {
|
||||
auto WeaponManagerComponent = localPlayer->WeaponManagerComponent;
|
||||
if (!WeaponManagerComponent) return;
|
||||
|
||||
auto Slot = WeaponManagerComponent->GetCurrentUsingPropSlot();
|
||||
if ((int)Slot.GetValue() < 1 || (int)Slot.GetValue() > 3) return;
|
||||
|
||||
auto CurrentWeaponReplicated = (ASTExtraShootWeapon*)WeaponManagerComponent->CurrentWeaponReplicated;
|
||||
if (!CurrentWeaponReplicated) return;
|
||||
|
||||
auto ShootWeaponEntityComp = CurrentWeaponReplicated->ShootWeaponEntityComp;
|
||||
if (!ShootWeaponEntityComp) return;
|
||||
|
||||
ShootWeaponEntityComp->BaseImpactDamage = 伤害值 * 伤害倍率;
|
||||
}
|
||||
|
||||
// 辅助函数:应用玩家功能
|
||||
void ApplyPlayerFeatures(ASTExtraPlayerCharacter* localPlayer,
|
||||
ASTExtraPlayerController* localController,
|
||||
int screenWidth, int screenHeight) {
|
||||
// 1. 高跳功能
|
||||
if (高跳) {
|
||||
UCharacterMovementComponent* CharacterMovement = localPlayer->CharacterMovement;
|
||||
if (CharacterMovement) {
|
||||
CharacterMovement->JumpZVelocity = 高度;
|
||||
CharacterMovement->GravityScale = 2.0f;
|
||||
CharacterMovement->MaxStepHeight = 999.9f;
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 人物旋转功能
|
||||
if (chongchongche) {
|
||||
USceneComponent* MeshContainer = g_LocalPlayer->MeshContainer;
|
||||
MeshContainer->RelativeRotation = {0, chongchongche1, 0};
|
||||
chongchongche1 += chongchongche2;
|
||||
if (chongchongche1 >= tocdoquay) chongchongche1 = 0.0f;
|
||||
chongchongche1 += 50;
|
||||
}
|
||||
|
||||
// 3. 人物缩放功能
|
||||
if (人物变大) {
|
||||
USceneComponent* MeshContainer = g_LocalPlayer->MeshContainer;
|
||||
MeshContainer->SetWorldScale3D({巨人, 巨人, 巨人});
|
||||
}
|
||||
|
||||
// 4. 飞天功能
|
||||
if (飞天跳开) {
|
||||
localPlayer->CharacterMovement->MaxAcceleration = 9999999.0f;
|
||||
localPlayer->CustomTimeDilation = 0.7f;
|
||||
localPlayer->EnergySpeedScale = 6.0f;
|
||||
localPlayer->CharacterMovement->JumpZVelocity = 2200.0f;
|
||||
localPlayer->CharacterMovement->bMaintainHorizontalGroundVelocity = true;
|
||||
}
|
||||
|
||||
if (飞天跳关) {
|
||||
localPlayer->CharacterMovement->MaxAcceleration = 10000.828f;
|
||||
localPlayer->CustomTimeDilation = 1.0f;
|
||||
localPlayer->EnergySpeedScale = 1.0f;
|
||||
localPlayer->CharacterMovement->bMaintainHorizontalGroundVelocity = false;
|
||||
localPlayer->CharacterMovement->JumpZVelocity = 500.0f;
|
||||
}
|
||||
|
||||
// 5. 能量加速功能
|
||||
if (能量加速开) {
|
||||
auto GWorld = GetWorld();
|
||||
if (localPlayer->Energy.EnergyCurrent >= 65) {
|
||||
GWorld->PersistentLevel->WorldSettings->MinUndilatedFrameTime = 0.210f;
|
||||
}
|
||||
}
|
||||
|
||||
if (能量加速关) {
|
||||
auto GWorld = GetWorld();
|
||||
if (localPlayer->Energy.EnergyCurrent >= 65) {
|
||||
GWorld->PersistentLevel->WorldSettings->MinUndilatedFrameTime = 0.000f;
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 武器功能
|
||||
if (伤害测试2) {
|
||||
ApplyWeaponDamageMultiplier(localPlayer);
|
||||
}
|
||||
|
||||
if (枪械一套) {
|
||||
ApplyWeaponRecoilControl(localPlayer);
|
||||
}
|
||||
|
||||
if (枪械变大) {
|
||||
ApplyWeaponScale(localPlayer);
|
||||
}
|
||||
|
||||
if (广角) {
|
||||
localPlayer->ThirdPersonCameraComponent->SetFieldOfView(视角);
|
||||
}
|
||||
|
||||
if (开启伤害) {
|
||||
ApplyWeaponDamage(localPlayer);
|
||||
}
|
||||
|
||||
// 7. 飞行功能
|
||||
if (飞天2) {
|
||||
UCharacterMovementComponent* CharacterMovement = localPlayer->CharacterMovement;
|
||||
if (CharacterMovement) {
|
||||
CharacterMovement->SetMovementMode(EMovementMode::MOVE_Flying, 1);
|
||||
FVector NewLocation = localPlayer->K2_GetActorLocation();
|
||||
NewLocation.Z += 10.0f;
|
||||
CharacterMovement->GravityScale = 0.0f;
|
||||
localPlayer->K2_SetActorLocation(NewLocation, 0, false, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
if (飞天1) {
|
||||
UCharacterMovementComponent* CharacterMovement = localPlayer->CharacterMovement;
|
||||
if (CharacterMovement) {
|
||||
CharacterMovement->GravityScale = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
if (飞天关) {
|
||||
UCharacterMovementComponent* CharacterMovement = g_LocalPlayer->CharacterMovement;
|
||||
CharacterMovement->SetMovementMode(EMovementMode::MOVE_Walking, 1);
|
||||
CharacterMovement->GravityScale = 1.0f;
|
||||
}
|
||||
|
||||
// 8. 修复功能
|
||||
if (修复着陆) {
|
||||
g_LocalPlayer->STPlayerController->bCanOpenParachute = true;
|
||||
g_LocalPlayer->STPlayerController->bCanCloseParachute = true;
|
||||
g_LocalPlayer->STPlayerController->bLandAfterJumpPlane = true;
|
||||
}
|
||||
}
|
||||
|
||||
// 辅助函数:应用载具功能
|
||||
void ApplyVehicleFeatures(ASTExtraPlayerCharacter* localPlayer,
|
||||
ASTExtraPlayerController* localController) {
|
||||
if (!自控初始化 || !localPlayer) return;
|
||||
|
||||
auto CurrentVehicle2 = localPlayer->CurrentVehicle;
|
||||
if (!CurrentVehicle2) return;
|
||||
|
||||
auto RootComponent = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
if (!RootComponent) return;
|
||||
|
||||
// 1. 旋转控制
|
||||
if (转圈) {
|
||||
auto RootComponent2 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent2->SetAllPhysicsAngularVelocity({0.f, 0.f, 26.5f}, true);
|
||||
}
|
||||
|
||||
if (转圈2) {
|
||||
auto RootComponent2 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent2->SetAllPhysicsAngularVelocity({0.f, 0.f, -26.5f}, true);
|
||||
}
|
||||
|
||||
// 2. 碰撞控制
|
||||
if (无视碰撞开) {
|
||||
CurrentVehicle2->SetActorEnableCollision(false);
|
||||
} else {
|
||||
CurrentVehicle2->SetActorEnableCollision(true);
|
||||
}
|
||||
|
||||
// 3. 重力控制
|
||||
if (无视重力开) {
|
||||
auto RootComponent3 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent3->SetEnableGravity(false);
|
||||
} else {
|
||||
auto RootComponent3 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent3->SetEnableGravity(true);
|
||||
}
|
||||
|
||||
// 4. 载具速度控制
|
||||
float coeff = (60.0f * 60.0f) * 10.f * 0.01 * 载具速度;
|
||||
float coefff = (60.0f * 60.0f) * 10.f * 0.01 * 喇叭高度;
|
||||
|
||||
FVector vel = {0, 0, 0};
|
||||
auto yaw = localController->PlayerCameraManager->CameraCache.POV.Rotation.Yaw;
|
||||
bool isMoving = false;
|
||||
|
||||
// 5. 不同模式的移动控制
|
||||
auto CurrentVehicle = localPlayer->GetCurrentVehicle();
|
||||
|
||||
// 老爷模式(喇叭控制)
|
||||
if (老爷模式 && CurrentVehicle->bIsUsingHorn) {
|
||||
isMoving = true;
|
||||
float theta = 2.f * M_PI * (yaw / 360.f);
|
||||
vel.X = (coeff * cosf(theta));
|
||||
vel.Y = (coeff * sinf(theta));
|
||||
auto RootComponent5 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent5->SetAllPhysicsLinearVelocity(vel, false);
|
||||
}
|
||||
|
||||
// 飞船模式(加速控制)
|
||||
if (飞船模式 && CurrentVehicle->bIsBoosting) {
|
||||
isMoving = true;
|
||||
float theta = 2.f * M_PI * (yaw / 360.f);
|
||||
vel.X = (coeff * cosf(theta));
|
||||
vel.Y = (coeff * sinf(theta));
|
||||
if (喇叭飞天) {
|
||||
vel.Z = (coefff * sinf(theta));
|
||||
}
|
||||
auto RootComponent6 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent6->SetAllPhysicsLinearVelocity(vel, false);
|
||||
}
|
||||
|
||||
// 喇叭飞天模式
|
||||
if (喇叭飞天 && CurrentVehicle->bIsUsingHorn) {
|
||||
isMoving = true;
|
||||
vel.Z = (coefff / 4);
|
||||
auto RootComponent7 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent7->SetAllPhysicsLinearVelocity(vel, false);
|
||||
}
|
||||
|
||||
// 载具加速模式
|
||||
if (载具加速 && CurrentVehicle->bIsBoosting) {
|
||||
isMoving = true;
|
||||
float theta = 2.f * M_PI * (yaw / 360.f);
|
||||
vel.X = (coeff * cosf(theta));
|
||||
vel.Y = (coeff * sinf(theta));
|
||||
auto RootComponent8 = static_cast<UPrimitiveComponent*>(CurrentVehicle2->K2_GetRootComponent());
|
||||
RootComponent8->SetAllPhysicsLinearVelocity(vel, false);
|
||||
}
|
||||
|
||||
// 6. 停止移动
|
||||
if (!isMoving) {
|
||||
vel = {0, 0, 0};
|
||||
RootComponent->SetAllPhysicsLinearVelocity(vel, true);
|
||||
}
|
||||
}
|
||||
|
||||
void DrawESP(ImDrawList* draw, int screenWidth, int screenHeight) {
|
||||
if (Config.OTHER.HIDEESP) {
|
||||
HIDEESP = false;
|
||||
} else {
|
||||
HIDEESP = true;
|
||||
}
|
||||
|
||||
if (!HIDEESP) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto Actors = getActors();
|
||||
int totalEnemies = 0, totalBots = 0, totalMonsters = 0;
|
||||
ASTExtraPlayerCharacter* localPlayer = nullptr;
|
||||
ASTExtraPlayerController* localController = nullptr;
|
||||
|
||||
// 1. 查找本地控制器
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
if (isObjectInvalid(Actor)) continue;
|
||||
|
||||
if (Actor->IsA(ASTExtraPlayerController::StaticClass())) {
|
||||
localController = (ASTExtraPlayerController*)Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!localController) return;
|
||||
|
||||
// 2. 查找本地玩家
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
if (isObjectInvalid(Actor)) continue;
|
||||
|
||||
if (Actor->IsA(ASTExtraPlayerCharacter::StaticClass())) {
|
||||
if (((ASTExtraPlayerCharacter*)Actor)->PlayerKey == localController->PlayerKey) {
|
||||
localPlayer = (ASTExtraPlayerCharacter*)Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!localPlayer) return;
|
||||
|
||||
// 3. 处理所有Actor
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
if (isObjectInvalid(Actor)) continue;
|
||||
|
||||
// 3.1 处理玩家
|
||||
if (Actor->IsA(ASTExtraPlayerCharacter::StaticClass())) {
|
||||
auto Player = (ASTExtraPlayerCharacter*)Actor;
|
||||
|
||||
// 跳过条件检查
|
||||
if (ShouldSkipPlayer(Player, localController, localPlayer)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查是否为怪物
|
||||
bool isMonster = (Player->bIsAI &&
|
||||
(Player->GetName().find("Monster") != std::string::npos ||
|
||||
Player->GetName().find("Beast") != std::string::npos ||
|
||||
Player->GetName().find("年兽") != std::string::npos));
|
||||
|
||||
// 更新计数
|
||||
if (isMonster) {
|
||||
totalMonsters++;
|
||||
} else if (Player->bIsAI) {
|
||||
totalBots++;
|
||||
} else {
|
||||
totalEnemies++;
|
||||
}
|
||||
|
||||
// 绘制玩家ESP
|
||||
DrawPlayerESP(draw, Player, localPlayer, localController, screenWidth, screenHeight);
|
||||
}
|
||||
|
||||
// 3.2 处理战利品箱
|
||||
if (Config.PlayerESP.LootBox && Actor->IsA(APickUpListWrapperActor::StaticClass())) {
|
||||
auto LootBox = (APickUpListWrapperActor*)Actor;
|
||||
auto RootComponent = Actor->RootComponent;
|
||||
if (!RootComponent) continue;
|
||||
|
||||
float Distance = LootBox->GetDistanceTo(localPlayer) / 100.f;
|
||||
FVector2D lootboxPos;
|
||||
|
||||
if (W2S(LootBox->K2_GetActorLocation(), &lootboxPos)) {
|
||||
std::string s = "物资箱 ";
|
||||
s += std::to_string((int)Distance);
|
||||
s += "m";
|
||||
|
||||
// 计算文本大小并绘制背景
|
||||
auto textSize = ImGui::CalcTextSize(s.c_str());
|
||||
float padding = 4.0f;
|
||||
ImVec2 bgMin = ImVec2(lootboxPos.X - padding, lootboxPos.Y - padding/2);
|
||||
ImVec2 bgMax = ImVec2(lootboxPos.X + textSize.x + padding, lootboxPos.Y + textSize.y + padding/2);
|
||||
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 160), 4.0f);
|
||||
draw->AddText(NULL, 16.0f,
|
||||
ImVec2(lootboxPos.X, lootboxPos.Y),
|
||||
ImColor(255, 204, 0, 240), s.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// 3.3 处理游戏状态(剩余人数)
|
||||
if (Config.PlayerESP.剩余人数 && Actor->IsA(ASTExtraGameStateBase::StaticClass())) {
|
||||
auto InGame = (ASTExtraGameStateBase*)Actor;
|
||||
std::string s = "剩余: " + std::to_string((int)InGame->AlivePlayerNum);
|
||||
|
||||
// 计算文本大小
|
||||
auto textSize = ImGui::CalcTextSize(s.c_str());
|
||||
float padding = 8.0f;
|
||||
|
||||
// iOS风格背景
|
||||
ImVec2 bgMin = ImVec2(screenWidth / 2.1f - textSize.x/2 - padding, 245);
|
||||
ImVec2 bgMax = ImVec2(screenWidth / 2.1f + textSize.x/2 + padding, 245 + textSize.y + padding);
|
||||
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 180), 8.0f);
|
||||
draw->AddRect(bgMin, bgMax, ImColor(255, 255, 255, 80), 8.0f, 0, 1.0f);
|
||||
|
||||
draw->AddText(nullptr, 20.0f,
|
||||
ImVec2(screenWidth / 2.1f - textSize.x/2, 250),
|
||||
ImColor(255, 255, 255, 240), s.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 全局状态显示
|
||||
g_LocalController = localController;
|
||||
g_LocalPlayer = localPlayer;
|
||||
|
||||
// 4.1 显示玩家/人机/怪物数量(iOS风格)
|
||||
if (人数) {
|
||||
// 背景
|
||||
ImVec2 bgMin = ImVec2(screenWidth / 1.73f - 220, 35);
|
||||
ImVec2 bgMax = ImVec2(screenWidth / 1.73f, 85);
|
||||
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 200), 10.0f);
|
||||
draw->AddRect(bgMin, bgMax, ImColor(255, 255, 255, 100), 10.0f, 0, 1.0f);
|
||||
|
||||
// 文本
|
||||
char infoText[256];
|
||||
sprintf(infoText, "玩家: %d\n人机: %d\n怪物: %d",
|
||||
totalEnemies, totalBots, totalMonsters);
|
||||
|
||||
draw->AddText(ImVec2(screenWidth / 1.73f - 210, 40),
|
||||
ImColor(255, 255, 255, 240), infoText);
|
||||
}
|
||||
|
||||
// 4.2 应用玩家功能
|
||||
ApplyPlayerFeatures(localPlayer, localController, screenWidth, screenHeight);
|
||||
|
||||
// 4.3 应用载具功能
|
||||
ApplyVehicleFeatures(localPlayer, localController);
|
||||
|
||||
// 5. 绘制水印(保持原位置和内容)
|
||||
if (水印) {
|
||||
// 使用原水印内容和位置
|
||||
std::string watermarkText = T("by.脑干\n当前内部测试版-不代表最终品质", "by.SuRanCi\nCurrent internal beta-does not represent final quality");
|
||||
|
||||
// 原位置:{screenWidth + 200, 650},但需要调整到可见位置
|
||||
// 调整为右下角位置
|
||||
ImVec2 watermarkPos = ImVec2(screenWidth - 350, screenHeight - 65);
|
||||
|
||||
// 计算文本大小并绘制背景
|
||||
auto textSize = ImGui::CalcTextSize(watermarkText.c_str());
|
||||
float padding = 6.0f;
|
||||
ImVec2 bgMin = ImVec2(watermarkPos.x - padding, watermarkPos.y - padding);
|
||||
ImVec2 bgMax = ImVec2(watermarkPos.x + textSize.x + padding, watermarkPos.y + textSize.y + padding);
|
||||
|
||||
// iOS风格背景
|
||||
draw->AddRectFilled(bgMin, bgMax, ImColor(0, 0, 0, 180), 6.0f);
|
||||
draw->AddRect(bgMin, bgMax, ImColor(255, 255, 255, 80), 6.0f, 0, 1.0f);
|
||||
|
||||
// 绘制文本
|
||||
draw->AddText(watermarkPos,
|
||||
ImColor(255, 59, 48, 240), // iOS红色
|
||||
watermarkText.c_str());
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,53 @@
|
||||
# PMDT
|
||||
# PUBG Mobile Debugging Tool (qingthr)
|
||||
|
||||
主要用于《刺激战场》(PUBG Mobile)的调试与功能扩展
|
||||
这是一个基于 NDK 开发的 Android 原生插件(HOOK 库),主要用于《刺激战场》(PUBG Mobile)的调试与功能扩展。项目集成了 ImGui 菜单界面,支持 ESP(透视)、物资生成、建筑探测及多种游戏数值调试功能。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- **ESP 绘制**:支持射线、骨骼、血量、名称及距离显示。
|
||||
- **物资调试**:支持一键刷物资、自定义物资生成等。
|
||||
- **建筑功能**:支持探测附近建筑、保存建筑列表、在玩家位置生成建筑及建筑跟随模式。
|
||||
- **游戏增强**:包括高跳、加速、视角调整(广角)、无限子弹、除雾等调试功能。
|
||||
- **多语言支持**:支持中文与英文界面切换。
|
||||
|
||||
## 项目结构
|
||||
|
||||
- `jni/`:核心源代码目录。
|
||||
- `主程序.cpp`:JNI 入口与 EGL 钩子处理。
|
||||
- `菜单.h`:基于 ImGui 的 UI 界面逻辑。
|
||||
- `变量.h`:全局变量、结构体定义及核心功能逻辑。
|
||||
- `DrawESP.h`:ESP 绘制逻辑。
|
||||
- `SDK/`:包含游戏相关的类与结构体定义。
|
||||
- `imgui/`:ImGui 框架及其 Android/OpenGL3 渲染实现。
|
||||
|
||||
## 修复内容 (Latest Update)
|
||||
|
||||
针对近期无法编译的问题,进行了以下核心修复:
|
||||
|
||||
1. **语法错误修正**:
|
||||
- 修正了 `jni/变量.h` 中 `探测并添加附近建筑(floatRadius)` 缺少空格导致的类型解析错误。
|
||||
2. **结构体与变量补全**:
|
||||
- 补全了缺失的 `探测到的建筑` 结构体定义。
|
||||
- 补全了 `建筑生成线程`、`建筑线程运行`、`缓存的建筑类` 等核心逻辑变量。
|
||||
3. **逻辑闭合修复**:
|
||||
- 针对 `jni/菜单.h` 中极其复杂的嵌套逻辑,修复了大量未闭合或多余的大括号 `{}`,确保 `void 菜单()` 函数及其内部窗口逻辑能够正确闭合,解决了“function definition is not allowed here”等编译难题。
|
||||
4. **链接错误修复**:
|
||||
- 将 `extern` 声明的全局变量(如 `建筑跟随模式`、`建筑探测半径` 等)修改为 `inline` 定义,解决了 ndk-build 链接阶段的 `undefined symbol` 错误。
|
||||
5. **代码清理**:
|
||||
- 暂时注释掉了未定义的 `执行控制台命令()` 函数,确保构建流程畅通。
|
||||
|
||||
## 编译指南
|
||||
|
||||
在 Termux 或 Android NDK 环境下,进入项目根目录运行:
|
||||
|
||||
```bash
|
||||
ndk-build
|
||||
```
|
||||
|
||||
编译成功后,生成的库文件位于 `libs/armeabi-v7a/libHOOK.so`。
|
||||
|
||||
## 开源协议
|
||||
|
||||
本项目采用 **MIT License**。
|
||||
|
||||
*注:本项目仅供学习交流使用,请勿用于非法用途。*
|
||||
|
||||
Executable
+389
@@ -0,0 +1,389 @@
|
||||
#include <jni.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#include "android_native_app_glue.h"
|
||||
#include <android/log.h>
|
||||
|
||||
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__))
|
||||
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "threaded_app", __VA_ARGS__))
|
||||
|
||||
/* For debug builds, always enable the debug traces in this library */
|
||||
#ifndef NDEBUG
|
||||
# define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "threaded_app", __VA_ARGS__))
|
||||
#else
|
||||
# define LOGV(...) ((void)0)
|
||||
#endif
|
||||
|
||||
static void free_saved_state(struct android_app* android_app) {
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
if (android_app->savedState != NULL) {
|
||||
|
||||
android_app->savedState = NULL;
|
||||
android_app->savedStateSize = 0;
|
||||
}
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
}
|
||||
|
||||
int8_t android_app_read_cmd(struct android_app* android_app) {
|
||||
int8_t cmd;
|
||||
if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd)) {
|
||||
switch (cmd) {
|
||||
case APP_CMD_SAVE_STATE:
|
||||
free_saved_state(android_app);
|
||||
break;
|
||||
}
|
||||
return cmd;
|
||||
} else {
|
||||
LOGE("No data on command pipe!");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void print_cur_config(struct android_app* android_app) {
|
||||
char lang[2], country[2];
|
||||
AConfiguration_getLanguage(android_app->config, lang);
|
||||
AConfiguration_getCountry(android_app->config, country);
|
||||
|
||||
LOGV("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d "
|
||||
"keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d "
|
||||
"modetype=%d modenight=%d",
|
||||
AConfiguration_getMcc(android_app->config),
|
||||
AConfiguration_getMnc(android_app->config),
|
||||
lang[0], lang[1], country[0], country[1],
|
||||
AConfiguration_getOrientation(android_app->config),
|
||||
AConfiguration_getTouchscreen(android_app->config),
|
||||
AConfiguration_getDensity(android_app->config),
|
||||
AConfiguration_getKeyboard(android_app->config),
|
||||
AConfiguration_getNavigation(android_app->config),
|
||||
AConfiguration_getKeysHidden(android_app->config),
|
||||
AConfiguration_getNavHidden(android_app->config),
|
||||
AConfiguration_getSdkVersion(android_app->config),
|
||||
AConfiguration_getScreenSize(android_app->config),
|
||||
AConfiguration_getScreenLong(android_app->config),
|
||||
AConfiguration_getUiModeType(android_app->config),
|
||||
AConfiguration_getUiModeNight(android_app->config));
|
||||
}
|
||||
|
||||
void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) {
|
||||
switch (cmd) {
|
||||
case APP_CMD_INPUT_CHANGED:
|
||||
LOGV("APP_CMD_INPUT_CHANGED\n");
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
if (android_app->inputQueue != NULL) {
|
||||
AInputQueue_detachLooper(android_app->inputQueue);
|
||||
}
|
||||
android_app->inputQueue = android_app->pendingInputQueue;
|
||||
if (android_app->inputQueue != NULL) {
|
||||
LOGV("Attaching input queue to looper");
|
||||
AInputQueue_attachLooper(android_app->inputQueue,
|
||||
android_app->looper, LOOPER_ID_INPUT, NULL,
|
||||
&android_app->inputPollSource);
|
||||
}
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
break;
|
||||
|
||||
case APP_CMD_INIT_WINDOW:
|
||||
LOGV("APP_CMD_INIT_WINDOW\n");
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->window = android_app->pendingWindow;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
break;
|
||||
|
||||
case APP_CMD_TERM_WINDOW:
|
||||
LOGV("APP_CMD_TERM_WINDOW\n");
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
break;
|
||||
|
||||
case APP_CMD_RESUME:
|
||||
case APP_CMD_START:
|
||||
case APP_CMD_PAUSE:
|
||||
case APP_CMD_STOP:
|
||||
LOGV("activityState=%d\n", cmd);
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->activityState = cmd;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
break;
|
||||
|
||||
case APP_CMD_CONFIG_CHANGED:
|
||||
LOGV("APP_CMD_CONFIG_CHANGED\n");
|
||||
AConfiguration_fromAssetManager(android_app->config,
|
||||
android_app->activity->assetManager);
|
||||
print_cur_config(android_app);
|
||||
break;
|
||||
|
||||
case APP_CMD_DESTROY:
|
||||
LOGV("APP_CMD_DESTROY\n");
|
||||
android_app->destroyRequested = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) {
|
||||
switch (cmd) {
|
||||
case APP_CMD_TERM_WINDOW:
|
||||
LOGV("APP_CMD_TERM_WINDOW\n");
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->window = NULL;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
break;
|
||||
|
||||
case APP_CMD_SAVE_STATE:
|
||||
LOGV("APP_CMD_SAVE_STATE\n");
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->stateSaved = 1;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
break;
|
||||
|
||||
case APP_CMD_RESUME:
|
||||
free_saved_state(android_app);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void app_dummy() {
|
||||
|
||||
}
|
||||
|
||||
static void android_app_destroy(struct android_app* android_app) {
|
||||
LOGV("android_app_destroy!");
|
||||
free_saved_state(android_app);
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
if (android_app->inputQueue != NULL) {
|
||||
AInputQueue_detachLooper(android_app->inputQueue);
|
||||
}
|
||||
AConfiguration_delete(android_app->config);
|
||||
android_app->destroyed = 1;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
// Can't touch android_app object after this.
|
||||
}
|
||||
|
||||
static void process_input(struct android_app* app, struct android_poll_source* source) {
|
||||
AInputEvent* event = NULL;
|
||||
if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
|
||||
LOGV("New input event: type=%d\n", AInputEvent_getType(event));
|
||||
if (AInputQueue_preDispatchEvent(app->inputQueue, event)) {
|
||||
return;
|
||||
}
|
||||
int32_t handled = 0;
|
||||
if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event);
|
||||
AInputQueue_finishEvent(app->inputQueue, event, handled);
|
||||
} else {
|
||||
LOGE("Failure reading next input event: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
static void process_cmd(struct android_app* app, struct android_poll_source* source) {
|
||||
int8_t cmd = android_app_read_cmd(app);
|
||||
android_app_pre_exec_cmd(app, cmd);
|
||||
if (app->onAppCmd != NULL) app->onAppCmd(app, cmd);
|
||||
android_app_post_exec_cmd(app, cmd);
|
||||
}
|
||||
|
||||
static void* android_app_entry(void* param) {
|
||||
struct android_app* android_app = (struct android_app*)param;
|
||||
|
||||
android_app->config = AConfiguration_new();
|
||||
AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager);
|
||||
|
||||
print_cur_config(android_app);
|
||||
|
||||
android_app->cmdPollSource.id = LOOPER_ID_MAIN;
|
||||
android_app->cmdPollSource.app = android_app;
|
||||
android_app->cmdPollSource.process = process_cmd;
|
||||
android_app->inputPollSource.id = LOOPER_ID_INPUT;
|
||||
android_app->inputPollSource.app = android_app;
|
||||
android_app->inputPollSource.process = process_input;
|
||||
|
||||
ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
|
||||
ALooper_addFd(looper, android_app->msgread, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL,
|
||||
&android_app->cmdPollSource);
|
||||
android_app->looper = looper;
|
||||
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->running = 1;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
|
||||
android_main(android_app);
|
||||
|
||||
android_app_destroy(android_app);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Native activity interaction (called from main thread)
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
static void android_app_write_cmd(struct android_app* android_app, int8_t cmd) {
|
||||
if (write(android_app->msgwrite, &cmd, sizeof(cmd)) != sizeof(cmd)) {
|
||||
LOGE("Failure writing android_app cmd: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
static void android_app_set_input(struct android_app* android_app, AInputQueue* inputQueue) {
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->pendingInputQueue = inputQueue;
|
||||
android_app_write_cmd(android_app, APP_CMD_INPUT_CHANGED);
|
||||
while (android_app->inputQueue != android_app->pendingInputQueue) {
|
||||
pthread_cond_wait(&android_app->cond, &android_app->mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
}
|
||||
|
||||
static void android_app_set_window(struct android_app* android_app, ANativeWindow* window) {
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
if (android_app->pendingWindow != NULL) {
|
||||
android_app_write_cmd(android_app, APP_CMD_TERM_WINDOW);
|
||||
}
|
||||
android_app->pendingWindow = window;
|
||||
if (window != NULL) {
|
||||
android_app_write_cmd(android_app, APP_CMD_INIT_WINDOW);
|
||||
}
|
||||
while (android_app->window != android_app->pendingWindow) {
|
||||
pthread_cond_wait(&android_app->cond, &android_app->mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
}
|
||||
|
||||
static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) {
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app_write_cmd(android_app, cmd);
|
||||
while (android_app->activityState != cmd) {
|
||||
pthread_cond_wait(&android_app->cond, &android_app->mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
}
|
||||
|
||||
static void android_app_free(struct android_app* android_app) {
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app_write_cmd(android_app, APP_CMD_DESTROY);
|
||||
while (!android_app->destroyed) {
|
||||
pthread_cond_wait(&android_app->cond, &android_app->mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
|
||||
close(android_app->msgread);
|
||||
close(android_app->msgwrite);
|
||||
pthread_cond_destroy(&android_app->cond);
|
||||
pthread_mutex_destroy(&android_app->mutex);
|
||||
|
||||
}
|
||||
|
||||
static void onDestroy(ANativeActivity* activity) {
|
||||
LOGV("Destroy: %p\n", activity);
|
||||
android_app_free((struct android_app*)activity->instance);
|
||||
}
|
||||
|
||||
static void onStart(ANativeActivity* activity) {
|
||||
LOGV("Start: %p\n", activity);
|
||||
android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_START);
|
||||
}
|
||||
|
||||
static void onResume(ANativeActivity* activity) {
|
||||
LOGV("Resume: %p\n", activity);
|
||||
android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_RESUME);
|
||||
}
|
||||
|
||||
static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) {
|
||||
struct android_app* android_app = (struct android_app*)activity->instance;
|
||||
void* savedState = NULL;
|
||||
|
||||
LOGV("SaveInstanceState: %p\n", activity);
|
||||
pthread_mutex_lock(&android_app->mutex);
|
||||
android_app->stateSaved = 0;
|
||||
android_app_write_cmd(android_app, APP_CMD_SAVE_STATE);
|
||||
while (!android_app->stateSaved) {
|
||||
pthread_cond_wait(&android_app->cond, &android_app->mutex);
|
||||
}
|
||||
|
||||
if (android_app->savedState != NULL) {
|
||||
savedState = android_app->savedState;
|
||||
*outLen = android_app->savedStateSize;
|
||||
android_app->savedState = NULL;
|
||||
android_app->savedStateSize = 0;
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
|
||||
return savedState;
|
||||
}
|
||||
|
||||
static void onPause(ANativeActivity* activity) {
|
||||
LOGV("Pause: %p\n", activity);
|
||||
android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_PAUSE);
|
||||
}
|
||||
|
||||
static void onStop(ANativeActivity* activity) {
|
||||
LOGV("Stop: %p\n", activity);
|
||||
android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_STOP);
|
||||
}
|
||||
|
||||
static void onConfigurationChanged(ANativeActivity* activity) {
|
||||
struct android_app* android_app = (struct android_app*)activity->instance;
|
||||
LOGV("ConfigurationChanged: %p\n", activity);
|
||||
android_app_write_cmd(android_app, APP_CMD_CONFIG_CHANGED);
|
||||
}
|
||||
|
||||
static void onLowMemory(ANativeActivity* activity) {
|
||||
struct android_app* android_app = (struct android_app*)activity->instance;
|
||||
LOGV("LowMemory: %p\n", activity);
|
||||
android_app_write_cmd(android_app, APP_CMD_LOW_MEMORY);
|
||||
}
|
||||
|
||||
static void onWindowFocusChanged(ANativeActivity* activity, int focused) {
|
||||
LOGV("WindowFocusChanged: %p -- %d\n", activity, focused);
|
||||
android_app_write_cmd((struct android_app*)activity->instance,
|
||||
focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS);
|
||||
}
|
||||
|
||||
static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) {
|
||||
LOGV("NativeWindowCreated: %p -- %p\n", activity, window);
|
||||
android_app_set_window((struct android_app*)activity->instance, window);
|
||||
}
|
||||
|
||||
static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) {
|
||||
LOGV("NativeWindowDestroyed: %p -- %p\n", activity, window);
|
||||
android_app_set_window((struct android_app*)activity->instance, NULL);
|
||||
}
|
||||
|
||||
static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) {
|
||||
LOGV("InputQueueCreated: %p -- %p\n", activity, queue);
|
||||
android_app_set_input((struct android_app*)activity->instance, queue);
|
||||
}
|
||||
|
||||
static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) {
|
||||
LOGV("InputQueueDestroyed: %p -- %p\n", activity, queue);
|
||||
android_app_set_input((struct android_app*)activity->instance, NULL);
|
||||
}
|
||||
|
||||
void ANativeActivity_onCreate(ANativeActivity* activity,
|
||||
void* savedState, size_t savedStateSize) {
|
||||
LOGV("Creating: %p\n", activity);
|
||||
activity->callbacks->onDestroy = onDestroy;
|
||||
activity->callbacks->onStart = onStart;
|
||||
activity->callbacks->onResume = onResume;
|
||||
activity->callbacks->onSaveInstanceState = onSaveInstanceState;
|
||||
activity->callbacks->onPause = onPause;
|
||||
activity->callbacks->onStop = onStop;
|
||||
activity->callbacks->onConfigurationChanged = onConfigurationChanged;
|
||||
activity->callbacks->onLowMemory = onLowMemory;
|
||||
activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
|
||||
activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
|
||||
activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
|
||||
activity->callbacks->onInputQueueCreated = onInputQueueCreated;
|
||||
activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
|
||||
|
||||
|
||||
}
|
||||
Executable
+332
@@ -0,0 +1,332 @@
|
||||
#ifndef _ANDROID_NATIVE_APP_GLUE_H
|
||||
#define _ANDROID_NATIVE_APP_GLUE_H
|
||||
|
||||
#include <poll.h>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
|
||||
#include <android/configuration.h>
|
||||
#include <android/looper.h>
|
||||
#include <android/native_activity.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The native activity interface provided by <android/native_activity.h>
|
||||
* is based on a set of application-provided callbacks that will be called
|
||||
* by the Activity's main thread when certain events occur.
|
||||
*
|
||||
* This means that each one of this callbacks _should_ _not_ block, or they
|
||||
* risk having the system force-close the application. This programming
|
||||
* model is direct, lightweight, but constraining.
|
||||
*
|
||||
* The 'threaded_native_app' static library is used to provide a different
|
||||
* execution model where the application can implement its own main event
|
||||
* loop in a different thread instead. Here's how it works:
|
||||
*
|
||||
* 1/ The application must provide a function named "android_main()" that
|
||||
* will be called when the activity is created, in a new thread that is
|
||||
* distinct from the activity's main thread.
|
||||
*
|
||||
* 2/ android_main() receives a pointer to a valid "android_app" structure
|
||||
* that contains references to other important objects, e.g. the
|
||||
* ANativeActivity obejct instance the application is running in.
|
||||
*
|
||||
* 3/ the "android_app" object holds an ALooper instance that already
|
||||
* listens to two important things:
|
||||
*
|
||||
* - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX
|
||||
* declarations below.
|
||||
*
|
||||
* - input events coming from the AInputQueue attached to the activity.
|
||||
*
|
||||
* Each of these correspond to an ALooper identifier returned by
|
||||
* ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT,
|
||||
* respectively.
|
||||
*
|
||||
* Your application can use the same ALooper to listen to additional
|
||||
* file-descriptors. They can either be callback based, or with return
|
||||
* identifiers starting with LOOPER_ID_USER.
|
||||
*
|
||||
* 4/ Whenever you receive a LOOPER_ID_MAIN or LOOPER_ID_INPUT event,
|
||||
* the returned data will point to an android_poll_source structure. You
|
||||
* can call the process() function on it, and fill in android_app->onAppCmd
|
||||
* and android_app->onInputEvent to be called for your own processing
|
||||
* of the event.
|
||||
*
|
||||
* Alternatively, you can call the low-level functions to read and process
|
||||
* the data directly... look at the process_cmd() and process_input()
|
||||
* implementations in the glue to see how to do this.
|
||||
*
|
||||
* See the sample named "native-activity" that comes with the NDK with a
|
||||
* full usage example. Also look at the JavaDoc of NativeActivity.
|
||||
*/
|
||||
|
||||
struct android_app;
|
||||
|
||||
/**
|
||||
* Data associated with an ALooper fd that will be returned as the "outData"
|
||||
* when that source has data ready.
|
||||
*/
|
||||
struct android_poll_source {
|
||||
// The identifier of this source. May be LOOPER_ID_MAIN or
|
||||
// LOOPER_ID_INPUT.
|
||||
int32_t id;
|
||||
|
||||
// The android_app this ident is associated with.
|
||||
struct android_app* app;
|
||||
|
||||
// Function to call to perform the standard processing of data from
|
||||
// this source.
|
||||
void (*process)(struct android_app* app, struct android_poll_source* source);
|
||||
};
|
||||
|
||||
/**
|
||||
* This is the interface for the standard glue code of a threaded
|
||||
* application. In this model, the application's code is running
|
||||
* in its own thread separate from the main thread of the process.
|
||||
* It is not required that this thread be associated with the Java
|
||||
* VM, although it will need to be in order to make JNI calls any
|
||||
* Java objects.
|
||||
*/
|
||||
struct android_app {
|
||||
// The application can place a pointer to its own state object
|
||||
// here if it likes.
|
||||
void* userData;
|
||||
|
||||
// Fill this in with the function to process main app commands (APP_CMD_*)
|
||||
void (*onAppCmd)(struct android_app* app, int32_t cmd);
|
||||
|
||||
// Fill this in with the function to process input events. At this point
|
||||
// the event has already been pre-dispatched, and it will be finished upon
|
||||
// return. Return 1 if you have handled the event, 0 for any default
|
||||
// dispatching.
|
||||
int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event);
|
||||
|
||||
// The ANativeActivity object instance that this app is running in.
|
||||
ANativeActivity* activity;
|
||||
|
||||
// The current configuration the app is running in.
|
||||
AConfiguration* config;
|
||||
|
||||
// This is the last instance's saved state, as provided at creation time.
|
||||
// It is NULL if there was no state. You can use this as you need; the
|
||||
// memory will remain around until you call android_app_exec_cmd() for
|
||||
// APP_CMD_RESUME, at which point it will be freed and savedState set to NULL.
|
||||
// These variables should only be changed when processing a APP_CMD_SAVE_STATE,
|
||||
// at which point they will be initialized to NULL and you can malloc your
|
||||
// state and place the information here. In that case the memory will be
|
||||
// freed for you later.
|
||||
void* savedState;
|
||||
size_t savedStateSize;
|
||||
|
||||
// The ALooper associated with the app's thread.
|
||||
ALooper* looper;
|
||||
|
||||
// When non-NULL, this is the input queue from which the app will
|
||||
// receive user input events.
|
||||
AInputQueue* inputQueue;
|
||||
|
||||
// When non-NULL, this is the window surface that the app can draw in.
|
||||
ANativeWindow* window;
|
||||
|
||||
// Current content rectangle of the window; this is the area where the
|
||||
// window's content should be placed to be seen by the user.
|
||||
ARect contentRect;
|
||||
|
||||
// Current state of the app's activity. May be either APP_CMD_START,
|
||||
// APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below.
|
||||
int activityState;
|
||||
|
||||
// This is non-zero when the application's NativeActivity is being
|
||||
// destroyed and waiting for the app thread to complete.
|
||||
int destroyRequested;
|
||||
|
||||
// -------------------------------------------------
|
||||
// Below are "private" implementation of the glue code.
|
||||
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cond;
|
||||
|
||||
int msgread;
|
||||
int msgwrite;
|
||||
|
||||
pthread_t thread;
|
||||
|
||||
struct android_poll_source cmdPollSource;
|
||||
struct android_poll_source inputPollSource;
|
||||
|
||||
int running;
|
||||
int stateSaved;
|
||||
int destroyed;
|
||||
int redrawNeeded;
|
||||
AInputQueue* pendingInputQueue;
|
||||
ANativeWindow* pendingWindow;
|
||||
ARect pendingContentRect;
|
||||
};
|
||||
|
||||
enum {
|
||||
/**
|
||||
* Looper data ID of commands coming from the app's main thread, which
|
||||
* is returned as an identifier from ALooper_pollOnce(). The data for this
|
||||
* identifier is a pointer to an android_poll_source structure.
|
||||
* These can be retrieved and processed with android_app_read_cmd()
|
||||
* and android_app_exec_cmd().
|
||||
*/
|
||||
LOOPER_ID_MAIN = 1,
|
||||
|
||||
/**
|
||||
* Looper data ID of events coming from the AInputQueue of the
|
||||
* application's window, which is returned as an identifier from
|
||||
* ALooper_pollOnce(). The data for this identifier is a pointer to an
|
||||
* android_poll_source structure. These can be read via the inputQueue
|
||||
* object of android_app.
|
||||
*/
|
||||
LOOPER_ID_INPUT = 2,
|
||||
|
||||
/**
|
||||
* Start of user-defined ALooper identifiers.
|
||||
*/
|
||||
LOOPER_ID_USER = 3,
|
||||
};
|
||||
|
||||
enum {
|
||||
/**
|
||||
* Command from main thread: the AInputQueue has changed. Upon processing
|
||||
* this command, android_app->inputQueue will be updated to the new queue
|
||||
* (or NULL).
|
||||
*/
|
||||
APP_CMD_INPUT_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: a new ANativeWindow is ready for use. Upon
|
||||
* receiving this command, android_app->window will contain the new window
|
||||
* surface.
|
||||
*/
|
||||
APP_CMD_INIT_WINDOW,
|
||||
|
||||
/**
|
||||
* Command from main thread: the existing ANativeWindow needs to be
|
||||
* terminated. Upon receiving this command, android_app->window still
|
||||
* contains the existing window; after calling android_app_exec_cmd
|
||||
* it will be set to NULL.
|
||||
*/
|
||||
APP_CMD_TERM_WINDOW,
|
||||
|
||||
/**
|
||||
* Command from main thread: the current ANativeWindow has been resized.
|
||||
* Please redraw with its new size.
|
||||
*/
|
||||
APP_CMD_WINDOW_RESIZED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the system needs that the current ANativeWindow
|
||||
* be redrawn. You should redraw the window before handing this to
|
||||
* android_app_exec_cmd() in order to avoid transient drawing glitches.
|
||||
*/
|
||||
APP_CMD_WINDOW_REDRAW_NEEDED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the content area of the window has changed,
|
||||
* such as from the soft input window being shown or hidden. You can
|
||||
* find the new content rect in android_app::contentRect.
|
||||
*/
|
||||
APP_CMD_CONTENT_RECT_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity window has gained
|
||||
* input focus.
|
||||
*/
|
||||
APP_CMD_GAINED_FOCUS,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity window has lost
|
||||
* input focus.
|
||||
*/
|
||||
APP_CMD_LOST_FOCUS,
|
||||
|
||||
/**
|
||||
* Command from main thread: the current device configuration has changed.
|
||||
*/
|
||||
APP_CMD_CONFIG_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the system is running low on memory.
|
||||
* Try to reduce your memory use.
|
||||
*/
|
||||
APP_CMD_LOW_MEMORY,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been started.
|
||||
*/
|
||||
APP_CMD_START,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been resumed.
|
||||
*/
|
||||
APP_CMD_RESUME,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app should generate a new saved state
|
||||
* for itself, to restore from later if needed. If you have saved state,
|
||||
* allocate it with malloc and place it in android_app.savedState with
|
||||
* the size in android_app.savedStateSize. The will be freed for you
|
||||
* later.
|
||||
*/
|
||||
APP_CMD_SAVE_STATE,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been paused.
|
||||
*/
|
||||
APP_CMD_PAUSE,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been stopped.
|
||||
*/
|
||||
APP_CMD_STOP,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity is being destroyed,
|
||||
* and waiting for the app thread to clean up and exit before proceeding.
|
||||
*/
|
||||
APP_CMD_DESTROY,
|
||||
};
|
||||
|
||||
/**
|
||||
* Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next
|
||||
* app command message.
|
||||
*/
|
||||
int8_t android_app_read_cmd(struct android_app* android_app);
|
||||
|
||||
/**
|
||||
* Call with the command returned by android_app_read_cmd() to do the
|
||||
* initial pre-processing of the given command. You can perform your own
|
||||
* actions for the command after calling this function.
|
||||
*/
|
||||
void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd);
|
||||
|
||||
/**
|
||||
* Call with the command returned by android_app_read_cmd() to do the
|
||||
* final post-processing of the given command. You must have done your own
|
||||
* actions for the command before calling this function.
|
||||
*/
|
||||
void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd);
|
||||
|
||||
/**
|
||||
* Dummy function you can call to ensure glue code isn't stripped.
|
||||
*/
|
||||
void app_dummy();
|
||||
|
||||
/**
|
||||
* This is the function that application code must implement, representing
|
||||
* the main entry to the app.
|
||||
*/
|
||||
extern void android_main(struct android_app* app);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ANDROID_NATIVE_APP_GLUE_H */
|
||||
Executable
+189
@@ -0,0 +1,189 @@
|
||||
#ifndef dobby_h
|
||||
#define dobby_h
|
||||
|
||||
// obfuscated interface
|
||||
#if 0
|
||||
#define DobbyBuildVersion c343f74888dffad84d9ad08d9c433456
|
||||
#define DobbyHook c8dc3ffa44f22dbd10ccae213dd8b1f8
|
||||
#define DobbyInstrument b71e27bca2c362de90c1034f19d839f9
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
void log_set_level(int level);
|
||||
void log_switch_to_syslog();
|
||||
void log_switch_to_file(const char *path);
|
||||
|
||||
typedef enum {
|
||||
kMemoryOperationSuccess,
|
||||
kMemoryOperationError,
|
||||
kNotSupportAllocateExecutableMemory,
|
||||
kNotEnough,
|
||||
kNone
|
||||
} MemoryOperationError;
|
||||
|
||||
#define PLATFORM_INTERFACE_CODE_PATCH_TOOL_H
|
||||
MemoryOperationError CodePatch(void *address, uint8_t *buffer, uint32_t buffer_size);
|
||||
|
||||
typedef uintptr_t addr_t;
|
||||
typedef uint32_t addr32_t;
|
||||
typedef uint64_t addr64_t;
|
||||
|
||||
#if defined(__arm64__) || defined(__aarch64__)
|
||||
|
||||
#define ARM64_TMP_REG_NDX_0 17
|
||||
|
||||
// float register
|
||||
typedef union _FPReg {
|
||||
__int128_t q;
|
||||
struct {
|
||||
double d1;
|
||||
double d2;
|
||||
} d;
|
||||
struct {
|
||||
float f1;
|
||||
float f2;
|
||||
float f3;
|
||||
float f4;
|
||||
} f;
|
||||
} FPReg;
|
||||
|
||||
// register context
|
||||
typedef struct _RegisterContext {
|
||||
uint64_t dmmpy_0; // dummy placeholder
|
||||
uint64_t sp;
|
||||
|
||||
uint64_t dmmpy_1; // dummy placeholder
|
||||
union {
|
||||
uint64_t x[29];
|
||||
struct {
|
||||
uint64_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22,
|
||||
x23, x24, x25, x26, x27, x28;
|
||||
} regs;
|
||||
} general;
|
||||
|
||||
uint64_t fp;
|
||||
uint64_t lr;
|
||||
|
||||
union {
|
||||
FPReg q[32];
|
||||
struct {
|
||||
FPReg q0, q1, q2, q3, q4, q5, q6, q7;
|
||||
// [!!! READ ME !!!]
|
||||
// for Arm64, can't access q8 - q31, unless you enable full floating-point register pack
|
||||
FPReg q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29,
|
||||
q30, q31;
|
||||
} regs;
|
||||
} floating;
|
||||
} RegisterContext;
|
||||
#elif defined(__arm__)
|
||||
typedef struct _RegisterContext {
|
||||
uint32_t dummy_0;
|
||||
uint32_t dummy_1;
|
||||
|
||||
uint32_t dummy_2;
|
||||
uint32_t sp;
|
||||
|
||||
union {
|
||||
uint32_t r[13];
|
||||
struct {
|
||||
uint32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12;
|
||||
} regs;
|
||||
} general;
|
||||
|
||||
uint32_t lr;
|
||||
} RegisterContext;
|
||||
#elif defined(_M_IX86) || defined(__i386__)
|
||||
typedef struct _RegisterContext {
|
||||
uint32_t dummy_0;
|
||||
uint32_t esp;
|
||||
|
||||
uint32_t dummy_1;
|
||||
uint32_t flags;
|
||||
|
||||
union {
|
||||
struct {
|
||||
uint32_t eax, ebx, ecx, edx, ebp, esp, edi, esi;
|
||||
} regs;
|
||||
} general;
|
||||
|
||||
} RegisterContext;
|
||||
#elif defined(_M_X64) || defined(__x86_64__)
|
||||
typedef struct _RegisterContext {
|
||||
uint64_t dummy_0;
|
||||
uint64_t rsp;
|
||||
|
||||
union {
|
||||
struct {
|
||||
uint64_t rax, rbx, rcx, rdx, rbp, rsp, rdi, rsi, r8, r9, r10, r11, r12, r13, r14, r15;
|
||||
} regs;
|
||||
} general;
|
||||
|
||||
uint64_t dummy_1;
|
||||
uint64_t flags;
|
||||
} RegisterContext;
|
||||
#endif
|
||||
|
||||
#define RT_FAILED -1
|
||||
#define RT_SUCCESS 0
|
||||
typedef enum _RetStatus { RS_FAILED = -1, RS_SUCCESS = 0 } RetStatus;
|
||||
|
||||
typedef struct _HookEntryInfo {
|
||||
int hook_id;
|
||||
union {
|
||||
void *target_address;
|
||||
void *function_address;
|
||||
void *instruction_address;
|
||||
};
|
||||
} HookEntryInfo;
|
||||
|
||||
// DobbyWrap <==> DobbyInstrument, so use DobbyInstrument instead of DobbyWrap
|
||||
#if 0
|
||||
// wrap function with pre_call and post_call
|
||||
typedef void (*PreCallTy)(RegisterContext *ctx, const HookEntryInfo *info);
|
||||
typedef void (*PostCallTy)(RegisterContext *ctx, const HookEntryInfo *info);
|
||||
int DobbyWrap(void *function_address, PreCallTy pre_call, PostCallTy post_call);
|
||||
#endif
|
||||
|
||||
// return dobby build date
|
||||
const char *DobbyBuildVersion();
|
||||
|
||||
// replace function
|
||||
int DobbyHook(void *address, void *replace_call, void **origin_call);
|
||||
|
||||
// dynamic binary instrument for instruction
|
||||
// [!!! READ ME !!!]
|
||||
// for Arm64, can't access q8 - q31, unless you enable full floating-point register pack
|
||||
typedef void (*DBICallTy)(RegisterContext *ctx, const HookEntryInfo *info);
|
||||
int DobbyInstrument(void *address, DBICallTy dbi_call);
|
||||
|
||||
// destory and restore hook
|
||||
int DobbyDestroy(void *address);
|
||||
|
||||
// iterate symbol table and find symbol
|
||||
void *DobbySymbolResolver(const char *image_name, const char *symbol_name);
|
||||
|
||||
// global offset table
|
||||
int DobbyGlobalOffsetTableReplace(char *image_name, char *symbol_name, void *fake_func, void **orig_func);
|
||||
|
||||
// [!!! READ ME !!!]
|
||||
// for arm, Arm64, dobby will use b xxx instead of ldr absolute indirect branch
|
||||
// for x64, dobby always use absolute indirect jump
|
||||
#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__)
|
||||
void dobby_enable_near_branch_trampoline();
|
||||
void dobby_disable_near_branch_trampoline();
|
||||
#endif
|
||||
// register linker load image callback
|
||||
typedef void (*linker_load_callback_t)(const char *image_name, void *handle);
|
||||
void dobby_register_image_load_callback(linker_load_callback_t func);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Executable
+46252
File diff suppressed because it is too large
Load Diff
Executable
+123
@@ -0,0 +1,123 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// COMPILE-TIME OPTIONS FOR DEAR IMGUI
|
||||
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
|
||||
// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
|
||||
//-----------------------------------------------------------------------------
|
||||
// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it)
|
||||
// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template.
|
||||
//-----------------------------------------------------------------------------
|
||||
// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp
|
||||
// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
|
||||
// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
|
||||
// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
//---- Define assertion handler. Defaults to calling assert().
|
||||
// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
|
||||
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
|
||||
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
|
||||
|
||||
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
|
||||
// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
|
||||
// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
|
||||
// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
|
||||
//#define IMGUI_API __declspec( dllexport )
|
||||
//#define IMGUI_API __declspec( dllimport )
|
||||
|
||||
//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
|
||||
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||
|
||||
//---- Disable all of Dear ImGui or don't implement standard windows.
|
||||
// It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp.
|
||||
//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
|
||||
//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended.
|
||||
//#define IMGUI_DISABLE_METRICS_WINDOW // Disable metrics/debugger window: ShowMetricsWindow() will be empty.
|
||||
|
||||
//---- Don't implement some functions to reduce linkage requirements.
|
||||
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a)
|
||||
//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW)
|
||||
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a)
|
||||
//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime).
|
||||
//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
|
||||
//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
|
||||
//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
|
||||
//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
|
||||
//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
|
||||
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
|
||||
//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
|
||||
|
||||
//---- Include imgui_user.h at the end of imgui.h as a convenience
|
||||
//#define IMGUI_INCLUDE_IMGUI_USER_H
|
||||
|
||||
//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another)
|
||||
//#define IMGUI_USE_BGRA_PACKED_COLOR
|
||||
|
||||
//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
|
||||
//#define IMGUI_USE_WCHAR32
|
||||
|
||||
//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
|
||||
// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files.
|
||||
//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
|
||||
//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
|
||||
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
|
||||
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
||||
|
||||
//---- Use stb_printf's faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined)
|
||||
// Requires 'stb_sprintf.h' to be available in the include path. Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by STB sprintf.
|
||||
// #define IMGUI_USE_STB_SPRINTF
|
||||
|
||||
//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
|
||||
// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
|
||||
// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
|
||||
//#define IMGUI_ENABLE_FREETYPE
|
||||
|
||||
//---- Use stb_truetype to build and rasterize the font atlas (default)
|
||||
// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend.
|
||||
//#define IMGUI_ENABLE_STB_TRUETYPE
|
||||
|
||||
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
|
||||
// This will be inlined as part of ImVec2 and ImVec4 class declarations.
|
||||
/*
|
||||
#define IM_VEC2_CLASS_EXTRA \
|
||||
ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
|
||||
operator MyVec2() const { return MyVec2(x,y); }
|
||||
|
||||
#define IM_VEC4_CLASS_EXTRA \
|
||||
ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
|
||||
operator MyVec4() const { return MyVec4(x,y,z,w); }
|
||||
*/
|
||||
|
||||
//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
|
||||
// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
|
||||
// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
|
||||
// Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
|
||||
//#define ImDrawIdx unsigned int
|
||||
|
||||
//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
|
||||
//struct ImDrawList;
|
||||
//struct ImDrawCmd;
|
||||
//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
|
||||
//#define ImDrawCallback MyImDrawCallback
|
||||
|
||||
//---- Debug Tools: Macro to break in Debugger
|
||||
// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.)
|
||||
//#define IM_DEBUG_BREAK IM_ASSERT(0)
|
||||
//#define IM_DEBUG_BREAK __debugbreak()
|
||||
|
||||
//---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(),
|
||||
// (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.)
|
||||
// This adds a small runtime cost which is why it is not enabled by default.
|
||||
//#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX
|
||||
|
||||
//---- Debug Tools: Enable slower asserts
|
||||
//#define IMGUI_DEBUG_PARANOID
|
||||
|
||||
//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.
|
||||
/*
|
||||
namespace ImGui
|
||||
{
|
||||
void MyFunction(const char* name, const MyMatrix44& v);
|
||||
}
|
||||
*/
|
||||
Executable
+13243
File diff suppressed because it is too large
Load Diff
Executable
+3062
File diff suppressed because it is too large
Load Diff
Executable
+7928
File diff suppressed because it is too large
Load Diff
Executable
+4201
File diff suppressed because it is too large
Load Diff
Executable
+357
@@ -0,0 +1,357 @@
|
||||
// dear imgui: Platform Binding for Android native app
|
||||
// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3)
|
||||
|
||||
// Implemented features:
|
||||
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy AKEYCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
|
||||
// Missing features:
|
||||
// [ ] Platform: Clipboard support.
|
||||
// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||||
// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android.
|
||||
// Important:
|
||||
// - Consider using SDL or GLFW backend on Android, which will be more full-featured than this.
|
||||
// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446)
|
||||
// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446)
|
||||
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
||||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago)with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion.
|
||||
// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+).
|
||||
// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range.
|
||||
// 2021-03-04: Initial version.
|
||||
#include <ctime>
|
||||
#include <map>
|
||||
#include <queue>
|
||||
#include <imgui.h>
|
||||
#include "imgui_impl_android.h"
|
||||
#include <time.h>
|
||||
#include <android/native_window.h>
|
||||
#include <android/input.h>
|
||||
#include <android/keycodes.h>
|
||||
#include <android/log.h>
|
||||
|
||||
|
||||
|
||||
// Android data
|
||||
static double g_Time = 0.0;
|
||||
static ANativeWindow* g_Window;
|
||||
static char g_LogTag[] = "ImGuiExample";
|
||||
|
||||
static ImGuiKey ImGui_ImplAndroid_KeyCodeToImGuiKey(int32_t key_code)
|
||||
{
|
||||
switch (key_code)
|
||||
{
|
||||
case AKEYCODE_TAB: return ImGuiKey_Tab;
|
||||
case AKEYCODE_DPAD_LEFT: return ImGuiKey_LeftArrow;
|
||||
case AKEYCODE_DPAD_RIGHT: return ImGuiKey_RightArrow;
|
||||
case AKEYCODE_DPAD_UP: return ImGuiKey_UpArrow;
|
||||
case AKEYCODE_DPAD_DOWN: return ImGuiKey_DownArrow;
|
||||
case AKEYCODE_PAGE_UP: return ImGuiKey_PageUp;
|
||||
case AKEYCODE_PAGE_DOWN: return ImGuiKey_PageDown;
|
||||
case AKEYCODE_MOVE_HOME: return ImGuiKey_Home;
|
||||
case AKEYCODE_MOVE_END: return ImGuiKey_End;
|
||||
case AKEYCODE_INSERT: return ImGuiKey_Insert;
|
||||
case AKEYCODE_FORWARD_DEL: return ImGuiKey_Delete;
|
||||
case AKEYCODE_DEL: return ImGuiKey_Backspace;
|
||||
case AKEYCODE_SPACE: return ImGuiKey_Space;
|
||||
case AKEYCODE_ENTER: return ImGuiKey_Enter;
|
||||
case AKEYCODE_ESCAPE: return ImGuiKey_Escape;
|
||||
case AKEYCODE_APOSTROPHE: return ImGuiKey_Apostrophe;
|
||||
case AKEYCODE_COMMA: return ImGuiKey_Comma;
|
||||
case AKEYCODE_MINUS: return ImGuiKey_Minus;
|
||||
case AKEYCODE_PERIOD: return ImGuiKey_Period;
|
||||
case AKEYCODE_SLASH: return ImGuiKey_Slash;
|
||||
case AKEYCODE_SEMICOLON: return ImGuiKey_Semicolon;
|
||||
case AKEYCODE_EQUALS: return ImGuiKey_Equal;
|
||||
case AKEYCODE_LEFT_BRACKET: return ImGuiKey_LeftBracket;
|
||||
case AKEYCODE_BACKSLASH: return ImGuiKey_Backslash;
|
||||
case AKEYCODE_RIGHT_BRACKET: return ImGuiKey_RightBracket;
|
||||
case AKEYCODE_GRAVE: return ImGuiKey_GraveAccent;
|
||||
case AKEYCODE_CAPS_LOCK: return ImGuiKey_CapsLock;
|
||||
case AKEYCODE_SCROLL_LOCK: return ImGuiKey_ScrollLock;
|
||||
case AKEYCODE_NUM_LOCK: return ImGuiKey_NumLock;
|
||||
case AKEYCODE_SYSRQ: return ImGuiKey_PrintScreen;
|
||||
case AKEYCODE_BREAK: return ImGuiKey_Pause;
|
||||
case AKEYCODE_NUMPAD_0: return ImGuiKey_Keypad0;
|
||||
case AKEYCODE_NUMPAD_1: return ImGuiKey_Keypad1;
|
||||
case AKEYCODE_NUMPAD_2: return ImGuiKey_Keypad2;
|
||||
case AKEYCODE_NUMPAD_3: return ImGuiKey_Keypad3;
|
||||
case AKEYCODE_NUMPAD_4: return ImGuiKey_Keypad4;
|
||||
case AKEYCODE_NUMPAD_5: return ImGuiKey_Keypad5;
|
||||
case AKEYCODE_NUMPAD_6: return ImGuiKey_Keypad6;
|
||||
case AKEYCODE_NUMPAD_7: return ImGuiKey_Keypad7;
|
||||
case AKEYCODE_NUMPAD_8: return ImGuiKey_Keypad8;
|
||||
case AKEYCODE_NUMPAD_9: return ImGuiKey_Keypad9;
|
||||
case AKEYCODE_NUMPAD_DOT: return ImGuiKey_KeypadDecimal;
|
||||
case AKEYCODE_NUMPAD_DIVIDE: return ImGuiKey_KeypadDivide;
|
||||
case AKEYCODE_NUMPAD_MULTIPLY: return ImGuiKey_KeypadMultiply;
|
||||
case AKEYCODE_NUMPAD_SUBTRACT: return ImGuiKey_KeypadSubtract;
|
||||
case AKEYCODE_NUMPAD_ADD: return ImGuiKey_KeypadAdd;
|
||||
case AKEYCODE_NUMPAD_ENTER: return ImGuiKey_KeypadEnter;
|
||||
case AKEYCODE_NUMPAD_EQUALS: return ImGuiKey_KeypadEqual;
|
||||
case AKEYCODE_CTRL_LEFT: return ImGuiKey_LeftCtrl;
|
||||
case AKEYCODE_SHIFT_LEFT: return ImGuiKey_LeftShift;
|
||||
case AKEYCODE_ALT_LEFT: return ImGuiKey_LeftAlt;
|
||||
case AKEYCODE_META_LEFT: return ImGuiKey_LeftSuper;
|
||||
case AKEYCODE_CTRL_RIGHT: return ImGuiKey_RightCtrl;
|
||||
case AKEYCODE_SHIFT_RIGHT: return ImGuiKey_RightShift;
|
||||
case AKEYCODE_ALT_RIGHT: return ImGuiKey_RightAlt;
|
||||
case AKEYCODE_META_RIGHT: return ImGuiKey_RightSuper;
|
||||
case AKEYCODE_MENU: return ImGuiKey_Menu;
|
||||
case AKEYCODE_0: return ImGuiKey_0;
|
||||
case AKEYCODE_1: return ImGuiKey_1;
|
||||
case AKEYCODE_2: return ImGuiKey_2;
|
||||
case AKEYCODE_3: return ImGuiKey_3;
|
||||
case AKEYCODE_4: return ImGuiKey_4;
|
||||
case AKEYCODE_5: return ImGuiKey_5;
|
||||
case AKEYCODE_6: return ImGuiKey_6;
|
||||
case AKEYCODE_7: return ImGuiKey_7;
|
||||
case AKEYCODE_8: return ImGuiKey_8;
|
||||
case AKEYCODE_9: return ImGuiKey_9;
|
||||
case AKEYCODE_A: return ImGuiKey_A;
|
||||
case AKEYCODE_B: return ImGuiKey_B;
|
||||
case AKEYCODE_C: return ImGuiKey_C;
|
||||
case AKEYCODE_D: return ImGuiKey_D;
|
||||
case AKEYCODE_E: return ImGuiKey_E;
|
||||
case AKEYCODE_F: return ImGuiKey_F;
|
||||
case AKEYCODE_G: return ImGuiKey_G;
|
||||
case AKEYCODE_H: return ImGuiKey_H;
|
||||
case AKEYCODE_I: return ImGuiKey_I;
|
||||
case AKEYCODE_J: return ImGuiKey_J;
|
||||
case AKEYCODE_K: return ImGuiKey_K;
|
||||
case AKEYCODE_L: return ImGuiKey_L;
|
||||
case AKEYCODE_M: return ImGuiKey_M;
|
||||
case AKEYCODE_N: return ImGuiKey_N;
|
||||
case AKEYCODE_O: return ImGuiKey_O;
|
||||
case AKEYCODE_P: return ImGuiKey_P;
|
||||
case AKEYCODE_Q: return ImGuiKey_Q;
|
||||
case AKEYCODE_R: return ImGuiKey_R;
|
||||
case AKEYCODE_S: return ImGuiKey_S;
|
||||
case AKEYCODE_T: return ImGuiKey_T;
|
||||
case AKEYCODE_U: return ImGuiKey_U;
|
||||
case AKEYCODE_V: return ImGuiKey_V;
|
||||
case AKEYCODE_W: return ImGuiKey_W;
|
||||
case AKEYCODE_X: return ImGuiKey_X;
|
||||
case AKEYCODE_Y: return ImGuiKey_Y;
|
||||
case AKEYCODE_Z: return ImGuiKey_Z;
|
||||
case AKEYCODE_F1: return ImGuiKey_F1;
|
||||
case AKEYCODE_F2: return ImGuiKey_F2;
|
||||
case AKEYCODE_F3: return ImGuiKey_F3;
|
||||
case AKEYCODE_F4: return ImGuiKey_F4;
|
||||
case AKEYCODE_F5: return ImGuiKey_F5;
|
||||
case AKEYCODE_F6: return ImGuiKey_F6;
|
||||
case AKEYCODE_F7: return ImGuiKey_F7;
|
||||
case AKEYCODE_F8: return ImGuiKey_F8;
|
||||
case AKEYCODE_F9: return ImGuiKey_F9;
|
||||
case AKEYCODE_F10: return ImGuiKey_F10;
|
||||
case AKEYCODE_F11: return ImGuiKey_F11;
|
||||
case AKEYCODE_F12: return ImGuiKey_F12;
|
||||
default: return ImGuiKey_None;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static std::map<int32_t, std::queue<int32_t>> g_KeyEventQueues; // FIXME: Remove dependency on map and queue once we use upcoming input queue.
|
||||
|
||||
int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent *input_event, ImVec2 screen_scale) {
|
||||
ImGuiIO &io = ImGui::GetIO();
|
||||
int32_t event_type = AInputEvent_getType(input_event);
|
||||
switch (event_type) {
|
||||
case AINPUT_EVENT_TYPE_KEY: {
|
||||
int32_t event_key_code = AKeyEvent_getKeyCode(input_event);
|
||||
int32_t event_action = AKeyEvent_getAction(input_event);
|
||||
int32_t event_meta_state = AKeyEvent_getMetaState(input_event);
|
||||
|
||||
io.KeyCtrl = ((event_meta_state & AMETA_CTRL_ON) != 0);
|
||||
io.KeyShift = ((event_meta_state & AMETA_SHIFT_ON) != 0);
|
||||
io.KeyAlt = ((event_meta_state & AMETA_ALT_ON) != 0);
|
||||
|
||||
switch (event_action) {
|
||||
// FIXME: AKEY_EVENT_ACTION_DOWN and AKEY_EVENT_ACTION_UP occur at once as soon as a touch pointer
|
||||
// goes up from a key. We use a simple key event queue/ and process one event per key per frame in
|
||||
// ImGui_ImplAndroid_NewFrame()...or consider using IO queue, if suitable: https://github.com/ocornut/imgui/issues/2787
|
||||
case AKEY_EVENT_ACTION_DOWN:
|
||||
case AKEY_EVENT_ACTION_UP:
|
||||
g_KeyEventQueues[event_key_code].push(event_action);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AINPUT_EVENT_TYPE_MOTION: {
|
||||
int32_t event_action = AMotionEvent_getAction(input_event);
|
||||
int32_t event_pointer_index = (event_action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
event_action &= AMOTION_EVENT_ACTION_MASK;
|
||||
switch (event_action) {
|
||||
case AMOTION_EVENT_ACTION_DOWN:
|
||||
case AMOTION_EVENT_ACTION_UP:
|
||||
// Physical mouse buttons (and probably other physical devices) also invoke the actions AMOTION_EVENT_ACTION_DOWN/_UP,
|
||||
// but we have to process them separately to identify the actual button pressed. This is done below via
|
||||
// AMOTION_EVENT_ACTION_BUTTON_PRESS/_RELEASE. Here, we only process "FINGER" input (and "UNKNOWN", as a fallback).
|
||||
if ((AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_FINGER) || (AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_UNKNOWN)) {
|
||||
io.MouseDown[0] = (event_action == AMOTION_EVENT_ACTION_DOWN);
|
||||
ImVec2 pos(AMotionEvent_getRawX(input_event, event_pointer_index), AMotionEvent_getRawY(input_event, event_pointer_index));
|
||||
io.MousePos = ImVec2(screen_scale.x > 0 ? pos.x / screen_scale.x : pos.x, screen_scale.y > 0 ? pos.y / screen_scale.y : pos.y);
|
||||
}
|
||||
break;
|
||||
case AMOTION_EVENT_ACTION_BUTTON_PRESS:
|
||||
case AMOTION_EVENT_ACTION_BUTTON_RELEASE: {
|
||||
int32_t button_state = AMotionEvent_getButtonState(input_event);
|
||||
io.MouseDown[0] = ((button_state & AMOTION_EVENT_BUTTON_PRIMARY) != 0);
|
||||
io.MouseDown[1] = ((button_state & AMOTION_EVENT_BUTTON_SECONDARY) != 0);
|
||||
io.MouseDown[2] = ((button_state & AMOTION_EVENT_BUTTON_TERTIARY) != 0);
|
||||
}
|
||||
break;
|
||||
case AMOTION_EVENT_ACTION_HOVER_MOVE: // Hovering: Tool moves while NOT pressed (such as a physical mouse)
|
||||
case AMOTION_EVENT_ACTION_MOVE: { // Touch pointer moves while DOWN
|
||||
ImVec2 pos(AMotionEvent_getRawX(input_event, event_pointer_index), AMotionEvent_getRawY(input_event, event_pointer_index));
|
||||
io.MousePos = ImVec2(screen_scale.x > 0 ? pos.x / screen_scale.x : pos.x, screen_scale.y > 0 ? pos.y / screen_scale.y : pos.y);
|
||||
break;
|
||||
}
|
||||
case AMOTION_EVENT_ACTION_SCROLL:
|
||||
io.MouseWheel = AMotionEvent_getAxisValue(input_event,AMOTION_EVENT_AXIS_VSCROLL,event_pointer_index);
|
||||
io.MouseWheelH = AMotionEvent_getAxisValue(input_event,AMOTION_EVENT_AXIS_HSCROLL,event_pointer_index);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event)
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
int32_t event_type = AInputEvent_getType(input_event);
|
||||
switch (event_type)
|
||||
{
|
||||
case AINPUT_EVENT_TYPE_KEY:
|
||||
{
|
||||
int32_t event_key_code = AKeyEvent_getKeyCode(input_event);
|
||||
int32_t event_scan_code = AKeyEvent_getScanCode(input_event);
|
||||
int32_t event_action = AKeyEvent_getAction(input_event);
|
||||
int32_t event_meta_state = AKeyEvent_getMetaState(input_event);
|
||||
|
||||
io.AddKeyEvent(ImGuiKey_ModCtrl, (event_meta_state & AMETA_CTRL_ON) != 0);
|
||||
io.AddKeyEvent(ImGuiKey_ModShift, (event_meta_state & AMETA_SHIFT_ON) != 0);
|
||||
io.AddKeyEvent(ImGuiKey_ModAlt, (event_meta_state & AMETA_ALT_ON) != 0);
|
||||
io.AddKeyEvent(ImGuiKey_ModSuper, (event_meta_state & AMETA_META_ON) != 0);
|
||||
|
||||
switch (event_action)
|
||||
{
|
||||
// FIXME: AKEY_EVENT_ACTION_DOWN and AKEY_EVENT_ACTION_UP occur at once as soon as a touch pointer
|
||||
// goes up from a key. We use a simple key event queue/ and process one event per key per frame in
|
||||
// ImGui_ImplAndroid_NewFrame()...or consider using IO queue, if suitable: https://github.com/ocornut/imgui/issues/2787
|
||||
case AKEY_EVENT_ACTION_DOWN:
|
||||
case AKEY_EVENT_ACTION_UP:
|
||||
{
|
||||
ImGuiKey key = ImGui_ImplAndroid_KeyCodeToImGuiKey(event_key_code);
|
||||
if (key != ImGuiKey_None && (event_action == AKEY_EVENT_ACTION_DOWN || event_action == AKEY_EVENT_ACTION_UP))
|
||||
{
|
||||
io.AddKeyEvent(key, event_action == AKEY_EVENT_ACTION_DOWN);
|
||||
io.SetKeyEventNativeData(key, event_key_code, event_scan_code);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AINPUT_EVENT_TYPE_MOTION:
|
||||
{
|
||||
int32_t event_action = AMotionEvent_getAction(input_event);
|
||||
int32_t event_pointer_index = (event_action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
event_action &= AMOTION_EVENT_ACTION_MASK;
|
||||
switch (event_action)
|
||||
{
|
||||
case AMOTION_EVENT_ACTION_DOWN:
|
||||
case AMOTION_EVENT_ACTION_UP:
|
||||
// Physical mouse buttons (and probably other physical devices) also invoke the actions AMOTION_EVENT_ACTION_DOWN/_UP,
|
||||
// but we have to process them separately to identify the actual button pressed. This is done below via
|
||||
// AMOTION_EVENT_ACTION_BUTTON_PRESS/_RELEASE. Here, we only process "FINGER" input (and "UNKNOWN", as a fallback).
|
||||
if((AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_FINGER)
|
||||
|| (AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_UNKNOWN))
|
||||
{
|
||||
io.AddMousePosEvent(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index));
|
||||
io.AddMouseButtonEvent(0, event_action == AMOTION_EVENT_ACTION_DOWN);
|
||||
}
|
||||
break;
|
||||
case AMOTION_EVENT_ACTION_BUTTON_PRESS:
|
||||
case AMOTION_EVENT_ACTION_BUTTON_RELEASE:
|
||||
{
|
||||
int32_t button_state = AMotionEvent_getButtonState(input_event);
|
||||
io.AddMouseButtonEvent(0, (button_state & AMOTION_EVENT_BUTTON_PRIMARY) != 0);
|
||||
io.AddMouseButtonEvent(1, (button_state & AMOTION_EVENT_BUTTON_SECONDARY) != 0);
|
||||
io.AddMouseButtonEvent(2, (button_state & AMOTION_EVENT_BUTTON_TERTIARY) != 0);
|
||||
}
|
||||
break;
|
||||
case AMOTION_EVENT_ACTION_HOVER_MOVE: // Hovering: Tool moves while NOT pressed (such as a physical mouse)
|
||||
case AMOTION_EVENT_ACTION_MOVE: // Touch pointer moves while DOWN
|
||||
io.AddMousePosEvent(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index));
|
||||
break;
|
||||
case AMOTION_EVENT_ACTION_SCROLL:
|
||||
io.AddMouseWheelEvent(AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_HSCROLL, event_pointer_index), AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_VSCROLL, event_pointer_index));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ImGui_ImplAndroid_Init(ANativeWindow* window)
|
||||
{
|
||||
g_Window = window;
|
||||
g_Time = 0.0;
|
||||
|
||||
// Setup backend capabilities flags
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.BackendPlatformName = "imgui_impl_android";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImGui_ImplAndroid_Shutdown()
|
||||
{
|
||||
}
|
||||
|
||||
void ImGui_ImplAndroid_NewFrame(int32_t window_width,int32_t window_height)
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
|
||||
// Setup display size (every frame to accommodate for window resizing)
|
||||
//int32_t window_width = ANativeWindow_getWidth(g_Window);
|
||||
//int32_t window_height = ANativeWindow_getHeight(g_Window);
|
||||
int display_width = window_width;
|
||||
int display_height = window_height;
|
||||
|
||||
io.DisplaySize = ImVec2((float)window_width, (float)window_height);
|
||||
if (window_width > 0 && window_height > 0)
|
||||
io.DisplayFramebufferScale = ImVec2((float)display_width / window_width, (float)display_height / window_height);
|
||||
|
||||
// Setup time step
|
||||
struct timespec current_timespec;
|
||||
clock_gettime(CLOCK_MONOTONIC, ¤t_timespec);
|
||||
double current_time = (double)(current_timespec.tv_sec) + (current_timespec.tv_nsec / 1000000000.0);
|
||||
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
|
||||
g_Time = current_time;
|
||||
}
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
// dear imgui: Platform Binding for Android native app
|
||||
// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3)
|
||||
|
||||
// Implemented features:
|
||||
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy AKEYCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
|
||||
// Missing features:
|
||||
// [ ] Platform: Clipboard support.
|
||||
// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||||
// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android.
|
||||
// Important:
|
||||
// - Consider using SDL or GLFW backend on Android, which will be more full-featured than this.
|
||||
// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446)
|
||||
// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446)
|
||||
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
||||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#pragma once
|
||||
|
||||
struct ANativeWindow;
|
||||
struct AInputEvent;
|
||||
|
||||
IMGUI_IMPL_API bool ImGui_ImplAndroid_Init(ANativeWindow* window = NULL);
|
||||
IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event);
|
||||
IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent *input_event, ImVec2 screen_scale);
|
||||
IMGUI_IMPL_API void ImGui_ImplAndroid_Shutdown();
|
||||
IMGUI_IMPL_API void ImGui_ImplAndroid_NewFrame(int32_t window_width,int32_t window_height);
|
||||
Executable
+811
@@ -0,0 +1,811 @@
|
||||
// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
|
||||
// - Desktop GL: 2.x 3.x 4.x
|
||||
// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
|
||||
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
|
||||
|
||||
// Implemented features:
|
||||
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
|
||||
// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
|
||||
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
||||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2021-12-15: OpenGL: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers.
|
||||
// 2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions.
|
||||
// 2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader.
|
||||
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
|
||||
// 2021-06-25: OpenGL: Use OES_vertex_array extension on Emscripten + backup/restore current state.
|
||||
// 2021-06-21: OpenGL: Destroy individual vertex/fragment shader objects right after they are linked into the main shader.
|
||||
// 2021-05-24: OpenGL: Access GL_CLIP_ORIGIN when "GL_ARB_clip_control" extension is detected, inside of just OpenGL 4.5 version.
|
||||
// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
|
||||
// 2021-04-06: OpenGL: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5 or greater.
|
||||
// 2021-02-18: OpenGL: Change blending equation to preserve alpha in output buffer.
|
||||
// 2021-01-03: OpenGL: Backup, setup and restore GL_STENCIL_TEST state.
|
||||
// 2020-10-23: OpenGL: Backup, setup and restore GL_PRIMITIVE_RESTART state.
|
||||
// 2020-10-15: OpenGL: Use glGetString(GL_VERSION) instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x)
|
||||
// 2020-09-17: OpenGL: Fix to avoid compiling/calling glBindSampler() on ES or pre 3.3 context which have the defines set by a loader.
|
||||
// 2020-07-10: OpenGL: Added support for glad2 OpenGL loader.
|
||||
// 2020-05-08: OpenGL: Made default GLSL version 150 (instead of 130) on OSX.
|
||||
// 2020-04-21: OpenGL: Fixed handling of glClipControl(GL_UPPER_LEFT) by inverting projection matrix.
|
||||
// 2020-04-12: OpenGL: Fixed context version check mistakenly testing for 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset.
|
||||
// 2020-03-24: OpenGL: Added support for glbinding 2.x OpenGL loader.
|
||||
// 2020-01-07: OpenGL: Added support for glbinding 3.x OpenGL loader.
|
||||
// 2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders.
|
||||
// 2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility.
|
||||
// 2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call.
|
||||
// 2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
|
||||
// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
|
||||
// 2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop.
|
||||
// 2019-03-15: OpenGL: Added a GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early.
|
||||
// 2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0).
|
||||
// 2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader.
|
||||
// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
|
||||
// 2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450).
|
||||
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
|
||||
// 2018-11-13: OpenGL: Support for GL 4.5's glClipControl(GL_UPPER_LEFT) / GL_CLIP_ORIGIN.
|
||||
// 2018-08-29: OpenGL: Added support for more OpenGL loaders: glew and glad, with comments indicative that any loader can be used.
|
||||
// 2018-08-09: OpenGL: Default to OpenGL ES 3 on iOS and Android. GLSL version default to "#version 300 ES".
|
||||
// 2018-07-30: OpenGL: Support for GLSL 300 ES and 410 core. Fixes for Emscripten compilation.
|
||||
// 2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link.
|
||||
// 2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples.
|
||||
// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
|
||||
// 2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state.
|
||||
// 2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a NULL pointer.
|
||||
// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150".
|
||||
// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
|
||||
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
|
||||
// 2018-01-07: OpenGL: Changed GLSL shader version from 330 to 150.
|
||||
// 2017-09-01: OpenGL: Save and restore current bound sampler. Save and restore current polygon mode.
|
||||
// 2017-05-01: OpenGL: Fixed save and restore of current blend func state.
|
||||
// 2017-05-01: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE.
|
||||
// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
|
||||
// 2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752)
|
||||
|
||||
//----------------------------------------
|
||||
// OpenGL GLSL GLSL
|
||||
// version version string
|
||||
//----------------------------------------
|
||||
// 2.0 110 "#version 110"
|
||||
// 2.1 120 "#version 120"
|
||||
// 3.0 130 "#version 130"
|
||||
// 3.1 140 "#version 140"
|
||||
// 3.2 150 "#version 150"
|
||||
// 3.3 330 "#version 330 core"
|
||||
// 4.0 400 "#version 400 core"
|
||||
// 4.1 410 "#version 410 core"
|
||||
// 4.2 420 "#version 410 core"
|
||||
// 4.3 430 "#version 430 core"
|
||||
// ES 2.0 100 "#version 100" = WebGL 1.0
|
||||
// ES 3.0 300 "#version 300 es" = WebGL 2.0
|
||||
//----------------------------------------
|
||||
|
||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include "imgui.h"
|
||||
#include "imgui_impl_opengl3.h"
|
||||
#include <stdio.h>
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
|
||||
#include <stddef.h> // intptr_t
|
||||
#else
|
||||
#include <stdint.h> // intptr_t
|
||||
#endif
|
||||
|
||||
// Clang warnings with -Weverything
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
|
||||
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
|
||||
#if __has_warning("-Wzero-as-null-pointer-constant")
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// GL includes
|
||||
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV))
|
||||
#include <OpenGLES/ES2/gl.h> // Use GL ES 2
|
||||
#else
|
||||
#include <GLES2/gl2.h> // Use GL ES 2
|
||||
#endif
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
#ifndef GL_GLEXT_PROTOTYPES
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#endif
|
||||
#include <GLES2/gl2ext.h>
|
||||
#endif
|
||||
#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV))
|
||||
#include <OpenGLES/ES3/gl.h> // Use GL ES 3
|
||||
#else
|
||||
#include <GLES3/gl3.h> // Use GL ES 3
|
||||
#endif
|
||||
#elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
|
||||
// Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers.
|
||||
// Helper libraries are often used for this purpose! Here we are using our own minimal custom loader based on gl3w.
|
||||
// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.).
|
||||
// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp):
|
||||
// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped
|
||||
// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases
|
||||
// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
|
||||
#define IMGL3W_IMPL
|
||||
#include "imgui_impl_opengl3_loader.h"
|
||||
#endif
|
||||
|
||||
// Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension
|
||||
#ifndef IMGUI_IMPL_OPENGL_ES2
|
||||
#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
#define glBindVertexArray glBindVertexArrayOES
|
||||
#define glGenVertexArrays glGenVertexArraysOES
|
||||
#define glDeleteVertexArrays glDeleteVertexArraysOES
|
||||
#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES
|
||||
#endif
|
||||
|
||||
// Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have.
|
||||
#ifdef GL_POLYGON_MODE
|
||||
#define IMGUI_IMPL_HAS_POLYGON_MODE
|
||||
#endif
|
||||
|
||||
// Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have.
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2)
|
||||
#define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
|
||||
#endif
|
||||
|
||||
// Desktop GL 3.3+ has glBindSampler()
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3)
|
||||
#define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
|
||||
#endif
|
||||
|
||||
// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1)
|
||||
#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
|
||||
#endif
|
||||
|
||||
// Desktop GL use extension detection
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
#define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
|
||||
#endif
|
||||
|
||||
// OpenGL Data
|
||||
struct ImGui_ImplOpenGL3_Data
|
||||
{
|
||||
GLuint GlVersion; // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries (e.g. 320 for GL 3.2)
|
||||
char GlslVersionString[32]; // Specified by user or detected based on compile time GL settings.
|
||||
GLuint FontTexture;
|
||||
GLuint ShaderHandle;
|
||||
GLint AttribLocationTex; // Uniforms location
|
||||
GLint AttribLocationProjMtx;
|
||||
GLuint AttribLocationVtxPos; // Vertex attributes location
|
||||
GLuint AttribLocationVtxUV;
|
||||
GLuint AttribLocationVtxColor;
|
||||
unsigned int VboHandle, ElementsHandle;
|
||||
GLsizeiptr VertexBufferSize;
|
||||
GLsizeiptr IndexBufferSize;
|
||||
bool HasClipOrigin;
|
||||
|
||||
ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); }
|
||||
};
|
||||
|
||||
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
|
||||
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
|
||||
static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData()
|
||||
{
|
||||
return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
|
||||
}
|
||||
|
||||
// Functions
|
||||
bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
|
||||
|
||||
// Initialize our loader
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
|
||||
if (imgl3wInit() != 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to initialize OpenGL loader!\n");
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Setup backend capabilities flags
|
||||
ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)();
|
||||
io.BackendRendererUserData = (void*)bd;
|
||||
io.BackendRendererName = "imgui_impl_opengl3";
|
||||
|
||||
// Query for GL version (e.g. 320 for GL 3.2)
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
GLint major = 0;
|
||||
GLint minor = 0;
|
||||
glGetIntegerv(GL_MAJOR_VERSION, &major);
|
||||
glGetIntegerv(GL_MINOR_VERSION, &minor);
|
||||
if (major == 0 && minor == 0)
|
||||
{
|
||||
// Query GL_VERSION in desktop GL 2.x, the string will start with "<major>.<minor>"
|
||||
const char* gl_version = (const char*)glGetString(GL_VERSION);
|
||||
sscanf(gl_version, "%d.%d", &major, &minor);
|
||||
}
|
||||
bd->GlVersion = (GLuint)(major * 100 + minor * 10);
|
||||
#else
|
||||
bd->GlVersion = 200; // GLES 2
|
||||
#endif
|
||||
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
|
||||
if (bd->GlVersion >= 320)
|
||||
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
||||
#endif
|
||||
|
||||
// Store GLSL version string so we can refer to it later in case we recreate shaders.
|
||||
// Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
|
||||
if (glsl_version == NULL)
|
||||
{
|
||||
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
glsl_version = "#version 100";
|
||||
#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
glsl_version = "#version 300 es";
|
||||
#elif defined(__APPLE__)
|
||||
glsl_version = "#version 150";
|
||||
#else
|
||||
glsl_version = "#version 130";
|
||||
#endif
|
||||
}
|
||||
IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString));
|
||||
strcpy(bd->GlslVersionString, glsl_version);
|
||||
strcat(bd->GlslVersionString, "\n");
|
||||
|
||||
// Make an arbitrary GL call (we don't actually need the result)
|
||||
// IF YOU GET A CRASH HERE: it probably means the OpenGL function loader didn't do its job. Let us know!
|
||||
GLint current_texture;
|
||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture);
|
||||
|
||||
// Detect extensions we support
|
||||
bd->HasClipOrigin = (bd->GlVersion >= 450);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
|
||||
GLint num_extensions = 0;
|
||||
glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
|
||||
for (GLint i = 0; i < num_extensions; i++)
|
||||
{
|
||||
const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i);
|
||||
if (extension != NULL && strcmp(extension, "GL_ARB_clip_control") == 0)
|
||||
bd->HasClipOrigin = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImGui_ImplOpenGL3_Shutdown()
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
|
||||
ImGui_ImplOpenGL3_DestroyDeviceObjects();
|
||||
io.BackendRendererName = NULL;
|
||||
io.BackendRendererUserData = NULL;
|
||||
IM_DELETE(bd);
|
||||
}
|
||||
|
||||
void ImGui_ImplOpenGL3_NewFrame()
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL3_Init()?");
|
||||
|
||||
if (!bd->ShaderHandle)
|
||||
ImGui_ImplOpenGL3_CreateDeviceObjects();
|
||||
}
|
||||
|
||||
static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object)
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
|
||||
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
|
||||
glEnable(GL_BLEND);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDisable(GL_CULL_FACE);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
|
||||
if (bd->GlVersion >= 310)
|
||||
glDisable(GL_PRIMITIVE_RESTART);
|
||||
#endif
|
||||
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
#endif
|
||||
|
||||
// Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT)
|
||||
#if defined(GL_CLIP_ORIGIN)
|
||||
bool clip_origin_lower_left = true;
|
||||
if (bd->HasClipOrigin)
|
||||
{
|
||||
GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin);
|
||||
if (current_clip_origin == GL_UPPER_LEFT)
|
||||
clip_origin_lower_left = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Setup viewport, orthographic projection matrix
|
||||
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
|
||||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
||||
float L = draw_data->DisplayPos.x;
|
||||
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
||||
float T = draw_data->DisplayPos.y;
|
||||
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
||||
#if defined(GL_CLIP_ORIGIN)
|
||||
if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left
|
||||
#endif
|
||||
const float ortho_projection[4][4] =
|
||||
{
|
||||
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, -1.0f, 0.0f },
|
||||
{ (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f },
|
||||
};
|
||||
glUseProgram(bd->ShaderHandle);
|
||||
glUniform1i(bd->AttribLocationTex, 0);
|
||||
glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
||||
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
|
||||
if (bd->GlVersion >= 330)
|
||||
glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
||||
#endif
|
||||
|
||||
(void)vertex_array_object;
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
glBindVertexArray(vertex_array_object);
|
||||
#endif
|
||||
|
||||
// Bind vertex/index buffers and setup attributes for ImDrawVert
|
||||
glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle);
|
||||
glEnableVertexAttribArray(bd->AttribLocationVtxPos);
|
||||
glEnableVertexAttribArray(bd->AttribLocationVtxUV);
|
||||
glEnableVertexAttribArray(bd->AttribLocationVtxColor);
|
||||
glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
|
||||
glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
|
||||
glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
|
||||
}
|
||||
|
||||
// OpenGL3 Render function.
|
||||
// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly.
|
||||
// This is in order to be able to run within an OpenGL engine that doesn't do so.
|
||||
void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
||||
{
|
||||
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||||
int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
|
||||
int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
|
||||
if (fb_width <= 0 || fb_height <= 0)
|
||||
return;
|
||||
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
|
||||
// Backup GL state
|
||||
GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program);
|
||||
GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
|
||||
GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; }
|
||||
#endif
|
||||
GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer);
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object);
|
||||
#endif
|
||||
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
|
||||
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
|
||||
#endif
|
||||
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
|
||||
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
|
||||
GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
|
||||
GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
|
||||
GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
|
||||
GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
|
||||
GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
|
||||
GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
|
||||
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
|
||||
GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
|
||||
GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
|
||||
GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST);
|
||||
GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
|
||||
GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE;
|
||||
#endif
|
||||
|
||||
// Setup desired GL state
|
||||
// Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts)
|
||||
// The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound.
|
||||
GLuint vertex_array_object = 0;
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
glGenVertexArrays(1, &vertex_array_object);
|
||||
#endif
|
||||
ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
|
||||
|
||||
// Will project scissor/clipping rectangles into framebuffer space
|
||||
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
||||
ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
|
||||
|
||||
// Render command lists
|
||||
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||||
{
|
||||
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||||
|
||||
// Upload vertex/index buffers
|
||||
GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert);
|
||||
GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx);
|
||||
if (bd->VertexBufferSize < vtx_buffer_size)
|
||||
{
|
||||
bd->VertexBufferSize = vtx_buffer_size;
|
||||
glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, NULL, GL_STREAM_DRAW);
|
||||
}
|
||||
if (bd->IndexBufferSize < idx_buffer_size)
|
||||
{
|
||||
bd->IndexBufferSize = idx_buffer_size;
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, NULL, GL_STREAM_DRAW);
|
||||
}
|
||||
glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data);
|
||||
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data);
|
||||
|
||||
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
||||
{
|
||||
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
||||
if (pcmd->UserCallback != NULL)
|
||||
{
|
||||
// User callback, registered via ImDrawList::AddCallback()
|
||||
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
|
||||
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
|
||||
ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
|
||||
else
|
||||
pcmd->UserCallback(cmd_list, pcmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Project scissor/clipping rectangles into framebuffer space
|
||||
ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
|
||||
ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
|
||||
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
|
||||
continue;
|
||||
|
||||
// Apply scissor/clipping rectangle (Y is inverted in OpenGL)
|
||||
glScissor((int)clip_min.x, (int)((float)fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y));
|
||||
|
||||
// Bind texture, Draw
|
||||
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID());
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
|
||||
if (bd->GlVersion >= 320)
|
||||
glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset);
|
||||
else
|
||||
#endif
|
||||
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Destroy the temporary VAO
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
glDeleteVertexArrays(1, &vertex_array_object);
|
||||
#endif
|
||||
|
||||
// Restore modified GL state
|
||||
glUseProgram(last_program);
|
||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
|
||||
if (bd->GlVersion >= 330)
|
||||
glBindSampler(0, last_sampler);
|
||||
#endif
|
||||
glActiveTexture(last_active_texture);
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
glBindVertexArray(last_vertex_array_object);
|
||||
#endif
|
||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
||||
glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
|
||||
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
|
||||
if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
|
||||
if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
|
||||
if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST);
|
||||
if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
|
||||
if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); }
|
||||
#endif
|
||||
|
||||
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
|
||||
glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
|
||||
#endif
|
||||
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
|
||||
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
|
||||
(void)bd; // Not all compilation paths use this
|
||||
}
|
||||
|
||||
bool ImGui_ImplOpenGL3_CreateFontsTexture()
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
|
||||
// Build texture atlas
|
||||
unsigned char* pixels;
|
||||
int width, height;
|
||||
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
|
||||
|
||||
// Upload texture to graphics system
|
||||
GLint last_texture;
|
||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||
glGenTextures(1, &bd->FontTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, bd->FontTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
#ifdef GL_UNPACK_ROW_LENGTH // Not on WebGL/ES
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
#endif
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
||||
|
||||
// Store our identifier
|
||||
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
|
||||
|
||||
// Restore state
|
||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImGui_ImplOpenGL3_DestroyFontsTexture()
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
if (bd->FontTexture)
|
||||
{
|
||||
glDeleteTextures(1, &bd->FontTexture);
|
||||
io.Fonts->SetTexID(0);
|
||||
bd->FontTexture = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file.
|
||||
static bool CheckShader(GLuint handle, const char* desc)
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
GLint status = 0, log_length = 0;
|
||||
glGetShaderiv(handle, GL_COMPILE_STATUS, &status);
|
||||
glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length);
|
||||
if ((GLboolean)status == GL_FALSE)
|
||||
fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString);
|
||||
if (log_length > 1)
|
||||
{
|
||||
ImVector<char> buf;
|
||||
buf.resize((int)(log_length + 1));
|
||||
glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
|
||||
fprintf(stderr, "%s\n", buf.begin());
|
||||
}
|
||||
return (GLboolean)status == GL_TRUE;
|
||||
}
|
||||
|
||||
// If you get an error please report on GitHub. You may try different GL context version or GLSL version.
|
||||
static bool CheckProgram(GLuint handle, const char* desc)
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
GLint status = 0, log_length = 0;
|
||||
glGetProgramiv(handle, GL_LINK_STATUS, &status);
|
||||
glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length);
|
||||
if ((GLboolean)status == GL_FALSE)
|
||||
fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString);
|
||||
if (log_length > 1)
|
||||
{
|
||||
ImVector<char> buf;
|
||||
buf.resize((int)(log_length + 1));
|
||||
glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
|
||||
fprintf(stderr, "%s\n", buf.begin());
|
||||
}
|
||||
return (GLboolean)status == GL_TRUE;
|
||||
}
|
||||
|
||||
bool ImGui_ImplOpenGL3_CreateDeviceObjects()
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
|
||||
// Backup GL state
|
||||
GLint last_texture, last_array_buffer;
|
||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
GLint last_vertex_array;
|
||||
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
||||
#endif
|
||||
|
||||
// Parse GLSL version string
|
||||
int glsl_version = 130;
|
||||
sscanf(bd->GlslVersionString, "#version %d", &glsl_version);
|
||||
|
||||
const GLchar* vertex_shader_glsl_120 =
|
||||
"uniform mat4 ProjMtx;\n"
|
||||
"attribute vec2 Position;\n"
|
||||
"attribute vec2 UV;\n"
|
||||
"attribute vec4 Color;\n"
|
||||
"varying vec2 Frag_UV;\n"
|
||||
"varying vec4 Frag_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Frag_UV = UV;\n"
|
||||
" Frag_Color = Color;\n"
|
||||
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* vertex_shader_glsl_130 =
|
||||
"uniform mat4 ProjMtx;\n"
|
||||
"in vec2 Position;\n"
|
||||
"in vec2 UV;\n"
|
||||
"in vec4 Color;\n"
|
||||
"out vec2 Frag_UV;\n"
|
||||
"out vec4 Frag_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Frag_UV = UV;\n"
|
||||
" Frag_Color = Color;\n"
|
||||
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* vertex_shader_glsl_300_es =
|
||||
"precision highp float;\n"
|
||||
"layout (location = 0) in vec2 Position;\n"
|
||||
"layout (location = 1) in vec2 UV;\n"
|
||||
"layout (location = 2) in vec4 Color;\n"
|
||||
"uniform mat4 ProjMtx;\n"
|
||||
"out vec2 Frag_UV;\n"
|
||||
"out vec4 Frag_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Frag_UV = UV;\n"
|
||||
" Frag_Color = Color;\n"
|
||||
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* vertex_shader_glsl_410_core =
|
||||
"layout (location = 0) in vec2 Position;\n"
|
||||
"layout (location = 1) in vec2 UV;\n"
|
||||
"layout (location = 2) in vec4 Color;\n"
|
||||
"uniform mat4 ProjMtx;\n"
|
||||
"out vec2 Frag_UV;\n"
|
||||
"out vec4 Frag_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Frag_UV = UV;\n"
|
||||
" Frag_Color = Color;\n"
|
||||
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* fragment_shader_glsl_120 =
|
||||
"#ifdef GL_ES\n"
|
||||
" precision mediump float;\n"
|
||||
"#endif\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"varying vec2 Frag_UV;\n"
|
||||
"varying vec4 Frag_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* fragment_shader_glsl_130 =
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec2 Frag_UV;\n"
|
||||
"in vec4 Frag_Color;\n"
|
||||
"out vec4 Out_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* fragment_shader_glsl_300_es =
|
||||
"precision mediump float;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec2 Frag_UV;\n"
|
||||
"in vec4 Frag_Color;\n"
|
||||
"layout (location = 0) out vec4 Out_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
|
||||
"}\n";
|
||||
|
||||
const GLchar* fragment_shader_glsl_410_core =
|
||||
"in vec2 Frag_UV;\n"
|
||||
"in vec4 Frag_Color;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"layout (location = 0) out vec4 Out_Color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
|
||||
"}\n";
|
||||
|
||||
// Select shaders matching our GLSL versions
|
||||
const GLchar* vertex_shader = NULL;
|
||||
const GLchar* fragment_shader = NULL;
|
||||
if (glsl_version < 130)
|
||||
{
|
||||
vertex_shader = vertex_shader_glsl_120;
|
||||
fragment_shader = fragment_shader_glsl_120;
|
||||
}
|
||||
else if (glsl_version >= 410)
|
||||
{
|
||||
vertex_shader = vertex_shader_glsl_410_core;
|
||||
fragment_shader = fragment_shader_glsl_410_core;
|
||||
}
|
||||
else if (glsl_version == 300)
|
||||
{
|
||||
vertex_shader = vertex_shader_glsl_300_es;
|
||||
fragment_shader = fragment_shader_glsl_300_es;
|
||||
}
|
||||
else
|
||||
{
|
||||
vertex_shader = vertex_shader_glsl_130;
|
||||
fragment_shader = fragment_shader_glsl_130;
|
||||
}
|
||||
|
||||
// Create shaders
|
||||
const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader };
|
||||
GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(vert_handle, 2, vertex_shader_with_version, NULL);
|
||||
glCompileShader(vert_handle);
|
||||
CheckShader(vert_handle, "vertex shader");
|
||||
|
||||
const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader };
|
||||
GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(frag_handle, 2, fragment_shader_with_version, NULL);
|
||||
glCompileShader(frag_handle);
|
||||
CheckShader(frag_handle, "fragment shader");
|
||||
|
||||
// Link
|
||||
bd->ShaderHandle = glCreateProgram();
|
||||
glAttachShader(bd->ShaderHandle, vert_handle);
|
||||
glAttachShader(bd->ShaderHandle, frag_handle);
|
||||
glLinkProgram(bd->ShaderHandle);
|
||||
CheckProgram(bd->ShaderHandle, "shader program");
|
||||
|
||||
glDetachShader(bd->ShaderHandle, vert_handle);
|
||||
glDetachShader(bd->ShaderHandle, frag_handle);
|
||||
glDeleteShader(vert_handle);
|
||||
glDeleteShader(frag_handle);
|
||||
|
||||
bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture");
|
||||
bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx");
|
||||
bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position");
|
||||
bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV");
|
||||
bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color");
|
||||
|
||||
// Create buffers
|
||||
glGenBuffers(1, &bd->VboHandle);
|
||||
glGenBuffers(1, &bd->ElementsHandle);
|
||||
|
||||
ImGui_ImplOpenGL3_CreateFontsTexture();
|
||||
|
||||
// Restore modified GL state
|
||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
|
||||
glBindVertexArray(last_vertex_array);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImGui_ImplOpenGL3_DestroyDeviceObjects()
|
||||
{
|
||||
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
|
||||
if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; }
|
||||
if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; }
|
||||
if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; }
|
||||
ImGui_ImplOpenGL3_DestroyFontsTexture();
|
||||
}
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
|
||||
// - Desktop GL: 2.x 3.x 4.x
|
||||
// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
|
||||
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
|
||||
|
||||
// Implemented features:
|
||||
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
|
||||
// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
|
||||
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
||||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
// About GLSL version:
|
||||
// The 'glsl_version' initialization parameter should be NULL (default) or a "#version XXX" string.
|
||||
// On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es"
|
||||
// Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp.
|
||||
|
||||
#pragma once
|
||||
#include <imgui.h> // IMGUI_IMPL_API
|
||||
|
||||
// Backend API
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL);
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data);
|
||||
|
||||
// (Optional) Called by Init/NewFrame/Shutdown
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateFontsTexture();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture();
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
|
||||
|
||||
// Specific OpenGL ES versions
|
||||
//#define IMGUI_IMPL_OPENGL_ES2 // Auto-detected on Emscripten
|
||||
//#define IMGUI_IMPL_OPENGL_ES3 // Auto-detected on iOS/Android
|
||||
|
||||
// You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line.
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2) \
|
||||
&& !defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
|
||||
// Try to detect GLES on matching platforms
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__))
|
||||
#define IMGUI_IMPL_OPENGL_ES3 // iOS, Android -> GL ES 3, "#version 300 es"
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100"
|
||||
#else
|
||||
// Otherwise imgui_impl_opengl3_loader.h will be used.
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Executable
+2946
File diff suppressed because it is too large
Load Diff
Executable
+4062
File diff suppressed because it is too large
Load Diff
Executable
+8463
File diff suppressed because it is too large
Load Diff
Executable
+639
@@ -0,0 +1,639 @@
|
||||
// [DEAR IMGUI]
|
||||
// This is a slightly modified version of stb_rect_pack.h 1.00.
|
||||
// Those changes would need to be pushed into nothings/stb:
|
||||
// - Added STBRP__CDECL
|
||||
// Grep for [DEAR IMGUI] to find the changes.
|
||||
|
||||
// stb_rect_pack.h - v1.00 - public domain - rectangle packing
|
||||
// Sean Barrett 2014
|
||||
//
|
||||
// Useful for e.g. packing rectangular textures into an atlas.
|
||||
// Does not do rotation.
|
||||
//
|
||||
// Not necessarily the awesomest packing method, but better than
|
||||
// the totally naive one in stb_truetype (which is primarily what
|
||||
// this is meant to replace).
|
||||
//
|
||||
// Has only had a few tests run, may have issues.
|
||||
//
|
||||
// More docs to come.
|
||||
//
|
||||
// No memory allocations; uses qsort() and assert() from stdlib.
|
||||
// Can override those by defining STBRP_SORT and STBRP_ASSERT.
|
||||
//
|
||||
// This library currently uses the Skyline Bottom-Left algorithm.
|
||||
//
|
||||
// Please note: better rectangle packers are welcome! Please
|
||||
// implement them to the same API, but with a different init
|
||||
// function.
|
||||
//
|
||||
// Credits
|
||||
//
|
||||
// Library
|
||||
// Sean Barrett
|
||||
// Minor features
|
||||
// Martins Mozeiko
|
||||
// github:IntellectualKitty
|
||||
//
|
||||
// Bugfixes / warning fixes
|
||||
// Jeremy Jaussaud
|
||||
// Fabian Giesen
|
||||
//
|
||||
// Version history:
|
||||
//
|
||||
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
||||
// 0.99 (2019-02-07) warning fixes
|
||||
// 0.11 (2017-03-03) return packing success/fail result
|
||||
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
|
||||
// 0.09 (2016-08-27) fix compiler warnings
|
||||
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
|
||||
// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)
|
||||
// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort
|
||||
// 0.05: added STBRP_ASSERT to allow replacing assert
|
||||
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
|
||||
// 0.01: initial release
|
||||
//
|
||||
// LICENSE
|
||||
//
|
||||
// See end of file for license information.
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// INCLUDE SECTION
|
||||
//
|
||||
|
||||
#ifndef STB_INCLUDE_STB_RECT_PACK_H
|
||||
#define STB_INCLUDE_STB_RECT_PACK_H
|
||||
|
||||
#define STB_RECT_PACK_VERSION 1
|
||||
|
||||
#ifdef STBRP_STATIC
|
||||
#define STBRP_DEF static
|
||||
#else
|
||||
#define STBRP_DEF extern
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct stbrp_context stbrp_context;
|
||||
typedef struct stbrp_node stbrp_node;
|
||||
typedef struct stbrp_rect stbrp_rect;
|
||||
|
||||
#ifdef STBRP_LARGE_RECTS
|
||||
typedef int stbrp_coord;
|
||||
#else
|
||||
typedef unsigned short stbrp_coord;
|
||||
#endif
|
||||
|
||||
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
|
||||
// Assign packed locations to rectangles. The rectangles are of type
|
||||
// 'stbrp_rect' defined below, stored in the array 'rects', and there
|
||||
// are 'num_rects' many of them.
|
||||
//
|
||||
// Rectangles which are successfully packed have the 'was_packed' flag
|
||||
// set to a non-zero value and 'x' and 'y' store the minimum location
|
||||
// on each axis (i.e. bottom-left in cartesian coordinates, top-left
|
||||
// if you imagine y increasing downwards). Rectangles which do not fit
|
||||
// have the 'was_packed' flag set to 0.
|
||||
//
|
||||
// You should not try to access the 'rects' array from another thread
|
||||
// while this function is running, as the function temporarily reorders
|
||||
// the array while it executes.
|
||||
//
|
||||
// To pack into another rectangle, you need to call stbrp_init_target
|
||||
// again. To continue packing into the same rectangle, you can call
|
||||
// this function again. Calling this multiple times with multiple rect
|
||||
// arrays will probably produce worse packing results than calling it
|
||||
// a single time with the full rectangle array, but the option is
|
||||
// available.
|
||||
//
|
||||
// The function returns 1 if all of the rectangles were successfully
|
||||
// packed and 0 otherwise.
|
||||
|
||||
struct stbrp_rect
|
||||
{
|
||||
// reserved for your use:
|
||||
int id;
|
||||
|
||||
// input:
|
||||
stbrp_coord w, h;
|
||||
|
||||
// output:
|
||||
stbrp_coord x, y;
|
||||
int was_packed; // non-zero if valid packing
|
||||
|
||||
}; // 16 bytes, nominally
|
||||
|
||||
|
||||
STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
|
||||
// Initialize a rectangle packer to:
|
||||
// pack a rectangle that is 'width' by 'height' in dimensions
|
||||
// using temporary storage provided by the array 'nodes', which is 'num_nodes' long
|
||||
//
|
||||
// You must call this function every time you start packing into a new target.
|
||||
//
|
||||
// There is no "shutdown" function. The 'nodes' memory must stay valid for
|
||||
// the following stbrp_pack_rects() call (or calls), but can be freed after
|
||||
// the call (or calls) finish.
|
||||
//
|
||||
// Note: to guarantee best results, either:
|
||||
// 1. make sure 'num_nodes' >= 'width'
|
||||
// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'
|
||||
//
|
||||
// If you don't do either of the above things, widths will be quantized to multiples
|
||||
// of small integers to guarantee the algorithm doesn't run out of temporary storage.
|
||||
//
|
||||
// If you do #2, then the non-quantized algorithm will be used, but the algorithm
|
||||
// may run out of temporary storage and be unable to pack some rectangles.
|
||||
|
||||
STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);
|
||||
// Optionally call this function after init but before doing any packing to
|
||||
// change the handling of the out-of-temp-memory scenario, described above.
|
||||
// If you call init again, this will be reset to the default (false).
|
||||
|
||||
|
||||
STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);
|
||||
// Optionally select which packing heuristic the library should use. Different
|
||||
// heuristics will produce better/worse results for different data sets.
|
||||
// If you call init again, this will be reset to the default.
|
||||
|
||||
enum
|
||||
{
|
||||
STBRP_HEURISTIC_Skyline_default=0,
|
||||
STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
|
||||
STBRP_HEURISTIC_Skyline_BF_sortHeight
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// the details of the following structures don't matter to you, but they must
|
||||
// be visible so you can handle the memory allocations for them
|
||||
|
||||
struct stbrp_node
|
||||
{
|
||||
stbrp_coord x,y;
|
||||
stbrp_node *next;
|
||||
};
|
||||
|
||||
struct stbrp_context
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
int align;
|
||||
int init_mode;
|
||||
int heuristic;
|
||||
int num_nodes;
|
||||
stbrp_node *active_head;
|
||||
stbrp_node *free_head;
|
||||
stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPLEMENTATION SECTION
|
||||
//
|
||||
|
||||
#ifdef STB_RECT_PACK_IMPLEMENTATION
|
||||
#ifndef STBRP_SORT
|
||||
#include <stdlib.h>
|
||||
#define STBRP_SORT qsort
|
||||
#endif
|
||||
|
||||
#ifndef STBRP_ASSERT
|
||||
#include <assert.h>
|
||||
#define STBRP_ASSERT assert
|
||||
#endif
|
||||
|
||||
// [DEAR IMGUI] Added STBRP__CDECL
|
||||
#ifdef _MSC_VER
|
||||
#define STBRP__NOTUSED(v) (void)(v)
|
||||
#define STBRP__CDECL __cdecl
|
||||
#else
|
||||
#define STBRP__NOTUSED(v) (void)sizeof(v)
|
||||
#define STBRP__CDECL
|
||||
#endif
|
||||
|
||||
enum
|
||||
{
|
||||
STBRP__INIT_skyline = 1
|
||||
};
|
||||
|
||||
STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
|
||||
{
|
||||
switch (context->init_mode) {
|
||||
case STBRP__INIT_skyline:
|
||||
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
|
||||
context->heuristic = heuristic;
|
||||
break;
|
||||
default:
|
||||
STBRP_ASSERT(0);
|
||||
}
|
||||
}
|
||||
|
||||
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
|
||||
{
|
||||
if (allow_out_of_mem)
|
||||
// if it's ok to run out of memory, then don't bother aligning them;
|
||||
// this gives better packing, but may fail due to OOM (even though
|
||||
// the rectangles easily fit). @TODO a smarter approach would be to only
|
||||
// quantize once we've hit OOM, then we could get rid of this parameter.
|
||||
context->align = 1;
|
||||
else {
|
||||
// if it's not ok to run out of memory, then quantize the widths
|
||||
// so that num_nodes is always enough nodes.
|
||||
//
|
||||
// I.e. num_nodes * align >= width
|
||||
// align >= width / num_nodes
|
||||
// align = ceil(width/num_nodes)
|
||||
|
||||
context->align = (context->width + context->num_nodes-1) / context->num_nodes;
|
||||
}
|
||||
}
|
||||
|
||||
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
|
||||
{
|
||||
int i;
|
||||
#ifndef STBRP_LARGE_RECTS
|
||||
STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
|
||||
#endif
|
||||
|
||||
for (i=0; i < num_nodes-1; ++i)
|
||||
nodes[i].next = &nodes[i+1];
|
||||
nodes[i].next = NULL;
|
||||
context->init_mode = STBRP__INIT_skyline;
|
||||
context->heuristic = STBRP_HEURISTIC_Skyline_default;
|
||||
context->free_head = &nodes[0];
|
||||
context->active_head = &context->extra[0];
|
||||
context->width = width;
|
||||
context->height = height;
|
||||
context->num_nodes = num_nodes;
|
||||
stbrp_setup_allow_out_of_mem(context, 0);
|
||||
|
||||
// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
|
||||
context->extra[0].x = 0;
|
||||
context->extra[0].y = 0;
|
||||
context->extra[0].next = &context->extra[1];
|
||||
context->extra[1].x = (stbrp_coord) width;
|
||||
#ifdef STBRP_LARGE_RECTS
|
||||
context->extra[1].y = (1<<30);
|
||||
#else
|
||||
context->extra[1].y = 65535;
|
||||
#endif
|
||||
context->extra[1].next = NULL;
|
||||
}
|
||||
|
||||
// find minimum y position if it starts at x1
|
||||
static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
|
||||
{
|
||||
stbrp_node *node = first;
|
||||
int x1 = x0 + width;
|
||||
int min_y, visited_width, waste_area;
|
||||
|
||||
STBRP__NOTUSED(c);
|
||||
|
||||
STBRP_ASSERT(first->x <= x0);
|
||||
|
||||
#if 0
|
||||
// skip in case we're past the node
|
||||
while (node->next->x <= x0)
|
||||
++node;
|
||||
#else
|
||||
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
|
||||
#endif
|
||||
|
||||
STBRP_ASSERT(node->x <= x0);
|
||||
|
||||
min_y = 0;
|
||||
waste_area = 0;
|
||||
visited_width = 0;
|
||||
while (node->x < x1) {
|
||||
if (node->y > min_y) {
|
||||
// raise min_y higher.
|
||||
// we've accounted for all waste up to min_y,
|
||||
// but we'll now add more waste for everything we've visted
|
||||
waste_area += visited_width * (node->y - min_y);
|
||||
min_y = node->y;
|
||||
// the first time through, visited_width might be reduced
|
||||
if (node->x < x0)
|
||||
visited_width += node->next->x - x0;
|
||||
else
|
||||
visited_width += node->next->x - node->x;
|
||||
} else {
|
||||
// add waste area
|
||||
int under_width = node->next->x - node->x;
|
||||
if (under_width + visited_width > width)
|
||||
under_width = width - visited_width;
|
||||
waste_area += under_width * (min_y - node->y);
|
||||
visited_width += under_width;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
*pwaste = waste_area;
|
||||
return min_y;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int x,y;
|
||||
stbrp_node **prev_link;
|
||||
} stbrp__findresult;
|
||||
|
||||
static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
|
||||
{
|
||||
int best_waste = (1<<30), best_x, best_y = (1 << 30);
|
||||
stbrp__findresult fr;
|
||||
stbrp_node **prev, *node, *tail, **best = NULL;
|
||||
|
||||
// align to multiple of c->align
|
||||
width = (width + c->align - 1);
|
||||
width -= width % c->align;
|
||||
STBRP_ASSERT(width % c->align == 0);
|
||||
|
||||
// if it can't possibly fit, bail immediately
|
||||
if (width > c->width || height > c->height) {
|
||||
fr.prev_link = NULL;
|
||||
fr.x = fr.y = 0;
|
||||
return fr;
|
||||
}
|
||||
|
||||
node = c->active_head;
|
||||
prev = &c->active_head;
|
||||
while (node->x + width <= c->width) {
|
||||
int y,waste;
|
||||
y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
|
||||
if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
|
||||
// bottom left
|
||||
if (y < best_y) {
|
||||
best_y = y;
|
||||
best = prev;
|
||||
}
|
||||
} else {
|
||||
// best-fit
|
||||
if (y + height <= c->height) {
|
||||
// can only use it if it first vertically
|
||||
if (y < best_y || (y == best_y && waste < best_waste)) {
|
||||
best_y = y;
|
||||
best_waste = waste;
|
||||
best = prev;
|
||||
}
|
||||
}
|
||||
}
|
||||
prev = &node->next;
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
best_x = (best == NULL) ? 0 : (*best)->x;
|
||||
|
||||
// if doing best-fit (BF), we also have to try aligning right edge to each node position
|
||||
//
|
||||
// e.g, if fitting
|
||||
//
|
||||
// ____________________
|
||||
// |____________________|
|
||||
//
|
||||
// into
|
||||
//
|
||||
// | |
|
||||
// | ____________|
|
||||
// |____________|
|
||||
//
|
||||
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
|
||||
//
|
||||
// This makes BF take about 2x the time
|
||||
|
||||
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
|
||||
tail = c->active_head;
|
||||
node = c->active_head;
|
||||
prev = &c->active_head;
|
||||
// find first node that's admissible
|
||||
while (tail->x < width)
|
||||
tail = tail->next;
|
||||
while (tail) {
|
||||
int xpos = tail->x - width;
|
||||
int y,waste;
|
||||
STBRP_ASSERT(xpos >= 0);
|
||||
// find the left position that matches this
|
||||
while (node->next->x <= xpos) {
|
||||
prev = &node->next;
|
||||
node = node->next;
|
||||
}
|
||||
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
|
||||
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
|
||||
if (y + height <= c->height) {
|
||||
if (y <= best_y) {
|
||||
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
|
||||
best_x = xpos;
|
||||
STBRP_ASSERT(y <= best_y);
|
||||
best_y = y;
|
||||
best_waste = waste;
|
||||
best = prev;
|
||||
}
|
||||
}
|
||||
}
|
||||
tail = tail->next;
|
||||
}
|
||||
}
|
||||
|
||||
fr.prev_link = best;
|
||||
fr.x = best_x;
|
||||
fr.y = best_y;
|
||||
return fr;
|
||||
}
|
||||
|
||||
static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
|
||||
{
|
||||
// find best position according to heuristic
|
||||
stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
|
||||
stbrp_node *node, *cur;
|
||||
|
||||
// bail if:
|
||||
// 1. it failed
|
||||
// 2. the best node doesn't fit (we don't always check this)
|
||||
// 3. we're out of memory
|
||||
if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
|
||||
res.prev_link = NULL;
|
||||
return res;
|
||||
}
|
||||
|
||||
// on success, create new node
|
||||
node = context->free_head;
|
||||
node->x = (stbrp_coord) res.x;
|
||||
node->y = (stbrp_coord) (res.y + height);
|
||||
|
||||
context->free_head = node->next;
|
||||
|
||||
// insert the new node into the right starting point, and
|
||||
// let 'cur' point to the remaining nodes needing to be
|
||||
// stiched back in
|
||||
|
||||
cur = *res.prev_link;
|
||||
if (cur->x < res.x) {
|
||||
// preserve the existing one, so start testing with the next one
|
||||
stbrp_node *next = cur->next;
|
||||
cur->next = node;
|
||||
cur = next;
|
||||
} else {
|
||||
*res.prev_link = node;
|
||||
}
|
||||
|
||||
// from here, traverse cur and free the nodes, until we get to one
|
||||
// that shouldn't be freed
|
||||
while (cur->next && cur->next->x <= res.x + width) {
|
||||
stbrp_node *next = cur->next;
|
||||
// move the current node to the free list
|
||||
cur->next = context->free_head;
|
||||
context->free_head = cur;
|
||||
cur = next;
|
||||
}
|
||||
|
||||
// stitch the list back in
|
||||
node->next = cur;
|
||||
|
||||
if (cur->x < res.x + width)
|
||||
cur->x = (stbrp_coord) (res.x + width);
|
||||
|
||||
#ifdef _DEBUG
|
||||
cur = context->active_head;
|
||||
while (cur->x < context->width) {
|
||||
STBRP_ASSERT(cur->x < cur->next->x);
|
||||
cur = cur->next;
|
||||
}
|
||||
STBRP_ASSERT(cur->next == NULL);
|
||||
|
||||
{
|
||||
int count=0;
|
||||
cur = context->active_head;
|
||||
while (cur) {
|
||||
cur = cur->next;
|
||||
++count;
|
||||
}
|
||||
cur = context->free_head;
|
||||
while (cur) {
|
||||
cur = cur->next;
|
||||
++count;
|
||||
}
|
||||
STBRP_ASSERT(count == context->num_nodes+2);
|
||||
}
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// [DEAR IMGUI] Added STBRP__CDECL
|
||||
static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
|
||||
{
|
||||
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||
if (p->h > q->h)
|
||||
return -1;
|
||||
if (p->h < q->h)
|
||||
return 1;
|
||||
return (p->w > q->w) ? -1 : (p->w < q->w);
|
||||
}
|
||||
|
||||
// [DEAR IMGUI] Added STBRP__CDECL
|
||||
static int STBRP__CDECL rect_original_order(const void *a, const void *b)
|
||||
{
|
||||
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
|
||||
}
|
||||
|
||||
#ifdef STBRP_LARGE_RECTS
|
||||
#define STBRP__MAXVAL 0xffffffff
|
||||
#else
|
||||
#define STBRP__MAXVAL 0xffff
|
||||
#endif
|
||||
|
||||
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
|
||||
{
|
||||
int i, all_rects_packed = 1;
|
||||
|
||||
// we use the 'was_packed' field internally to allow sorting/unsorting
|
||||
for (i=0; i < num_rects; ++i) {
|
||||
rects[i].was_packed = i;
|
||||
}
|
||||
|
||||
// sort according to heuristic
|
||||
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
|
||||
|
||||
for (i=0; i < num_rects; ++i) {
|
||||
if (rects[i].w == 0 || rects[i].h == 0) {
|
||||
rects[i].x = rects[i].y = 0; // empty rect needs no space
|
||||
} else {
|
||||
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
|
||||
if (fr.prev_link) {
|
||||
rects[i].x = (stbrp_coord) fr.x;
|
||||
rects[i].y = (stbrp_coord) fr.y;
|
||||
} else {
|
||||
rects[i].x = rects[i].y = STBRP__MAXVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// unsort
|
||||
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
|
||||
|
||||
// set was_packed flags and all_rects_packed status
|
||||
for (i=0; i < num_rects; ++i) {
|
||||
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
|
||||
if (!rects[i].was_packed)
|
||||
all_rects_packed = 0;
|
||||
}
|
||||
|
||||
// return the all_rects_packed status
|
||||
return all_rects_packed;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
------------------------------------------------------------------------------
|
||||
This software is available under 2 licenses -- choose whichever you prefer.
|
||||
------------------------------------------------------------------------------
|
||||
ALTERNATIVE A - MIT License
|
||||
Copyright (c) 2017 Sean Barrett
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
------------------------------------------------------------------------------
|
||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||
This is free and unencumbered software released into the public domain.
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||
software, either in source code form or as a compiled binary, for any purpose,
|
||||
commercial or non-commercial, and by any means.
|
||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||
software dedicate any and all copyright interest in the software to the public
|
||||
domain. We make this dedication for the benefit of the public at large and to
|
||||
the detriment of our heirs and successors. We intend this dedication to be an
|
||||
overt act of relinquishment in perpetuity of all present and future rights to
|
||||
this software under copyright law.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
------------------------------------------------------------------------------
|
||||
*/
|
||||
Executable
+1449
File diff suppressed because it is too large
Load Diff
Executable
+4903
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,132 @@
|
||||
#include <android_native_app_glue.h>
|
||||
#include <EGL/egl.h>
|
||||
#include "imgui/imgui.h"
|
||||
#include "imgui/imgui_impl_android.h"
|
||||
#include "imgui/imgui_impl_opengl3.h"
|
||||
#include "font.h"
|
||||
#include <dobby.h>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <sstream>
|
||||
#include "结构体/数据/SDK.hpp"
|
||||
using namespace SDK;
|
||||
bool initImGui=false;
|
||||
bool 水印=true;
|
||||
int screenWidth=2400,screenHeight=1080,glWidth,glHeight,gWidth,gHeight;
|
||||
float density=-1;
|
||||
uintptr_t UE4;
|
||||
android_app*g_App=0;
|
||||
static char s[64];
|
||||
#include "引用.h"
|
||||
#include "菜单.h"
|
||||
EGLBoolean (*orig_eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
|
||||
EGLBoolean _eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
|
||||
eglQuerySurface(dpy, surface, EGL_WIDTH, &glWidth);
|
||||
eglQuerySurface(dpy, surface, EGL_HEIGHT, &glHeight);
|
||||
if (glWidth <= 0 || glHeight <= 0)
|
||||
return eglSwapBuffers(dpy, surface);
|
||||
if (!g_App)
|
||||
return eglSwapBuffers(dpy, surface);
|
||||
screenWidth = ANativeWindow_getWidth(g_App->window);
|
||||
screenHeight = ANativeWindow_getHeight(g_App->window);
|
||||
density = AConfiguration_getDensity(g_App->config);
|
||||
if (!initImGui) {
|
||||
LoadLanguageSetting();
|
||||
IMGUI_CHECKVERSION();
|
||||
ImGui::CreateContext();
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.IniFilename = NULL;
|
||||
ImGui::StyleColorsLight();//黑紫主题
|
||||
ImGui_ImplAndroid_Init();
|
||||
ImGui_ImplOpenGL3_Init("#version 300 es");
|
||||
ImFontConfig font_cfg;
|
||||
font_cfg.SizePixels = 22.0f;
|
||||
io.Fonts->AddFontFromMemoryTTF((void*)Custom_data, Custom_size, 29.0f,
|
||||
nullptr, io.Fonts->GetGlyphRangesChineseFull());
|
||||
static const ImWchar diamondRange[] = { 0x25C6, 0x25C6, 0 };
|
||||
ImFontConfig cfgMerge;
|
||||
cfgMerge.MergeMode = true;
|
||||
io.Fonts->AddFontFromMemoryTTF((void*)Custom_data, Custom_size, 29.0f,
|
||||
&cfgMerge, diamondRange);
|
||||
io.Fonts->Build();
|
||||
io.Fonts->AddFontDefault(&font_cfg);
|
||||
ImGuiStyle *style = &ImGui::GetStyle();
|
||||
style->Alpha = 0.8;
|
||||
style->GrabMinSize = 13.0f; // 设置滑块宽度
|
||||
style->ScrollbarRounding = 2.0f; // 设置滚动条圆角
|
||||
style->ScrollbarSize = 15.0f; // 设置滚动条宽度
|
||||
style->WindowPadding = ImVec2(4, 9); // 设置窗口内容区域与窗口边界的内边距,这里是上下4,左右9单位
|
||||
style->WindowRounding = 5.0f; // 设置窗口边角的圆角半径为5单位
|
||||
style->FramePadding = ImVec2(3, 3); // 设置表单控件(如按钮)内容区域与边界的内边距
|
||||
style->FrameRounding = 2.0f; // 设置表单控件边角的圆角半径为2单位
|
||||
style->ItemSpacing = ImVec2(8, 4); // 设置控件之间的水平和垂直间距
|
||||
style->ItemInnerSpacing = ImVec2(1, 10); // 设置控件内部元素之间的间距
|
||||
style->CellPadding = ImVec2(5, 5); // 设置表格单元格的内边距
|
||||
style->IndentSpacing = 23.0f; // 设置列表项缩进的间距
|
||||
style->TouchExtraPadding = ImVec2(0, 0); // 设置触摸屏额外的内边距(这里设置为0,可能意味着不增加额外的触摸区域)
|
||||
style->ButtonTextAlign = ImVec2(0.50f, 0.50f); // 设置按钮文本的对齐方式(水平和垂直居中)
|
||||
style->DisplayWindowPadding = ImVec2(22, 22); // 设置显示窗口内容区域与窗口边界的内边距
|
||||
style->DisplaySafeAreaPadding = ImVec2(4, 4); // 设置显示安全区域的内边距(避免内容被屏幕边缘裁剪)
|
||||
style->AntiAliasedLines = true; // 启用抗锯齿线
|
||||
style->CurveTessellationTol = 1.f; // 设置曲线细分公差
|
||||
style->TabBorderSize = 0.001f; // 设置标签页边框的大小(这里设置为0,意味着没有边框)
|
||||
style->WindowTitleAlign = ImVec2(0.5, 0.5); // 设置标题居中
|
||||
ImGui::GetStyle().ScaleAllSizes(1.0f);
|
||||
initImGui = true;
|
||||
const ImWchar icons_ranges[]={0xf000,0xf3ff,0};
|
||||
ImFontConfig icons_config;
|
||||
ImFontConfig CustomFont;
|
||||
CustomFont.FontDataOwnedByAtlas=false;
|
||||
icons_config.MergeMode=true;
|
||||
icons_config.PixelSnapH=true;
|
||||
icons_config.OversampleH=2.5;
|
||||
icons_config.OversampleV=2.5;
|
||||
io.ConfigWindowsMoveFromTitleBarOnly=true;
|
||||
}
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui_ImplAndroid_NewFrame(glWidth,glHeight);
|
||||
ImGui::NewFrame();
|
||||
DrawESP(ImGui::GetBackgroundDrawList(),glWidth, glHeight);
|
||||
ImGuiIO & io = ImGui::GetIO();
|
||||
菜单();
|
||||
ImGui::Render();
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
return orig_eglSwapBuffers(dpy,surface);
|
||||
}
|
||||
int32_t(*orig_onInputEvent)(struct android_app*app,AInputEvent*inputEvent);
|
||||
int32_t onInputEvent(struct android_app*app,AInputEvent*inputEvent){
|
||||
ImGui_ImplAndroid_HandleInputEvent(inputEvent,{(float)screenWidth/(float)glWidth,(float)screenHeight/(float)glHeight});
|
||||
return orig_onInputEvent(app,inputEvent);
|
||||
}
|
||||
extern "C"{
|
||||
void android_main(struct android_app*state){
|
||||
app_dummy();
|
||||
}
|
||||
}
|
||||
void*main_thread(void*){
|
||||
UE4=get_Module_Base("libUE4.so");
|
||||
while(!UE4){
|
||||
UE4=get_Module_Base("libUE4.so");
|
||||
sleep(1.5);
|
||||
}
|
||||
while(!g_App){
|
||||
g_App=*(android_app**)(UE4+0x4249CA4);
|
||||
sleep(1.5);
|
||||
}
|
||||
orig_onInputEvent=decltype(orig_onInputEvent)(g_App->onInputEvent);
|
||||
g_App->onInputEvent=onInputEvent;
|
||||
FName::GNames=GetGNames();
|
||||
UObject::GUObjectArray=(FUObjectArray*)(UE4+0x454dd28);
|
||||
DobbyHook((void*)DobbySymbolResolver(("/system/lib/libEGL.so"),("eglSwapBuffers")),(void*)_eglSwapBuffers,(void**)&orig_eglSwapBuffers);
|
||||
DobbyHook((void*)(UE4 + 0xc5ebbc), (void*)gm, (void**)&ogm);
|
||||
return 0;
|
||||
}
|
||||
__attribute__((constructor))void _init(){
|
||||
pthread_t pid;
|
||||
pthread_create(&pid,0,main_thread,0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
#include <functional>
|
||||
#include <atomic>
|
||||
#include <algorithm>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <atomic>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <chrono>
|
||||
#include <iomanip>
|
||||
#include <map>
|
||||
#include "结构体/内存读写/Syscall读写.h"
|
||||
#include "结构体/函数/混淆.cpp"
|
||||
#include "结构体/函数/Quaternion.hpp"
|
||||
#include "结构体/函数/普通函数.h"
|
||||
#include "结构体/函数/必要函数.h"
|
||||
#include "结构体/数据/训练场数据包.h"
|
||||
#include "结构体/数据/雪地数据包.h"
|
||||
#include "结构体/数据/海岛数据包.h"
|
||||
#include "结构体/数据/沙漠数据包.h"
|
||||
#include "结构体/数据/雨林数据包.h"
|
||||
#include "变量.h"
|
||||
#include "DrawESP.h"
|
||||
Executable
+239
@@ -0,0 +1,239 @@
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/uio.h>
|
||||
#include <malloc.h>
|
||||
#include <math.h>
|
||||
#include <thread>
|
||||
#include <iostream>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <locale>
|
||||
#include <string>
|
||||
#include <codecvt>
|
||||
#include <dlfcn.h>
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef long ADDRESS;
|
||||
typedef char PACKAGENAME;
|
||||
typedef unsigned short UTF16;
|
||||
typedef char UTF8;
|
||||
|
||||
// syscall内存读写
|
||||
#if defined(__arm__)
|
||||
int process_vm_readv_syscall = 376;
|
||||
int process_vm_writev_syscall = 377;
|
||||
#elif defined(__aarch64__)
|
||||
int process_vm_readv_syscall = 270;
|
||||
int process_vm_writev_syscall = 271;
|
||||
#elif defined(__i386__)
|
||||
int process_vm_readv_syscall = 347;
|
||||
int process_vm_writev_syscall = 348;
|
||||
#else
|
||||
int process_vm_readv_syscall = 310;
|
||||
int process_vm_writev_syscall = 311;
|
||||
#endif
|
||||
|
||||
ssize_t process_v1(pid_t __pid, const struct iovec *__local_iov, unsigned long __local_iov_count,
|
||||
const struct iovec *__remote_iov, unsigned long __remote_iov_count,
|
||||
unsigned long __flags, bool iswrite)
|
||||
{
|
||||
return syscall((iswrite ? process_vm_writev_syscall : process_vm_readv_syscall), __pid,
|
||||
__local_iov, __local_iov_count, __remote_iov, __remote_iov_count, __flags);
|
||||
}
|
||||
|
||||
// 进程读写内存
|
||||
bool pvm1(void *address, void *buffer, size_t size, bool iswrite)
|
||||
{
|
||||
struct iovec local[1];
|
||||
struct iovec remote[1];
|
||||
local[0].iov_base = buffer;
|
||||
local[0].iov_len = size;
|
||||
remote[0].iov_base = address;
|
||||
remote[0].iov_len = size;
|
||||
ssize_t bytes = process_v1(getpid(), local, 1, remote, 1, 0, iswrite);
|
||||
return bytes == size;
|
||||
}
|
||||
|
||||
// 读取内存
|
||||
bool vm_readv(long address, void *buffer, size_t size)
|
||||
{
|
||||
return pvm1(reinterpret_cast < void *>(address), buffer, size, false);
|
||||
}
|
||||
|
||||
// 写入内存
|
||||
bool vm_writev(long address, void *buffer, size_t size)
|
||||
{
|
||||
return pvm1(reinterpret_cast < void *>(address), buffer, size, true);
|
||||
}
|
||||
|
||||
// 获取F类内存
|
||||
float getfloat(long addr)
|
||||
{
|
||||
float var = 0;
|
||||
vm_readv(addr, &var, 4);
|
||||
return (var);
|
||||
}
|
||||
|
||||
// 获取
|
||||
int getdword(long addr)
|
||||
{
|
||||
int var = 0;
|
||||
vm_readv(addr, &var, 4);
|
||||
return (var);
|
||||
}
|
||||
|
||||
// 获取
|
||||
bool getbool(long addr)
|
||||
{
|
||||
bool var = 0;
|
||||
vm_readv(addr, &var, 4);
|
||||
return (var);
|
||||
}
|
||||
|
||||
// 获取指针
|
||||
long getPointer(long addr)
|
||||
{
|
||||
long var = 0;
|
||||
vm_readv(addr, &var, 4);
|
||||
return (var);
|
||||
}
|
||||
|
||||
// 写入F类内存
|
||||
void writefloat(long addr, float data)
|
||||
{
|
||||
vm_writev(addr, &data, 4);
|
||||
}
|
||||
|
||||
bool WriteAddr(void *addr, void *buffer, size_t length) {
|
||||
unsigned long page_size = sysconf(_SC_PAGESIZE);
|
||||
unsigned long size = page_size * sizeof(uintptr_t);
|
||||
return mprotect((void *) ((uintptr_t) addr - ((uintptr_t) addr % page_size) - page_size), (size_t) size, PROT_EXEC | PROT_READ | PROT_WRITE) == 0 && memcpy(addr, buffer, length) != 0;
|
||||
}
|
||||
bool WriteInt(uintptr_t addr,int var) {
|
||||
return WriteAddr(reinterpret_cast<void*>(addr),reinterpret_cast<void*>(&var), sizeof(var));
|
||||
}
|
||||
|
||||
// 写入D类内存
|
||||
void writedword(long addr, int data)
|
||||
{
|
||||
vm_writev(addr, &data, 4);
|
||||
}
|
||||
|
||||
// 获取进程
|
||||
int getProcessID(const char *packageName)
|
||||
{
|
||||
int id = -1;
|
||||
DIR *dir;
|
||||
FILE *fp;
|
||||
char filename[64];
|
||||
char cmdline[64];
|
||||
struct dirent *entry;
|
||||
dir = opendir("/proc");
|
||||
while ((entry = readdir(dir)) != NULL)
|
||||
{
|
||||
id = atoi(entry->d_name);
|
||||
if (id != 0)
|
||||
{
|
||||
sprintf(filename, "/proc/%d/cmdline", id);
|
||||
fp = fopen(filename, "r");
|
||||
if (fp)
|
||||
{
|
||||
fgets(cmdline, sizeof(cmdline), fp);
|
||||
fclose(fp);
|
||||
if (strcmp(packageName, cmdline) == 0)
|
||||
{
|
||||
return id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(dir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 获取基址
|
||||
long get_Module_Base(const char *module_name)
|
||||
{
|
||||
FILE *fp;
|
||||
long addr = 0;
|
||||
char *pch;
|
||||
char filename[64];
|
||||
char line[1024];
|
||||
snprintf(filename, sizeof(filename), "/proc/%d/maps", getpid());
|
||||
fp = fopen(filename, "r");
|
||||
if (fp != NULL)
|
||||
{
|
||||
while (fgets(line, sizeof(line), fp))
|
||||
{
|
||||
if (strstr(line, module_name))
|
||||
{
|
||||
pch = strtok(line, "-");
|
||||
addr = strtoul(pch, NULL, 16);
|
||||
if (addr == 0x8000)
|
||||
addr = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
// 读取字符信息
|
||||
void getUTF8(char * buf, long namepy)
|
||||
{
|
||||
UTF16 buf16[16] = { 0 };
|
||||
vm_readv(namepy, buf16, 32);
|
||||
UTF16 *pTempUTF16 = buf16;
|
||||
UTF8 *pTempUTF8 = buf;
|
||||
UTF8 *pUTF8End = pTempUTF8 + 32;
|
||||
while (pTempUTF16 < pTempUTF16 + 28)
|
||||
{
|
||||
if (*pTempUTF16 <= 0x007F && pTempUTF8 + 1 < pUTF8End)
|
||||
{
|
||||
*pTempUTF8++ = (UTF8) * pTempUTF16;
|
||||
}
|
||||
else if (*pTempUTF16 >= 0x0080 && *pTempUTF16 <= 0x07FF && pTempUTF8 + 2 < pUTF8End)
|
||||
{
|
||||
*pTempUTF8++ = (*pTempUTF16 >> 6) | 0xC0;
|
||||
*pTempUTF8++ = (*pTempUTF16 & 0x3F) | 0x80;
|
||||
}
|
||||
else if (*pTempUTF16 >= 0x0800 && *pTempUTF16 <= 0xFFFF && pTempUTF8 + 3 < pUTF8End)
|
||||
{
|
||||
*pTempUTF8++ = (*pTempUTF16 >> 12) | 0xE0;
|
||||
*pTempUTF8++ = ((*pTempUTF16 >> 6) & 0x3F) | 0x80;
|
||||
*pTempUTF8++ = (*pTempUTF16 & 0x3F) | 0x80;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
pTempUTF16++;
|
||||
}
|
||||
}
|
||||
bool IsPtrValid(void *addr) {
|
||||
if (!addr) {
|
||||
return false;
|
||||
}
|
||||
static int fd = -1;
|
||||
if (fd == -1) {
|
||||
fd = open("/dev/random", O_WRONLY);
|
||||
}
|
||||
return write(fd, addr, 4) >= 0;
|
||||
}
|
||||
Executable
+703
@@ -0,0 +1,703 @@
|
||||
#pragma once
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
#include <iostream>
|
||||
|
||||
#define SMALL_float 0.0000000001
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to include a header file if the file exists.
|
||||
* If the file does not exist, create a dummy data structure for that type.
|
||||
* If it cannot be determined if it exists, just attempt to include it.
|
||||
*/
|
||||
#ifdef __has_include
|
||||
# if __has_include("Vector3.hpp")
|
||||
# include "Vector3.hpp"
|
||||
# elif !defined(GMATH_VECTOR3)
|
||||
#define GMATH_VECTOR3
|
||||
struct Vector3
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
float X;
|
||||
float Y;
|
||||
float Z;
|
||||
};
|
||||
float data[3];
|
||||
};
|
||||
|
||||
inline Vector3() : X(0), Y(0), Z(0) {}
|
||||
inline Vector3(float data[]) : X(data[0]), Y(data[1]), Z(data[2])
|
||||
{}
|
||||
inline Vector3(float value) : X(value), Y(value), Z(value) {}
|
||||
inline Vector3(float x, float y) : X(x), Y(y), Z(0) {}
|
||||
inline Vector3(float x, float y, float z) : X(x), Y(y), Z(z) {}
|
||||
|
||||
static inline Vector3 Cross(Vector3 lhs, Vector3 rhs)
|
||||
{
|
||||
float x = lhs.Y * rhs.Z - lhs.Z * rhs.Y;
|
||||
float y = lhs.Z * rhs.X - lhs.X * rhs.Z;
|
||||
float z = lhs.X * rhs.Y - lhs.Y * rhs.X;
|
||||
return Vector3(x, y, z);
|
||||
}
|
||||
|
||||
static inline float Dot(Vector3 lhs, Vector3 rhs)
|
||||
{
|
||||
return lhs.X * rhs.X + lhs.Y * rhs.Y + lhs.Z * rhs.Z;
|
||||
}
|
||||
|
||||
static inline Vector3 Normalized(Vector3 v)
|
||||
{
|
||||
float mag = sqrt(v.X * v.X + v.Y * v.Y + v.Z * v.Z);
|
||||
if (mag == 0)
|
||||
return Vector3::Zero();
|
||||
return v / mag;
|
||||
}
|
||||
|
||||
static inline Vector3 Orthogonal(Vector3 v)
|
||||
{
|
||||
return v.Z < v.X ?
|
||||
Vector3(v.Y, -v.X, 0) : Vector3(0, -v.Z, v.Y);
|
||||
}
|
||||
|
||||
static inline float SqrMagnitude(Vector3 v)
|
||||
{
|
||||
return v.X * v.X + v.Y * v.Y + v.Z * v.Z;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
inline Vector3 operator+(Vector3 lhs, const Vector3 rhs)
|
||||
{
|
||||
return Vector3(lhs.X + rhs.X, lhs.Y + rhs.Y, lhs.Z + rhs.Z);
|
||||
}
|
||||
|
||||
inline Vector3 operator*(Vector3 lhs, const float rhs)
|
||||
{
|
||||
return Vector3(lhs.X * rhs, lhs.Y * rhs, lhs.Z * rhs);
|
||||
}
|
||||
# endif
|
||||
#else
|
||||
# include "Vector3.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
struct Quaternion
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
float X;
|
||||
float Y;
|
||||
float Z;
|
||||
float W;
|
||||
};
|
||||
float data[4];
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Constructors.
|
||||
*/
|
||||
inline Quaternion();
|
||||
inline Quaternion(float data[]);
|
||||
inline Quaternion(Vector3 vector, float scalar);
|
||||
inline Quaternion(float x, float y, float z, float w);
|
||||
|
||||
|
||||
/**
|
||||
* Constants for common quaternions.
|
||||
*/
|
||||
static inline Quaternion Identity();
|
||||
|
||||
|
||||
/**
|
||||
* Returns the angle between two quaternions.
|
||||
* The quaternions must be normalized.
|
||||
* @param a: The first quaternion.
|
||||
* @param b: The second quaternion.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Angle(Quaternion a, Quaternion b);
|
||||
|
||||
/**
|
||||
* Returns the conjugate of a quaternion.
|
||||
* @param rotation: The quaternion in question.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion Conjugate(Quaternion rotation);
|
||||
|
||||
/**
|
||||
* Returns the dot product of two quaternions.
|
||||
* @param lhs: The left side of the multiplication.
|
||||
* @param rhs: The right side of the multiplication.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Dot(Quaternion lhs, Quaternion rhs);
|
||||
|
||||
/**
|
||||
* Creates a new quaternion from the angle-axis representation of
|
||||
* a rotation.
|
||||
* @param angle: The rotation angle in radians.
|
||||
* @param axis: The vector about which the rotation occurs.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion FromAngleAxis(float angle, Vector3 axis);
|
||||
|
||||
/**
|
||||
* Create a new quaternion from the euler angle representation of
|
||||
* a rotation. The z, x and y values represent rotations about those
|
||||
* axis in that respective order.
|
||||
* @param rotation: The x, y and z rotations.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion FromEuler(Vector3 rotation);
|
||||
|
||||
/**
|
||||
* Create a new quaternion from the euler angle representation of
|
||||
* a rotation. The z, x and y values represent rotations about those
|
||||
* axis in that respective order.
|
||||
* @param x: The rotation about the x-axis in radians.
|
||||
* @param y: The rotation about the y-axis in radians.
|
||||
* @param z: The rotation about the z-axis in radians.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion FromEuler(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Create a quaternion rotation which rotates "fromVector" to "toVector".
|
||||
* @param fromVector: The vector from which to start the rotation.
|
||||
* @param toVector: The vector at which to end the rotation.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion FromToRotation(Vector3 fromVector,
|
||||
Vector3 toVector);
|
||||
|
||||
/**
|
||||
* Returns the inverse of a rotation.
|
||||
* @param rotation: The quaternion in question.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion Inverse(Quaternion rotation);
|
||||
|
||||
/**
|
||||
* Interpolates between a and b by t, which is clamped to the range [0-1].
|
||||
* The result is normalized before being returned.
|
||||
* @param a: The starting rotation.
|
||||
* @param b: The ending rotation.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion Lerp(Quaternion a, Quaternion b, float t);
|
||||
|
||||
/**
|
||||
* Interpolates between a and b by t. This normalizes the result when
|
||||
* complete.
|
||||
* @param a: The starting rotation.
|
||||
* @param b: The ending rotation.
|
||||
* @param t: The interpolation value.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion LerpUnclamped(Quaternion a, Quaternion b,
|
||||
float t);
|
||||
|
||||
/**
|
||||
* Creates a rotation with the specified forward direction. This is the
|
||||
* same as calling LookRotation with (0, 1, 0) as the upwards vector.
|
||||
* The output is undefined for parallel vectors.
|
||||
* @param forward: The forward direction to look toward.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion LookRotation(Vector3 forward);
|
||||
|
||||
/**
|
||||
* Creates a rotation with the specified forward and upwards directions.
|
||||
* The output is undefined for parallel vectors.
|
||||
* @param forward: The forward direction to look toward.
|
||||
* @param upwards: The direction to treat as up.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion LookRotation(Vector3 forward, Vector3 upwards);
|
||||
|
||||
/**
|
||||
* Returns the norm of a quaternion.
|
||||
* @param rotation: The quaternion in question.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Norm(Quaternion rotation);
|
||||
|
||||
/**
|
||||
* Returns a quaternion with identical rotation and a norm of one.
|
||||
* @param rotation: The quaternion in question.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion Normalized(Quaternion rotation);
|
||||
|
||||
/**
|
||||
* Returns a new Quaternion created by rotating "from" towards "to" by
|
||||
* "maxRadiansDelta". This will not overshoot, and if a negative delta is
|
||||
* applied, it will rotate till completely opposite "to" and then stop.
|
||||
* @param from: The rotation at which to start.
|
||||
* @param to: The rotation at which to end.
|
||||
# @param maxRadiansDelta: The maximum number of radians to rotate.
|
||||
* @return: A new Quaternion.
|
||||
*/
|
||||
static inline Quaternion RotateTowards(Quaternion from, Quaternion to,
|
||||
float maxRadiansDelta);
|
||||
|
||||
/**
|
||||
* Returns a new quaternion interpolated between a and b, using spherical
|
||||
* linear interpolation. The variable t is clamped to the range [0-1]. The
|
||||
* resulting quaternion will be normalized.
|
||||
* @param a: The starting rotation.
|
||||
* @param b: The ending rotation.
|
||||
* @param t: The interpolation value.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion Slerp(Quaternion a, Quaternion b, float t);
|
||||
|
||||
/**
|
||||
* Returns a new quaternion interpolated between a and b, using spherical
|
||||
* linear interpolation. The resulting quaternion will be normalized.
|
||||
* @param a: The starting rotation.
|
||||
* @param b: The ending rotation.
|
||||
* @param t: The interpolation value.
|
||||
* @return: A new quaternion.
|
||||
*/
|
||||
static inline Quaternion SlerpUnclamped(Quaternion a, Quaternion b,
|
||||
float t);
|
||||
|
||||
/**
|
||||
* Outputs the angle axis representation of the provided quaternion.
|
||||
* @param rotation: The input quaternion.
|
||||
* @param angle: The output angle.
|
||||
* @param axis: The output axis.
|
||||
*/
|
||||
static inline void ToAngleAxis(Quaternion rotation, float &angle,
|
||||
Vector3 &axis);
|
||||
|
||||
/**
|
||||
* Returns the Euler angle representation of a rotation. The resulting
|
||||
* vector contains the rotations about the z, x and y axis, in that order.
|
||||
* @param rotation: The quaternion to convert.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 ToEuler(Quaternion rotation);
|
||||
|
||||
/**
|
||||
* Operator overloading.
|
||||
*/
|
||||
inline struct Quaternion& operator+=(const float rhs);
|
||||
inline struct Quaternion& operator-=(const float rhs);
|
||||
inline struct Quaternion& operator*=(const float rhs);
|
||||
inline struct Quaternion& operator/=(const float rhs);
|
||||
inline struct Quaternion& operator+=(const Quaternion rhs);
|
||||
inline struct Quaternion& operator-=(const Quaternion rhs);
|
||||
inline struct Quaternion& operator*=(const Quaternion rhs);
|
||||
};
|
||||
|
||||
inline Quaternion operator-(Quaternion rhs);
|
||||
inline Quaternion operator+(Quaternion lhs, const float rhs);
|
||||
inline Quaternion operator-(Quaternion lhs, const float rhs);
|
||||
inline Quaternion operator*(Quaternion lhs, const float rhs);
|
||||
inline Quaternion operator/(Quaternion lhs, const float rhs);
|
||||
inline Quaternion operator+(const float lhs, Quaternion rhs);
|
||||
inline Quaternion operator-(const float lhs, Quaternion rhs);
|
||||
inline Quaternion operator*(const float lhs, Quaternion rhs);
|
||||
inline Quaternion operator/(const float lhs, Quaternion rhs);
|
||||
inline Quaternion operator+(Quaternion lhs, const Quaternion rhs);
|
||||
inline Quaternion operator-(Quaternion lhs, const Quaternion rhs);
|
||||
inline Quaternion operator*(Quaternion lhs, const Quaternion rhs);
|
||||
inline Vector3 operator*(Quaternion lhs, const Vector3 rhs);
|
||||
inline bool operator==(const Quaternion lhs, const Quaternion rhs);
|
||||
inline bool operator!=(const Quaternion lhs, const Quaternion rhs);
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Implementation
|
||||
*/
|
||||
|
||||
Quaternion::Quaternion() : X(0), Y(0), Z(0), W(1) {}
|
||||
Quaternion::Quaternion(float data[]) : X(data[0]), Y(data[1]), Z(data[2]),
|
||||
W(data[3]) {}
|
||||
Quaternion::Quaternion(Vector3 vector, float scalar) : X(vector.X),
|
||||
Y(vector.Y), Z(vector.Z), W(scalar) {}
|
||||
Quaternion::Quaternion(float x, float y, float z, float w) : X(x), Y(y),
|
||||
Z(z), W(w) {}
|
||||
|
||||
|
||||
Quaternion Quaternion::Identity() { return Quaternion(0, 0, 0, 1); }
|
||||
|
||||
|
||||
float Quaternion::Angle(Quaternion a, Quaternion b)
|
||||
{
|
||||
float dot = Dot(a, b);
|
||||
return acos(fmin(fabs(dot), 1)) * 2;
|
||||
}
|
||||
|
||||
Quaternion Quaternion::Conjugate(Quaternion rotation)
|
||||
{
|
||||
return Quaternion(-rotation.X, -rotation.Y, -rotation.Z, rotation.W);
|
||||
}
|
||||
|
||||
float Quaternion::Dot(Quaternion lhs, Quaternion rhs)
|
||||
{
|
||||
return lhs.X * rhs.X + lhs.Y * rhs.Y + lhs.Z * rhs.Z + lhs.W * rhs.W;
|
||||
}
|
||||
|
||||
Quaternion Quaternion::FromAngleAxis(float angle, Vector3 axis)
|
||||
{
|
||||
Quaternion q;
|
||||
float m = sqrt(axis.X * axis.X + axis.Y * axis.Y + axis.Z * axis.Z);
|
||||
float s = sin(angle / 2) / m;
|
||||
q.X = axis.X * s;
|
||||
q.Y = axis.Y * s;
|
||||
q.Z = axis.Z * s;
|
||||
q.W = cos(angle / 2);
|
||||
return q;
|
||||
}
|
||||
|
||||
Quaternion Quaternion::FromEuler(Vector3 rotation)
|
||||
{
|
||||
return FromEuler(rotation.X, rotation.Y, rotation.Z);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::FromEuler(float x, float y, float z)
|
||||
{
|
||||
float cx = cos(x * 0.5);
|
||||
float cy = cos(y * 0.5);
|
||||
float cz = cos(z * 0.5);
|
||||
float sx = sin(x * 0.5);
|
||||
float sy = sin(y * 0.5);
|
||||
float sz = sin(z * 0.5);
|
||||
Quaternion q;
|
||||
q.X = cx * sy * sz + cy * cz * sx;
|
||||
q.Y = cx * cz * sy - cy * sx * sz;
|
||||
q.Z = cx * cy * sz - cz * sx * sy;
|
||||
q.W = sx * sy * sz + cx * cy * cz;
|
||||
return q;
|
||||
}
|
||||
|
||||
Quaternion Quaternion::FromToRotation(Vector3 fromVector, Vector3 toVector)
|
||||
{
|
||||
float dot = Vector3::Dot(fromVector, toVector);
|
||||
float k = sqrt(Vector3::SqrMagnitude(fromVector) *
|
||||
Vector3::SqrMagnitude(toVector));
|
||||
if (fabs(dot / k + 1) < 0.00001)
|
||||
{
|
||||
Vector3 ortho = Vector3::Orthogonal(fromVector);
|
||||
return Quaternion(Vector3::Normalized(ortho), 0);
|
||||
}
|
||||
Vector3 cross = Vector3::Cross(fromVector, toVector);
|
||||
return Normalized(Quaternion(cross, dot + k));
|
||||
}
|
||||
|
||||
Quaternion Quaternion::Inverse(Quaternion rotation)
|
||||
{
|
||||
float n = Norm(rotation);
|
||||
return Conjugate(rotation) / (n * n);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::Lerp(Quaternion a, Quaternion b, float t)
|
||||
{
|
||||
if (t < 0) return Normalized(a);
|
||||
else if (t > 1) return Normalized(b);
|
||||
return LerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::LerpUnclamped(Quaternion a, Quaternion b, float t)
|
||||
{
|
||||
Quaternion quaternion;
|
||||
if (Dot(a, b) >= 0)
|
||||
quaternion = a * (1 - t) + b * t;
|
||||
else
|
||||
quaternion = a * (1 - t) - b * t;
|
||||
return Normalized(quaternion);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::LookRotation(Vector3 forward)
|
||||
{
|
||||
return LookRotation(forward, Vector3(0, 1, 0));
|
||||
}
|
||||
|
||||
Quaternion Quaternion::LookRotation(Vector3 forward, Vector3 upwards)
|
||||
{
|
||||
// Normalize inputs
|
||||
forward = Vector3::Normalized(forward);
|
||||
upwards = Vector3::Normalized(upwards);
|
||||
// Don't allow zero vectors
|
||||
if (Vector3::SqrMagnitude(forward) < SMALL_float || Vector3::SqrMagnitude(upwards) < SMALL_float)
|
||||
return Quaternion::Identity();
|
||||
// Handle alignment with up direction
|
||||
if (1 - fabs(Vector3::Dot(forward, upwards)) < SMALL_float)
|
||||
return FromToRotation(Vector3::Forward(), forward);
|
||||
// Get orthogonal vectors
|
||||
Vector3 right = Vector3::Normalized(Vector3::Cross(upwards, forward));
|
||||
upwards = Vector3::Cross(forward, right);
|
||||
// Calculate rotation
|
||||
Quaternion quaternion;
|
||||
float radicand = right.X + upwards.Y + forward.Z;
|
||||
if (radicand > 0)
|
||||
{
|
||||
quaternion.W = sqrt(1.0 + radicand) * 0.5;
|
||||
float recip = 1.0 / (4.0 * quaternion.W);
|
||||
quaternion.X = (upwards.Z - forward.Y) * recip;
|
||||
quaternion.Y = (forward.X - right.Z) * recip;
|
||||
quaternion.Z = (right.Y - upwards.X) * recip;
|
||||
}
|
||||
else if (right.X >= upwards.Y && right.X >= forward.Z)
|
||||
{
|
||||
quaternion.X = sqrt(1.0 + right.X - upwards.Y - forward.Z) * 0.5;
|
||||
float recip = 1.0 / (4.0 * quaternion.X);
|
||||
quaternion.W = (upwards.Z - forward.Y) * recip;
|
||||
quaternion.Z = (forward.X + right.Z) * recip;
|
||||
quaternion.Y = (right.Y + upwards.X) * recip;
|
||||
}
|
||||
else if (upwards.Y > forward.Z)
|
||||
{
|
||||
quaternion.Y = sqrt(1.0 - right.X + upwards.Y - forward.Z) * 0.5;
|
||||
float recip = 1.0 / (4.0 * quaternion.Y);
|
||||
quaternion.Z = (upwards.Z + forward.Y) * recip;
|
||||
quaternion.W = (forward.X - right.Z) * recip;
|
||||
quaternion.X = (right.Y + upwards.X) * recip;
|
||||
}
|
||||
else
|
||||
{
|
||||
quaternion.Z = sqrt(1.0 - right.X - upwards.Y + forward.Z) * 0.5;
|
||||
float recip = 1.0 / (4.0 * quaternion.Z);
|
||||
quaternion.Y = (upwards.Z + forward.Y) * recip;
|
||||
quaternion.X = (forward.X + right.Z) * recip;
|
||||
quaternion.W = (right.Y - upwards.X) * recip;
|
||||
}
|
||||
return quaternion;
|
||||
}
|
||||
|
||||
float Quaternion::Norm(Quaternion rotation)
|
||||
{
|
||||
return sqrt(rotation.X * rotation.X +
|
||||
rotation.Y * rotation.Y +
|
||||
rotation.Z * rotation.Z +
|
||||
rotation.W * rotation.W);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::Normalized(Quaternion rotation)
|
||||
{
|
||||
return rotation / Norm(rotation);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::RotateTowards(Quaternion from, Quaternion to,
|
||||
float maxRadiansDelta)
|
||||
{
|
||||
float angle = Quaternion::Angle(from, to);
|
||||
if (angle == 0)
|
||||
return to;
|
||||
maxRadiansDelta = fmax(maxRadiansDelta, angle - M_PI);
|
||||
float t = fmin(1, maxRadiansDelta / angle);
|
||||
return Quaternion::SlerpUnclamped(from, to, t);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::Slerp(Quaternion a, Quaternion b, float t)
|
||||
{
|
||||
if (t < 0) return Normalized(a);
|
||||
else if (t > 1) return Normalized(b);
|
||||
return SlerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Quaternion Quaternion::SlerpUnclamped(Quaternion a, Quaternion b, float t)
|
||||
{
|
||||
float n1;
|
||||
float n2;
|
||||
float n3 = Dot(a, b);
|
||||
bool flag = false;
|
||||
if (n3 < 0)
|
||||
{
|
||||
flag = true;
|
||||
n3 = -n3;
|
||||
}
|
||||
if (n3 > 0.999999)
|
||||
{
|
||||
n2 = 1 - t;
|
||||
n1 = flag ? -t : t;
|
||||
}
|
||||
else
|
||||
{
|
||||
float n4 = acos(n3);
|
||||
float n5 = 1 / sin(n4);
|
||||
n2 = sin((1 - t) * n4) * n5;
|
||||
n1 = flag ? -sin(t * n4) * n5 : sin(t * n4) * n5;
|
||||
}
|
||||
Quaternion quaternion;
|
||||
quaternion.X = (n2 * a.X) + (n1 * b.X);
|
||||
quaternion.Y = (n2 * a.Y) + (n1 * b.Y);
|
||||
quaternion.Z = (n2 * a.Z) + (n1 * b.Z);
|
||||
quaternion.W = (n2 * a.W) + (n1 * b.W);
|
||||
return Normalized(quaternion);
|
||||
}
|
||||
|
||||
void Quaternion::ToAngleAxis(Quaternion rotation, float &angle, Vector3 &axis)
|
||||
{
|
||||
if (rotation.W > 1)
|
||||
rotation = Normalized(rotation);
|
||||
angle = 2 * acos(rotation.W);
|
||||
float s = sqrt(1 - rotation.W * rotation.W);
|
||||
if (s < 0.00001) {
|
||||
axis.X = 1;
|
||||
axis.Y = 0;
|
||||
axis.Z = 0;
|
||||
} else {
|
||||
axis.X = rotation.X / s;
|
||||
axis.Y = rotation.Y / s;
|
||||
axis.Z = rotation.Z / s;
|
||||
}
|
||||
}
|
||||
|
||||
Vector3 Quaternion::ToEuler(Quaternion rotation)
|
||||
{
|
||||
float sqw = rotation.W * rotation.W;
|
||||
float sqx = rotation.X * rotation.X;
|
||||
float sqy = rotation.Y * rotation.Y;
|
||||
float sqz = rotation.Z * rotation.Z;
|
||||
// If normalized is one, otherwise is correction factor
|
||||
float unit = sqx + sqy + sqz + sqw;
|
||||
float test = rotation.X * rotation.W - rotation.Y * rotation.Z;
|
||||
Vector3 v;
|
||||
// Singularity at north pole
|
||||
if (test > 0.4995f * unit)
|
||||
{
|
||||
v.Y = 2 * atan2(rotation.Y, rotation.X);
|
||||
v.X = M_PI_2;
|
||||
v.Z = 0;
|
||||
return v;
|
||||
}
|
||||
// Singularity at south pole
|
||||
if (test < -0.4995f * unit)
|
||||
{
|
||||
v.Y = -2 * atan2(rotation.Y, rotation.X);
|
||||
v.X = -M_PI_2;
|
||||
v.Z = 0;
|
||||
return v;
|
||||
}
|
||||
// Yaw
|
||||
v.Y = atan2(2 * rotation.W * rotation.Y + 2 * rotation.Z * rotation.X,
|
||||
1 - 2 * (rotation.X * rotation.X + rotation.Y * rotation.Y));
|
||||
// Pitch
|
||||
v.X = asin(2 * (rotation.W * rotation.X - rotation.Y * rotation.Z));
|
||||
// Roll
|
||||
v.Z = atan2(2 * rotation.W * rotation.Z + 2 * rotation.X * rotation.Y,
|
||||
1 - 2 * (rotation.Z * rotation.Z + rotation.X * rotation.X));
|
||||
return v;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator+=(const float rhs)
|
||||
{
|
||||
X += rhs;
|
||||
Y += rhs;
|
||||
Z += rhs;
|
||||
W += rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator-=(const float rhs)
|
||||
{
|
||||
X -= rhs;
|
||||
Y -= rhs;
|
||||
Z -= rhs;
|
||||
W -= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator*=(const float rhs)
|
||||
{
|
||||
X *= rhs;
|
||||
Y *= rhs;
|
||||
Z *= rhs;
|
||||
W *= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator/=(const float rhs)
|
||||
{
|
||||
X /= rhs;
|
||||
Y /= rhs;
|
||||
Z /= rhs;
|
||||
W /= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator+=(const Quaternion rhs)
|
||||
{
|
||||
X += rhs.X;
|
||||
Y += rhs.Y;
|
||||
Z += rhs.Z;
|
||||
W += rhs.W;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator-=(const Quaternion rhs)
|
||||
{
|
||||
X -= rhs.X;
|
||||
Y -= rhs.Y;
|
||||
Z -= rhs.Z;
|
||||
W -= rhs.W;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Quaternion& Quaternion::operator*=(const Quaternion rhs)
|
||||
{
|
||||
Quaternion q;
|
||||
q.W = W * rhs.W - X * rhs.X - Y * rhs.Y - Z * rhs.Z;
|
||||
q.X = X * rhs.W + W * rhs.X + Y * rhs.Z - Z * rhs.Y;
|
||||
q.Y = W * rhs.Y - X * rhs.Z + Y * rhs.W + Z * rhs.X;
|
||||
q.Z = W * rhs.Z + X * rhs.Y - Y * rhs.X + Z * rhs.W;
|
||||
*this = q;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Quaternion operator-(Quaternion rhs) { return rhs * -1; }
|
||||
Quaternion operator+(Quaternion lhs, const float rhs) { return lhs += rhs; }
|
||||
Quaternion operator-(Quaternion lhs, const float rhs) { return lhs -= rhs; }
|
||||
Quaternion operator*(Quaternion lhs, const float rhs) { return lhs *= rhs; }
|
||||
Quaternion operator/(Quaternion lhs, const float rhs) { return lhs /= rhs; }
|
||||
Quaternion operator+(const float lhs, Quaternion rhs) { return rhs += lhs; }
|
||||
Quaternion operator-(const float lhs, Quaternion rhs) { return rhs -= lhs; }
|
||||
Quaternion operator*(const float lhs, Quaternion rhs) { return rhs *= lhs; }
|
||||
Quaternion operator/(const float lhs, Quaternion rhs) { return rhs /= lhs; }
|
||||
Quaternion operator+(Quaternion lhs, const Quaternion rhs)
|
||||
{
|
||||
return lhs += rhs;
|
||||
}
|
||||
Quaternion operator-(Quaternion lhs, const Quaternion rhs)
|
||||
{
|
||||
return lhs -= rhs;
|
||||
}
|
||||
Quaternion operator*(Quaternion lhs, const Quaternion rhs)
|
||||
{
|
||||
return lhs *= rhs;
|
||||
}
|
||||
|
||||
Vector3 operator*(Quaternion lhs, const Vector3 rhs)
|
||||
{
|
||||
Vector3 u = Vector3(lhs.X, lhs.Y, lhs.Z);
|
||||
float s = lhs.W;
|
||||
return u * (Vector3::Dot(u, rhs) * 2)
|
||||
+ rhs * (s * s - Vector3::Dot(u, u))
|
||||
+ Vector3::Cross(u, rhs) * (2.0 * s);
|
||||
}
|
||||
|
||||
bool operator==(const Quaternion lhs, const Quaternion rhs)
|
||||
{
|
||||
return lhs.X == rhs.X &&
|
||||
lhs.Y == rhs.Y &&
|
||||
lhs.Z == rhs.Z &&
|
||||
lhs.W == rhs.W;
|
||||
}
|
||||
|
||||
bool operator!=(const Quaternion lhs, const Quaternion rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
Executable
+528
@@ -0,0 +1,528 @@
|
||||
#pragma once
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
|
||||
|
||||
struct Vector2
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
float X;
|
||||
float Y;
|
||||
};
|
||||
float data[2];
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Constructors.
|
||||
*/
|
||||
inline Vector2();
|
||||
inline Vector2(float data[]);
|
||||
inline Vector2(float value);
|
||||
inline Vector2(float x, float y);
|
||||
|
||||
|
||||
/**
|
||||
* Constants for common vectors.
|
||||
*/
|
||||
static inline Vector2 Zero();
|
||||
static inline Vector2 One();
|
||||
static inline Vector2 Right();
|
||||
static inline Vector2 Left();
|
||||
static inline Vector2 Up();
|
||||
static inline Vector2 Down();
|
||||
|
||||
|
||||
//=====𝗦𝗥𝗖==𝗝𝗢𝗜𝗡==𝗧𝗘𝗟𝗘𝗚𝗥𝗔𝗠=@𝗚𝗞𝗣𝗙𝗥𝗘𝗘𝗛𝗔𝗖𝗞𝗦===@GKPHACK===V=2.4==//
|
||||
static inline float Angle(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns a vector with its magnitude clamped to maxLength.
|
||||
* @param vector: The target vector.
|
||||
* @param maxLength: The maximum length of the return vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 ClampMagnitude(Vector2 vector, float maxLength);
|
||||
|
||||
/**
|
||||
* Returns the component of a in the direction of b (scalar projection).
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being compared against.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Component(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns the distance between a and b.
|
||||
* @param a: The first point.
|
||||
* @param b: The second point.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Distance(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns the dot product of two vectors.
|
||||
* @param lhs: The left side of the multiplication.
|
||||
* @param rhs: The right side of the multiplication.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Dot(Vector2 lhs, Vector2 rhs);
|
||||
|
||||
/**
|
||||
* Converts a polar representation of a vector into cartesian
|
||||
* coordinates.
|
||||
* @param rad: The magnitude of the vector.
|
||||
* @param theta: The angle from the X axis.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 FromPolar(float rad, float theta);
|
||||
|
||||
/**
|
||||
* Returns a vector linearly interpolated between a and b, moving along
|
||||
* a straight line. The vector is clamped to never go beyond the end points.
|
||||
* @param a: The starting point.
|
||||
* @param b: The ending point.
|
||||
* @param t: The interpolation value [0-1].
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Lerp(Vector2 a, Vector2 b, float t);
|
||||
|
||||
/**
|
||||
* Returns a vector linearly interpolated between a and b, moving along
|
||||
* a straight line.
|
||||
* @param a: The starting point.
|
||||
* @param b: The ending point.
|
||||
* @param t: The interpolation value [0-1] (no actual bounds).
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 LerpUnclamped(Vector2 a, Vector2 b, float t);
|
||||
|
||||
/**
|
||||
* Returns the magnitude of a vector.
|
||||
* @param v: The vector in question.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Magnitude(Vector2 v);
|
||||
|
||||
/**
|
||||
* Returns a vector made from the largest components of two other vectors.
|
||||
* @param a: The first vector.
|
||||
* @param b: The second vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Max(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns a vector made from the smallest components of two other vectors.
|
||||
* @param a: The first vector.
|
||||
* @param b: The second vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Min(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns a vector "maxDistanceDelta" units closer to the target. This
|
||||
* interpolation is in a straight line, and will not overshoot.
|
||||
* @param current: The current position.
|
||||
* @param target: The destination position.
|
||||
* @param maxDistanceDelta: The maximum distance to move.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 MoveTowards(Vector2 current, Vector2 target,
|
||||
float maxDistanceDelta);
|
||||
|
||||
/**
|
||||
* Returns a new vector with magnitude of one.
|
||||
* @param v: The vector in question.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Normalized(Vector2 v);
|
||||
|
||||
/**
|
||||
* Creates a new coordinate system out of the two vectors.
|
||||
* Normalizes "normal" and normalizes "tangent" and makes it orthogonal to
|
||||
* "normal"..
|
||||
* @param normal: A reference to the first axis vector.
|
||||
* @param tangent: A reference to the second axis vector.
|
||||
*/
|
||||
static inline void OrthoNormalize(Vector2 &normal, Vector2 &tangent);
|
||||
|
||||
/**
|
||||
* Returns the vector projection of a onto b.
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being projected onto.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Project(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns a vector reflected about the provided line.
|
||||
* This behaves as if there is a plane with the line as its normal, and the
|
||||
* vector comes in and bounces off this plane.
|
||||
* @param vector: The vector traveling inward at the imaginary plane.
|
||||
* @param line: The line about which to reflect.
|
||||
* @return: A new vector pointing outward from the imaginary plane.
|
||||
*/
|
||||
static inline Vector2 Reflect(Vector2 vector, Vector2 line);
|
||||
|
||||
/**
|
||||
* Returns the vector rejection of a on b.
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being projected onto.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Reject(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Rotates vector "current" towards vector "target" by "maxRadiansDelta".
|
||||
* This treats the vectors as directions and will linearly interpolate
|
||||
* between their magnitudes by "maxMagnitudeDelta". This function does not
|
||||
* overshoot. If a negative delta is supplied, it will rotate away from
|
||||
* "target" until it is pointing the opposite direction, but will not
|
||||
* overshoot that either.
|
||||
* @param current: The starting direction.
|
||||
* @param target: The destination direction.
|
||||
* @param maxRadiansDelta: The maximum number of radians to rotate.
|
||||
* @param maxMagnitudeDelta: The maximum delta for magnitude interpolation.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 RotateTowards(Vector2 current, Vector2 target,
|
||||
float maxRadiansDelta,
|
||||
float maxMagnitudeDelta);
|
||||
|
||||
/**
|
||||
* Multiplies two vectors component-wise.
|
||||
* @param a: The lhs of the multiplication.
|
||||
* @param b: The rhs of the multiplication.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector2 Scale(Vector2 a, Vector2 b);
|
||||
|
||||
/**
|
||||
* Returns a vector rotated towards b from a by the percent t.
|
||||
* Since interpolation is done spherically, the vector moves at a constant
|
||||
* angular velocity. This rotation is clamped to 0 <= t <= 1.
|
||||
* @param a: The starting direction.
|
||||
* @param b: The ending direction.
|
||||
* @param t: The interpolation value [0-1].
|
||||
*/
|
||||
static inline Vector2 Slerp(Vector2 a, Vector2 b, float t);
|
||||
|
||||
/**
|
||||
* Returns a vector rotated towards b from a by the percent t.
|
||||
* Since interpolation is done spherically, the vector moves at a constant
|
||||
* angular velocity. This rotation is unclamped.
|
||||
* @param a: The starting direction.
|
||||
* @param b: The ending direction.
|
||||
* @param t: The interpolation value [0-1].
|
||||
*/
|
||||
static inline Vector2 SlerpUnclamped(Vector2 a, Vector2 b, float t);
|
||||
|
||||
/**
|
||||
* Returns the squared magnitude of a vector.
|
||||
* This is useful when comparing relative lengths, where the exact length
|
||||
* is not important, and much time can be saved by not calculating the
|
||||
* square root.
|
||||
* @param v: The vector in question.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float SqrMagnitude(Vector2 v);
|
||||
|
||||
/**
|
||||
* Calculates the polar coordinate space representation of a vector.
|
||||
* @param vector: The vector to convert.
|
||||
* @param rad: The magnitude of the vector.
|
||||
* @param theta: The angle from the X axis.
|
||||
*/
|
||||
static inline void ToPolar(Vector2 vector, float &rad, float &theta);
|
||||
|
||||
|
||||
/**
|
||||
* Operator overloading.
|
||||
*/
|
||||
inline struct Vector2& operator+=(const float rhs);
|
||||
inline struct Vector2& operator-=(const float rhs);
|
||||
inline struct Vector2& operator*=(const float rhs);
|
||||
inline struct Vector2& operator/=(const float rhs);
|
||||
inline struct Vector2& operator+=(const Vector2 rhs);
|
||||
inline struct Vector2& operator-=(const Vector2 rhs);
|
||||
};
|
||||
|
||||
inline Vector2 operator-(Vector2 rhs);
|
||||
inline Vector2 operator+(Vector2 lhs, const float rhs);
|
||||
inline Vector2 operator-(Vector2 lhs, const float rhs);
|
||||
inline Vector2 operator*(Vector2 lhs, const float rhs);
|
||||
inline Vector2 operator/(Vector2 lhs, const float rhs);
|
||||
inline Vector2 operator+(const float lhs, Vector2 rhs);
|
||||
inline Vector2 operator-(const float lhs, Vector2 rhs);
|
||||
inline Vector2 operator*(const float lhs, Vector2 rhs);
|
||||
inline Vector2 operator/(const float lhs, Vector2 rhs);
|
||||
inline Vector2 operator+(Vector2 lhs, const Vector2 rhs);
|
||||
inline Vector2 operator-(Vector2 lhs, const Vector2 rhs);
|
||||
inline bool operator==(const Vector2 lhs, const Vector2 rhs);
|
||||
inline bool operator!=(const Vector2 lhs, const Vector2 rhs);
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Implementation
|
||||
*/
|
||||
|
||||
Vector2::Vector2() : X(0), Y(0) {}
|
||||
Vector2::Vector2(float data[]) : X(data[0]), Y(data[1]) {}
|
||||
Vector2::Vector2(float value) : X(value), Y(value) {}
|
||||
Vector2::Vector2(float x, float y) : X(x), Y(y) {}
|
||||
|
||||
|
||||
Vector2 Vector2::Zero() { return Vector2(0, 0); }
|
||||
Vector2 Vector2::One() { return Vector2(1, 1); }
|
||||
Vector2 Vector2::Right() { return Vector2(1, 0); }
|
||||
Vector2 Vector2::Left() { return Vector2(-1, 0); }
|
||||
Vector2 Vector2::Up() { return Vector2(0, 1); }
|
||||
Vector2 Vector2::Down() { return Vector2(0, -1); }
|
||||
|
||||
|
||||
float Vector2::Angle(Vector2 a, Vector2 b)
|
||||
{
|
||||
float v = Dot(a, b) / (Magnitude(a) * Magnitude(b));
|
||||
v = fmax(v, -1.0);
|
||||
v = fmin(v, 1.0);
|
||||
return acos(v);
|
||||
}
|
||||
|
||||
Vector2 Vector2::ClampMagnitude(Vector2 vector, float maxLength)
|
||||
{
|
||||
float length = Magnitude(vector);
|
||||
if (length > maxLength)
|
||||
vector *= maxLength / length;
|
||||
return vector;
|
||||
}
|
||||
|
||||
float Vector2::Component(Vector2 a, Vector2 b)
|
||||
{
|
||||
return Dot(a, b) / Magnitude(b);
|
||||
}
|
||||
|
||||
float Vector2::Distance(Vector2 a, Vector2 b)
|
||||
{
|
||||
return Vector2::Magnitude(a - b);
|
||||
}
|
||||
|
||||
float Vector2::Dot(Vector2 lhs, Vector2 rhs)
|
||||
{
|
||||
return lhs.X * rhs.X + lhs.Y * rhs.Y;
|
||||
}
|
||||
|
||||
Vector2 Vector2::FromPolar(float rad, float theta)
|
||||
{
|
||||
Vector2 v;
|
||||
v.X = rad * cos(theta);
|
||||
v.Y = rad * sin(theta);
|
||||
return v;
|
||||
}
|
||||
|
||||
Vector2 Vector2::Lerp(Vector2 a, Vector2 b, float t)
|
||||
{
|
||||
if (t < 0) return a;
|
||||
else if (t > 1) return b;
|
||||
return LerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Vector2 Vector2::LerpUnclamped(Vector2 a, Vector2 b, float t)
|
||||
{
|
||||
return (b - a) * t + a;
|
||||
}
|
||||
|
||||
float Vector2::Magnitude(Vector2 v)
|
||||
{
|
||||
return sqrt(SqrMagnitude(v));
|
||||
}
|
||||
|
||||
Vector2 Vector2::Max(Vector2 a, Vector2 b)
|
||||
{
|
||||
float x = a.X > b.X ? a.X : b.X;
|
||||
float y = a.Y > b.Y ? a.Y : b.Y;
|
||||
return Vector2(x, y);
|
||||
}
|
||||
|
||||
Vector2 Vector2::Min(Vector2 a, Vector2 b)
|
||||
{
|
||||
float x = a.X > b.X ? b.X : a.X;
|
||||
float y = a.Y > b.Y ? b.Y : a.Y;
|
||||
return Vector2(x, y);
|
||||
}
|
||||
|
||||
Vector2 Vector2::MoveTowards(Vector2 current, Vector2 target,
|
||||
float maxDistanceDelta)
|
||||
{
|
||||
Vector2 d = target - current;
|
||||
float m = Magnitude(d);
|
||||
if (m < maxDistanceDelta || m == 0)
|
||||
return target;
|
||||
return current + (d * maxDistanceDelta / m);
|
||||
}
|
||||
|
||||
Vector2 Vector2::Normalized(Vector2 v)
|
||||
{
|
||||
float mag = Magnitude(v);
|
||||
if (mag == 0)
|
||||
return Vector2::Zero();
|
||||
return v / mag;
|
||||
}
|
||||
|
||||
void Vector2::OrthoNormalize(Vector2 &normal, Vector2 &tangent)
|
||||
{
|
||||
normal = Normalized(normal);
|
||||
tangent = Reject(tangent, normal);
|
||||
tangent = Normalized(tangent);
|
||||
}
|
||||
|
||||
Vector2 Vector2::Project(Vector2 a, Vector2 b)
|
||||
{
|
||||
float m = Magnitude(b);
|
||||
return Dot(a, b) / (m * m) * b;
|
||||
}
|
||||
|
||||
Vector2 Vector2::Reflect(Vector2 vector, Vector2 planeNormal)
|
||||
{
|
||||
return vector - 2 * Project(vector, planeNormal);
|
||||
}
|
||||
|
||||
Vector2 Vector2::Reject(Vector2 a, Vector2 b)
|
||||
{
|
||||
return a - Project(a, b);
|
||||
}
|
||||
|
||||
Vector2 Vector2::RotateTowards(Vector2 current, Vector2 target,
|
||||
float maxRadiansDelta,
|
||||
float maxMagnitudeDelta)
|
||||
{
|
||||
float magCur = Magnitude(current);
|
||||
float magTar = Magnitude(target);
|
||||
float newMag = magCur + maxMagnitudeDelta *
|
||||
((magTar > magCur) - (magCur > magTar));
|
||||
newMag = fmin(newMag, fmax(magCur, magTar));
|
||||
newMag = fmax(newMag, fmin(magCur, magTar));
|
||||
|
||||
float totalAngle = Angle(current, target) - maxRadiansDelta;
|
||||
if (totalAngle <= 0)
|
||||
return Normalized(target) * newMag;
|
||||
else if (totalAngle >= M_PI)
|
||||
return Normalized(-target) * newMag;
|
||||
|
||||
float axis = current.X * target.Y - current.Y * target.X;
|
||||
axis = axis / fabs(axis);
|
||||
if (!(1 - fabs(axis) < 0.00001))
|
||||
axis = 1;
|
||||
current = Normalized(current);
|
||||
Vector2 newVector = current * cos(maxRadiansDelta) +
|
||||
Vector2(-current.Y, current.X) * sin(maxRadiansDelta) * axis;
|
||||
return newVector * newMag;
|
||||
}
|
||||
|
||||
Vector2 Vector2::Scale(Vector2 a, Vector2 b)
|
||||
{
|
||||
return Vector2(a.X * b.X, a.Y * b.Y);
|
||||
}
|
||||
|
||||
Vector2 Vector2::Slerp(Vector2 a, Vector2 b, float t)
|
||||
{
|
||||
if (t < 0) return a;
|
||||
else if (t > 1) return b;
|
||||
return SlerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Vector2 Vector2::SlerpUnclamped(Vector2 a, Vector2 b, float t)
|
||||
{
|
||||
float magA = Magnitude(a);
|
||||
float magB = Magnitude(b);
|
||||
a /= magA;
|
||||
b /= magB;
|
||||
float dot = Dot(a, b);
|
||||
dot = fmax(dot, -1.0);
|
||||
dot = fmin(dot, 1.0);
|
||||
float theta = acos(dot) * t;
|
||||
Vector2 relativeVec = Normalized(b - a * dot);
|
||||
Vector2 newVec = a * cos(theta) + relativeVec * sin(theta);
|
||||
return newVec * (magA + (magB - magA) * t);
|
||||
}
|
||||
|
||||
float Vector2::SqrMagnitude(Vector2 v)
|
||||
{
|
||||
return v.X * v.X + v.Y * v.Y;
|
||||
}
|
||||
|
||||
void Vector2::ToPolar(Vector2 vector, float &rad, float &theta)
|
||||
{
|
||||
rad = Magnitude(vector);
|
||||
theta = atan2(vector.Y, vector.X);
|
||||
}
|
||||
|
||||
|
||||
struct Vector2& Vector2::operator+=(const float rhs)
|
||||
{
|
||||
X += rhs;
|
||||
Y += rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector2& Vector2::operator-=(const float rhs)
|
||||
{
|
||||
X -= rhs;
|
||||
Y -= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector2& Vector2::operator*=(const float rhs)
|
||||
{
|
||||
X *= rhs;
|
||||
Y *= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector2& Vector2::operator/=(const float rhs)
|
||||
{
|
||||
X /= rhs;
|
||||
Y /= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector2& Vector2::operator+=(const Vector2 rhs)
|
||||
{
|
||||
X += rhs.X;
|
||||
Y += rhs.Y;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector2& Vector2::operator-=(const Vector2 rhs)
|
||||
{
|
||||
X -= rhs.X;
|
||||
Y -= rhs.Y;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Vector2 operator-(Vector2 rhs) { return rhs * -1; }
|
||||
Vector2 operator+(Vector2 lhs, const float rhs) { return lhs += rhs; }
|
||||
Vector2 operator-(Vector2 lhs, const float rhs) { return lhs -= rhs; }
|
||||
Vector2 operator*(Vector2 lhs, const float rhs) { return lhs *= rhs; }
|
||||
Vector2 operator/(Vector2 lhs, const float rhs) { return lhs /= rhs; }
|
||||
Vector2 operator+(const float lhs, Vector2 rhs) { return rhs += lhs; }
|
||||
Vector2 operator-(const float lhs, Vector2 rhs) { return rhs -= lhs; }
|
||||
Vector2 operator*(const float lhs, Vector2 rhs) { return rhs *= lhs; }
|
||||
Vector2 operator/(const float lhs, Vector2 rhs) { return rhs /= lhs; }
|
||||
Vector2 operator+(Vector2 lhs, const Vector2 rhs) { return lhs += rhs; }
|
||||
Vector2 operator-(Vector2 lhs, const Vector2 rhs) { return lhs -= rhs; }
|
||||
|
||||
bool operator==(const Vector2 lhs, const Vector2 rhs)
|
||||
{
|
||||
return lhs.X == rhs.X && lhs.Y == rhs.Y;
|
||||
}
|
||||
|
||||
bool operator!=(const Vector2 lhs, const Vector2 rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
Executable
+625
@@ -0,0 +1,625 @@
|
||||
#pragma once
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
|
||||
|
||||
struct Vector3
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
float X;
|
||||
float Y;
|
||||
float Z;
|
||||
};
|
||||
float data[3];
|
||||
};
|
||||
//=====𝗦𝗥𝗖==𝗝𝗢𝗜𝗡==𝗧𝗘𝗟𝗘𝗚𝗥𝗔𝗠=@𝗚𝗞𝗣𝗙𝗥𝗘𝗘𝗛𝗔𝗖𝗞𝗦===@GKPHACK===V=2.4==//
|
||||
inline Vector3();
|
||||
inline Vector3(float data[]);
|
||||
inline Vector3(float value);
|
||||
inline Vector3(float x, float y);
|
||||
inline Vector3(float x, float y, float z);
|
||||
|
||||
|
||||
/**
|
||||
* Constants for common vectors.
|
||||
*/
|
||||
static inline Vector3 Zero();
|
||||
static inline Vector3 One();
|
||||
static inline Vector3 Right();
|
||||
static inline Vector3 Left();
|
||||
static inline Vector3 Up();
|
||||
static inline Vector3 Down();
|
||||
static inline Vector3 Forward();
|
||||
static inline Vector3 Backward();
|
||||
|
||||
|
||||
/**
|
||||
* Returns the angle between two vectors in radians.
|
||||
* @param a: The first vector.
|
||||
* @param b: The second vector.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Angle(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns a vector with its magnitude clamped to maxLength.
|
||||
* @param vector: The target vector.
|
||||
* @param maxLength: The maximum length of the return vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 ClampMagnitude(Vector3 vector, float maxLength);
|
||||
|
||||
/**
|
||||
* Returns the component of a in the direction of b (scalar projection).
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being compared against.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Component(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns the cross product of two vectors.
|
||||
* @param lhs: The left side of the multiplication.
|
||||
* @param rhs: The right side of the multiplication.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Cross(Vector3 lhs, Vector3 rhs);
|
||||
|
||||
/**
|
||||
* Returns the distance between a and b.
|
||||
* @param a: The first point.
|
||||
* @param b: The second point.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Distance(Vector3 a, Vector3 b);
|
||||
|
||||
static inline char ToChar(Vector3 a);
|
||||
|
||||
/**
|
||||
* Returns the dot product of two vectors.
|
||||
* @param lhs: The left side of the multiplication.
|
||||
* @param rhs: The right side of the multiplication.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Dot(Vector3 lhs, Vector3 rhs);
|
||||
|
||||
/**
|
||||
* Converts a spherical representation of a vector into cartesian
|
||||
* coordinates.
|
||||
* This uses the ISO convention (radius r, inclination theta, azimuth phi).
|
||||
* @param rad: The magnitude of the vector.
|
||||
* @param theta: The angle in the XY plane from the X axis.
|
||||
* @param phi: The angle from the positive Z axis to the vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 FromSpherical(float rad, float theta, float phi);
|
||||
|
||||
/**
|
||||
* Returns a vector linearly interpolated between a and b, moving along
|
||||
* a straight line. The vector is clamped to never go beyond the end points.
|
||||
* @param a: The starting point.
|
||||
* @param b: The ending point.
|
||||
* @param t: The interpolation value [0-1].
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Lerp(Vector3 a, Vector3 b, float t);
|
||||
|
||||
/**
|
||||
* Returns a vector linearly interpolated between a and b, moving along
|
||||
* a straight line.
|
||||
* @param a: The starting point.
|
||||
* @param b: The ending point.
|
||||
* @param t: The interpolation value [0-1] (no actual bounds).
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 LerpUnclamped(Vector3 a, Vector3 b, float t);
|
||||
|
||||
/**
|
||||
* Returns the magnitude of a vector.
|
||||
* @param v: The vector in question.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float Magnitude(Vector3 v);
|
||||
|
||||
/**
|
||||
* Returns a vector made from the largest components of two other vectors.
|
||||
* @param a: The first vector.
|
||||
* @param b: The second vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Max(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns a vector made from the smallest components of two other vectors.
|
||||
* @param a: The first vector.
|
||||
* @param b: The second vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Min(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns a vector "maxDistanceDelta" units closer to the target. This
|
||||
* interpolation is in a straight line, and will not overshoot.
|
||||
* @param current: The current position.
|
||||
* @param target: The destination position.
|
||||
* @param maxDistanceDelta: The maximum distance to move.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 MoveTowards(Vector3 current, Vector3 target,
|
||||
float maxDistanceDelta);
|
||||
|
||||
/**
|
||||
* Returns a new vector with magnitude of one.
|
||||
* @param v: The vector in question.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Normalized(Vector3 v);
|
||||
|
||||
/**
|
||||
* Returns an arbitrary vector orthogonal to the input.
|
||||
* This vector is not normalized.
|
||||
* @param v: The input vector.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Orthogonal(Vector3 v);
|
||||
|
||||
/**
|
||||
* Creates a new coordinate system out of the three vectors.
|
||||
* Normalizes "normal", normalizes "tangent" and makes it orthogonal to
|
||||
* "normal" and normalizes "binormal" and makes it orthogonal to both
|
||||
* "normal" and "tangent".
|
||||
* @param normal: A reference to the first axis vector.
|
||||
* @param tangent: A reference to the second axis vector.
|
||||
* @param binormal: A reference to the third axis vector.
|
||||
*/
|
||||
static inline void OrthoNormalize(Vector3 &normal, Vector3 &tangent,
|
||||
Vector3 &binormal);
|
||||
|
||||
/**
|
||||
* Returns the vector projection of a onto b.
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being projected onto.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Project(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns a vector projected onto a plane orthogonal to "planeNormal".
|
||||
* This can be visualized as the shadow of the vector onto the plane, if
|
||||
* the light source were in the direction of the plane normal.
|
||||
* @param vector: The vector to project.
|
||||
* @param planeNormal: The normal of the plane onto which to project.
|
||||
* @param: A new vector.
|
||||
*/
|
||||
static inline Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);
|
||||
|
||||
/**
|
||||
* Returns a vector reflected off the plane orthogonal to the normal.
|
||||
* The input vector is pointed inward, at the plane, and the return vector
|
||||
* is pointed outward from the plane, like a beam of light hitting and then
|
||||
* reflecting off a mirror.
|
||||
* @param vector: The vector traveling inward at the plane.
|
||||
* @param planeNormal: The normal of the plane off of which to reflect.
|
||||
* @return: A new vector pointing outward from the plane.
|
||||
*/
|
||||
static inline Vector3 Reflect(Vector3 vector, Vector3 planeNormal);
|
||||
|
||||
/**
|
||||
* Returns the vector rejection of a on b.
|
||||
* @param a: The target vector.
|
||||
* @param b: The vector being projected onto.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Reject(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Rotates vector "current" towards vector "target" by "maxRadiansDelta".
|
||||
* This treats the vectors as directions and will linearly interpolate
|
||||
* between their magnitudes by "maxMagnitudeDelta". This function does not
|
||||
* overshoot. If a negative delta is supplied, it will rotate away from
|
||||
* "target" until it is pointing the opposite direction, but will not
|
||||
* overshoot that either.
|
||||
* @param current: The starting direction.
|
||||
* @param target: The destination direction.
|
||||
* @param maxRadiansDelta: The maximum number of radians to rotate.
|
||||
* @param maxMagnitudeDelta: The maximum delta for magnitude interpolation.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 RotateTowards(Vector3 current, Vector3 target,
|
||||
float maxRadiansDelta,
|
||||
float maxMagnitudeDelta);
|
||||
|
||||
/**
|
||||
* Multiplies two vectors element-wise.
|
||||
* @param a: The lhs of the multiplication.
|
||||
* @param b: The rhs of the multiplication.
|
||||
* @return: A new vector.
|
||||
*/
|
||||
static inline Vector3 Scale(Vector3 a, Vector3 b);
|
||||
|
||||
/**
|
||||
* Returns a vector rotated towards b from a by the percent t.
|
||||
* Since interpolation is done spherically, the vector moves at a constant
|
||||
* angular velocity. This rotation is clamped to 0 <= t <= 1.
|
||||
* @param a: The starting direction.
|
||||
* @param b: The ending direction.
|
||||
* @param t: The interpolation value [0-1].
|
||||
*/
|
||||
static inline Vector3 Slerp(Vector3 a, Vector3 b, float t);
|
||||
|
||||
/**
|
||||
* Returns a vector rotated towards b from a by the percent t.
|
||||
* Since interpolation is done spherically, the vector moves at a constant
|
||||
* angular velocity. This rotation is unclamped.
|
||||
* @param a: The starting direction.
|
||||
* @param b: The ending direction.
|
||||
* @param t: The interpolation value [0-1].
|
||||
*/
|
||||
static inline Vector3 SlerpUnclamped(Vector3 a, Vector3 b, float t);
|
||||
|
||||
/**
|
||||
* Returns the squared magnitude of a vector.
|
||||
* This is useful when comparing relative lengths, where the exact length
|
||||
* is not important, and much time can be saved by not calculating the
|
||||
* square root.
|
||||
* @param v: The vector in question.
|
||||
* @return: A scalar value.
|
||||
*/
|
||||
static inline float SqrMagnitude(Vector3 v);
|
||||
|
||||
/**
|
||||
* Calculates the spherical coordinate space representation of a vector.
|
||||
* This uses the ISO convention (radius r, inclination theta, azimuth phi).
|
||||
* @param vector: The vector to convert.
|
||||
* @param rad: The magnitude of the vector.
|
||||
* @param theta: The angle in the XY plane from the X axis.
|
||||
* @param phi: The angle from the positive Z axis to the vector.
|
||||
*/
|
||||
static inline void ToSpherical(Vector3 vector, float &rad, float &theta,
|
||||
float &phi);
|
||||
|
||||
|
||||
/**
|
||||
* Operator overloading.
|
||||
*/
|
||||
inline struct Vector3& operator+=(const float rhs);
|
||||
inline struct Vector3& operator-=(const float rhs);
|
||||
inline struct Vector3& operator*=(const float rhs);
|
||||
inline struct Vector3& operator/=(const float rhs);
|
||||
inline struct Vector3& operator+=(const Vector3 rhs);
|
||||
inline struct Vector3& operator-=(const Vector3 rhs);
|
||||
};
|
||||
|
||||
inline Vector3 operator-(Vector3 rhs);
|
||||
inline Vector3 operator+(Vector3 lhs, const float rhs);
|
||||
inline Vector3 operator-(Vector3 lhs, const float rhs);
|
||||
inline Vector3 operator*(Vector3 lhs, const float rhs);
|
||||
inline Vector3 operator/(Vector3 lhs, const float rhs);
|
||||
inline Vector3 operator+(const float lhs, Vector3 rhs);
|
||||
inline Vector3 operator-(const float lhs, Vector3 rhs);
|
||||
inline Vector3 operator*(const float lhs, Vector3 rhs);
|
||||
inline Vector3 operator/(const float lhs, Vector3 rhs);
|
||||
inline Vector3 operator+(Vector3 lhs, const Vector3 rhs);
|
||||
inline Vector3 operator-(Vector3 lhs, const Vector3 rhs);
|
||||
inline bool operator==(const Vector3 lhs, const Vector3 rhs);
|
||||
inline bool operator!=(const Vector3 lhs, const Vector3 rhs);
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Implementation
|
||||
*/
|
||||
|
||||
Vector3::Vector3() : X(0), Y(0), Z(0) {}
|
||||
Vector3::Vector3(float data[]) : X(data[0]), Y(data[1]), Z(data[2]) {}
|
||||
Vector3::Vector3(float value) : X(value), Y(value), Z(value) {}
|
||||
Vector3::Vector3(float x, float y) : X(x), Y(y), Z(0) {}
|
||||
Vector3::Vector3(float x, float y, float z) : X(x), Y(y), Z(z) {}
|
||||
|
||||
|
||||
Vector3 Vector3::Zero() { return Vector3(0, 0, 0); }
|
||||
Vector3 Vector3::One() { return Vector3(1, 1, 1); }
|
||||
Vector3 Vector3::Right() { return Vector3(1, 0, 0); }
|
||||
Vector3 Vector3::Left() { return Vector3(-1, 0, 0); }
|
||||
Vector3 Vector3::Up() { return Vector3(0, 1, 0); }
|
||||
Vector3 Vector3::Down() { return Vector3(0, -1, 0); }
|
||||
Vector3 Vector3::Forward() { return Vector3(0, 0, 1); }
|
||||
Vector3 Vector3::Backward() { return Vector3(0, 0, -1); }
|
||||
|
||||
|
||||
float Vector3::Angle(Vector3 a, Vector3 b)
|
||||
{
|
||||
float v = Dot(a, b) / (Magnitude(a) * Magnitude(b));
|
||||
v = fmax(v, -1.0);
|
||||
v = fmin(v, 1.0);
|
||||
return acos(v);
|
||||
}
|
||||
|
||||
Vector3 Vector3::ClampMagnitude(Vector3 vector, float maxLength)
|
||||
{
|
||||
float length = Magnitude(vector);
|
||||
if (length > maxLength)
|
||||
vector *= maxLength / length;
|
||||
return vector;
|
||||
}
|
||||
|
||||
float Vector3::Component(Vector3 a, Vector3 b)
|
||||
{
|
||||
return Dot(a, b) / Magnitude(b);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Cross(Vector3 lhs, Vector3 rhs)
|
||||
{
|
||||
float x = lhs.Y * rhs.Z - lhs.Z * rhs.Y;
|
||||
float y = lhs.Z * rhs.X - lhs.X * rhs.Z;
|
||||
float z = lhs.X * rhs.Y - lhs.Y * rhs.X;
|
||||
return Vector3(x, y, z);
|
||||
}
|
||||
|
||||
float Vector3::Distance(Vector3 a, Vector3 b)
|
||||
{
|
||||
return Vector3::Magnitude(a - b);
|
||||
}
|
||||
|
||||
float Vector3::Dot(Vector3 lhs, Vector3 rhs)
|
||||
{
|
||||
return lhs.X * rhs.X + lhs.Y * rhs.Y + lhs.Z * rhs.Z;
|
||||
}
|
||||
|
||||
Vector3 Vector3::FromSpherical(float rad, float theta, float phi)
|
||||
{
|
||||
Vector3 v;
|
||||
v.X = rad * sin(theta) * cos(phi);
|
||||
v.Y = rad * sin(theta) * sin(phi);
|
||||
v.Z = rad * cos(theta);
|
||||
return v;
|
||||
}
|
||||
|
||||
Vector3 Vector3::Lerp(Vector3 a, Vector3 b, float t)
|
||||
{
|
||||
if (t < 0) return a;
|
||||
else if (t > 1) return b;
|
||||
return LerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Vector3 Vector3::LerpUnclamped(Vector3 a, Vector3 b, float t)
|
||||
{
|
||||
return (b - a) * t + a;
|
||||
}
|
||||
|
||||
float Vector3::Magnitude(Vector3 v)
|
||||
{
|
||||
return sqrt(SqrMagnitude(v));
|
||||
}
|
||||
|
||||
Vector3 Vector3::Max(Vector3 a, Vector3 b)
|
||||
{
|
||||
float x = a.X > b.X ? a.X : b.X;
|
||||
float y = a.Y > b.Y ? a.Y : b.Y;
|
||||
float z = a.Z > b.Z ? a.Z : b.Z;
|
||||
return Vector3(x, y, z);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Min(Vector3 a, Vector3 b)
|
||||
{
|
||||
float x = a.X > b.X ? b.X : a.X;
|
||||
float y = a.Y > b.Y ? b.Y : a.Y;
|
||||
float z = a.Z > b.Z ? b.Z : a.Z;
|
||||
return Vector3(x, y, z);
|
||||
}
|
||||
|
||||
Vector3 Vector3::MoveTowards(Vector3 current, Vector3 target,
|
||||
float maxDistanceDelta)
|
||||
{
|
||||
Vector3 d = target - current;
|
||||
float m = Magnitude(d);
|
||||
if (m < maxDistanceDelta || m == 0)
|
||||
return target;
|
||||
return current + (d * maxDistanceDelta / m);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Normalized(Vector3 v)
|
||||
{
|
||||
float mag = Magnitude(v);
|
||||
if (mag == 0)
|
||||
return Vector3::Zero();
|
||||
return v / mag;
|
||||
}
|
||||
|
||||
Vector3 Vector3::Orthogonal(Vector3 v)
|
||||
{
|
||||
return v.Z < v.X ? Vector3(v.Y, -v.X, 0) : Vector3(0, -v.Z, v.Y);
|
||||
}
|
||||
|
||||
void Vector3::OrthoNormalize(Vector3 &normal, Vector3 &tangent,
|
||||
Vector3 &binormal)
|
||||
{
|
||||
normal = Normalized(normal);
|
||||
tangent = ProjectOnPlane(tangent, normal);
|
||||
tangent = Normalized(tangent);
|
||||
binormal = ProjectOnPlane(binormal, tangent);
|
||||
binormal = ProjectOnPlane(binormal, normal);
|
||||
binormal = Normalized(binormal);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Project(Vector3 a, Vector3 b)
|
||||
{
|
||||
float m = Magnitude(b);
|
||||
return Dot(a, b) / (m * m) * b;
|
||||
}
|
||||
|
||||
Vector3 Vector3::ProjectOnPlane(Vector3 vector, Vector3 planeNormal)
|
||||
{
|
||||
return Reject(vector, planeNormal);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Reflect(Vector3 vector, Vector3 planeNormal)
|
||||
{
|
||||
return vector - 2 * Project(vector, planeNormal);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Reject(Vector3 a, Vector3 b)
|
||||
{
|
||||
return a - Project(a, b);
|
||||
}
|
||||
|
||||
Vector3 Vector3::RotateTowards(Vector3 current, Vector3 target,
|
||||
float maxRadiansDelta,
|
||||
float maxMagnitudeDelta)
|
||||
{
|
||||
float magCur = Magnitude(current);
|
||||
float magTar = Magnitude(target);
|
||||
float newMag = magCur + maxMagnitudeDelta *
|
||||
((magTar > magCur) - (magCur > magTar));
|
||||
newMag = fmin(newMag, fmax(magCur, magTar));
|
||||
newMag = fmax(newMag, fmin(magCur, magTar));
|
||||
|
||||
float totalAngle = Angle(current, target) - maxRadiansDelta;
|
||||
if (totalAngle <= 0)
|
||||
return Normalized(target) * newMag;
|
||||
else if (totalAngle >= M_PI)
|
||||
return Normalized(-target) * newMag;
|
||||
|
||||
Vector3 axis = Cross(current, target);
|
||||
float magAxis = Magnitude(axis);
|
||||
if (magAxis == 0)
|
||||
axis = Normalized(Cross(current, current + Vector3(3.95, 5.32, -4.24)));
|
||||
else
|
||||
axis /= magAxis;
|
||||
current = Normalized(current);
|
||||
Vector3 newVector = current * cos(maxRadiansDelta) +
|
||||
Cross(axis, current) * sin(maxRadiansDelta);
|
||||
return newVector * newMag;
|
||||
}
|
||||
|
||||
Vector3 Vector3::Scale(Vector3 a, Vector3 b)
|
||||
{
|
||||
return Vector3(a.X * b.X, a.Y * b.Y, a.Z * b.Z);
|
||||
}
|
||||
|
||||
Vector3 Vector3::Slerp(Vector3 a, Vector3 b, float t)
|
||||
{
|
||||
if (t < 0) return a;
|
||||
else if (t > 1) return b;
|
||||
return SlerpUnclamped(a, b, t);
|
||||
}
|
||||
|
||||
Vector3 Vector3::SlerpUnclamped(Vector3 a, Vector3 b, float t)
|
||||
{
|
||||
float magA = Magnitude(a);
|
||||
float magB = Magnitude(b);
|
||||
a /= magA;
|
||||
b /= magB;
|
||||
float dot = Dot(a, b);
|
||||
dot = fmax(dot, -1.0);
|
||||
dot = fmin(dot, 1.0);
|
||||
float theta = acos(dot) * t;
|
||||
Vector3 relativeVec = Normalized(b - a * dot);
|
||||
Vector3 newVec = a * cos(theta) + relativeVec * sin(theta);
|
||||
return newVec * (magA + (magB - magA) * t);
|
||||
}
|
||||
|
||||
float Vector3::SqrMagnitude(Vector3 v)
|
||||
{
|
||||
return v.X * v.X + v.Y * v.Y + v.Z * v.Z;
|
||||
}
|
||||
|
||||
void Vector3::ToSpherical(Vector3 vector, float &rad, float &theta,
|
||||
float &phi)
|
||||
{
|
||||
rad = Magnitude(vector);
|
||||
float v = vector.Z / rad;
|
||||
v = fmax(v, -1.0);
|
||||
v = fmin(v, 1.0);
|
||||
theta = acos(v);
|
||||
phi = atan2(vector.Y, vector.X);
|
||||
}
|
||||
|
||||
|
||||
struct Vector3& Vector3::operator+=(const float rhs)
|
||||
{
|
||||
X += rhs;
|
||||
Y += rhs;
|
||||
Z += rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector3& Vector3::operator-=(const float rhs)
|
||||
{
|
||||
X -= rhs;
|
||||
Y -= rhs;
|
||||
Z -= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector3& Vector3::operator*=(const float rhs)
|
||||
{
|
||||
X *= rhs;
|
||||
Y *= rhs;
|
||||
Z *= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector3& Vector3::operator/=(const float rhs)
|
||||
{
|
||||
X /= rhs;
|
||||
Y /= rhs;
|
||||
Z /= rhs;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector3& Vector3::operator+=(const Vector3 rhs)
|
||||
{
|
||||
X += rhs.X;
|
||||
Y += rhs.Y;
|
||||
Z += rhs.Z;
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct Vector3& Vector3::operator-=(const Vector3 rhs)
|
||||
{
|
||||
X -= rhs.X;
|
||||
Y -= rhs.Y;
|
||||
Z -= rhs.Z;
|
||||
return *this;
|
||||
}
|
||||
|
||||
char Vector3::ToChar(Vector3 a) {
|
||||
const char* x = (const char*)(int)a.X;
|
||||
const char* y = (const char*)(int)a.Y;
|
||||
const char* z = (const char*)(int)a.Z;
|
||||
char buffer[25];
|
||||
strncpy(buffer, x, sizeof(buffer));
|
||||
strncpy(buffer, ", ", sizeof(buffer));
|
||||
strncpy(buffer, y, sizeof(buffer));
|
||||
strncpy(buffer, ", ", sizeof(buffer));
|
||||
strncpy(buffer, z, sizeof(buffer));
|
||||
strncpy(buffer, ", ", sizeof(buffer));
|
||||
return buffer[25];
|
||||
}
|
||||
|
||||
Vector3 operator-(Vector3 rhs) { return rhs * -1; }
|
||||
Vector3 operator+(Vector3 lhs, const float rhs) { return lhs += rhs; }
|
||||
Vector3 operator-(Vector3 lhs, const float rhs) { return lhs -= rhs; }
|
||||
Vector3 operator*(Vector3 lhs, const float rhs) { return lhs *= rhs; }
|
||||
Vector3 operator/(Vector3 lhs, const float rhs) { return lhs /= rhs; }
|
||||
Vector3 operator+(const float lhs, Vector3 rhs) { return rhs += lhs; }
|
||||
Vector3 operator-(const float lhs, Vector3 rhs) { return rhs -= lhs; }
|
||||
Vector3 operator*(const float lhs, Vector3 rhs) { return rhs *= lhs; }
|
||||
Vector3 operator/(const float lhs, Vector3 rhs) { return rhs /= lhs; }
|
||||
Vector3 operator+(Vector3 lhs, const Vector3 rhs) { return lhs += rhs; }
|
||||
Vector3 operator-(Vector3 lhs, const Vector3 rhs) { return lhs -= rhs; }
|
||||
|
||||
bool operator==(const Vector3 lhs, const Vector3 rhs)
|
||||
{
|
||||
return lhs.X == rhs.X && lhs.Y == rhs.Y && lhs.Z == rhs.Z;
|
||||
}
|
||||
|
||||
bool operator!=(const Vector3 lhs, const Vector3 rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
Executable
+142
@@ -0,0 +1,142 @@
|
||||
TNameEntryArray*GetGNames(){
|
||||
return(TNameEntryArray*)getPointer(UE4+0x4431AE4);
|
||||
}
|
||||
|
||||
static UEngine *GEngine = 0;
|
||||
UWorld *GetWorld() {
|
||||
while (!GEngine) {
|
||||
GEngine = UObject::FindObject<UEngine>("UAEGameEngine Transient.UAEGameEngine_1");
|
||||
sleep(1);
|
||||
}
|
||||
if (GEngine) {
|
||||
auto ViewPort = GEngine->GameViewport;
|
||||
if (ViewPort) {
|
||||
return ViewPort->World;
|
||||
} }
|
||||
return 0;
|
||||
}
|
||||
#include <vector>
|
||||
std::vector<AActor*> getActors()
|
||||
{
|
||||
auto World = GetWorld();
|
||||
if (!World)
|
||||
return std::vector<AActor*>();
|
||||
auto PersistentLevel = World->PersistentLevel;
|
||||
if (!PersistentLevel)
|
||||
return std::vector<AActor*>();
|
||||
auto Actors = *(TArray<AActor*> *)((uintptr_t)PersistentLevel + 0x70);
|
||||
std::vector<AActor*> actors;
|
||||
for (int i = 0; i < Actors.Num(); i++)
|
||||
{
|
||||
auto Actor = Actors[i];
|
||||
if (Actor)
|
||||
{
|
||||
actors.push_back(Actor);
|
||||
}
|
||||
}
|
||||
return actors;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct sRegion {
|
||||
uintptr_t start, end;
|
||||
};
|
||||
|
||||
std::vector<sRegion> trapRegions;
|
||||
|
||||
bool isObjectInvalid(UObject *obj) {
|
||||
if (!IsPtrValid(obj)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!IsPtrValid(obj->ClassPrivate)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj->InternalIndex <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj->NamePrivate.ComparisonIndex <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((uintptr_t)(obj) % sizeof(uintptr_t) != 0x0 && (uintptr_t)(obj) % sizeof(uintptr_t) != 0x4) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (std::any_of(trapRegions.begin(), trapRegions.end(), [obj](sRegion region) { return ((uintptr_t) obj) >= region.start && ((uintptr_t) obj) <= region.end; }) ||
|
||||
std::any_of(trapRegions.begin(), trapRegions.end(), [obj](sRegion region) { return ((uintptr_t) obj->ClassPrivate) >= region.start && ((uintptr_t) obj->ClassPrivate) <= region.end; })) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
AUAEGameMode *GameMode=0;
|
||||
ASTExtraPlayerCharacter *PlayerCharacter=0;
|
||||
ASTExtraPlayerController *PlayerController2=0;
|
||||
APlayerController *PlayerController=0;
|
||||
AGameNetworkManager *NetworkManager = 0;
|
||||
void GetActor(){
|
||||
|
||||
auto Actors = getActors();
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
if (isObjectInvalid(Actor))
|
||||
continue;
|
||||
|
||||
if (Actor->IsA(AGameNetworkManager::StaticClass())) {
|
||||
NetworkManager = (AGameNetworkManager *) Actor;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void 获取对象(){
|
||||
auto Actors = getActors();
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
|
||||
|
||||
if (Actor->IsA(AUAEGameMode::StaticClass())) {
|
||||
GameMode = (AUAEGameMode *) Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
|
||||
|
||||
if (Actor->IsA(ASTExtraPlayerCharacter::StaticClass())) {
|
||||
PlayerCharacter = (ASTExtraPlayerCharacter *) Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
|
||||
|
||||
if (Actor->IsA(ASTExtraPlayerController::StaticClass())) {
|
||||
PlayerController2 = (ASTExtraPlayerController *) Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < Actors.size(); i++) {
|
||||
auto Actor = Actors[i];
|
||||
|
||||
|
||||
if (Actor->IsA(APlayerController::StaticClass())) {
|
||||
PlayerController = (APlayerController *) Actor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void 修复(){
|
||||
获取对象();
|
||||
GameMode->bEnableClimbing=true;
|
||||
GameMode->bEnableDamage=true;
|
||||
GameMode->bEnableDamage=20;
|
||||
}
|
||||
Executable
+215
@@ -0,0 +1,215 @@
|
||||
ASTExtraPlayerCharacter *g_LocalPlayer = 0;
|
||||
ASTExtraPlayerController *g_LocalController = 0;
|
||||
// ================= 语言设置和记忆功能 =================
|
||||
enum class Language {
|
||||
CHINESE,
|
||||
ENGLISH
|
||||
};
|
||||
|
||||
static Language currentLanguage = Language::CHINESE;
|
||||
static const char* LANGUAGE_FILE = "/sdcard/pubg_menu_language.conf";
|
||||
|
||||
// 保存语言设置到文件
|
||||
void SaveLanguageSetting() {
|
||||
std::ofstream file(LANGUAGE_FILE);
|
||||
if (file.is_open()) {
|
||||
file << static_cast<int>(currentLanguage);
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 从文件加载语言设置
|
||||
void LoadLanguageSetting() {
|
||||
std::ifstream file(LANGUAGE_FILE);
|
||||
if (file.is_open()) {
|
||||
int lang;
|
||||
file >> lang;
|
||||
currentLanguage = static_cast<Language>(lang);
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 切换语言
|
||||
void ToggleLanguage() {
|
||||
currentLanguage = (currentLanguage == Language::CHINESE) ? Language::ENGLISH : Language::CHINESE;
|
||||
SaveLanguageSetting();
|
||||
}
|
||||
|
||||
// 多语言文本函数
|
||||
const char* T(const char* chinese, const char* english) {
|
||||
return (currentLanguage == Language::CHINESE) ? chinese : english;
|
||||
}
|
||||
#define IM_PI 3.14159265358979323846f
|
||||
#define RAD2DEG(x) ((float)(x) * (float)(180.f / IM_PI))
|
||||
#define DEG2RAD(x) ((float)(x) * (float)(IM_PI / 180.f))
|
||||
ImColor 紫色2 = ImColor(46,46,177);
|
||||
ImColor 粉色=ImColor(226,145,163,255);
|
||||
ImColor 浅蓝 = ImColor(ImVec4(36/255.f, 249/255.f, 217/255.f, 255/255.f));
|
||||
ImColor 蓝色 = ImColor(ImVec4(170/255.f, 203/255.f, 244/255.f, 0.95f));
|
||||
ImColor 白色 = ImColor(ImVec4(255/255.f, 255/255.f, 258/255.f, 0.95f));
|
||||
ImColor 浅粉 = ImColor(ImVec4(255/255.f, 200/255.f, 250/255.f, 0.95f));
|
||||
ImColor 黑色 = ImColor(ImVec4(0/255.f, 0/255.f, 0/255.f, 0.7f));
|
||||
ImColor 半黑 = ImColor(ImVec4(0/255.f, 0/255.f, 0/255.f, 0.18f));
|
||||
ImColor 血色 = ImColor(ImVec4(0/255.f, 249/255.f, 0/255.f, 0.35f));
|
||||
ImColor 红色 = ImColor(ImVec4(233/255.f, 55/255.f, 51/255.f, 0.95f));
|
||||
ImColor 绿色 = ImColor(ImVec4(50/255.f, 222/215.f, 50/255.f, 0.95f));
|
||||
ImColor 黄色 = ImColor(ImVec4(255/255.f, 255/255.f, 0/255.f, 0.95f));
|
||||
ImColor 橘黄 = ImColor(ImVec4(255/255.f, 150/255.f, 30/255.f, 0.95f));
|
||||
ImColor 粉红 = ImColor(ImVec4(220/255.f, 108/255.f, 1202/255.f, 0.95f));
|
||||
ImColor 紫色 = ImColor(ImVec4(169/255.f, 120/255.f, 223/255.f, 0.95f));
|
||||
ImColor 空白 = ImColor(ImVec4(1.0/255.f, 1.0/255.f, 1.0/255.f, 0.0f));
|
||||
|
||||
|
||||
namespace Settings
|
||||
{
|
||||
static int Tab = 1;
|
||||
}
|
||||
|
||||
std::string getClipboardTextt() {
|
||||
if (!g_App)
|
||||
return "";
|
||||
|
||||
auto activity = g_App->activity;
|
||||
if (!activity)
|
||||
return "";
|
||||
|
||||
auto vm = activity->vm;
|
||||
if (!vm)
|
||||
return "";
|
||||
|
||||
auto object = activity->clazz;
|
||||
if (!object)
|
||||
return "";
|
||||
|
||||
std::string result;
|
||||
|
||||
JNIEnv *env;
|
||||
vm->AttachCurrentThread(&env, 0);
|
||||
{
|
||||
auto ContextClass = env->FindClass("android/content/Context");
|
||||
auto getSystemServiceMethod = env->GetMethodID(ContextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
|
||||
|
||||
auto str = env->NewStringUTF("clipboard");
|
||||
auto clipboardManager = env->CallObjectMethod(object, getSystemServiceMethod, str);
|
||||
env->DeleteLocalRef(str);
|
||||
|
||||
auto ClipboardManagerClass = env->FindClass("android/content/ClipboardManager");
|
||||
auto getText = env->GetMethodID(ClipboardManagerClass, "getText", "()Ljava/lang/CharSequence;");
|
||||
|
||||
auto CharSequenceClass = env->FindClass("java/lang/CharSequence");
|
||||
auto toStringMethod = env->GetMethodID(CharSequenceClass, "toString", "()Ljava/lang/String;");
|
||||
|
||||
auto text = env->CallObjectMethod(clipboardManager, getText);
|
||||
if (text) {
|
||||
str = (jstring) env->CallObjectMethod(text, toStringMethod);
|
||||
result = env->GetStringUTFChars(str, 0);
|
||||
env->DeleteLocalRef(str);
|
||||
env->DeleteLocalRef(text);
|
||||
}
|
||||
|
||||
env->DeleteLocalRef(CharSequenceClass);
|
||||
env->DeleteLocalRef(ClipboardManagerClass);
|
||||
env->DeleteLocalRef(clipboardManager);
|
||||
env->DeleteLocalRef(ContextClass);
|
||||
}
|
||||
vm->DetachCurrentThread();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 安全写入D内存
|
||||
void safeWritedword(uintptr_t addr, int value) {
|
||||
long pageSize = sysconf(_SC_PAGESIZE); // = 4096
|
||||
uintptr_t pageStart = addr & ~(pageSize - 1);
|
||||
|
||||
if (mprotect((void*)(pageStart), pageSize * 2, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) {
|
||||
perror("mprotect failed");
|
||||
return;
|
||||
}
|
||||
|
||||
*((int*)addr) = value;
|
||||
}
|
||||
|
||||
FVector WorldToRadar(float Yaw, FVector Origin, FVector LocalOrigin, float PosX, float PosY, Vector3 Size, bool &outbuff) {
|
||||
bool flag = false;
|
||||
double num = (double)Yaw;
|
||||
double num2 = num * 0.017453292519943295;
|
||||
float num3 = (float)std::cos(num2);
|
||||
float num4 = (float)std::sin(num2);
|
||||
float num5 = Origin.X - LocalOrigin.X;
|
||||
float num6 = Origin.Y - LocalOrigin.Y;
|
||||
struct FVector Xector;
|
||||
Xector.X = (num6 * num3 - num5 * num4) / 150.f;
|
||||
Xector.Y = (num5 * num3 + num6 * num4) / 150.f;
|
||||
struct FVector Xector2;
|
||||
Xector2.X = Xector.X + PosX + Size.X / 2.f;
|
||||
Xector2.Y = -Xector.Y + PosY + Size.Y / 2.f;
|
||||
bool flag2 = Xector2.X > PosX + Size.X;
|
||||
if (flag2) {
|
||||
Xector2.X = PosX + Size.X;
|
||||
}else{
|
||||
bool flag3 = Xector2.X < PosX;
|
||||
if (flag3) {
|
||||
Xector2.X = PosX;
|
||||
}
|
||||
}
|
||||
bool flag4 = Xector2.Y > PosY + Size.Y;
|
||||
if (flag4) {
|
||||
Xector2.Y = PosY + Size.Y;
|
||||
}else{
|
||||
bool flag5 = Xector2.Y < PosY;
|
||||
if (flag5){
|
||||
Xector2.Y = PosY;
|
||||
}
|
||||
}
|
||||
bool flag6 = Xector2.Y == PosY || Xector2.X == PosX;
|
||||
if (flag6){
|
||||
flag = true;
|
||||
}
|
||||
outbuff = flag;
|
||||
return Xector2;
|
||||
}
|
||||
void VectorAnglesRadar(Vector3 & forward, FVector & angles) {
|
||||
if (forward.X == 0.f && forward.Y == 0.f) {
|
||||
angles.X = forward.Z > 0.f ? -90.f : 90.f;
|
||||
angles.Y = 0.f;
|
||||
} else {
|
||||
angles.X = RAD2DEG(atan2(-forward.Z, forward.Magnitude(forward)));
|
||||
angles.Y = RAD2DEG(atan2(forward.Y, forward.X));
|
||||
}
|
||||
angles.Z = 0.f;
|
||||
}
|
||||
void Box4Line(ImDrawList *draw, float thicc, int x, int y, int w, int h, int color) {
|
||||
int iw = w / 4;
|
||||
int ih = h / 4;
|
||||
// top
|
||||
draw->AddRect(ImVec2(x, y),ImVec2(x + iw, y), color, thicc);
|
||||
draw->AddRect(ImVec2(x + w - iw, y),ImVec2(x + w, y), color, thicc);
|
||||
draw->AddRect(ImVec2(x, y),ImVec2(x, y + ih), color, thicc);
|
||||
draw->AddRect(ImVec2(x + w - 1, y),ImVec2(x + w - 1, y + ih), color, thicc);;
|
||||
// bottom
|
||||
draw->AddRect(ImVec2(x, y + h),ImVec2(x + iw, y + h), color, thicc);
|
||||
draw->AddRect(ImVec2(x + w - iw, y + h),ImVec2(x + w, y + h), color, thicc);
|
||||
draw->AddRect(ImVec2(x, y + h - ih), ImVec2(x, y + h), color, thicc);
|
||||
draw->AddRect(ImVec2(x + w - 1, y + h - ih), ImVec2(x + w - 1, y + h), color, thicc);
|
||||
}
|
||||
void 绘制加粗文本(float size, float x, float y, ImColor color, ImColor color1, const char* str)
|
||||
{
|
||||
ImGui::GetBackgroundDrawList()->AddText(NULL, size, {x-0.8, y-0.8}, color1, str);
|
||||
ImGui::GetBackgroundDrawList()->AddText(NULL, size, {x+0.8, y+0.8}, color1, str);
|
||||
ImGui::GetBackgroundDrawList()->AddText(NULL, size, {x, y}, color, str);
|
||||
}
|
||||
void RotateTriangle(std::array<Vector3, 3> & points, float rotation) {
|
||||
const auto points_center = (points.at(0) + points.at(1) + points.at(2)) / 3;
|
||||
for (auto & point : points) {
|
||||
point = point - points_center;
|
||||
const auto temp_x = point.X;
|
||||
const auto temp_y = point.Y;
|
||||
const auto theta = DEG2RAD(rotation);
|
||||
const auto c = cosf(theta);
|
||||
const auto s = sinf(theta);
|
||||
point.X = temp_x * c - temp_y * s;
|
||||
point.Y = temp_x * s + temp_y * c;
|
||||
point = point + points_center;
|
||||
}
|
||||
}
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
|
||||
#include "混淆.h"
|
||||
|
||||
size_t& _lxy_oxor_any_::X() {
|
||||
static size_t x = 0;
|
||||
return x;
|
||||
}
|
||||
|
||||
size_t& _lxy_oxor_any_::Y() {
|
||||
static size_t y = 0;
|
||||
return y;
|
||||
}
|
||||
Executable
+699
@@ -0,0 +1,699 @@
|
||||
#ifndef 混淆_H
|
||||
#define 混淆_H
|
||||
|
||||
#if _KERNEL_MODE
|
||||
#ifndef _VCRUNTIME_DISABLED_WARNINGS
|
||||
#define _VCRUNTIME_DISABLED_WARNINGS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#if _WIN32 || _WIN64
|
||||
#if _WIN64
|
||||
#define 混淆_ENVIRONMENT64
|
||||
#else
|
||||
#define 混淆_ENVIRONMENT32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if __GNUC__
|
||||
#if __x86_64__ || __ppc64__
|
||||
#define 混淆_ENVIRONMENT64
|
||||
#else
|
||||
#define 混淆_ENVIRONMENT32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define 混淆_FORCEINLINE __forceinline
|
||||
#else
|
||||
#define 混淆_FORCEINLINE __attribute__((always_inline)) inline
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define 混淆
|
||||
#define oxorvar
|
||||
#else
|
||||
#define 混淆(any) _lxy_oxor_any_::oxor_any<decltype(_lxy_oxor_any_::typeofs(any)), _lxy_oxor_any_::array_size(any), __COUNTER__>(any, _lxy_::make_index_sequence<sizeof(decltype(any))>()).get()
|
||||
#define oxorvar(var) ((var) + 混淆(0))
|
||||
#endif
|
||||
|
||||
namespace _lxy_ {
|
||||
|
||||
// https://stackoverflow.com/a/32223343/16602611
|
||||
|
||||
template <size_t... Ints>
|
||||
struct index_sequence {
|
||||
using type = index_sequence;
|
||||
using value_type = size_t;
|
||||
static constexpr size_t size() noexcept { return sizeof...(Ints); }
|
||||
};
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
template <class Sequence1, class Sequence2>
|
||||
struct _merge_and_renumber;
|
||||
|
||||
template <size_t... I1, size_t... I2>
|
||||
struct _merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>>
|
||||
: index_sequence<I1..., (sizeof...(I1) + I2)...>
|
||||
{ };
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
template <size_t N>
|
||||
struct make_index_sequence
|
||||
: _merge_and_renumber<typename make_index_sequence<N / 2>::type,
|
||||
typename make_index_sequence<N - N / 2>::type>
|
||||
{ };
|
||||
|
||||
template<> struct make_index_sequence<0> : index_sequence<> { };
|
||||
template<> struct make_index_sequence<1> : index_sequence<0> { };
|
||||
}
|
||||
|
||||
namespace _lxy_oxor_any_ {
|
||||
|
||||
/*
|
||||
template <size_t ...>
|
||||
struct indexSequence {
|
||||
};
|
||||
|
||||
template <size_t N, size_t ... Next>
|
||||
struct indexSequenceHelper : public indexSequenceHelper<N - 1U, N - 1U, Next...> {
|
||||
};
|
||||
|
||||
template <size_t ... Next>
|
||||
struct indexSequenceHelper<0U, Next ... > {
|
||||
using type = indexSequence<Next ... >;
|
||||
};
|
||||
|
||||
template <size_t N>
|
||||
using makeIndexSequence = typename indexSequenceHelper<N>::type;
|
||||
*/
|
||||
|
||||
size_t& X();
|
||||
|
||||
size_t& Y();
|
||||
|
||||
static constexpr size_t base_key = static_cast<size_t>(
|
||||
(__TIME__[7] - '0') +
|
||||
(__TIME__[6] - '0') * 10 +
|
||||
(__TIME__[4] - '0') * 60 +
|
||||
(__TIME__[3] - '0') * 600 +
|
||||
(__TIME__[1] - '0') * 3600 +
|
||||
(__TIME__[0] - '0') * 36000);
|
||||
|
||||
template<uint32_t s, size_t n>
|
||||
class random_constant_32 {
|
||||
static constexpr uint32_t x = s ^ (s << 13);
|
||||
static constexpr uint32_t y = x ^ (x >> 17);
|
||||
static constexpr uint32_t z = y ^ (y << 5);
|
||||
public:
|
||||
static constexpr uint32_t value = random_constant_32<z, n - 1>::value;
|
||||
};
|
||||
|
||||
template<uint32_t s>
|
||||
class random_constant_32<s, 0> {
|
||||
public:
|
||||
static constexpr uint32_t value = s;
|
||||
};
|
||||
|
||||
template<uint64_t s, size_t n>
|
||||
class random_constant_64 {
|
||||
static constexpr uint64_t x = s ^ (s << 13);
|
||||
static constexpr uint64_t y = x ^ (x >> 7);
|
||||
static constexpr uint64_t z = y ^ (y << 17);
|
||||
public:
|
||||
static constexpr uint64_t value = random_constant_64<z, n - 1>::value;
|
||||
};
|
||||
|
||||
template<uint64_t s>
|
||||
class random_constant_64<s, 0> {
|
||||
public:
|
||||
static constexpr uint64_t value = s;
|
||||
};
|
||||
|
||||
#ifdef 混淆_ENVIRONMENT64
|
||||
#define random_constant random_constant_64
|
||||
#else
|
||||
#define random_constant random_constant_32
|
||||
#endif
|
||||
|
||||
template<typename T, size_t size>
|
||||
static 混淆_FORCEINLINE constexpr size_t array_size(const T(&)[size]) { return size; }
|
||||
|
||||
template<typename T>
|
||||
static 混淆_FORCEINLINE constexpr size_t array_size(T) { return 0; }
|
||||
|
||||
template<typename T, size_t size>
|
||||
static inline T typeofs(const T(&)[size]);
|
||||
|
||||
template<typename T>
|
||||
static inline T typeofs(T);
|
||||
|
||||
template<size_t key>
|
||||
static 混淆_FORCEINLINE constexpr uint8_t encrypt_byte(uint8_t c, size_t i) {
|
||||
return static_cast<uint8_t>(((c + (key * 7)) ^ (i + key)));
|
||||
}
|
||||
|
||||
template<size_t key>
|
||||
static 混淆_FORCEINLINE constexpr uint8_t decrypt_byte(uint8_t c, size_t i) {
|
||||
//a ^ b == (a + b) - 2 * (a & b)
|
||||
size_t a = c;
|
||||
size_t b = i + key;
|
||||
//size_t a_xor_b = (a + b) - 2 * (a & b);
|
||||
size_t a_xor_b = (a + b) - ((a & b) + (b & a));
|
||||
return static_cast<uint8_t>((a_xor_b)-(key * 7));
|
||||
}
|
||||
|
||||
template<size_t key>
|
||||
static 混淆_FORCEINLINE constexpr size_t limit() {
|
||||
constexpr size_t bcf_value[] = { 1,2,3,4,5, 6,8,9,10,16, 32,40,64,66,100, 128,512,1000,1024,4096, 'a','z','A','Z','*' };
|
||||
return bcf_value[key % (sizeof(bcf_value) / sizeof(bcf_value[0]))];
|
||||
}
|
||||
|
||||
template<typename return_type, size_t key, size_t size>
|
||||
static 混淆_FORCEINLINE const return_type decrypt(uint8_t(&buffer)[size]) {
|
||||
#ifndef 混淆_DISABLE_OBFUSCATION
|
||||
|
||||
uint8_t source;
|
||||
uint8_t decrypted; //do not assign initial value
|
||||
size_t stack_x;
|
||||
size_t stack_y;
|
||||
|
||||
loc_start_1:
|
||||
stack_x = X();
|
||||
stack_y = Y();
|
||||
loc_start_2:
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
source = buffer[i];
|
||||
loc_start_3:
|
||||
if (stack_x <= i) {
|
||||
if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);//fake
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 1 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 2 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 3 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 4 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 5 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 6 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 7 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 8 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 9 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
loc_start_4:
|
||||
if (stack_y <= i) {
|
||||
if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);//fake
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 1 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 2 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 3 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 4 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 5 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 6 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 7 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 8 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 9 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
loc_start_5:
|
||||
if (stack_x + stack_y <= i) {
|
||||
if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key>(source, i);//real
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 1 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 2 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 3 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 4 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 5 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 6 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 7 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 8 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 9 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
loc_start_6:
|
||||
if (stack_x + stack_y != limit<key * __COUNTER__>()) {
|
||||
if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 1 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 2 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 3 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 4 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 5 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 6 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 7 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 8 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 9 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
loc_start_7:
|
||||
if (stack_x < limit<key * __COUNTER__>()) {
|
||||
if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 1 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 2 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 3 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 4 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 5 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 6 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 7 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 8 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>() % 9 + 1) {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
loc_start_8:
|
||||
if (stack_y < limit<key * __COUNTER__>()) {
|
||||
loc_start_9:
|
||||
buffer[i] = decrypted;//assign
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
decrypted += decrypted;
|
||||
loc_unreachable_1:
|
||||
buffer[i] = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
loc_unreachable_2:
|
||||
stack_y++;
|
||||
loc_unreachable_3:
|
||||
i--;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
decrypted += buffer[i];
|
||||
loc_unreachable_4:
|
||||
buffer[i] = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
buffer[i] += decrypted;
|
||||
loc_unreachable_5:
|
||||
stack_x += stack_y;
|
||||
loc_unreachable_6:
|
||||
i--;
|
||||
i -= decrypted;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
decrypted -= buffer[i];
|
||||
loc_unreachable_7:
|
||||
buffer[i] = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
stack_y++;
|
||||
i -= buffer[i];
|
||||
i -= stack_y;
|
||||
loc_unreachable_8:
|
||||
buffer[i] = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
stack_x++;
|
||||
i--;
|
||||
i -= stack_x;
|
||||
loc_unreachable_9:
|
||||
i += buffer[i];
|
||||
i += stack_y;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
while (true) {
|
||||
if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
else if (stack_x == stack_y + limit<key * __COUNTER__>()) {
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
stack_x = stack_y + limit<key* __COUNTER__>();
|
||||
stack_y = stack_x + limit<key* __COUNTER__>();
|
||||
}
|
||||
|
||||
if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_1;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_2;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_3;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_4;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_5;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_6;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_7;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_8;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_start_9;
|
||||
}
|
||||
else if (stack_x < stack_y + limit<key * __COUNTER__>()) {
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
stack_x = stack_y + limit<key* __COUNTER__>();
|
||||
stack_y = stack_x + limit<key* __COUNTER__>();
|
||||
}
|
||||
|
||||
if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_9;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_8;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_7;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_6;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_5;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_4;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_3;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_2;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
decrypted = decrypt_byte<key* __COUNTER__>(source, i);
|
||||
goto loc_unreachable_1;
|
||||
}
|
||||
else if (stack_x > stack_y + limit<key * __COUNTER__>()) {
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
stack_x = stack_y + limit<key* __COUNTER__>();
|
||||
stack_y = stack_x + limit<key* __COUNTER__>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
//Ooops, Decompilation failure:
|
||||
//401000: stack frame is too big
|
||||
return reinterpret_cast<return_type>(buffer + ((key * __COUNTER__) % 0x400000 + 0x1400000));
|
||||
}
|
||||
}
|
||||
else {
|
||||
//unreachable
|
||||
//Ooops, Decompilation failure:
|
||||
//401000: stack frame is too big
|
||||
return reinterpret_cast<return_type>(buffer + ((key * __COUNTER__) % 0x1400000 + 0x400000));
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
buffer[i] = decrypt_byte<key>(buffer[i], i);
|
||||
}
|
||||
#endif // 混淆_DISABLE_OBFUSCATION
|
||||
return reinterpret_cast<return_type>(buffer);
|
||||
}
|
||||
|
||||
static 混淆_FORCEINLINE constexpr size_t align(size_t n, size_t a) {
|
||||
return (n + a - 1) & ~(a - 1);
|
||||
}
|
||||
|
||||
template<typename any_t, size_t ary_size, size_t counter>
|
||||
class oxor_any {
|
||||
|
||||
static constexpr size_t size = align(ary_size * sizeof(any_t), 16)
|
||||
+ random_constant<counter^ base_key, (counter^ base_key) % 128>::value % (16 + 1);
|
||||
|
||||
static constexpr size_t key = random_constant<counter^ base_key, (size^ base_key) % 128>::value;
|
||||
|
||||
uint8_t buffer[size];
|
||||
|
||||
public:
|
||||
|
||||
template<size_t... indices>
|
||||
混淆_FORCEINLINE constexpr oxor_any(const any_t(&any)[ary_size], _lxy_::index_sequence<indices...>) :
|
||||
buffer{ encrypt_byte<key>(((uint8_t*)&any)[indices], indices)... } {
|
||||
}
|
||||
|
||||
混淆_FORCEINLINE const any_t* get() { return decrypt<const any_t*, key>(buffer); }
|
||||
};
|
||||
|
||||
template<typename any_t, size_t counter>
|
||||
class oxor_any<any_t, 0, counter> {
|
||||
|
||||
static constexpr size_t size = align(sizeof(any_t), 16)
|
||||
+ random_constant<counter^ base_key, (counter^ base_key) % 128>::value % (16 + 1);
|
||||
|
||||
static constexpr size_t key = random_constant<counter^ base_key, (size^ base_key) % 128>::value;
|
||||
|
||||
uint8_t buffer[size];
|
||||
|
||||
public:
|
||||
|
||||
template<size_t... indices>
|
||||
混淆_FORCEINLINE constexpr oxor_any(any_t any, _lxy_::index_sequence<indices...>) :
|
||||
buffer{ encrypt_byte<key>(reinterpret_cast<uint8_t*>(&any)[indices], indices)... } {
|
||||
}
|
||||
|
||||
混淆_FORCEINLINE const any_t get() { return *decrypt<const any_t*, key>(buffer); }
|
||||
};
|
||||
}
|
||||
|
||||
#endif // 混淆_H
|
||||
Executable
+2412
File diff suppressed because it is too large
Load Diff
Executable
+3632
File diff suppressed because it is too large
Load Diff
Executable
+5463
File diff suppressed because it is too large
Load Diff
Executable
+1488
File diff suppressed because it is too large
Load Diff
Executable
+931
@@ -0,0 +1,931 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:39 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AIModule.EPathFollowingResult
|
||||
enum class EPathFollowingResult : uint8_t
|
||||
{
|
||||
EPathFollowingResult__Success = 0,
|
||||
EPathFollowingResult__Blocked = 1,
|
||||
EPathFollowingResult__OffPath = 2,
|
||||
EPathFollowingResult__Aborted = 3,
|
||||
EPathFollowingResult__Skipped_DEPRECATED = 4,
|
||||
EPathFollowingResult__Invalid = 5,
|
||||
EPathFollowingResult__EPathFollowingResult_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryStatus
|
||||
enum class EEnvQueryStatus : uint8_t
|
||||
{
|
||||
EEnvQueryStatus__Processing = 0,
|
||||
EEnvQueryStatus__Success = 1,
|
||||
EEnvQueryStatus__Failed = 2,
|
||||
EEnvQueryStatus__Aborted = 3,
|
||||
EEnvQueryStatus__OwnerLost = 4,
|
||||
EEnvQueryStatus__MissingParam = 5,
|
||||
EEnvQueryStatus__EEnvQueryStatus_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAISenseNotifyType
|
||||
enum class EAISenseNotifyType : uint8_t
|
||||
{
|
||||
EAISenseNotifyType__OnEveryPerception = 0,
|
||||
EAISenseNotifyType__OnPerceptionChange = 1,
|
||||
EAISenseNotifyType__EAISenseNotifyType_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAITaskPriority
|
||||
enum class EAITaskPriority : uint8_t
|
||||
{
|
||||
EAITaskPriority__Lowest = 0,
|
||||
EAITaskPriority__Low = 1,
|
||||
EAITaskPriority__AutonomousAI = 2,
|
||||
EAITaskPriority__High = 3,
|
||||
EAITaskPriority__Ultimate = 4,
|
||||
EAITaskPriority__EAITaskPriority_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EGenericAICheck
|
||||
enum class EGenericAICheck : uint8_t
|
||||
{
|
||||
EGenericAICheck__Less = 0,
|
||||
EGenericAICheck__LessOrEqual = 1,
|
||||
EGenericAICheck__Equal = 2,
|
||||
EGenericAICheck__NotEqual = 3,
|
||||
EGenericAICheck__GreaterOrEqual = 4,
|
||||
EGenericAICheck__Greater = 5,
|
||||
EGenericAICheck__IsTrue = 6,
|
||||
EGenericAICheck__MAX = 7
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAILockSource
|
||||
enum class EAILockSource : uint8_t
|
||||
{
|
||||
EAILockSource__Animation = 0,
|
||||
EAILockSource__Logic = 1,
|
||||
EAILockSource__Script = 2,
|
||||
EAILockSource__Gameplay = 3,
|
||||
EAILockSource__MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAIRequestPriority
|
||||
enum class EAIRequestPriority : uint8_t
|
||||
{
|
||||
EAIRequestPriority__SoftScript = 0,
|
||||
EAIRequestPriority__Logic = 1,
|
||||
EAIRequestPriority__HardScript = 2,
|
||||
EAIRequestPriority__Reaction = 3,
|
||||
EAIRequestPriority__Ultimate = 4,
|
||||
EAIRequestPriority__MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnActionEventType
|
||||
enum class EPawnActionEventType : uint8_t
|
||||
{
|
||||
EPawnActionEventType__Invalid = 0,
|
||||
EPawnActionEventType__FailedToStart = 1,
|
||||
EPawnActionEventType__InstantAbort = 2,
|
||||
EPawnActionEventType__FinishedAborting = 3,
|
||||
EPawnActionEventType__FinishedExecution = 4,
|
||||
EPawnActionEventType__Push = 5,
|
||||
EPawnActionEventType__EPawnActionEventType_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnActionResult
|
||||
enum class EPawnActionResult : uint8_t
|
||||
{
|
||||
EPawnActionResult__NotStarted = 0,
|
||||
EPawnActionResult__InProgress = 1,
|
||||
EPawnActionResult__Success = 2,
|
||||
EPawnActionResult__Failed = 3,
|
||||
EPawnActionResult__Aborted = 4,
|
||||
EPawnActionResult__EPawnActionResult_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnActionAbortState
|
||||
enum class EPawnActionAbortState : uint8_t
|
||||
{
|
||||
EPawnActionAbortState__NeverStarted = 0,
|
||||
EPawnActionAbortState__NotBeingAborted = 1,
|
||||
EPawnActionAbortState__MarkPendingAbort = 2,
|
||||
EPawnActionAbortState__LatentAbortInProgress = 3,
|
||||
EPawnActionAbortState__AbortDone = 4,
|
||||
EPawnActionAbortState__MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.FAIDistanceType
|
||||
enum class EFAIDistanceType : uint8_t
|
||||
{
|
||||
FAIDistanceType__Distance3D = 0,
|
||||
FAIDistanceType__Distance2D = 1,
|
||||
FAIDistanceType__DistanceZ = 2,
|
||||
FAIDistanceType__MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAIOptionFlag
|
||||
enum class EAIOptionFlag : uint8_t
|
||||
{
|
||||
EAIOptionFlag__Default = 0,
|
||||
EAIOptionFlag__Enable = 1,
|
||||
EAIOptionFlag__Disable = 2,
|
||||
EAIOptionFlag__MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTFlowAbortMode
|
||||
enum class EBTFlowAbortMode : uint8_t
|
||||
{
|
||||
EBTFlowAbortMode__None = 0,
|
||||
EBTFlowAbortMode__LowerPriority = 1,
|
||||
EBTFlowAbortMode__Self = 2,
|
||||
EBTFlowAbortMode__Both = 3,
|
||||
EBTFlowAbortMode__EBTFlowAbortMode_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTNodeResult
|
||||
enum class EBTNodeResult : uint8_t
|
||||
{
|
||||
EBTNodeResult__Succeeded = 0,
|
||||
EBTNodeResult__Failed = 1,
|
||||
EBTNodeResult__Aborted = 2,
|
||||
EBTNodeResult__InProgress = 3,
|
||||
EBTNodeResult__EBTNodeResult_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.ETextKeyOperation
|
||||
enum class ETextKeyOperation : uint8_t
|
||||
{
|
||||
ETextKeyOperation__Equal = 0,
|
||||
ETextKeyOperation__NotEqual = 1,
|
||||
ETextKeyOperation__Contain = 2,
|
||||
ETextKeyOperation__NotContain = 3,
|
||||
ETextKeyOperation__ETextKeyOperation_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EArithmeticKeyOperation
|
||||
enum class EArithmeticKeyOperation : uint8_t
|
||||
{
|
||||
EArithmeticKeyOperation__Equal = 0,
|
||||
EArithmeticKeyOperation__NotEqual = 1,
|
||||
EArithmeticKeyOperation__Less = 2,
|
||||
EArithmeticKeyOperation__LessOrEqual = 3,
|
||||
EArithmeticKeyOperation__Greater = 4,
|
||||
EArithmeticKeyOperation__GreaterOrEqual = 5,
|
||||
EArithmeticKeyOperation__EArithmeticKeyOperation_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBasicKeyOperation
|
||||
enum class EBasicKeyOperation : uint8_t
|
||||
{
|
||||
EBasicKeyOperation__Set = 0,
|
||||
EBasicKeyOperation__NotSet = 1,
|
||||
EBasicKeyOperation__EBasicKeyOperation_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTParallelMode
|
||||
enum class EBTParallelMode : uint8_t
|
||||
{
|
||||
EBTParallelMode__AbortBackground = 0,
|
||||
EBTParallelMode__WaitForBackground = 1,
|
||||
EBTParallelMode__EBTParallelMode_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTDecoratorLogic
|
||||
enum class EBTDecoratorLogic : uint8_t
|
||||
{
|
||||
EBTDecoratorLogic__Invalid = 0,
|
||||
EBTDecoratorLogic__Test = 1,
|
||||
EBTDecoratorLogic__And = 2,
|
||||
EBTDecoratorLogic__Or = 3,
|
||||
EBTDecoratorLogic__Not = 4,
|
||||
EBTDecoratorLogic__EBTDecoratorLogic_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTChildIndex
|
||||
enum class EBTChildIndex : uint8_t
|
||||
{
|
||||
EBTChildIndex__FirstNode = 0,
|
||||
EBTChildIndex__TaskNode = 1,
|
||||
EBTChildIndex__EBTChildIndex_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBTBlackboardRestart
|
||||
enum class EBTBlackboardRestart : uint8_t
|
||||
{
|
||||
EBTBlackboardRestart__ValueChange = 0,
|
||||
EBTBlackboardRestart__ResultChange = 1,
|
||||
EBTBlackboardRestart__EBTBlackboardRestart_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EBlackBoardEntryComparison
|
||||
enum class EBlackBoardEntryComparison : uint8_t
|
||||
{
|
||||
EBlackBoardEntryComparison__Equal = 0,
|
||||
EBlackBoardEntryComparison__NotEqual = 1,
|
||||
EBlackBoardEntryComparison__EBlackBoardEntryComparison_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPathExistanceQueryType
|
||||
enum class EPathExistanceQueryType : uint8_t
|
||||
{
|
||||
EPathExistanceQueryType__NavmeshRaycast2D = 0,
|
||||
EPathExistanceQueryType__HierarchicalQuery = 1,
|
||||
EPathExistanceQueryType__RegularPathFinding = 2,
|
||||
EPathExistanceQueryType__EPathExistanceQueryType_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPointOnCircleSpacingMethod
|
||||
enum class EPointOnCircleSpacingMethod : uint8_t
|
||||
{
|
||||
EPointOnCircleSpacingMethod__BySpaceBetween = 0,
|
||||
EPointOnCircleSpacingMethod__ByNumberOfPoints = 1,
|
||||
EPointOnCircleSpacingMethod__EPointOnCircleSpacingMethod_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEQSNormalizationType
|
||||
enum class EEQSNormalizationType : uint8_t
|
||||
{
|
||||
EEQSNormalizationType__Absolute = 0,
|
||||
EEQSNormalizationType__RelativeToScores = 1,
|
||||
EEQSNormalizationType__EEQSNormalizationType_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestDistance
|
||||
enum class EEnvTestDistance : uint8_t
|
||||
{
|
||||
EEnvTestDistance__Distance3D = 0,
|
||||
EEnvTestDistance__Distance2D = 1,
|
||||
EEnvTestDistance__DistanceZ = 2,
|
||||
EEnvTestDistance__DistanceAbsoluteZ = 3,
|
||||
EEnvTestDistance__EEnvTestDistance_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestDot
|
||||
enum class EEnvTestDot : uint8_t
|
||||
{
|
||||
EEnvTestDot__Dot3D = 0,
|
||||
EEnvTestDot__Dot2D = 1,
|
||||
EEnvTestDot__EEnvTestDot_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestPathfinding
|
||||
enum class EEnvTestPathfinding : uint8_t
|
||||
{
|
||||
EEnvTestPathfinding__PathExist = 0,
|
||||
EEnvTestPathfinding__PathCost = 1,
|
||||
EEnvTestPathfinding__PathLength = 2,
|
||||
EEnvTestPathfinding__EEnvTestPathfinding_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryTestClamping
|
||||
enum class EEnvQueryTestClamping : uint8_t
|
||||
{
|
||||
EEnvQueryTestClamping__None = 0,
|
||||
EEnvQueryTestClamping__SpecifiedValue = 1,
|
||||
EEnvQueryTestClamping__FilterThreshold = 2,
|
||||
EEnvQueryTestClamping__EEnvQueryTestClamping_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvDirection
|
||||
enum class EEnvDirection : uint8_t
|
||||
{
|
||||
EEnvDirection__TwoPoints = 0,
|
||||
EEnvDirection__Rotation = 1,
|
||||
EEnvDirection__EEnvDirection_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvOverlapShape
|
||||
enum class EEnvOverlapShape : uint8_t
|
||||
{
|
||||
EEnvOverlapShape__Box = 0,
|
||||
EEnvOverlapShape__Sphere = 1,
|
||||
EEnvOverlapShape__Capsule = 2,
|
||||
EEnvOverlapShape__EEnvOverlapShape_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTraceShape
|
||||
enum class EEnvTraceShape : uint8_t
|
||||
{
|
||||
EEnvTraceShape__Line = 0,
|
||||
EEnvTraceShape__Box = 1,
|
||||
EEnvTraceShape__Sphere = 2,
|
||||
EEnvTraceShape__Capsule = 3,
|
||||
EEnvTraceShape__EEnvTraceShape_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryTrace
|
||||
enum class EEnvQueryTrace : uint8_t
|
||||
{
|
||||
EEnvQueryTrace__None = 0,
|
||||
EEnvQueryTrace__Navigation = 1,
|
||||
EEnvQueryTrace__Geometry = 2,
|
||||
EEnvQueryTrace__NavigationOverLedges = 3,
|
||||
EEnvQueryTrace__EEnvQueryTrace_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EAIParamType
|
||||
enum class EAIParamType : uint8_t
|
||||
{
|
||||
EAIParamType__Float = 0,
|
||||
EAIParamType__Int = 1,
|
||||
EAIParamType__Bool = 2,
|
||||
EAIParamType__MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryParam
|
||||
enum class EEnvQueryParam : uint8_t
|
||||
{
|
||||
EEnvQueryParam__Float = 0,
|
||||
EEnvQueryParam__Int = 1,
|
||||
EEnvQueryParam__Bool = 2,
|
||||
EEnvQueryParam__EEnvQueryParam_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryRunMode
|
||||
enum class EEnvQueryRunMode : uint8_t
|
||||
{
|
||||
EEnvQueryRunMode__SingleResult = 0,
|
||||
EEnvQueryRunMode__RandomBest5Pct = 1,
|
||||
EEnvQueryRunMode__RandomBest25Pct = 2,
|
||||
EEnvQueryRunMode__AllMatching = 3,
|
||||
EEnvQueryRunMode__EEnvQueryRunMode_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestScoreOperator
|
||||
enum class EEnvTestScoreOperator : uint8_t
|
||||
{
|
||||
EEnvTestScoreOperator__AverageScore = 0,
|
||||
EEnvTestScoreOperator__MinScore = 1,
|
||||
EEnvTestScoreOperator__MaxScore = 2,
|
||||
EEnvTestScoreOperator__EEnvTestScoreOperator_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestFilterOperator
|
||||
enum class EEnvTestFilterOperator : uint8_t
|
||||
{
|
||||
EEnvTestFilterOperator__AllPass = 0,
|
||||
EEnvTestFilterOperator__AnyPass = 1,
|
||||
EEnvTestFilterOperator__EEnvTestFilterOperator_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestCost
|
||||
enum class EEnvTestCost : uint8_t
|
||||
{
|
||||
EEnvTestCost__Low = 0,
|
||||
EEnvTestCost__Medium = 1,
|
||||
EEnvTestCost__High = 2,
|
||||
EEnvTestCost__EEnvTestCost_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestWeight
|
||||
enum class EEnvTestWeight : uint8_t
|
||||
{
|
||||
EEnvTestWeight__None = 0,
|
||||
EEnvTestWeight__Square = 1,
|
||||
EEnvTestWeight__Inverse = 2,
|
||||
EEnvTestWeight__Unused = 3,
|
||||
EEnvTestWeight__Constant = 4,
|
||||
EEnvTestWeight__Skip = 5,
|
||||
EEnvTestWeight__EEnvTestWeight_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestScoreEquation
|
||||
enum class EEnvTestScoreEquation : uint8_t
|
||||
{
|
||||
EEnvTestScoreEquation__Linear = 0,
|
||||
EEnvTestScoreEquation__Square = 1,
|
||||
EEnvTestScoreEquation__InverseLinear = 2,
|
||||
EEnvTestScoreEquation__SquareRoot = 3,
|
||||
EEnvTestScoreEquation__Constant = 4,
|
||||
EEnvTestScoreEquation__EEnvTestScoreEquation_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestFilterType
|
||||
enum class EEnvTestFilterType : uint8_t
|
||||
{
|
||||
EEnvTestFilterType__Minimum = 0,
|
||||
EEnvTestFilterType__Maximum = 1,
|
||||
EEnvTestFilterType__Range = 2,
|
||||
EEnvTestFilterType__Match = 3,
|
||||
EEnvTestFilterType__EEnvTestFilterType_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvTestPurpose
|
||||
enum class EEnvTestPurpose : uint8_t
|
||||
{
|
||||
EEnvTestPurpose__Filter = 0,
|
||||
EEnvTestPurpose__Score = 1,
|
||||
EEnvTestPurpose__FilterAndScore = 2,
|
||||
EEnvTestPurpose__EEnvTestPurpose_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EEnvQueryHightlightMode
|
||||
enum class EEnvQueryHightlightMode : uint8_t
|
||||
{
|
||||
EEnvQueryHightlightMode__All = 0,
|
||||
EEnvQueryHightlightMode__Best5Pct = 1,
|
||||
EEnvQueryHightlightMode__Best25Pct = 2,
|
||||
EEnvQueryHightlightMode__EEnvQueryHightlightMode_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.ETeamAttitude
|
||||
enum class ETeamAttitude : uint8_t
|
||||
{
|
||||
ETeamAttitude__Friendly = 0,
|
||||
ETeamAttitude__Neutral = 1,
|
||||
ETeamAttitude__Hostile = 2,
|
||||
ETeamAttitude__ETeamAttitude_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPathFollowingRequestResult
|
||||
enum class EPathFollowingRequestResult : uint8_t
|
||||
{
|
||||
EPathFollowingRequestResult__Failed = 0,
|
||||
EPathFollowingRequestResult__AlreadyAtGoal = 1,
|
||||
EPathFollowingRequestResult__RequestSuccessful = 2,
|
||||
EPathFollowingRequestResult__EPathFollowingRequestResult_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPathFollowingAction
|
||||
enum class EPathFollowingAction : uint8_t
|
||||
{
|
||||
EPathFollowingAction__Error = 0,
|
||||
EPathFollowingAction__NoMove = 1,
|
||||
EPathFollowingAction__DirectMove = 2,
|
||||
EPathFollowingAction__PartialPath = 3,
|
||||
EPathFollowingAction__PathToGoal = 4,
|
||||
EPathFollowingAction__EPathFollowingAction_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPathFollowingStatus
|
||||
enum class EPathFollowingStatus : uint8_t
|
||||
{
|
||||
EPathFollowingStatus__Idle = 0,
|
||||
EPathFollowingStatus__Waiting = 1,
|
||||
EPathFollowingStatus__Paused = 2,
|
||||
EPathFollowingStatus__Moving = 3,
|
||||
EPathFollowingStatus__EPathFollowingStatus_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnActionFailHandling
|
||||
enum class EPawnActionFailHandling : uint8_t
|
||||
{
|
||||
EPawnActionFailHandling__RequireSuccess = 0,
|
||||
EPawnActionFailHandling__IgnoreFailure = 1,
|
||||
EPawnActionFailHandling__EPawnActionFailHandling_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnSubActionTriggeringPolicy
|
||||
enum class EPawnSubActionTriggeringPolicy : uint8_t
|
||||
{
|
||||
EPawnSubActionTriggeringPolicy__CopyBeforeTriggering = 0,
|
||||
EPawnSubActionTriggeringPolicy__ReuseInstances = 1,
|
||||
EPawnSubActionTriggeringPolicy__EPawnSubActionTriggeringPolicy_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AIModule.EPawnActionMoveMode
|
||||
enum class EPawnActionMoveMode : uint8_t
|
||||
{
|
||||
EPawnActionMoveMode__UsePathfinding = 0,
|
||||
EPawnActionMoveMode__StraightLine = 1,
|
||||
EPawnActionMoveMode__EPawnActionMoveMode_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AIModule.BlackboardKeySelector
|
||||
// 0x0020
|
||||
struct FBlackboardKeySelector
|
||||
{
|
||||
TArray<class UBlackboardKeyType*> AllowedTypes; // 0x0000(0x000C) (Edit, BlueprintVisible, ZeroConstructor, Transient)
|
||||
unsigned char UnknownData00[0x4]; // 0x000C(0x0004) MISSED OFFSET
|
||||
struct FName SelectedKeyName; // 0x0010(0x0008) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnTemplate, IsPlainOldData)
|
||||
class UClass* SelectedKeyType; // 0x0018(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnTemplate, Transient, IsPlainOldData)
|
||||
unsigned char SelectedKeyID; // 0x001C(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnTemplate, Transient, IsPlainOldData)
|
||||
unsigned char bNoneIsAllowedValue : 1; // 0x001D(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData01[0x2]; // 0x001E(0x0002) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIRequestID
|
||||
// 0x0004
|
||||
struct FAIRequestID
|
||||
{
|
||||
uint32_t RequestID; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIStimulus
|
||||
// 0x0048
|
||||
struct FAIStimulus
|
||||
{
|
||||
float Age; // 0x0000(0x0004) (BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float ExpirationAge; // 0x0004(0x0004) (BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Strength; // 0x0008(0x0004) (BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector StimulusLocation; // 0x000C(0x000C) (BlueprintVisible, IsPlainOldData)
|
||||
struct FVector ReceiverLocation; // 0x0018(0x000C) (BlueprintVisible, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x0024(0x0004) MISSED OFFSET
|
||||
struct FName Tag; // 0x0028(0x0008) (BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x10]; // 0x0030(0x0010) MISSED OFFSET
|
||||
unsigned char UnknownData02 : 1; // 0x0040(0x0001)
|
||||
unsigned char bSuccessfullySensed : 1; // 0x0040(0x0001) (BlueprintVisible)
|
||||
unsigned char UnknownData03[0x7]; // 0x0041(0x0007) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.ActorPerceptionBlueprintInfo
|
||||
// 0x0014
|
||||
struct FActorPerceptionBlueprintInfo
|
||||
{
|
||||
class AActor* Target; // 0x0000(0x0004) (BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FAIStimulus> LastSensedStimuli; // 0x0004(0x000C) (BlueprintVisible, ZeroConstructor)
|
||||
unsigned char bIsHostile : 1; // 0x0010(0x0001) (BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x0011(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDamageEvent
|
||||
// 0x0024
|
||||
struct FAIDamageEvent
|
||||
{
|
||||
float Amount; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector Location; // 0x0004(0x000C) (Edit, BlueprintVisible, IsPlainOldData)
|
||||
struct FVector HitLocation; // 0x0010(0x000C) (Edit, BlueprintVisible, IsPlainOldData)
|
||||
class AActor* DamagedActor; // 0x001C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Instigator; // 0x0020(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AINoiseEvent
|
||||
// 0x0030
|
||||
struct FAINoiseEvent
|
||||
{
|
||||
unsigned char UnknownData00[0x4]; // 0x0000(0x0004) MISSED OFFSET
|
||||
struct FVector NoiseLocation; // 0x0004(0x000C) (Edit, BlueprintVisible, IsPlainOldData)
|
||||
float Loudness; // 0x0010(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float MaxRange; // 0x0014(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Instigator; // 0x0018(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
struct FName Tag; // 0x0020(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x8]; // 0x0028(0x0008) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIPredictionEvent
|
||||
// 0x000C
|
||||
struct FAIPredictionEvent
|
||||
{
|
||||
class AActor* Requestor; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class AActor* PredictedActor; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x0008(0x0004) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AITeamStimulusEvent
|
||||
// 0x0030
|
||||
struct FAITeamStimulusEvent
|
||||
{
|
||||
unsigned char UnknownData00[0x28]; // 0x0000(0x0028) MISSED OFFSET
|
||||
class AActor* Broadcaster; // 0x0028(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Enemy; // 0x002C(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AITouchEvent
|
||||
// 0x0014
|
||||
struct FAITouchEvent
|
||||
{
|
||||
unsigned char UnknownData00[0xC]; // 0x0000(0x000C) MISSED OFFSET
|
||||
class AActor* TouchReceiver; // 0x000C(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class AActor* OtherActor; // 0x0010(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AISenseAffiliationFilter
|
||||
// 0x0004
|
||||
struct FAISenseAffiliationFilter
|
||||
{
|
||||
unsigned char bDetectEnemies : 1; // 0x0000(0x0001) (Edit, BlueprintVisible, BlueprintReadOnly)
|
||||
unsigned char bDetectNeutrals : 1; // 0x0000(0x0001) (Edit, BlueprintVisible, BlueprintReadOnly)
|
||||
unsigned char bDetectFriendlies : 1; // 0x0000(0x0001) (Edit, BlueprintVisible, BlueprintReadOnly)
|
||||
unsigned char UnknownData00[0x3]; // 0x0001(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIMoveRequest
|
||||
// 0x0028
|
||||
struct FAIMoveRequest
|
||||
{
|
||||
class AActor* GoalActor; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x24]; // 0x0004(0x0024) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.BTDecoratorLogic
|
||||
// 0x0004
|
||||
struct FBTDecoratorLogic
|
||||
{
|
||||
TEnumAsByte<EBTDecoratorLogic> Operation; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x1]; // 0x0001(0x0001) MISSED OFFSET
|
||||
uint16_t Number; // 0x0002(0x0002) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.BehaviorTreeTemplateInfo
|
||||
// 0x000C
|
||||
struct FBehaviorTreeTemplateInfo
|
||||
{
|
||||
class UBehaviorTree* Asset; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UBTCompositeNode* Template; // 0x0004(0x0004) (ZeroConstructor, Transient, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x0008(0x0004) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.BlackboardEntry
|
||||
// 0x0010
|
||||
struct FBlackboardEntry
|
||||
{
|
||||
struct FName EntryName; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
class UBlackboardKeyType* KeyType; // 0x0008(0x0004) (Edit, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
unsigned char bInstanceSynced : 1; // 0x000C(0x0001) (Edit)
|
||||
unsigned char UnknownData00[0x3]; // 0x000D(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.BTCompositeChild
|
||||
// 0x0020
|
||||
struct FBTCompositeChild
|
||||
{
|
||||
class UBTCompositeNode* ChildComposite; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UBTTaskNode* ChildTask; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
TArray<class UBTDecorator*> Decorators; // 0x0008(0x000C) (ZeroConstructor)
|
||||
TArray<struct FBTDecoratorLogic> DecoratorOps; // 0x0014(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderValue
|
||||
// 0x0018
|
||||
struct FAIDataProviderValue
|
||||
{
|
||||
unsigned char UnknownData00[0x4]; // 0x0000(0x0004) MISSED OFFSET
|
||||
class UProperty* CachedProperty; // 0x0004(0x0004) (ZeroConstructor, Transient, IsPlainOldData)
|
||||
class UAIDataProvider* DataBinding; // 0x0008(0x0004) (Edit, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x4]; // 0x000C(0x0004) MISSED OFFSET
|
||||
struct FName DataField; // 0x0010(0x0008) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderTypedValue
|
||||
// 0x0008 (0x0020 - 0x0018)
|
||||
struct FAIDataProviderTypedValue : public FAIDataProviderValue
|
||||
{
|
||||
class UClass* PropertyType; // 0x0018(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderFloatValue
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
struct FAIDataProviderFloatValue : public FAIDataProviderTypedValue
|
||||
{
|
||||
float DefaultValue; // 0x001C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDynamicParam
|
||||
// 0x0030
|
||||
struct FAIDynamicParam
|
||||
{
|
||||
struct FName ParamName; // 0x0000(0x0008) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, EditConst, IsPlainOldData)
|
||||
EAIParamType ParamType; // 0x0008(0x0001) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, EditConst, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0009(0x0003) MISSED OFFSET
|
||||
float Value; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FBlackboardKeySelector BBKey; // 0x0010(0x0020) (Edit, BlueprintVisible)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EQSParametrizedQueryExecutionRequest
|
||||
// 0x0038
|
||||
struct FEQSParametrizedQueryExecutionRequest
|
||||
{
|
||||
class UEnvQuery* QueryTemplate; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FAIDynamicParam> QueryConfig; // 0x0004(0x000C) (Edit, ZeroConstructor)
|
||||
struct FBlackboardKeySelector EQSQueryBlackboardKey; // 0x0010(0x0020) (Edit)
|
||||
TEnumAsByte<EEnvQueryRunMode> RunMode; // 0x0030(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char bUseBBKeyForQueryTemplate : 1; // 0x0031(0x0001) (Edit)
|
||||
unsigned char UnknownData00[0x6]; // 0x0032(0x0006) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvNamedValue
|
||||
// 0x0010
|
||||
struct FEnvNamedValue
|
||||
{
|
||||
struct FName ParamName; // 0x0000(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
EAIParamType ParamType; // 0x0008(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0009(0x0003) MISSED OFFSET
|
||||
float Value; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.CrowdAvoidanceConfig
|
||||
// 0x001C
|
||||
struct FCrowdAvoidanceConfig
|
||||
{
|
||||
float VelocityBias; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float DesiredVelocityWeight; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float CurrentVelocityWeight; // 0x0008(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float SideBiasWeight; // 0x000C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float ImpactTimeWeight; // 0x0010(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float ImpactTimeRange; // 0x0014(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char CustomPatternIdx; // 0x0018(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char AdaptiveDivisions; // 0x0019(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char AdaptiveRings; // 0x001A(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char AdaptiveDepth; // 0x001B(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.CrowdAvoidanceSamplingPattern
|
||||
// 0x0018
|
||||
struct FCrowdAvoidanceSamplingPattern
|
||||
{
|
||||
TArray<float> Angles; // 0x0000(0x000C) (Edit, ZeroConstructor)
|
||||
TArray<float> Radii; // 0x000C(0x000C) (Edit, ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderBoolValue
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
struct FAIDataProviderBoolValue : public FAIDataProviderTypedValue
|
||||
{
|
||||
bool DefaultValue; // 0x001C(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x001D(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvTraceData
|
||||
// 0x0028
|
||||
struct FEnvTraceData
|
||||
{
|
||||
int VersionNum; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UClass* NavigationFilter; // 0x0004(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ProjectDown; // 0x0008(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ProjectUp; // 0x000C(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ExtentX; // 0x0010(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ExtentY; // 0x0014(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ExtentZ; // 0x0018(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float PostProjectionVerticalOffset; // 0x001C(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<ETraceTypeQuery> TraceChannel; // 0x0020(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<ECollisionChannel> SerializedChannel; // 0x0021(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<EEnvTraceShape> TraceShape; // 0x0022(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<EEnvQueryTrace> TraceMode; // 0x0023(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
unsigned char bTraceComplex : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bOnlyBlockingHits : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bCanTraceOnNavMesh : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bCanTraceOnGeometry : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bCanDisableTrace : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bCanProjectDown : 1; // 0x0024(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char UnknownData00[0x3]; // 0x0025(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderIntValue
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
struct FAIDataProviderIntValue : public FAIDataProviderTypedValue
|
||||
{
|
||||
int DefaultValue; // 0x001C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvDirection
|
||||
// 0x0010
|
||||
struct FEnvDirection
|
||||
{
|
||||
class UClass* LineFrom; // 0x0000(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
class UClass* LineTo; // 0x0004(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
class UClass* Rotation; // 0x0008(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<EEnvDirection> DirMode; // 0x000C(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x000D(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvQueryInstanceCache
|
||||
// 0x0170
|
||||
struct FEnvQueryInstanceCache
|
||||
{
|
||||
class UEnvQuery* Template; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x16C]; // 0x0004(0x016C) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvOverlapData
|
||||
// 0x001C
|
||||
struct FEnvOverlapData
|
||||
{
|
||||
float ExtentX; // 0x0000(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ExtentY; // 0x0004(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float ExtentZ; // 0x0008(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
struct FVector ShapeOffset; // 0x000C(0x000C) (Edit, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<ECollisionChannel> OverlapChannel; // 0x0018(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TEnumAsByte<EEnvOverlapShape> OverlapShape; // 0x0019(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
unsigned char bOnlyBlockingHits : 1; // 0x001A(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char bOverlapComplex : 1; // 0x001A(0x0001) (Edit, DisableEditOnInstance)
|
||||
unsigned char UnknownData00[0x1]; // 0x001B(0x0001) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.PawnActionStack
|
||||
// 0x0004
|
||||
struct FPawnActionStack
|
||||
{
|
||||
class UPawnAction* TopAction; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.PawnActionEvent
|
||||
// 0x0010
|
||||
struct FPawnActionEvent
|
||||
{
|
||||
class UPawnAction* Action; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0xC]; // 0x0004(0x000C) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AIDataProviderStructValue
|
||||
// 0x0010 (0x0028 - 0x0018)
|
||||
struct FAIDataProviderStructValue : public FAIDataProviderValue
|
||||
{
|
||||
unsigned char UnknownData00[0x10]; // 0x0018(0x0010) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.AISightEvent
|
||||
// 0x0010
|
||||
struct FAISightEvent
|
||||
{
|
||||
unsigned char UnknownData00[0x8]; // 0x0000(0x0008) MISSED OFFSET
|
||||
class AActor* SeenActor; // 0x0008(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Observer; // 0x000C(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvQueryRequest
|
||||
// 0x0048
|
||||
struct FEnvQueryRequest
|
||||
{
|
||||
class UEnvQuery* QueryTemplate; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UObject* Owner; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UWorld* World; // 0x0008(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3C]; // 0x000C(0x003C) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.EnvQueryResult
|
||||
// 0x0030
|
||||
struct FEnvQueryResult
|
||||
{
|
||||
unsigned char UnknownData00[0xC]; // 0x0000(0x000C) MISSED OFFSET
|
||||
class UClass* ItemType; // 0x000C(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x10]; // 0x0010(0x0010) MISSED OFFSET
|
||||
int OptionIndex; // 0x0020(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
int QueryID; // 0x0024(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x8]; // 0x0028(0x0008) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AIModule.GenericTeamId
|
||||
// 0x0001
|
||||
struct FGenericTeamId
|
||||
{
|
||||
unsigned char TeamID; // 0x0000(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+72
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class ActorSequence.ActorSequence
|
||||
// 0x0020 (0x02A0 - 0x0280)
|
||||
class UActorSequence : public UMovieSceneSequence
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x20]; // 0x0280(0x0020) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ActorSequence.ActorSequence");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class ActorSequence.ActorSequenceComponent
|
||||
// 0x0028 (0x00E8 - 0x00C0)
|
||||
class UActorSequenceComponent : public UActorComponent
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x1C]; // 0x00C0(0x001C) MISSED OFFSET
|
||||
class UActorSequence* Sequence; // 0x00DC(0x0004) (Edit, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
class UActorSequencePlayer* SequencePlayer; // 0x00E0(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
bool bAutoPlay; // 0x00E4(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x3]; // 0x00E5(0x0003) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ActorSequence.ActorSequenceComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class ActorSequence.ActorSequencePlayer
|
||||
// 0x0000 (0x06A0 - 0x06A0)
|
||||
class UActorSequencePlayer : public UMovieSceneSequencePlayer
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ActorSequence.ActorSequencePlayer");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum ActorSequence.EActorSequenceObjectReferenceType
|
||||
enum class EActorSequenceObjectReferenceType : uint8_t
|
||||
{
|
||||
EActorSequenceObjectReferenceType__ContextActor = 0,
|
||||
EActorSequenceObjectReferenceType__ExternalActor = 1,
|
||||
EActorSequenceObjectReferenceType__Component = 2,
|
||||
EActorSequenceObjectReferenceType__EActorSequenceObjectReferenceType_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct ActorSequence.ActorSequenceObjectReference
|
||||
// 0x0020
|
||||
struct FActorSequenceObjectReference
|
||||
{
|
||||
EActorSequenceObjectReferenceType Type; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0001(0x0003) MISSED OFFSET
|
||||
struct FGuid ActorId; // 0x0004(0x0010) (IsPlainOldData)
|
||||
struct FString PathToComponent; // 0x0014(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct ActorSequence.ActorSequenceObjectReferences
|
||||
// 0x000C
|
||||
struct FActorSequenceObjectReferences
|
||||
{
|
||||
TArray<struct FActorSequenceObjectReference> Array; // 0x0000(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct ActorSequence.ActorSequenceObjectReferenceMap
|
||||
// 0x0018
|
||||
struct FActorSequenceObjectReferenceMap
|
||||
{
|
||||
TArray<struct FGuid> BindingIds; // 0x0000(0x000C) (ZeroConstructor)
|
||||
TArray<struct FActorSequenceObjectReferences> References; // 0x000C(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+589
@@ -0,0 +1,589 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AkAudio.AkAcousticPortal
|
||||
// 0x0010 (0x02F0 - 0x02E0)
|
||||
class AAkAcousticPortal : public AVolume
|
||||
{
|
||||
public:
|
||||
float Gain; // 0x02E0(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
EAkAcousticPortalState InitialState; // 0x02E4(0x0001) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0xB]; // 0x02E5(0x000B) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAcousticPortal");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void OpenPortal();
|
||||
EAkAcousticPortalState GetCurrentState();
|
||||
void ClosePortal();
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkAcousticTexture
|
||||
// 0x0004 (0x0020 - 0x001C)
|
||||
class UAkAcousticTexture : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAcousticTexture");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkAmbientSound
|
||||
// 0x0010 (0x02C8 - 0x02B8)
|
||||
class AAkAmbientSound : public AActor
|
||||
{
|
||||
public:
|
||||
class UAkAudioEvent* AkAudioEvent; // 0x02B8(0x0004) (ZeroConstructor, Deprecated, IsPlainOldData)
|
||||
class UAkComponent* AkComponent; // 0x02BC(0x0004) (Edit, BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
bool StopWhenOwnerIsDestroyed; // 0x02C0(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool AutoPost; // 0x02C1(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x6]; // 0x02C2(0x0006) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAmbientSound");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void StopAmbientSound();
|
||||
void StartAmbientSound();
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkAudioBank
|
||||
// 0x0004 (0x0020 - 0x001C)
|
||||
class UAkAudioBank : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAudioBank");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkAudioEvent
|
||||
// 0x0014 (0x0030 - 0x001C)
|
||||
class UAkAudioEvent : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
float MaxAttenuationRadius; // 0x0020(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
bool IsInfinite; // 0x0024(0x0001) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x3]; // 0x0025(0x0003) MISSED OFFSET
|
||||
float MinimumDuration; // 0x0028(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
float MaximumDuration; // 0x002C(0x0004) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAudioEvent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkAuxBus
|
||||
// 0x000C (0x0028 - 0x001C)
|
||||
class UAkAuxBus : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkAuxBus");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkComponent
|
||||
// 0x0200 (0x04C0 - 0x02C0)
|
||||
class UAkComponent : public USceneComponent
|
||||
{
|
||||
public:
|
||||
class UAkAuxBus* EarlyReflectionAuxBus; // 0x02C0(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString EarlyReflectionAuxBusName; // 0x02C4(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
int EarlyReflectionOrder; // 0x02D0(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
float EarlyReflectionBusSendGain; // 0x02D4(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float EarlyReflectionMaxPathLength; // 0x02D8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x02DC(0x0004) MISSED OFFSET
|
||||
unsigned char EnableSpotReflectors : 1; // 0x02E0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char DrawFirstOrderReflections : 1; // 0x02E0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char DrawSecondOrderReflections : 1; // 0x02E0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char DrawHigherOrderReflections : 1; // 0x02E0(0x0001) (Edit, BlueprintVisible)
|
||||
bool StopWhenOwnerDestroyed; // 0x02E1(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char bIsUpdateEmmiterTransform : 1; // 0x02E2(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData01[0x1]; // 0x02E3(0x0001) MISSED OFFSET
|
||||
float AttenuationScalingFactor; // 0x02E4(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
float OcclusionRefreshInterval; // 0x02E8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
class UAkAudioEvent* AkAudioEvent; // 0x02EC(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString EventName; // 0x02F0(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
unsigned char UnknownData02[0x1C4]; // 0x02FC(0x01C4) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void UseReverbVolumes(bool inUseReverbVolumes);
|
||||
void UseEarlyReflections(class UAkAuxBus* AuxBus, bool Left, bool Right, bool Floor, bool Ceiling, bool Back, bool Front, bool SpotReflectors, const struct FString& AuxBusName);
|
||||
void Stop();
|
||||
void SetSwitch(const struct FString& SwitchGroup, const struct FString& SwitchState);
|
||||
void SetStopWhenOwnerDestroyed(bool bStopWhenOwnerDestroyed);
|
||||
void SetRTPCValueGlobally(const struct FString& RTPC, float Value);
|
||||
void SetRTPCValue(const struct FString& RTPC, float Value, int InterpolationTimeMs);
|
||||
void SetOutputBusVolume(float BusVolume);
|
||||
void SetListeners(TArray<class UAkComponent*> Listeners);
|
||||
void SetEarlyReflectionOrder(int NewEarlyReflectionOrder);
|
||||
void SetAutoDestroy(bool in_AutoDestroy);
|
||||
void SetAttenuationScalingFactor(float Value);
|
||||
void PostTrigger(const struct FString& Trigger);
|
||||
int PostAssociatedAkEvent();
|
||||
int PostAkEventByName(const struct FString& in_EventName);
|
||||
int PostAkEvent(class UAkAudioEvent* AkEvent, const struct FString& in_EventName);
|
||||
float GetAttenuationRadius();
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkGameplayStatics
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UAkGameplayStatics : public UBlueprintFunctionLibrary
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkGameplayStatics");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
static void WakeupFromSuspend();
|
||||
static void UseReverbVolumes(bool inUseReverbVolumes, class AActor* Actor);
|
||||
static void UseEarlyReflections(class AActor* Actor, class UAkAuxBus* AuxBus, bool Left, bool Right, bool Floor, bool Ceiling, bool Back, bool Front, bool SpotReflectors, const struct FString& AuxBusName);
|
||||
static void UnloadBankByName(const struct FString& BankName);
|
||||
static void UnloadBank(class UAkAudioBank* Bank, const struct FString& BankName);
|
||||
static void Suspend();
|
||||
static void StopProfilerCapture();
|
||||
static void StopOutputCapture();
|
||||
static void StopAllAmbientSounds(class UObject* WorldContextObject);
|
||||
static void StopAll();
|
||||
static void StopActor(class AActor* Actor);
|
||||
static void StartProfilerCapture(const struct FString& Filename);
|
||||
static void StartOutputCapture(const struct FString& Filename);
|
||||
static void StartAllAmbientSounds(class UObject* WorldContextObject);
|
||||
static class UAkComponent* SpawnAkComponentAtLocation(class UObject* WorldContextObject, class UAkAudioEvent* AkEvent, class UAkAuxBus* EarlyReflectionsBus, const struct FVector& Location, const struct FRotator& Orientation, bool AutoPost, const struct FString& EventName, const struct FString& EarlyReflectionsBusName, bool AutoDestroy);
|
||||
static void ShowAKComponentPosition(bool _IsShow);
|
||||
static void SetSwitch(const struct FName& SwitchGroup, const struct FName& SwitchState, class AActor* Actor);
|
||||
static void SetState(const struct FName& StateGroup, const struct FName& State);
|
||||
static void SetRTPCValue(const struct FName& RTPC, float Value, int InterpolationTimeMs, class AActor* Actor);
|
||||
static void SetPanningRule(EPanningRule PanRule);
|
||||
static void SetOutputBusVolume(float BusVolume, class AActor* Actor);
|
||||
static void SetOcclusionScalingFactor(float ScalingFactor);
|
||||
static void SetOcclusionRefreshInterval(float RefreshInterval, class AActor* Actor);
|
||||
static void SetBusConfig(const struct FString& BusName, EAkChannelConfiguration ChannelConfiguration);
|
||||
static void PostTrigger(const struct FName& Trigger, class AActor* Actor);
|
||||
static void PostEventByName(const struct FString& EventName, class AActor* Actor, bool bStopWhenAttachedToDestroyed);
|
||||
static int PostEventAttached(class UAkAudioEvent* AkEvent, class AActor* Actor, const struct FName& AttachPointName, bool bStopWhenAttachedToDestroyed, const struct FString& EventName);
|
||||
static void PostEventAtLocationByName(const struct FString& EventName, const struct FVector& Location, const struct FRotator& Orientation, class UObject* WorldContextObject);
|
||||
static int PostEventAtLocation(class UAkAudioEvent* AkEvent, const struct FVector& Location, const struct FRotator& Orientation, const struct FString& EventName, class UObject* WorldContextObject);
|
||||
static int PostEvent(class UAkAudioEvent* AkEvent, class AActor* Actor, bool bStopWhenAttachedToDestroyed, const struct FString& EventName);
|
||||
static void LoadInitBank();
|
||||
static void LoadBanks(TArray<class UAkAudioBank*> SoundBanks, bool SynchronizeSoundBanks);
|
||||
static void LoadBankByName(const struct FString& BankName);
|
||||
static void LoadBank(class UAkAudioBank* Bank, const struct FString& BankName);
|
||||
static bool IsGame(class UObject* WorldContextObject);
|
||||
static bool IsEditor();
|
||||
static float GetOcclusionScalingFactor();
|
||||
static class UAkComponent* GetAkComponent(class USceneComponent* AttachToComponent, const struct FName& AttachPointName, const struct FVector& Location, TEnumAsByte<EAttachLocation> LocationType);
|
||||
static void ClearBanks();
|
||||
static void AKSetRTPCValue(const struct FString& RTPC, float Value, bool in_bBypassInternalValueInterpolation);
|
||||
static void AddOutputCaptureMarker(const struct FString& MarkerText);
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkLateReverbComponent
|
||||
// 0x0030 (0x02F0 - 0x02C0)
|
||||
class UAkLateReverbComponent : public USceneComponent
|
||||
{
|
||||
public:
|
||||
unsigned char bEnable : 1; // 0x02C0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x02C1(0x0003) MISSED OFFSET
|
||||
class UAkAuxBus* AuxBus; // 0x02C4(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString AuxBusName; // 0x02C8(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
float SendLevel; // 0x02D4(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float FadeRate; // 0x02D8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Priority; // 0x02DC(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x10]; // 0x02E0(0x0010) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkLateReverbComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkReverbVolume
|
||||
// 0x0028 (0x0308 - 0x02E0)
|
||||
class AAkReverbVolume : public AVolume
|
||||
{
|
||||
public:
|
||||
unsigned char bEnabled : 1; // 0x02E0(0x0001) (Deprecated)
|
||||
unsigned char UnknownData00[0x3]; // 0x02E1(0x0003) MISSED OFFSET
|
||||
class UAkAuxBus* AuxBus; // 0x02E4(0x0004) (ZeroConstructor, Deprecated, IsPlainOldData)
|
||||
struct FString AuxBusName; // 0x02E8(0x000C) (ZeroConstructor, Deprecated)
|
||||
float SendLevel; // 0x02F4(0x0004) (ZeroConstructor, Deprecated, IsPlainOldData)
|
||||
float FadeRate; // 0x02F8(0x0004) (ZeroConstructor, Deprecated, IsPlainOldData)
|
||||
float Priority; // 0x02FC(0x0004) (ZeroConstructor, Deprecated, IsPlainOldData)
|
||||
class UAkLateReverbComponent* LateReverbComponent; // 0x0300(0x0004) (Edit, BlueprintVisible, ExportObject, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x4]; // 0x0304(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkReverbVolume");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkRoomComponent
|
||||
// 0x0010 (0x02D0 - 0x02C0)
|
||||
class UAkRoomComponent : public USceneComponent
|
||||
{
|
||||
public:
|
||||
unsigned char bEnable : 1; // 0x02C0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x7]; // 0x02C1(0x0007) MISSED OFFSET
|
||||
float Priority; // 0x02C8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x4]; // 0x02CC(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkRoomComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void RemoveSpatialAudioRoom();
|
||||
void AddSpatialAudioRoom();
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkSettings
|
||||
// 0x0054 (0x0070 - 0x001C)
|
||||
class UAkSettings : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
struct FFilePath WwiseProjectPath; // 0x0020(0x000C) (Edit, Config)
|
||||
struct FDirectoryPath WwiseWindowsInstallationPath; // 0x002C(0x000C) (Edit, Config)
|
||||
struct FFilePath WwiseMacInstallationPath; // 0x0038(0x000C) (Edit, Config)
|
||||
bool SuppressWwiseProjectPathWarnings; // 0x0044(0x0001) (ZeroConstructor, Config, IsPlainOldData)
|
||||
bool UseAlternateObstructionOcclusionFeature; // 0x0045(0x0001) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x2A]; // 0x0046(0x002A) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkSettings");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkSpatialAudioVolume
|
||||
// 0x0010 (0x02F0 - 0x02E0)
|
||||
class AAkSpatialAudioVolume : public AVolume
|
||||
{
|
||||
public:
|
||||
class UAkSurfaceReflectorSetComponent* SurfaceReflectorSet; // 0x02E0(0x0004) (Edit, BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
class UAkLateReverbComponent* LateReverb; // 0x02E4(0x0004) (Edit, BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
class UAkRoomComponent* room; // 0x02E8(0x0004) (Edit, BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x02EC(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkSpatialAudioVolume");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkSpotReflector
|
||||
// 0x0020 (0x02D8 - 0x02B8)
|
||||
class AAkSpotReflector : public AActor
|
||||
{
|
||||
public:
|
||||
class UAkAuxBus* AuxBus; // 0x02B8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString AuxBusName; // 0x02BC(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
class UAkAcousticTexture* AcousticTexture; // 0x02C8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float DistanceScalingFactor; // 0x02CC(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Level; // 0x02D0(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x02D4(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkSpotReflector");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.AkSurfaceReflectorSetComponent
|
||||
// 0x0020 (0x02E0 - 0x02C0)
|
||||
class UAkSurfaceReflectorSetComponent : public USceneComponent
|
||||
{
|
||||
public:
|
||||
unsigned char bEnableSurfaceReflectors : 1; // 0x02C0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x02C1(0x0003) MISSED OFFSET
|
||||
TArray<struct FAkPoly> AcousticPolys; // 0x02C4(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
unsigned char UnknownData01[0x10]; // 0x02D0(0x0010) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.AkSurfaceReflectorSetComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void UpdateSurfaceReflectorSet();
|
||||
void SendSurfaceReflectorSet();
|
||||
void RemoveSurfaceReflectorSet();
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.InterpTrackAkAudioEvent
|
||||
// 0x0010 (0x0070 - 0x0060)
|
||||
class UInterpTrackAkAudioEvent : public UInterpTrackVectorBase
|
||||
{
|
||||
public:
|
||||
TArray<struct FAkAudioEventTrackKey> Events; // 0x0060(0x000C) (ZeroConstructor)
|
||||
unsigned char bContinueEventOnMatineeEnd : 1; // 0x006C(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x006D(0x0003) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.InterpTrackAkAudioEvent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.InterpTrackAkAudioRTPC
|
||||
// 0x0010 (0x0070 - 0x0060)
|
||||
class UInterpTrackAkAudioRTPC : public UInterpTrackFloatBase
|
||||
{
|
||||
public:
|
||||
struct FString Param; // 0x0060(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
unsigned char bPlayOnReverse : 1; // 0x006C(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char bContinueRTPCOnMatineeEnd : 1; // 0x006C(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x006D(0x0003) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.InterpTrackAkAudioRTPC");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.InterpTrackInstAkAudioEvent
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UInterpTrackInstAkAudioEvent : public UInterpTrackInst
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.InterpTrackInstAkAudioEvent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.InterpTrackInstAkAudioRTPC
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UInterpTrackInstAkAudioRTPC : public UInterpTrackInst
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.InterpTrackInstAkAudioRTPC");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.MovieSceneAkAudioEventSection
|
||||
// 0x0010 (0x0100 - 0x00F0)
|
||||
class UMovieSceneAkAudioEventSection : public UMovieSceneSection
|
||||
{
|
||||
public:
|
||||
bool StopAtSectionEnd; // 0x00F0(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x00F1(0x0003) MISSED OFFSET
|
||||
struct FString EventName; // 0x00F4(0x000C) (Edit, ZeroConstructor)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.MovieSceneAkAudioEventSection");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.MovieSceneAkTrack
|
||||
// 0x0010 (0x00C0 - 0x00B0)
|
||||
class UMovieSceneAkTrack : public UMovieSceneTrack
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x00B0(0x0004) MISSED OFFSET
|
||||
unsigned char bIsAMasterTrack : 1; // 0x00B4(0x0001)
|
||||
unsigned char UnknownData01[0xB]; // 0x00B5(0x000B) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.MovieSceneAkTrack");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.MovieSceneAkAudioEventTrack
|
||||
// 0x0000 (0x00C0 - 0x00C0)
|
||||
class UMovieSceneAkAudioEventTrack : public UMovieSceneAkTrack
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.MovieSceneAkAudioEventTrack");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.MovieSceneAkAudioRTPCSection
|
||||
// 0x0060 (0x0150 - 0x00F0)
|
||||
class UMovieSceneAkAudioRTPCSection : public UMovieSceneSection
|
||||
{
|
||||
public:
|
||||
struct FString Name; // 0x00F0(0x000C) (Edit, ZeroConstructor)
|
||||
struct FRichCurve FloatCurve; // 0x00FC(0x0054)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.MovieSceneAkAudioRTPCSection");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AkAudio.MovieSceneAkAudioRTPCTrack
|
||||
// 0x0000 (0x00C0 - 0x00C0)
|
||||
class UMovieSceneAkAudioRTPCTrack : public UMovieSceneAkTrack
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AkAudio.MovieSceneAkAudioRTPCTrack");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
Executable
+1755
File diff suppressed because it is too large
Load Diff
Executable
+481
@@ -0,0 +1,481 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AkAudio.AkAcousticPortal.OpenPortal
|
||||
struct AAkAcousticPortal_OpenPortal_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkAcousticPortal.GetCurrentState
|
||||
struct AAkAcousticPortal_GetCurrentState_Params
|
||||
{
|
||||
EAkAcousticPortalState ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkAcousticPortal.ClosePortal
|
||||
struct AAkAcousticPortal_ClosePortal_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkAmbientSound.StopAmbientSound
|
||||
struct AAkAmbientSound_StopAmbientSound_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkAmbientSound.StartAmbientSound
|
||||
struct AAkAmbientSound_StartAmbientSound_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.UseReverbVolumes
|
||||
struct UAkComponent_UseReverbVolumes_Params
|
||||
{
|
||||
bool inUseReverbVolumes; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.UseEarlyReflections
|
||||
struct UAkComponent_UseEarlyReflections_Params
|
||||
{
|
||||
class UAkAuxBus* AuxBus; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Left; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Right; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Floor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Ceiling; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Back; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Front; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool SpotReflectors; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString AuxBusName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.Stop
|
||||
struct UAkComponent_Stop_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetSwitch
|
||||
struct UAkComponent_SetSwitch_Params
|
||||
{
|
||||
struct FString SwitchGroup; // (Parm, ZeroConstructor)
|
||||
struct FString SwitchState; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetStopWhenOwnerDestroyed
|
||||
struct UAkComponent_SetStopWhenOwnerDestroyed_Params
|
||||
{
|
||||
bool bStopWhenOwnerDestroyed; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetRTPCValueGlobally
|
||||
struct UAkComponent_SetRTPCValueGlobally_Params
|
||||
{
|
||||
struct FString RTPC; // (Parm, ZeroConstructor)
|
||||
float Value; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetRTPCValue
|
||||
struct UAkComponent_SetRTPCValue_Params
|
||||
{
|
||||
struct FString RTPC; // (Parm, ZeroConstructor)
|
||||
float Value; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int InterpolationTimeMs; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetOutputBusVolume
|
||||
struct UAkComponent_SetOutputBusVolume_Params
|
||||
{
|
||||
float BusVolume; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetListeners
|
||||
struct UAkComponent_SetListeners_Params
|
||||
{
|
||||
TArray<class UAkComponent*> Listeners; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetEarlyReflectionOrder
|
||||
struct UAkComponent_SetEarlyReflectionOrder_Params
|
||||
{
|
||||
int NewEarlyReflectionOrder; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetAutoDestroy
|
||||
struct UAkComponent_SetAutoDestroy_Params
|
||||
{
|
||||
bool in_AutoDestroy; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.SetAttenuationScalingFactor
|
||||
struct UAkComponent_SetAttenuationScalingFactor_Params
|
||||
{
|
||||
float Value; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.PostTrigger
|
||||
struct UAkComponent_PostTrigger_Params
|
||||
{
|
||||
struct FString Trigger; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.PostAssociatedAkEvent
|
||||
struct UAkComponent_PostAssociatedAkEvent_Params
|
||||
{
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.PostAkEventByName
|
||||
struct UAkComponent_PostAkEventByName_Params
|
||||
{
|
||||
struct FString in_EventName; // (Parm, ZeroConstructor)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.PostAkEvent
|
||||
struct UAkComponent_PostAkEvent_Params
|
||||
{
|
||||
class UAkAudioEvent* AkEvent; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString in_EventName; // (Parm, ZeroConstructor)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkComponent.GetAttenuationRadius
|
||||
struct UAkComponent_GetAttenuationRadius_Params
|
||||
{
|
||||
float ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.WakeupFromSuspend
|
||||
struct UAkGameplayStatics_WakeupFromSuspend_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.UseReverbVolumes
|
||||
struct UAkGameplayStatics_UseReverbVolumes_Params
|
||||
{
|
||||
bool inUseReverbVolumes; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.UseEarlyReflections
|
||||
struct UAkGameplayStatics_UseEarlyReflections_Params
|
||||
{
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UAkAuxBus* AuxBus; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Left; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Right; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Floor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Ceiling; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Back; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool Front; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool SpotReflectors; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString AuxBusName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.UnloadBankByName
|
||||
struct UAkGameplayStatics_UnloadBankByName_Params
|
||||
{
|
||||
struct FString BankName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.UnloadBank
|
||||
struct UAkGameplayStatics_UnloadBank_Params
|
||||
{
|
||||
class UAkAudioBank* Bank; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString BankName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.Suspend
|
||||
struct UAkGameplayStatics_Suspend_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StopProfilerCapture
|
||||
struct UAkGameplayStatics_StopProfilerCapture_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StopOutputCapture
|
||||
struct UAkGameplayStatics_StopOutputCapture_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StopAllAmbientSounds
|
||||
struct UAkGameplayStatics_StopAllAmbientSounds_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StopAll
|
||||
struct UAkGameplayStatics_StopAll_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StopActor
|
||||
struct UAkGameplayStatics_StopActor_Params
|
||||
{
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StartProfilerCapture
|
||||
struct UAkGameplayStatics_StartProfilerCapture_Params
|
||||
{
|
||||
struct FString Filename; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StartOutputCapture
|
||||
struct UAkGameplayStatics_StartOutputCapture_Params
|
||||
{
|
||||
struct FString Filename; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.StartAllAmbientSounds
|
||||
struct UAkGameplayStatics_StartAllAmbientSounds_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SpawnAkComponentAtLocation
|
||||
struct UAkGameplayStatics_SpawnAkComponentAtLocation_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UAkAudioEvent* AkEvent; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UAkAuxBus* EarlyReflectionsBus; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector Location; // (Parm, IsPlainOldData)
|
||||
struct FRotator Orientation; // (Parm, IsPlainOldData)
|
||||
bool AutoPost; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
struct FString EarlyReflectionsBusName; // (Parm, ZeroConstructor)
|
||||
bool AutoDestroy; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UAkComponent* ReturnValue; // (ExportObject, Parm, OutParm, ZeroConstructor, ReturnParm, InstancedReference, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.ShowAKComponentPosition
|
||||
struct UAkGameplayStatics_ShowAKComponentPosition_Params
|
||||
{
|
||||
bool _IsShow; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetSwitch
|
||||
struct UAkGameplayStatics_SetSwitch_Params
|
||||
{
|
||||
struct FName SwitchGroup; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FName SwitchState; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetState
|
||||
struct UAkGameplayStatics_SetState_Params
|
||||
{
|
||||
struct FName StateGroup; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FName State; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetRTPCValue
|
||||
struct UAkGameplayStatics_SetRTPCValue_Params
|
||||
{
|
||||
struct FName RTPC; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float Value; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int InterpolationTimeMs; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetPanningRule
|
||||
struct UAkGameplayStatics_SetPanningRule_Params
|
||||
{
|
||||
EPanningRule PanRule; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetOutputBusVolume
|
||||
struct UAkGameplayStatics_SetOutputBusVolume_Params
|
||||
{
|
||||
float BusVolume; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetOcclusionScalingFactor
|
||||
struct UAkGameplayStatics_SetOcclusionScalingFactor_Params
|
||||
{
|
||||
float ScalingFactor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetOcclusionRefreshInterval
|
||||
struct UAkGameplayStatics_SetOcclusionRefreshInterval_Params
|
||||
{
|
||||
float RefreshInterval; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.SetBusConfig
|
||||
struct UAkGameplayStatics_SetBusConfig_Params
|
||||
{
|
||||
struct FString BusName; // (Parm, ZeroConstructor)
|
||||
EAkChannelConfiguration ChannelConfiguration; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostTrigger
|
||||
struct UAkGameplayStatics_PostTrigger_Params
|
||||
{
|
||||
struct FName Trigger; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostEventByName
|
||||
struct UAkGameplayStatics_PostEventByName_Params
|
||||
{
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bStopWhenAttachedToDestroyed; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostEventAttached
|
||||
struct UAkGameplayStatics_PostEventAttached_Params
|
||||
{
|
||||
class UAkAudioEvent* AkEvent; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FName AttachPointName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bStopWhenAttachedToDestroyed; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostEventAtLocationByName
|
||||
struct UAkGameplayStatics_PostEventAtLocationByName_Params
|
||||
{
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
struct FVector Location; // (Parm, IsPlainOldData)
|
||||
struct FRotator Orientation; // (Parm, IsPlainOldData)
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostEventAtLocation
|
||||
struct UAkGameplayStatics_PostEventAtLocation_Params
|
||||
{
|
||||
class UAkAudioEvent* AkEvent; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector Location; // (Parm, IsPlainOldData)
|
||||
struct FRotator Orientation; // (Parm, IsPlainOldData)
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.PostEvent
|
||||
struct UAkGameplayStatics_PostEvent_Params
|
||||
{
|
||||
class UAkAudioEvent* AkEvent; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bStopWhenAttachedToDestroyed; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString EventName; // (Parm, ZeroConstructor)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.LoadInitBank
|
||||
struct UAkGameplayStatics_LoadInitBank_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.LoadBanks
|
||||
struct UAkGameplayStatics_LoadBanks_Params
|
||||
{
|
||||
TArray<class UAkAudioBank*> SoundBanks; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
bool SynchronizeSoundBanks; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.LoadBankByName
|
||||
struct UAkGameplayStatics_LoadBankByName_Params
|
||||
{
|
||||
struct FString BankName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.LoadBank
|
||||
struct UAkGameplayStatics_LoadBank_Params
|
||||
{
|
||||
class UAkAudioBank* Bank; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FString BankName; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.IsGame
|
||||
struct UAkGameplayStatics_IsGame_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.IsEditor
|
||||
struct UAkGameplayStatics_IsEditor_Params
|
||||
{
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.GetOcclusionScalingFactor
|
||||
struct UAkGameplayStatics_GetOcclusionScalingFactor_Params
|
||||
{
|
||||
float ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.GetAkComponent
|
||||
struct UAkGameplayStatics_GetAkComponent_Params
|
||||
{
|
||||
class USceneComponent* AttachToComponent; // (Parm, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
struct FName AttachPointName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector Location; // (Parm, IsPlainOldData)
|
||||
TEnumAsByte<EAttachLocation> LocationType; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UAkComponent* ReturnValue; // (ExportObject, Parm, OutParm, ZeroConstructor, ReturnParm, InstancedReference, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.ClearBanks
|
||||
struct UAkGameplayStatics_ClearBanks_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.AKSetRTPCValue
|
||||
struct UAkGameplayStatics_AKSetRTPCValue_Params
|
||||
{
|
||||
struct FString RTPC; // (Parm, ZeroConstructor)
|
||||
float Value; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool in_bBypassInternalValueInterpolation; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkGameplayStatics.AddOutputCaptureMarker
|
||||
struct UAkGameplayStatics_AddOutputCaptureMarker_Params
|
||||
{
|
||||
struct FString MarkerText; // (Parm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AkAudio.AkRoomComponent.RemoveSpatialAudioRoom
|
||||
struct UAkRoomComponent_RemoveSpatialAudioRoom_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkRoomComponent.AddSpatialAudioRoom
|
||||
struct UAkRoomComponent_AddSpatialAudioRoom_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkSurfaceReflectorSetComponent.UpdateSurfaceReflectorSet
|
||||
struct UAkSurfaceReflectorSetComponent_UpdateSurfaceReflectorSet_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkSurfaceReflectorSetComponent.SendSurfaceReflectorSet
|
||||
struct UAkSurfaceReflectorSetComponent_SendSurfaceReflectorSet_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AkAudio.AkSurfaceReflectorSetComponent.RemoveSurfaceReflectorSet
|
||||
struct UAkSurfaceReflectorSetComponent_RemoveSurfaceReflectorSet_Params
|
||||
{
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+119
@@ -0,0 +1,119 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AkAudio.AkAcousticPortalState
|
||||
enum class EAkAcousticPortalState : uint8_t
|
||||
{
|
||||
AkAcousticPortalState__Closed = 0,
|
||||
AkAcousticPortalState__Open = 1,
|
||||
AkAcousticPortalState__AkAcousticPortalState_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AkAudio.EReflectionFilterBits
|
||||
enum class EReflectionFilterBits : uint8_t
|
||||
{
|
||||
EReflectionFilterBits__Wall = 0,
|
||||
EReflectionFilterBits__Ceiling = 1,
|
||||
EReflectionFilterBits__Floor = 2,
|
||||
EReflectionFilterBits__EReflectionFilterBits_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AkAudio.PanningRule
|
||||
enum class EPanningRule : uint8_t
|
||||
{
|
||||
PanningRule__PanningRule_Speakers = 0,
|
||||
PanningRule__PanningRule_Headphones = 1,
|
||||
PanningRule__PanningRule_MAX = 2
|
||||
};
|
||||
|
||||
|
||||
// Enum AkAudio.AkChannelConfiguration
|
||||
enum class EAkChannelConfiguration : uint8_t
|
||||
{
|
||||
AkChannelConfiguration__Ak_Parent = 0,
|
||||
AkChannelConfiguration__Ak_1 = 1,
|
||||
AkChannelConfiguration__Ak_2 = 2,
|
||||
AkChannelConfiguration__Ak_3 = 3,
|
||||
AkChannelConfiguration__Ak_4 = 4,
|
||||
AkChannelConfiguration__Ak_5 = 5,
|
||||
AkChannelConfiguration__Ak_7 = 6,
|
||||
AkChannelConfiguration__Ak_5_1 = 7,
|
||||
AkChannelConfiguration__Ak_7_1 = 8,
|
||||
AkChannelConfiguration__Ak_7_101 = 9,
|
||||
AkChannelConfiguration__Ak_Auro_9 = 10,
|
||||
AkChannelConfiguration__Ak_Auro_10 = 11,
|
||||
AkChannelConfiguration__Ak_Auro_11 = 12,
|
||||
AkChannelConfiguration__Ak_Auro_13 = 13,
|
||||
AkChannelConfiguration__Ak_Ambisonics_1st_order = 14,
|
||||
AkChannelConfiguration__Ak_Ambisonics_2nd_order = 15,
|
||||
AkChannelConfiguration__Ak_Ambisonics_3rd_order = 16,
|
||||
AkChannelConfiguration__Ak_MAX = 17
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AkAudio.AkPoly
|
||||
// 0x0008
|
||||
struct FAkPoly
|
||||
{
|
||||
class UAkAcousticTexture* Texture; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool EnableSurface; // 0x0004(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0005(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AkAudio.AkAudioEventTrackKey
|
||||
// 0x0014
|
||||
struct FAkAudioEventTrackKey
|
||||
{
|
||||
float Time; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
class UAkAudioEvent* AkAudioEvent; // 0x0004(0x0004) (Edit, BlueprintVisible, ZeroConstructor, EditConst, IsPlainOldData)
|
||||
struct FString EventName; // 0x0008(0x000C) (Edit, BlueprintVisible, ZeroConstructor, EditConst)
|
||||
};
|
||||
|
||||
// ScriptStruct AkAudio.AkAmbSoundCheckpointRecord
|
||||
// 0x0001
|
||||
struct FAkAmbSoundCheckpointRecord
|
||||
{
|
||||
bool bCurrentlyPlaying; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AkAudio.MovieSceneAkAudioEventTemplate
|
||||
// 0x0004 (0x0010 - 0x000C)
|
||||
struct FMovieSceneAkAudioEventTemplate : public FMovieSceneEvalTemplate
|
||||
{
|
||||
class UMovieSceneAkAudioEventSection* Section; // 0x000C(0x0004) (ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AkAudio.MovieSceneAkAudioRTPCTemplate
|
||||
// 0x0004 (0x0010 - 0x000C)
|
||||
struct FMovieSceneAkAudioRTPCTemplate : public FMovieSceneEvalTemplate
|
||||
{
|
||||
class UMovieSceneAkAudioRTPCSection* Section; // 0x000C(0x0004) (ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AkAudio.MovieSceneAkAudioRTPCSectionData
|
||||
// 0x0060
|
||||
struct FMovieSceneAkAudioRTPCSectionData
|
||||
{
|
||||
struct FString RTPCName; // 0x0000(0x000C) (ZeroConstructor)
|
||||
struct FRichCurve RTPCCurve; // 0x000C(0x0054)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileGradeScore
|
||||
// 0x001C (0x0038 - 0x001C)
|
||||
class UAndroidCommonDeviceProfileGradeScore : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
TArray<struct FGradeScoreProfileName> GradeScoreProfileName; // 0x0020(0x000C) (Edit, ZeroConstructor, Config)
|
||||
TArray<float> GradeScoreTypePercentage; // 0x002C(0x000C) (Edit, ZeroConstructor, Config)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileGradeScore");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileMatchingRules
|
||||
// 0x000C (0x0028 - 0x001C)
|
||||
class UAndroidCommonDeviceProfileMatchingRules : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileMatchingRules");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileWhiteList
|
||||
// 0x000C (0x0028 - 0x001C)
|
||||
class UAndroidCommonDeviceProfileWhiteList : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidDeviceProfileSelector.AndroidCommonDeviceProfileWhiteList");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules
|
||||
// 0x000C (0x0028 - 0x001C)
|
||||
class UAndroidDeviceProfileMatchingRules : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AndroidDeviceProfileSelector.AndroidJavaSurfaceViewDevices
|
||||
// 0x000C (0x0028 - 0x001C)
|
||||
class UAndroidJavaSurfaceViewDevices : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidDeviceProfileSelector.AndroidJavaSurfaceViewDevices");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AndroidDeviceProfileSelector.ECompareType
|
||||
enum class ECompareType : uint8_t
|
||||
{
|
||||
CMP_Equal = 0,
|
||||
CMP_Less = 1,
|
||||
CMP_LessEqual = 2,
|
||||
CMP_Greater = 3,
|
||||
CMP_GreaterEqual = 4,
|
||||
CMP_NotEqual = 5,
|
||||
CMP_Regex = 6,
|
||||
CMP_MAX = 7
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidDeviceProfileSelector.ESourceType
|
||||
enum class ESourceType : uint8_t
|
||||
{
|
||||
SRC_PreviousRegexMatch = 0,
|
||||
SRC_GpuFamily = 1,
|
||||
SRC_GlVersion = 2,
|
||||
SRC_AndroidVersion = 3,
|
||||
SRC_DeviceMake = 4,
|
||||
SRC_DeviceModel = 5,
|
||||
SRC_VulkanVersion = 6,
|
||||
SRC_UsingHoudini = 7,
|
||||
SRC_VulkanAvailable = 8,
|
||||
SRC_MemorySizeInGB = 9,
|
||||
SRC_CPUCoreNum = 10,
|
||||
SRC_CPUMaxFreq = 11,
|
||||
SRC_GLExtensions = 12,
|
||||
SRC_MAX = 13
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidDeviceProfileSelector.EGradeScoreType
|
||||
enum class EGradeScoreType : uint8_t
|
||||
{
|
||||
GST_GPU = 0,
|
||||
GST_Memory = 1,
|
||||
GST_CPUCore = 2,
|
||||
GST_CPUFreq = 3,
|
||||
GST_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidDeviceProfileSelector.EGradeType
|
||||
enum class EGradeType : uint8_t
|
||||
{
|
||||
GAT_Grade01 = 0,
|
||||
GAT_Grade02 = 1,
|
||||
GAT_Grade03 = 2,
|
||||
GAT_Grade04 = 3,
|
||||
GAT_Grade05 = 4,
|
||||
GAT_Grade06 = 5,
|
||||
GAT_Grade07 = 6,
|
||||
GAT_MAX = 7
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.GradeScoreProfileName
|
||||
// 0x0010
|
||||
struct FGradeScoreProfileName
|
||||
{
|
||||
struct FString ProfileName; // 0x0000(0x000C) (ZeroConstructor)
|
||||
int Score; // 0x000C(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.GradeProfileMatchItem
|
||||
// 0x0010
|
||||
struct FGradeProfileMatchItem
|
||||
{
|
||||
TEnumAsByte<ESourceType> SourceType; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
TEnumAsByte<ECompareType> CompareType; // 0x0001(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x2]; // 0x0002(0x0002) MISSED OFFSET
|
||||
struct FString MatchString; // 0x0004(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.GradeProfileMatch
|
||||
// 0x0014
|
||||
struct FGradeProfileMatch
|
||||
{
|
||||
TEnumAsByte<EGradeScoreType> ScoreType; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0001(0x0003) MISSED OFFSET
|
||||
int Score; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FGradeProfileMatchItem> Match; // 0x0008(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.ProfileMatchItem
|
||||
// 0x0010
|
||||
struct FProfileMatchItem
|
||||
{
|
||||
TEnumAsByte<ESourceType> SourceType; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
TEnumAsByte<ECompareType> CompareType; // 0x0001(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x2]; // 0x0002(0x0002) MISSED OFFSET
|
||||
struct FString MatchString; // 0x0004(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.ProfileMatch
|
||||
// 0x0018
|
||||
struct FProfileMatch
|
||||
{
|
||||
struct FString Profile; // 0x0000(0x000C) (ZeroConstructor)
|
||||
TArray<struct FProfileMatchItem> Match; // 0x000C(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidDeviceProfileSelector.JavaSurfaceViewDevice
|
||||
// 0x0018
|
||||
struct FJavaSurfaceViewDevice
|
||||
{
|
||||
struct FString Manufacturer; // 0x0000(0x000C) (ZeroConstructor)
|
||||
struct FString Model; // 0x000C(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AndroidMediaFactory.AndroidMediaSettings
|
||||
// 0x0004 (0x0020 - 0x001C)
|
||||
class UAndroidMediaSettings : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidMediaFactory.AndroidMediaSettings");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AndroidPermission.AndroidPermissionCallbackProxy
|
||||
// 0x0054 (0x0070 - 0x001C)
|
||||
class UAndroidPermissionCallbackProxy : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x54]; // 0x001C(0x0054) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidPermission.AndroidPermissionCallbackProxy");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AndroidPermission.AndroidPermissionFunctionLibrary
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UAndroidPermissionFunctionLibrary : public UBlueprintFunctionLibrary
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidPermission.AndroidPermissionFunctionLibrary");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
static bool CheckPermission(const struct FString& permission);
|
||||
static class UAndroidPermissionCallbackProxy* AcquirePermissions(TArray<struct FString> Permissions);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AndroidPermission.AndroidPermissionFunctionLibrary.CheckPermission
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// struct FString permission (Parm, ZeroConstructor)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAndroidPermissionFunctionLibrary::CheckPermission(const struct FString& permission)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AndroidPermission.AndroidPermissionFunctionLibrary.CheckPermission");
|
||||
|
||||
UAndroidPermissionFunctionLibrary_CheckPermission_Params params;
|
||||
params.permission = permission;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AndroidPermission.AndroidPermissionFunctionLibrary.AcquirePermissions
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable)
|
||||
// Parameters:
|
||||
// TArray<struct FString> Permissions (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
// class UAndroidPermissionCallbackProxy* ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
class UAndroidPermissionCallbackProxy* UAndroidPermissionFunctionLibrary::AcquirePermissions(TArray<struct FString> Permissions)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AndroidPermission.AndroidPermissionFunctionLibrary.AcquirePermissions");
|
||||
|
||||
UAndroidPermissionFunctionLibrary_AcquirePermissions_Params params;
|
||||
params.Permissions = Permissions;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AndroidPermission.AndroidPermissionFunctionLibrary.CheckPermission
|
||||
struct UAndroidPermissionFunctionLibrary_CheckPermission_Params
|
||||
{
|
||||
struct FString permission; // (Parm, ZeroConstructor)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AndroidPermission.AndroidPermissionFunctionLibrary.AcquirePermissions
|
||||
struct UAndroidPermissionFunctionLibrary_AcquirePermissions_Params
|
||||
{
|
||||
TArray<struct FString> Permissions; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
class UAndroidPermissionCallbackProxy* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AndroidRuntimeSettings.AndroidRuntimeSettings
|
||||
// 0x01AC (0x01C8 - 0x001C)
|
||||
class UAndroidRuntimeSettings : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
int StoreVersion; // 0x0028(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
struct FString ApplicationDisplayName; // 0x002C(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString VersionDisplayName; // 0x0038(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
int MinSDKVersion; // 0x0044(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
int TargetSDKVersion; // 0x0048(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TEnumAsByte<EAndroidInstallLocation> InstallLocation; // 0x004C(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bEnableGradle; // 0x004D(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bPackageDataInsideApk; // 0x004E(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bCreateAllPlatformsInstall; // 0x004F(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bDisableVerifyOBBOnStartUp; // 0x0050(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bUseExternalFilesDir; // 0x0051(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TEnumAsByte<EAndroidScreenOrientation> Orientation; // 0x0052(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x1]; // 0x0053(0x0001) MISSED OFFSET
|
||||
float MaxAspectRatio; // 0x0054(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TEnumAsByte<EAndroidAntVerbosity> AntVerbosity; // 0x0058(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bFullScreen; // 0x0059(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bEnableNewKeyboard; // 0x005A(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TEnumAsByte<EAndroidDepthBufferPreference> DepthBufferPreference; // 0x005B(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TArray<struct FString> ExtraManifestNodeTags; // 0x005C(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FString> ExtraApplicationNodeTags; // 0x0068(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString ExtraApplicationSettings; // 0x0074(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FString> ExtraActivityNodeTags; // 0x0080(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString ExtraActivitySettings; // 0x008C(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FString> ExtraPermissions; // 0x0098(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
bool bAndroidVoiceEnabled; // 0x00A4(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bPackageForGearVR; // 0x00A5(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bRemoveOSIG; // 0x00A6(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x1]; // 0x00A7(0x0001) MISSED OFFSET
|
||||
TArray<TEnumAsByte<EGoogleVRCaps>> GoogleVRCaps; // 0x00A8(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
bool bGoogleVRSustainedPerformance; // 0x00B4(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData03[0x3]; // 0x00B5(0x0003) MISSED OFFSET
|
||||
struct FString KeyStore; // 0x00B8(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString KeyAlias; // 0x00C4(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString KeyStorePassword; // 0x00D0(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString KeyPassword; // 0x00DC(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
bool bBuildForArmV7; // 0x00E8(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildForArm64; // 0x00E9(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildForX86; // 0x00EA(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildForX8664; // 0x00EB(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildForES2; // 0x00EC(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildForES31; // 0x00ED(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bSupportsVulkan; // 0x00EE(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bBuildWithHiddenSymbolVisibility; // 0x00EF(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bEnableGooglePlaySupport; // 0x00F0(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bUseGetAccounts; // 0x00F1(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData04[0x2]; // 0x00F2(0x0002) MISSED OFFSET
|
||||
struct FString GamesAppID; // 0x00F4(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FGooglePlayAchievementMapping> AchievementMap; // 0x0100(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FGooglePlayLeaderboardMapping> LeaderboardMap; // 0x010C(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
bool bSupportAdMob; // 0x0118(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData05[0x3]; // 0x0119(0x0003) MISSED OFFSET
|
||||
struct FString AdMobAdUnitID; // 0x011C(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
TArray<struct FString> AdMobAdUnitIDs; // 0x0128(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString GooglePlayLicenseKey; // 0x0134(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
struct FString GCMClientSenderID; // 0x0140(0x000C) (Edit, ZeroConstructor, Config, GlobalConfig)
|
||||
bool bShowLaunchImage; // 0x014C(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
TEnumAsByte<EAndroidAudio> AndroidAudio; // 0x014D(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData06[0x2]; // 0x014E(0x0002) MISSED OFFSET
|
||||
int AudioSampleRate; // 0x0150(0x0004) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
int AudioCallbackBufferFrameSize; // 0x0154(0x0004) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
int AudioNumBuffersToEnqueue; // 0x0158(0x0004) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
int AudioMaxChannels; // 0x015C(0x0004) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
int AudioNumSourceWorkers; // 0x0160(0x0004) (Edit, ZeroConstructor, Config, IsPlainOldData)
|
||||
struct FString SpatializationPlugin; // 0x0164(0x000C) (Edit, ZeroConstructor, Config)
|
||||
struct FString ReverbPlugin; // 0x0170(0x000C) (Edit, ZeroConstructor, Config)
|
||||
struct FString OcclusionPlugin; // 0x017C(0x000C) (Edit, ZeroConstructor, Config)
|
||||
TEnumAsByte<EAndroidGraphicsDebugger> AndroidGraphicsDebugger; // 0x0188(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData07[0x3]; // 0x0189(0x0003) MISSED OFFSET
|
||||
struct FDirectoryPath MaliGraphicsDebuggerPath; // 0x018C(0x000C) (Edit, Config, GlobalConfig)
|
||||
struct FDirectoryPath RenderDocPath; // 0x0198(0x000C) (Edit, Config, GlobalConfig)
|
||||
bool bMultiTargetFormat_ETC1; // 0x01A4(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bMultiTargetFormat_ETC2; // 0x01A5(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bMultiTargetFormat_DXT; // 0x01A6(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bMultiTargetFormat_PVRTC; // 0x01A7(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bMultiTargetFormat_ATC; // 0x01A8(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
bool bMultiTargetFormat_ASTC; // 0x01A9(0x0001) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData08[0x2]; // 0x01AA(0x0002) MISSED OFFSET
|
||||
float TextureFormatPriority_ETC1; // 0x01AC(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
float TextureFormatPriority_ETC2; // 0x01B0(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
float TextureFormatPriority_DXT; // 0x01B4(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
float TextureFormatPriority_PVRTC; // 0x01B8(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
float TextureFormatPriority_ATC; // 0x01BC(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
float TextureFormatPriority_ASTC; // 0x01C0(0x0004) (Edit, ZeroConstructor, Config, GlobalConfig, IsPlainOldData)
|
||||
unsigned char UnknownData09[0x4]; // 0x01C4(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AndroidRuntimeSettings.AndroidRuntimeSettings");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidGraphicsDebugger
|
||||
enum class EAndroidGraphicsDebugger : uint8_t
|
||||
{
|
||||
EAndroidGraphicsDebugger__None = 0,
|
||||
EAndroidGraphicsDebugger__Mali = 1,
|
||||
EAndroidGraphicsDebugger__Adreno = 2,
|
||||
EAndroidGraphicsDebugger__RenderDoc = 3,
|
||||
EAndroidGraphicsDebugger__EAndroidGraphicsDebugger_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EGoogleVRCaps
|
||||
enum class EGoogleVRCaps : uint8_t
|
||||
{
|
||||
EGoogleVRCaps__Cardboard = 0,
|
||||
EGoogleVRCaps__Daydream33 = 1,
|
||||
EGoogleVRCaps__Daydream63 = 2,
|
||||
EGoogleVRCaps__EGoogleVRCaps_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EGoogleVRMode
|
||||
enum class EGoogleVRMode : uint8_t
|
||||
{
|
||||
EGoogleVRMode__Cardboard = 0,
|
||||
EGoogleVRMode__Daydream = 1,
|
||||
EGoogleVRMode__DaydreamAndCardboard = 2,
|
||||
EGoogleVRMode__EGoogleVRMode_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidAudio
|
||||
enum class EAndroidAudio : uint8_t
|
||||
{
|
||||
EAndroidAudio__Default = 0,
|
||||
EAndroidAudio__OGG = 1,
|
||||
EAndroidAudio__ADPCM = 2,
|
||||
EAndroidAudio__EAndroidAudio_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidInstallLocation
|
||||
enum class EAndroidInstallLocation : uint8_t
|
||||
{
|
||||
EAndroidInstallLocation__InternalOnly = 0,
|
||||
EAndroidInstallLocation__PreferExternal = 1,
|
||||
EAndroidInstallLocation__Auto = 2,
|
||||
EAndroidInstallLocation__EAndroidInstallLocation_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidDepthBufferPreference
|
||||
enum class EAndroidDepthBufferPreference : uint8_t
|
||||
{
|
||||
EAndroidDepthBufferPreference__Default = 0,
|
||||
EAndroidDepthBufferPreference__Bits16 = 1,
|
||||
EAndroidDepthBufferPreference__Bits24 = 2,
|
||||
EAndroidDepthBufferPreference__Bits32 = 3,
|
||||
EAndroidDepthBufferPreference__EAndroidDepthBufferPreference_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidScreenOrientation
|
||||
enum class EAndroidScreenOrientation : uint8_t
|
||||
{
|
||||
EAndroidScreenOrientation__Portrait = 0,
|
||||
EAndroidScreenOrientation__ReversePortrait = 1,
|
||||
EAndroidScreenOrientation__SensorPortrait = 2,
|
||||
EAndroidScreenOrientation__Landscape = 3,
|
||||
EAndroidScreenOrientation__ReverseLandscape = 4,
|
||||
EAndroidScreenOrientation__SensorLandscape = 5,
|
||||
EAndroidScreenOrientation__Sensor = 6,
|
||||
EAndroidScreenOrientation__FullSensor = 7,
|
||||
EAndroidScreenOrientation__EAndroidScreenOrientation_MAX = 8
|
||||
};
|
||||
|
||||
|
||||
// Enum AndroidRuntimeSettings.EAndroidAntVerbosity
|
||||
enum class EAndroidAntVerbosity : uint8_t
|
||||
{
|
||||
EAndroidAntVerbosity__Quiet = 0,
|
||||
EAndroidAntVerbosity__Normal = 1,
|
||||
EAndroidAntVerbosity__Verbose = 2,
|
||||
EAndroidAntVerbosity__EAndroidAntVerbosity_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AndroidRuntimeSettings.GooglePlayAchievementMapping
|
||||
// 0x0018
|
||||
struct FGooglePlayAchievementMapping
|
||||
{
|
||||
struct FString Name; // 0x0000(0x000C) (Edit, ZeroConstructor)
|
||||
struct FString AchievementID; // 0x000C(0x000C) (Edit, ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AndroidRuntimeSettings.GooglePlayLeaderboardMapping
|
||||
// 0x0018
|
||||
struct FGooglePlayLeaderboardMapping
|
||||
{
|
||||
struct FString Name; // 0x0000(0x000C) (Edit, ZeroConstructor)
|
||||
struct FString LeaderboardID; // 0x000C(0x000C) (Edit, ZeroConstructor)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AnimGraphRuntime.AnimCustomInstance
|
||||
// 0x0000 (0x02F0 - 0x02F0)
|
||||
class UAnimCustomInstance : public UAnimInstance
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.AnimCustomInstance");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AnimGraphRuntime.AnimNotify_PlayMontageNotify
|
||||
// 0x0008 (0x0030 - 0x0028)
|
||||
class UAnimNotify_PlayMontageNotify : public UAnimNotify
|
||||
{
|
||||
public:
|
||||
struct FName NotifyName; // 0x0028(0x0008) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.AnimNotify_PlayMontageNotify");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AnimGraphRuntime.AnimNotify_PlayMontageNotifyWindow
|
||||
// 0x0008 (0x0028 - 0x0020)
|
||||
class UAnimNotify_PlayMontageNotifyWindow : public UAnimNotifyState
|
||||
{
|
||||
public:
|
||||
struct FName NotifyName; // 0x0020(0x0008) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.AnimNotify_PlayMontageNotifyWindow");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AnimGraphRuntime.AnimSequencerInstance
|
||||
// 0x0000 (0x02F0 - 0x02F0)
|
||||
class UAnimSequencerInstance : public UAnimCustomInstance
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.AnimSequencerInstance");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AnimGraphRuntime.KismetAnimationLibrary
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UKismetAnimationLibrary : public UBlueprintFunctionLibrary
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.KismetAnimationLibrary");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
static void K2_TwoBoneIK(const struct FVector& RootPos, const struct FVector& JointPos, const struct FVector& EndPos, const struct FVector& JointTarget, const struct FVector& Effector, float MaxStretchScale, float StartStretchRatio, bool bAllowStretching, struct FVector* OutEndPos, struct FVector* OutJointPos);
|
||||
static struct FTransform K2_LookAt(const struct FTransform& CurrentTransform, const struct FVector& TargetPosition, const struct FVector& LookAtVector, bool bUseUpVector, const struct FVector& UpVector, float ClampConeInDegree);
|
||||
};
|
||||
|
||||
|
||||
// Class AnimGraphRuntime.PlayMontageCallbackProxy
|
||||
// 0x00D4 (0x00F0 - 0x001C)
|
||||
class UPlayMontageCallbackProxy : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x001C(0x000C) MISSED OFFSET
|
||||
struct FScriptMulticastDelegate OnBlendOut; // 0x0028(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
struct FScriptMulticastDelegate OnInterrupted; // 0x0034(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
struct FScriptMulticastDelegate OnNotifyBegin; // 0x0040(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
struct FScriptMulticastDelegate OnNotifyEnd; // 0x004C(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
unsigned char UnknownData01[0x98]; // 0x0058(0x0098) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AnimGraphRuntime.PlayMontageCallbackProxy");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void OnNotifyEndReceived(const struct FName& NotifyName, const struct FBranchingPointNotifyPayload& BranchingPointNotifyPayload);
|
||||
void OnNotifyBeginReceived(const struct FName& NotifyName, const struct FBranchingPointNotifyPayload& BranchingPointNotifyPayload);
|
||||
void OnMontageEnded(class UAnimMontage* Montage, bool bInterrupted);
|
||||
void OnMontageBlendingOut(class UAnimMontage* Montage, bool bInterrupted);
|
||||
static class UPlayMontageCallbackProxy* CreateProxyObjectForPlayMontage(class USkeletalMeshComponent* InSkeletalMeshComponent, class UAnimMontage* MontageToPlay, float PlayRate, float StartingPosition, const struct FName& StartingSection);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+236
@@ -0,0 +1,236 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AnimGraphRuntime.KismetAnimationLibrary.K2_TwoBoneIK
|
||||
// (Final, Native, Static, Public, HasOutParms, HasDefaults, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FVector RootPos (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector JointPos (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector EndPos (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector JointTarget (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector Effector (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector OutJointPos (Parm, OutParm, IsPlainOldData)
|
||||
// struct FVector OutEndPos (Parm, OutParm, IsPlainOldData)
|
||||
// bool bAllowStretching (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float StartStretchRatio (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float MaxStretchScale (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UKismetAnimationLibrary::K2_TwoBoneIK(const struct FVector& RootPos, const struct FVector& JointPos, const struct FVector& EndPos, const struct FVector& JointTarget, const struct FVector& Effector, float MaxStretchScale, float StartStretchRatio, bool bAllowStretching, struct FVector* OutEndPos, struct FVector* OutJointPos)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.KismetAnimationLibrary.K2_TwoBoneIK");
|
||||
|
||||
UKismetAnimationLibrary_K2_TwoBoneIK_Params params;
|
||||
params.RootPos = RootPos;
|
||||
params.JointPos = JointPos;
|
||||
params.EndPos = EndPos;
|
||||
params.JointTarget = JointTarget;
|
||||
params.Effector = Effector;
|
||||
params.bAllowStretching = bAllowStretching;
|
||||
params.StartStretchRatio = StartStretchRatio;
|
||||
params.MaxStretchScale = MaxStretchScale;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutJointPos != nullptr)
|
||||
*OutJointPos = params.OutJointPos;
|
||||
if (OutEndPos != nullptr)
|
||||
*OutEndPos = params.OutEndPos;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.KismetAnimationLibrary.K2_LookAt
|
||||
// (Final, Native, Static, Public, HasOutParms, HasDefaults, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FTransform CurrentTransform (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector TargetPosition (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector LookAtVector (Parm, IsPlainOldData)
|
||||
// bool bUseUpVector (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FVector UpVector (Parm, IsPlainOldData)
|
||||
// float ClampConeInDegree (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FTransform ReturnValue (Parm, OutParm, ReturnParm, IsPlainOldData)
|
||||
|
||||
struct FTransform UKismetAnimationLibrary::K2_LookAt(const struct FTransform& CurrentTransform, const struct FVector& TargetPosition, const struct FVector& LookAtVector, bool bUseUpVector, const struct FVector& UpVector, float ClampConeInDegree)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.KismetAnimationLibrary.K2_LookAt");
|
||||
|
||||
UKismetAnimationLibrary_K2_LookAt_Params params;
|
||||
params.CurrentTransform = CurrentTransform;
|
||||
params.TargetPosition = TargetPosition;
|
||||
params.LookAtVector = LookAtVector;
|
||||
params.bUseUpVector = bUseUpVector;
|
||||
params.UpVector = UpVector;
|
||||
params.ClampConeInDegree = ClampConeInDegree;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyEndReceived
|
||||
// (Final, Native, Protected, HasOutParms)
|
||||
// Parameters:
|
||||
// struct FName NotifyName (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FBranchingPointNotifyPayload BranchingPointNotifyPayload (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void UPlayMontageCallbackProxy::OnNotifyEndReceived(const struct FName& NotifyName, const struct FBranchingPointNotifyPayload& BranchingPointNotifyPayload)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyEndReceived");
|
||||
|
||||
UPlayMontageCallbackProxy_OnNotifyEndReceived_Params params;
|
||||
params.NotifyName = NotifyName;
|
||||
params.BranchingPointNotifyPayload = BranchingPointNotifyPayload;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyBeginReceived
|
||||
// (Final, Native, Protected, HasOutParms)
|
||||
// Parameters:
|
||||
// struct FName NotifyName (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FBranchingPointNotifyPayload BranchingPointNotifyPayload (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void UPlayMontageCallbackProxy::OnNotifyBeginReceived(const struct FName& NotifyName, const struct FBranchingPointNotifyPayload& BranchingPointNotifyPayload)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyBeginReceived");
|
||||
|
||||
UPlayMontageCallbackProxy_OnNotifyBeginReceived_Params params;
|
||||
params.NotifyName = NotifyName;
|
||||
params.BranchingPointNotifyPayload = BranchingPointNotifyPayload;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageEnded
|
||||
// (Final, Native, Protected)
|
||||
// Parameters:
|
||||
// class UAnimMontage* Montage (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bInterrupted (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UPlayMontageCallbackProxy::OnMontageEnded(class UAnimMontage* Montage, bool bInterrupted)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageEnded");
|
||||
|
||||
UPlayMontageCallbackProxy_OnMontageEnded_Params params;
|
||||
params.Montage = Montage;
|
||||
params.bInterrupted = bInterrupted;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageBlendingOut
|
||||
// (Final, Native, Protected)
|
||||
// Parameters:
|
||||
// class UAnimMontage* Montage (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bInterrupted (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UPlayMontageCallbackProxy::OnMontageBlendingOut(class UAnimMontage* Montage, bool bInterrupted)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageBlendingOut");
|
||||
|
||||
UPlayMontageCallbackProxy_OnMontageBlendingOut_Params params;
|
||||
params.Montage = Montage;
|
||||
params.bInterrupted = bInterrupted;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.CreateProxyObjectForPlayMontage
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class USkeletalMeshComponent* InSkeletalMeshComponent (Parm, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
// class UAnimMontage* MontageToPlay (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float PlayRate (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float StartingPosition (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FName StartingSection (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class UPlayMontageCallbackProxy* ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
class UPlayMontageCallbackProxy* UPlayMontageCallbackProxy::CreateProxyObjectForPlayMontage(class USkeletalMeshComponent* InSkeletalMeshComponent, class UAnimMontage* MontageToPlay, float PlayRate, float StartingPosition, const struct FName& StartingSection)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AnimGraphRuntime.PlayMontageCallbackProxy.CreateProxyObjectForPlayMontage");
|
||||
|
||||
UPlayMontageCallbackProxy_CreateProxyObjectForPlayMontage_Params params;
|
||||
params.InSkeletalMeshComponent = InSkeletalMeshComponent;
|
||||
params.MontageToPlay = MontageToPlay;
|
||||
params.PlayRate = PlayRate;
|
||||
params.StartingPosition = StartingPosition;
|
||||
params.StartingSection = StartingSection;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AnimGraphRuntime.KismetAnimationLibrary.K2_TwoBoneIK
|
||||
struct UKismetAnimationLibrary_K2_TwoBoneIK_Params
|
||||
{
|
||||
struct FVector RootPos; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector JointPos; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector EndPos; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector JointTarget; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector Effector; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector OutJointPos; // (Parm, OutParm, IsPlainOldData)
|
||||
struct FVector OutEndPos; // (Parm, OutParm, IsPlainOldData)
|
||||
bool bAllowStretching; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float StartStretchRatio; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float MaxStretchScale; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.KismetAnimationLibrary.K2_LookAt
|
||||
struct UKismetAnimationLibrary_K2_LookAt_Params
|
||||
{
|
||||
struct FTransform CurrentTransform; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector TargetPosition; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector LookAtVector; // (Parm, IsPlainOldData)
|
||||
bool bUseUpVector; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector UpVector; // (Parm, IsPlainOldData)
|
||||
float ClampConeInDegree; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FTransform ReturnValue; // (Parm, OutParm, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyEndReceived
|
||||
struct UPlayMontageCallbackProxy_OnNotifyEndReceived_Params
|
||||
{
|
||||
struct FName NotifyName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FBranchingPointNotifyPayload BranchingPointNotifyPayload; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnNotifyBeginReceived
|
||||
struct UPlayMontageCallbackProxy_OnNotifyBeginReceived_Params
|
||||
{
|
||||
struct FName NotifyName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FBranchingPointNotifyPayload BranchingPointNotifyPayload; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageEnded
|
||||
struct UPlayMontageCallbackProxy_OnMontageEnded_Params
|
||||
{
|
||||
class UAnimMontage* Montage; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bInterrupted; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.OnMontageBlendingOut
|
||||
struct UPlayMontageCallbackProxy_OnMontageBlendingOut_Params
|
||||
{
|
||||
class UAnimMontage* Montage; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bInterrupted; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AnimGraphRuntime.PlayMontageCallbackProxy.CreateProxyObjectForPlayMontage
|
||||
struct UPlayMontageCallbackProxy_CreateProxyObjectForPlayMontage_Params
|
||||
{
|
||||
class USkeletalMeshComponent* InSkeletalMeshComponent; // (Parm, ZeroConstructor, InstancedReference, IsPlainOldData)
|
||||
class UAnimMontage* MontageToPlay; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float PlayRate; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float StartingPosition; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FName StartingSection; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
class UPlayMontageCallbackProxy* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+1190
File diff suppressed because it is too large
Load Diff
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
Executable
+175
@@ -0,0 +1,175 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AnimationCore.ETransformConstraintType
|
||||
enum class ETransformConstraintType : uint8_t
|
||||
{
|
||||
ETransformConstraintType__Translation = 0,
|
||||
ETransformConstraintType__Rotation = 1,
|
||||
ETransformConstraintType__Scale = 2,
|
||||
ETransformConstraintType__Parent = 3,
|
||||
ETransformConstraintType__ETransformConstraintType_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AnimationCore.EConstraintType
|
||||
enum class EConstraintType : uint8_t
|
||||
{
|
||||
EConstraintType__Transform = 0,
|
||||
EConstraintType__Aim = 1,
|
||||
EConstraintType__MAX = 2
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AnimationCore.Axis
|
||||
// 0x0010
|
||||
struct FAxis
|
||||
{
|
||||
struct FVector Axis; // 0x0000(0x000C) (Edit, IsPlainOldData)
|
||||
bool bInLocalSpace; // 0x000C(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x000D(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.ConstraintDescriptor
|
||||
// 0x0008
|
||||
struct FConstraintDescriptor
|
||||
{
|
||||
EConstraintType Type; // 0x0000(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x7]; // 0x0001(0x0007) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.ConstraintData
|
||||
// 0x0080
|
||||
struct FConstraintData
|
||||
{
|
||||
struct FConstraintDescriptor Constraint; // 0x0000(0x0008)
|
||||
struct FName TargetNode; // 0x0008(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||
float Weight; // 0x0010(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
bool bMaintainOffset; // 0x0014(0x0001) (ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0xB]; // 0x0015(0x000B) MISSED OFFSET
|
||||
struct FTransform Offset; // 0x0020(0x0030) (IsPlainOldData)
|
||||
struct FTransform CurrentTransform; // 0x0050(0x0030) (Transient, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.FilterOptionPerAxis
|
||||
// 0x0003
|
||||
struct FFilterOptionPerAxis
|
||||
{
|
||||
bool bX; // 0x0000(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bY; // 0x0001(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bZ; // 0x0002(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.ConstraintDescriptionEx
|
||||
// 0x0008
|
||||
struct FConstraintDescriptionEx
|
||||
{
|
||||
unsigned char UnknownData00[0x4]; // 0x0000(0x0004) MISSED OFFSET
|
||||
struct FFilterOptionPerAxis AxesFilterOption; // 0x0004(0x0003) (Edit)
|
||||
unsigned char UnknownData01[0x1]; // 0x0007(0x0001) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.AimConstraintDescription
|
||||
// 0x0024 (0x002C - 0x0008)
|
||||
struct FAimConstraintDescription : public FConstraintDescriptionEx
|
||||
{
|
||||
struct FAxis LookAt_Axis; // 0x0008(0x0010) (Edit)
|
||||
struct FAxis LookUp_Axis; // 0x0018(0x0010) (Edit)
|
||||
bool bUseLookUp; // 0x0028(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0029(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.TransformConstraintDescription
|
||||
// 0x0000 (0x0008 - 0x0008)
|
||||
struct FTransformConstraintDescription : public FConstraintDescriptionEx
|
||||
{
|
||||
ETransformConstraintType TransformType; // 0x0007(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.ConstraintDescription
|
||||
// 0x000D
|
||||
struct FConstraintDescription
|
||||
{
|
||||
bool bTranslation; // 0x0000(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bRotation; // 0x0001(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bScale; // 0x0002(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bParent; // 0x0003(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FFilterOptionPerAxis TranslationAxes; // 0x0004(0x0003) (Edit, BlueprintVisible)
|
||||
struct FFilterOptionPerAxis RotationAxes; // 0x0007(0x0003) (Edit, BlueprintVisible)
|
||||
struct FFilterOptionPerAxis ScaleAxes; // 0x000A(0x0003) (Edit, BlueprintVisible)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.TransformConstraint
|
||||
// 0x0028
|
||||
struct FTransformConstraint
|
||||
{
|
||||
struct FConstraintDescription Operator; // 0x0000(0x000D) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x000D(0x0003) MISSED OFFSET
|
||||
struct FName SourceNode; // 0x0010(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FName TargetNode; // 0x0018(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Weight; // 0x0020(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
bool bMaintainOffset; // 0x0024(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x3]; // 0x0025(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.ConstraintOffset
|
||||
// 0x0060
|
||||
struct FConstraintOffset
|
||||
{
|
||||
struct FVector Translation; // 0x0000(0x000C) (IsPlainOldData)
|
||||
unsigned char UnknownData00[0x4]; // 0x000C(0x0004) MISSED OFFSET
|
||||
struct FQuat Rotation; // 0x0010(0x0010) (IsPlainOldData)
|
||||
struct FVector Scale; // 0x0020(0x000C) (IsPlainOldData)
|
||||
unsigned char UnknownData01[0x4]; // 0x002C(0x0004) MISSED OFFSET
|
||||
struct FTransform Parent; // 0x0030(0x0030) (IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.NodeChain
|
||||
// 0x000C
|
||||
struct FNodeChain
|
||||
{
|
||||
TArray<struct FName> Nodes; // 0x0000(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.NodeObject
|
||||
// 0x0010
|
||||
struct FNodeObject
|
||||
{
|
||||
struct FName Name; // 0x0000(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||
struct FName ParentName; // 0x0008(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.NodeHierarchyData
|
||||
// 0x0054
|
||||
struct FNodeHierarchyData
|
||||
{
|
||||
TArray<struct FNodeObject> Nodes; // 0x0000(0x000C) (ZeroConstructor)
|
||||
TArray<struct FTransform> Transforms; // 0x000C(0x000C) (ZeroConstructor)
|
||||
TMap<struct FName, int> NodeNameToIndexMapping; // 0x0018(0x0050) (ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AnimationCore.NodeHierarchyWithUserData
|
||||
// 0x0058
|
||||
struct FNodeHierarchyWithUserData
|
||||
{
|
||||
unsigned char UnknownData00[0x4]; // 0x0000(0x0004) MISSED OFFSET
|
||||
struct FNodeHierarchyData Hierarchy; // 0x0004(0x0054)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+112
@@ -0,0 +1,112 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class ApexDestruction.DestructibleActor
|
||||
// 0x0018 (0x02D0 - 0x02B8)
|
||||
class ADestructibleActor : public AActor
|
||||
{
|
||||
public:
|
||||
class UDestructibleComponent* DestructibleComponent; // 0x02B8(0x0004) (Edit, BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, EditConst, InstancedReference, IsPlainOldData)
|
||||
unsigned char bAffectNavigation : 1; // 0x02BC(0x0001) (Edit, BlueprintVisible, Config)
|
||||
unsigned char UnknownData00[0x3]; // 0x02BD(0x0003) MISSED OFFSET
|
||||
struct FScriptMulticastDelegate OnActorFracture; // 0x02C0(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
unsigned char UnknownData01[0x4]; // 0x02CC(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ApexDestruction.DestructibleActor");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class ApexDestruction.DestructibleComponent
|
||||
// 0x00B0 (0x07E0 - 0x0730)
|
||||
class UDestructibleComponent : public USkinnedMeshComponent
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x0730(0x0004) MISSED OFFSET
|
||||
unsigned char bFractureEffectOverride : 1; // 0x0734(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData01[0x3]; // 0x0735(0x0003) MISSED OFFSET
|
||||
TArray<struct FFractureEffect> FractureEffects; // 0x0738(0x000C) (Edit, BlueprintVisible, BlueprintReadOnly, EditFixedSize, ZeroConstructor)
|
||||
bool bEnableHardSleeping; // 0x0744(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x3]; // 0x0745(0x0003) MISSED OFFSET
|
||||
float LargeChunkThreshold; // 0x0748(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData03[0xC]; // 0x074C(0x000C) MISSED OFFSET
|
||||
struct FScriptMulticastDelegate OnComponentFracture; // 0x0758(0x000C) (ZeroConstructor, InstancedReference, BlueprintAssignable)
|
||||
unsigned char UnknownData04[0x7C]; // 0x0764(0x007C) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ApexDestruction.DestructibleComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void SetDestructibleMesh(class UDestructibleMesh* NewMesh);
|
||||
class UDestructibleMesh* GetDestructibleMesh();
|
||||
void ApplyRadiusDamage(float BaseDamage, const struct FVector& HurtOrigin, float DamageRadius, float ImpulseStrength, bool bFullDamage);
|
||||
void ApplyDamage(float DamageAmount, const struct FVector& HitLocation, const struct FVector& ImpulseDir, float ImpulseStrength);
|
||||
};
|
||||
|
||||
|
||||
// Class ApexDestruction.DestructibleFractureSettings
|
||||
// 0x0054 (0x0070 - 0x001C)
|
||||
class UDestructibleFractureSettings : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
struct FFractureMaterial FractureMaterialDesc; // 0x0020(0x0024) (Edit, Transient)
|
||||
int RandomSeed; // 0x0044(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FVector> VoronoiSites; // 0x0048(0x000C) (ZeroConstructor)
|
||||
int OriginalSubmeshCount; // 0x0054(0x0004) (ZeroConstructor, IsPlainOldData)
|
||||
TArray<class UMaterialInterface*> Materials; // 0x0058(0x000C) (ZeroConstructor)
|
||||
TArray<struct FDestructibleChunkParameters> ChunkParameters; // 0x0064(0x000C) (ZeroConstructor)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ApexDestruction.DestructibleFractureSettings");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class ApexDestruction.DestructibleMesh
|
||||
// 0x0088 (0x02A8 - 0x0220)
|
||||
class UDestructibleMesh : public USkeletalMesh
|
||||
{
|
||||
public:
|
||||
struct FDestructibleParameters DefaultDestructibleParameters; // 0x0220(0x007C) (Edit)
|
||||
TArray<struct FFractureEffect> FractureEffects; // 0x029C(0x000C) (Edit, EditFixedSize, ZeroConstructor)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class ApexDestruction.DestructibleMesh");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.SetDestructibleMesh
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UDestructibleMesh* NewMesh (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UDestructibleComponent::SetDestructibleMesh(class UDestructibleMesh* NewMesh)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function ApexDestruction.DestructibleComponent.SetDestructibleMesh");
|
||||
|
||||
UDestructibleComponent_SetDestructibleMesh_Params params;
|
||||
params.NewMesh = NewMesh;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.GetDestructibleMesh
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UDestructibleMesh* ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
class UDestructibleMesh* UDestructibleComponent::GetDestructibleMesh()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function ApexDestruction.DestructibleComponent.GetDestructibleMesh");
|
||||
|
||||
UDestructibleComponent_GetDestructibleMesh_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.ApplyRadiusDamage
|
||||
// (Native, Public, HasOutParms, HasDefaults, BlueprintCallable)
|
||||
// Parameters:
|
||||
// float BaseDamage (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FVector HurtOrigin (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// float DamageRadius (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float ImpulseStrength (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bFullDamage (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UDestructibleComponent::ApplyRadiusDamage(float BaseDamage, const struct FVector& HurtOrigin, float DamageRadius, float ImpulseStrength, bool bFullDamage)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function ApexDestruction.DestructibleComponent.ApplyRadiusDamage");
|
||||
|
||||
UDestructibleComponent_ApplyRadiusDamage_Params params;
|
||||
params.BaseDamage = BaseDamage;
|
||||
params.HurtOrigin = HurtOrigin;
|
||||
params.DamageRadius = DamageRadius;
|
||||
params.ImpulseStrength = ImpulseStrength;
|
||||
params.bFullDamage = bFullDamage;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.ApplyDamage
|
||||
// (Native, Public, HasOutParms, HasDefaults, BlueprintCallable)
|
||||
// Parameters:
|
||||
// float DamageAmount (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FVector HitLocation (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// struct FVector ImpulseDir (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
// float ImpulseStrength (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UDestructibleComponent::ApplyDamage(float DamageAmount, const struct FVector& HitLocation, const struct FVector& ImpulseDir, float ImpulseStrength)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function ApexDestruction.DestructibleComponent.ApplyDamage");
|
||||
|
||||
UDestructibleComponent_ApplyDamage_Params params;
|
||||
params.DamageAmount = DamageAmount;
|
||||
params.HitLocation = HitLocation;
|
||||
params.ImpulseDir = ImpulseDir;
|
||||
params.ImpulseStrength = ImpulseStrength;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.SetDestructibleMesh
|
||||
struct UDestructibleComponent_SetDestructibleMesh_Params
|
||||
{
|
||||
class UDestructibleMesh* NewMesh; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.GetDestructibleMesh
|
||||
struct UDestructibleComponent_GetDestructibleMesh_Params
|
||||
{
|
||||
class UDestructibleMesh* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.ApplyRadiusDamage
|
||||
struct UDestructibleComponent_ApplyRadiusDamage_Params
|
||||
{
|
||||
float BaseDamage; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector HurtOrigin; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
float DamageRadius; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float ImpulseStrength; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bFullDamage; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function ApexDestruction.DestructibleComponent.ApplyDamage
|
||||
struct UDestructibleComponent_ApplyDamage_Params
|
||||
{
|
||||
float DamageAmount; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FVector HitLocation; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
struct FVector ImpulseDir; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData)
|
||||
float ImpulseStrength; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+134
@@ -0,0 +1,134 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum ApexDestruction.EImpactDamageOverride
|
||||
enum class EImpactDamageOverride : uint8_t
|
||||
{
|
||||
IDO_None = 0,
|
||||
IDO_On = 1,
|
||||
IDO_Off = 2,
|
||||
IDO_MAX = 3
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct ApexDestruction.FractureMaterial
|
||||
// 0x0024
|
||||
struct FFractureMaterial
|
||||
{
|
||||
struct FVector2D UVScale; // 0x0000(0x0008) (Edit, IsPlainOldData)
|
||||
struct FVector2D UVOffset; // 0x0008(0x0008) (Edit, IsPlainOldData)
|
||||
struct FVector Tangent; // 0x0010(0x000C) (Edit, IsPlainOldData)
|
||||
float UAngle; // 0x001C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
int InteriorElementIndex; // 0x0020(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleChunkParameters
|
||||
// 0x0004
|
||||
struct FDestructibleChunkParameters
|
||||
{
|
||||
bool bIsSupportChunk; // 0x0000(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bDoNotFracture; // 0x0001(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bDoNotDamage; // 0x0002(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bDoNotCrumble; // 0x0003(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleDamageParameters
|
||||
// 0x001C
|
||||
struct FDestructibleDamageParameters
|
||||
{
|
||||
float DamageThreshold; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float DamageSpread; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bEnableImpactDamage; // 0x0008(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0009(0x0003) MISSED OFFSET
|
||||
float ImpactDamage; // 0x000C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
int DefaultImpactDamageDepth; // 0x0010(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bCustomImpactResistance; // 0x0014(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData01[0x3]; // 0x0015(0x0003) MISSED OFFSET
|
||||
float ImpactResistance; // 0x0018(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleDebrisParameters
|
||||
// 0x002C
|
||||
struct FDestructibleDebrisParameters
|
||||
{
|
||||
float DebrisLifetimeMin; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float DebrisLifetimeMax; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float DebrisMaxSeparationMin; // 0x0008(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float DebrisMaxSeparationMax; // 0x000C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
struct FBox ValidBounds; // 0x0010(0x001C) (Edit, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleAdvancedParameters
|
||||
// 0x0010
|
||||
struct FDestructibleAdvancedParameters
|
||||
{
|
||||
float DamageCap; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float ImpactVelocityThreshold; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float MaxChunkSpeed; // 0x0008(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
float FractureImpulseScale; // 0x000C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleSpecialHierarchyDepths
|
||||
// 0x0014
|
||||
struct FDestructibleSpecialHierarchyDepths
|
||||
{
|
||||
int SupportDepth; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
int MinimumFractureDepth; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
bool bEnableDebris; // 0x0008(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0009(0x0003) MISSED OFFSET
|
||||
int DebrisDepth; // 0x000C(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
int EssentialDepth; // 0x0010(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleDepthParameters
|
||||
// 0x0001
|
||||
struct FDestructibleDepthParameters
|
||||
{
|
||||
TEnumAsByte<EImpactDamageOverride> ImpactDamageOverride; // 0x0000(0x0001) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleParametersFlag
|
||||
// 0x0004
|
||||
struct FDestructibleParametersFlag
|
||||
{
|
||||
unsigned char bAccumulateDamage : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bAssetDefinedSupport : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bWorldSupport : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bDebrisTimeout : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bDebrisMaxSeparation : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bCrumbleSmallestChunks : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bAccurateRaycasts : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bUseValidBounds : 1; // 0x0000(0x0001) (Edit)
|
||||
unsigned char bFormExtendedStructures : 1; // 0x0001(0x0001) (Edit)
|
||||
unsigned char UnknownData00[0x2]; // 0x0002(0x0002) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct ApexDestruction.DestructibleParameters
|
||||
// 0x007C
|
||||
struct FDestructibleParameters
|
||||
{
|
||||
struct FDestructibleDamageParameters DamageParameters; // 0x0000(0x001C) (Edit)
|
||||
struct FDestructibleDebrisParameters DebrisParameters; // 0x001C(0x002C) (Edit)
|
||||
struct FDestructibleAdvancedParameters AdvancedParameters; // 0x0048(0x0010) (Edit)
|
||||
struct FDestructibleSpecialHierarchyDepths SpecialHierarchyDepths; // 0x0058(0x0014) (Edit)
|
||||
TArray<struct FDestructibleDepthParameters> DepthParameters; // 0x006C(0x000C) (Edit, EditFixedSize, ZeroConstructor)
|
||||
struct FDestructibleParametersFlag Flags; // 0x0078(0x0004) (Edit)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+94
@@ -0,0 +1,94 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AssetRegistry.AssetRegistryImpl
|
||||
// 0x0874 (0x0890 - 0x001C)
|
||||
class UAssetRegistryImpl : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x874]; // 0x001C(0x0874) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AssetRegistry.AssetRegistryImpl");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AssetRegistry.AssetRegistryHelpers
|
||||
// 0x0004 (0x0020 - 0x001C)
|
||||
class UAssetRegistryHelpers : public UObject
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AssetRegistry.AssetRegistryHelpers");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
static struct FSoftObjectPath ToSoftObjectPath(const struct FAssetData& InAssetData);
|
||||
static struct FARFilter SetFilterTagsAndValues(const struct FARFilter& InFilter, TArray<struct FTagAndValue> InTagsAndValues);
|
||||
static bool IsValid(const struct FAssetData& InAssetData);
|
||||
static bool IsUAsset(const struct FAssetData& InAssetData);
|
||||
static bool IsRedirector(const struct FAssetData& InAssetData);
|
||||
static bool IsAssetLoaded(const struct FAssetData& InAssetData);
|
||||
static bool GetTagValue(const struct FAssetData& InAssetData, const struct FName& InTagName, struct FString* OutTagValue);
|
||||
static struct FString GetFullName(const struct FAssetData& InAssetData);
|
||||
static struct FString GetExportTextName(const struct FAssetData& InAssetData);
|
||||
static class UClass* GetClass(const struct FAssetData& InAssetData);
|
||||
static TScriptInterface<class UAssetRegistry> GetAssetRegistry();
|
||||
static class UObject* GetAsset(const struct FAssetData& InAssetData);
|
||||
static struct FAssetData CreateAssetData(class UObject* InAsset, bool bAllowBlueprintClass);
|
||||
};
|
||||
|
||||
|
||||
// Class AssetRegistry.AssetRegistry
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UAssetRegistry : public UInterface
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AssetRegistry.AssetRegistry");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void RunAssetsThroughFilter(const struct FARFilter& Filter, TArray<struct FAssetData>* AssetDataList);
|
||||
bool IsLoadingAssets();
|
||||
bool HasAssets(const struct FName& PackagePath, bool bRecursive);
|
||||
void GetSubPaths(const struct FString& InBasePath, bool bInRecurse, TArray<struct FString>* OutPathList);
|
||||
bool GetAssetsByPath(const struct FName& PackagePath, bool bRecursive, bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData);
|
||||
bool GetAssetsByPackageName(const struct FName& PackageName, bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData);
|
||||
bool GetAssetsByClass(const struct FName& ClassName, bool bSearchSubClasses, TArray<struct FAssetData>* OutAssetData);
|
||||
bool GetAssets(const struct FARFilter& Filter, TArray<struct FAssetData>* OutAssetData);
|
||||
struct FAssetData GetAssetByObjectPath(const struct FName& ObjectPath, bool bIncludeOnlyOnDiskAssets);
|
||||
void GetAllCachedPaths(TArray<struct FString>* OutPathList);
|
||||
bool GetAllAssets(bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
Executable
+704
@@ -0,0 +1,704 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.ToSoftObjectPath
|
||||
// (Final, Native, Static, Public, HasOutParms, HasDefaults, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// struct FSoftObjectPath ReturnValue (Parm, OutParm, ReturnParm)
|
||||
|
||||
struct FSoftObjectPath UAssetRegistryHelpers::ToSoftObjectPath(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.ToSoftObjectPath");
|
||||
|
||||
UAssetRegistryHelpers_ToSoftObjectPath_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.SetFilterTagsAndValues
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FARFilter InFilter (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// TArray<struct FTagAndValue> InTagsAndValues (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
// struct FARFilter ReturnValue (Parm, OutParm, ReturnParm)
|
||||
|
||||
struct FARFilter UAssetRegistryHelpers::SetFilterTagsAndValues(const struct FARFilter& InFilter, TArray<struct FTagAndValue> InTagsAndValues)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.SetFilterTagsAndValues");
|
||||
|
||||
UAssetRegistryHelpers_SetFilterTagsAndValues_Params params;
|
||||
params.InFilter = InFilter;
|
||||
params.InTagsAndValues = InTagsAndValues;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsValid
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistryHelpers::IsValid(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.IsValid");
|
||||
|
||||
UAssetRegistryHelpers_IsValid_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsUAsset
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistryHelpers::IsUAsset(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.IsUAsset");
|
||||
|
||||
UAssetRegistryHelpers_IsUAsset_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsRedirector
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistryHelpers::IsRedirector(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.IsRedirector");
|
||||
|
||||
UAssetRegistryHelpers_IsRedirector_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsAssetLoaded
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistryHelpers::IsAssetLoaded(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.IsAssetLoaded");
|
||||
|
||||
UAssetRegistryHelpers_IsAssetLoaded_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetTagValue
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// struct FName InTagName (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData)
|
||||
// struct FString OutTagValue (Parm, OutParm, ZeroConstructor)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistryHelpers::GetTagValue(const struct FAssetData& InAssetData, const struct FName& InTagName, struct FString* OutTagValue)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetTagValue");
|
||||
|
||||
UAssetRegistryHelpers_GetTagValue_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
params.InTagName = InTagName;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutTagValue != nullptr)
|
||||
*OutTagValue = params.OutTagValue;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetFullName
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// struct FString ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm)
|
||||
|
||||
struct FString UAssetRegistryHelpers::GetFullName(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetFullName");
|
||||
|
||||
UAssetRegistryHelpers_GetFullName_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetExportTextName
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// struct FString ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm)
|
||||
|
||||
struct FString UAssetRegistryHelpers::GetExportTextName(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetExportTextName");
|
||||
|
||||
UAssetRegistryHelpers_GetExportTextName_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetClass
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// class UClass* ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
class UClass* UAssetRegistryHelpers::GetClass(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetClass");
|
||||
|
||||
UAssetRegistryHelpers_GetClass_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetAssetRegistry
|
||||
// (Final, Native, Static, Public, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// TScriptInterface<class UAssetRegistry> ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
TScriptInterface<class UAssetRegistry> UAssetRegistryHelpers::GetAssetRegistry()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetAssetRegistry");
|
||||
|
||||
UAssetRegistryHelpers_GetAssetRegistry_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetAsset
|
||||
// (Final, Native, Static, Public, HasOutParms, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// struct FAssetData InAssetData (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// class UObject* ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
class UObject* UAssetRegistryHelpers::GetAsset(const struct FAssetData& InAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.GetAsset");
|
||||
|
||||
UAssetRegistryHelpers_GetAsset_Params params;
|
||||
params.InAssetData = InAssetData;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.CreateAssetData
|
||||
// (Final, Native, Static, Public, BlueprintCallable, BlueprintPure)
|
||||
// Parameters:
|
||||
// class UObject* InAsset (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bAllowBlueprintClass (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FAssetData ReturnValue (Parm, OutParm, ReturnParm)
|
||||
|
||||
struct FAssetData UAssetRegistryHelpers::CreateAssetData(class UObject* InAsset, bool bAllowBlueprintClass)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistryHelpers.CreateAssetData");
|
||||
|
||||
UAssetRegistryHelpers_CreateAssetData_Params params;
|
||||
params.InAsset = InAsset;
|
||||
params.bAllowBlueprintClass = bAllowBlueprintClass;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.RunAssetsThroughFilter
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// TArray<struct FAssetData> AssetDataList (Parm, OutParm, ZeroConstructor)
|
||||
// struct FARFilter Filter (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void UAssetRegistry::RunAssetsThroughFilter(const struct FARFilter& Filter, TArray<struct FAssetData>* AssetDataList)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.RunAssetsThroughFilter");
|
||||
|
||||
UAssetRegistry_RunAssetsThroughFilter_Params params;
|
||||
params.Filter = Filter;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (AssetDataList != nullptr)
|
||||
*AssetDataList = params.AssetDataList;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.IsLoadingAssets
|
||||
// (Native, Public, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::IsLoadingAssets()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.IsLoadingAssets");
|
||||
|
||||
UAssetRegistry_IsLoadingAssets_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.HasAssets
|
||||
// (Native, Public, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FName PackagePath (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bRecursive (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::HasAssets(const struct FName& PackagePath, bool bRecursive)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.HasAssets");
|
||||
|
||||
UAssetRegistry_HasAssets_Params params;
|
||||
params.PackagePath = PackagePath;
|
||||
params.bRecursive = bRecursive;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetSubPaths
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FString InBasePath (Parm, ZeroConstructor)
|
||||
// TArray<struct FString> OutPathList (Parm, OutParm, ZeroConstructor)
|
||||
// bool bInRecurse (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAssetRegistry::GetSubPaths(const struct FString& InBasePath, bool bInRecurse, TArray<struct FString>* OutPathList)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetSubPaths");
|
||||
|
||||
UAssetRegistry_GetSubPaths_Params params;
|
||||
params.InBasePath = InBasePath;
|
||||
params.bInRecurse = bInRecurse;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutPathList != nullptr)
|
||||
*OutPathList = params.OutPathList;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByPath
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FName PackagePath (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// TArray<struct FAssetData> OutAssetData (Parm, OutParm, ZeroConstructor)
|
||||
// bool bRecursive (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bIncludeOnlyOnDiskAssets (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::GetAssetsByPath(const struct FName& PackagePath, bool bRecursive, bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAssetsByPath");
|
||||
|
||||
UAssetRegistry_GetAssetsByPath_Params params;
|
||||
params.PackagePath = PackagePath;
|
||||
params.bRecursive = bRecursive;
|
||||
params.bIncludeOnlyOnDiskAssets = bIncludeOnlyOnDiskAssets;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutAssetData != nullptr)
|
||||
*OutAssetData = params.OutAssetData;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByPackageName
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FName PackageName (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// TArray<struct FAssetData> OutAssetData (Parm, OutParm, ZeroConstructor)
|
||||
// bool bIncludeOnlyOnDiskAssets (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::GetAssetsByPackageName(const struct FName& PackageName, bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAssetsByPackageName");
|
||||
|
||||
UAssetRegistry_GetAssetsByPackageName_Params params;
|
||||
params.PackageName = PackageName;
|
||||
params.bIncludeOnlyOnDiskAssets = bIncludeOnlyOnDiskAssets;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutAssetData != nullptr)
|
||||
*OutAssetData = params.OutAssetData;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByClass
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FName ClassName (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// TArray<struct FAssetData> OutAssetData (Parm, OutParm, ZeroConstructor)
|
||||
// bool bSearchSubClasses (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::GetAssetsByClass(const struct FName& ClassName, bool bSearchSubClasses, TArray<struct FAssetData>* OutAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAssetsByClass");
|
||||
|
||||
UAssetRegistry_GetAssetsByClass_Params params;
|
||||
params.ClassName = ClassName;
|
||||
params.bSearchSubClasses = bSearchSubClasses;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutAssetData != nullptr)
|
||||
*OutAssetData = params.OutAssetData;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssets
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FARFilter Filter (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
// TArray<struct FAssetData> OutAssetData (Parm, OutParm, ZeroConstructor)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::GetAssets(const struct FARFilter& Filter, TArray<struct FAssetData>* OutAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAssets");
|
||||
|
||||
UAssetRegistry_GetAssets_Params params;
|
||||
params.Filter = Filter;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutAssetData != nullptr)
|
||||
*OutAssetData = params.OutAssetData;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetByObjectPath
|
||||
// (Native, Public, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// struct FName ObjectPath (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bIncludeOnlyOnDiskAssets (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FAssetData ReturnValue (Parm, OutParm, ReturnParm)
|
||||
|
||||
struct FAssetData UAssetRegistry::GetAssetByObjectPath(const struct FName& ObjectPath, bool bIncludeOnlyOnDiskAssets)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAssetByObjectPath");
|
||||
|
||||
UAssetRegistry_GetAssetByObjectPath_Params params;
|
||||
params.ObjectPath = ObjectPath;
|
||||
params.bIncludeOnlyOnDiskAssets = bIncludeOnlyOnDiskAssets;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAllCachedPaths
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// TArray<struct FString> OutPathList (Parm, OutParm, ZeroConstructor)
|
||||
|
||||
void UAssetRegistry::GetAllCachedPaths(TArray<struct FString>* OutPathList)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAllCachedPaths");
|
||||
|
||||
UAssetRegistry_GetAllCachedPaths_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutPathList != nullptr)
|
||||
*OutPathList = params.OutPathList;
|
||||
}
|
||||
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAllAssets
|
||||
// (Native, Public, HasOutParms, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// TArray<struct FAssetData> OutAssetData (Parm, OutParm, ZeroConstructor)
|
||||
// bool bIncludeOnlyOnDiskAssets (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool UAssetRegistry::GetAllAssets(bool bIncludeOnlyOnDiskAssets, TArray<struct FAssetData>* OutAssetData)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AssetRegistry.AssetRegistry.GetAllAssets");
|
||||
|
||||
UAssetRegistry_GetAllAssets_Params params;
|
||||
params.bIncludeOnlyOnDiskAssets = bIncludeOnlyOnDiskAssets;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
if (OutAssetData != nullptr)
|
||||
*OutAssetData = params.OutAssetData;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.ToSoftObjectPath
|
||||
struct UAssetRegistryHelpers_ToSoftObjectPath_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
struct FSoftObjectPath ReturnValue; // (Parm, OutParm, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.SetFilterTagsAndValues
|
||||
struct UAssetRegistryHelpers_SetFilterTagsAndValues_Params
|
||||
{
|
||||
struct FARFilter InFilter; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
TArray<struct FTagAndValue> InTagsAndValues; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm)
|
||||
struct FARFilter ReturnValue; // (Parm, OutParm, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsValid
|
||||
struct UAssetRegistryHelpers_IsValid_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsUAsset
|
||||
struct UAssetRegistryHelpers_IsUAsset_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsRedirector
|
||||
struct UAssetRegistryHelpers_IsRedirector_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.IsAssetLoaded
|
||||
struct UAssetRegistryHelpers_IsAssetLoaded_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetTagValue
|
||||
struct UAssetRegistryHelpers_GetTagValue_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
struct FName InTagName; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData)
|
||||
struct FString OutTagValue; // (Parm, OutParm, ZeroConstructor)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetFullName
|
||||
struct UAssetRegistryHelpers_GetFullName_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
struct FString ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetExportTextName
|
||||
struct UAssetRegistryHelpers_GetExportTextName_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
struct FString ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetClass
|
||||
struct UAssetRegistryHelpers_GetClass_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
class UClass* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetAssetRegistry
|
||||
struct UAssetRegistryHelpers_GetAssetRegistry_Params
|
||||
{
|
||||
TScriptInterface<class UAssetRegistry> ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.GetAsset
|
||||
struct UAssetRegistryHelpers_GetAsset_Params
|
||||
{
|
||||
struct FAssetData InAssetData; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
class UObject* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistryHelpers.CreateAssetData
|
||||
struct UAssetRegistryHelpers_CreateAssetData_Params
|
||||
{
|
||||
class UObject* InAsset; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bAllowBlueprintClass; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FAssetData ReturnValue; // (Parm, OutParm, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.RunAssetsThroughFilter
|
||||
struct UAssetRegistry_RunAssetsThroughFilter_Params
|
||||
{
|
||||
TArray<struct FAssetData> AssetDataList; // (Parm, OutParm, ZeroConstructor)
|
||||
struct FARFilter Filter; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.IsLoadingAssets
|
||||
struct UAssetRegistry_IsLoadingAssets_Params
|
||||
{
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.HasAssets
|
||||
struct UAssetRegistry_HasAssets_Params
|
||||
{
|
||||
struct FName PackagePath; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bRecursive; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetSubPaths
|
||||
struct UAssetRegistry_GetSubPaths_Params
|
||||
{
|
||||
struct FString InBasePath; // (Parm, ZeroConstructor)
|
||||
TArray<struct FString> OutPathList; // (Parm, OutParm, ZeroConstructor)
|
||||
bool bInRecurse; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByPath
|
||||
struct UAssetRegistry_GetAssetsByPath_Params
|
||||
{
|
||||
struct FName PackagePath; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FAssetData> OutAssetData; // (Parm, OutParm, ZeroConstructor)
|
||||
bool bRecursive; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bIncludeOnlyOnDiskAssets; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByPackageName
|
||||
struct UAssetRegistry_GetAssetsByPackageName_Params
|
||||
{
|
||||
struct FName PackageName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FAssetData> OutAssetData; // (Parm, OutParm, ZeroConstructor)
|
||||
bool bIncludeOnlyOnDiskAssets; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetsByClass
|
||||
struct UAssetRegistry_GetAssetsByClass_Params
|
||||
{
|
||||
struct FName ClassName; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FAssetData> OutAssetData; // (Parm, OutParm, ZeroConstructor)
|
||||
bool bSearchSubClasses; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssets
|
||||
struct UAssetRegistry_GetAssets_Params
|
||||
{
|
||||
struct FARFilter Filter; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
TArray<struct FAssetData> OutAssetData; // (Parm, OutParm, ZeroConstructor)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAssetByObjectPath
|
||||
struct UAssetRegistry_GetAssetByObjectPath_Params
|
||||
{
|
||||
struct FName ObjectPath; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bIncludeOnlyOnDiskAssets; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FAssetData ReturnValue; // (Parm, OutParm, ReturnParm)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAllCachedPaths
|
||||
struct UAssetRegistry_GetAllCachedPaths_Params
|
||||
{
|
||||
TArray<struct FString> OutPathList; // (Parm, OutParm, ZeroConstructor)
|
||||
};
|
||||
|
||||
// Function AssetRegistry.AssetRegistry.GetAllAssets
|
||||
struct UAssetRegistry_GetAllAssets_Params
|
||||
{
|
||||
TArray<struct FAssetData> OutAssetData; // (Parm, OutParm, ZeroConstructor)
|
||||
bool bIncludeOnlyOnDiskAssets; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AssetRegistry.AssetData
|
||||
// 0x0040
|
||||
struct FAssetData
|
||||
{
|
||||
struct FName ObjectPath; // 0x0000(0x0008) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
struct FName PackageName; // 0x0008(0x0008) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
struct FName PackagePath; // 0x0010(0x0008) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
struct FName AssetName; // 0x0018(0x0008) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
struct FName AssetClass; // 0x0020(0x0008) (BlueprintVisible, BlueprintReadOnly, ZeroConstructor, Transient, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x18]; // 0x0028(0x0018) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AssetRegistry.ARFilter
|
||||
// 0x00AC
|
||||
struct FARFilter
|
||||
{
|
||||
TArray<struct FName> PackageNames; // 0x0000(0x000C) (BlueprintVisible, ZeroConstructor, Transient)
|
||||
TArray<struct FName> PackagePaths; // 0x000C(0x000C) (BlueprintVisible, ZeroConstructor, Transient)
|
||||
TArray<struct FName> ObjectPaths; // 0x0018(0x000C) (BlueprintVisible, ZeroConstructor, Transient)
|
||||
TArray<struct FName> ClassNames; // 0x0024(0x000C) (BlueprintVisible, ZeroConstructor, Transient)
|
||||
unsigned char UnknownData00[0x3C]; // 0x0030(0x003C) MISSED OFFSET
|
||||
unsigned char UnknownData01[0x3C]; // 0x0030(0x003C) UNKNOWN PROPERTY: SetProperty AssetRegistry.ARFilter.RecursiveClassesExclusionSet
|
||||
bool bRecursivePaths; // 0x00A8(0x0001) (BlueprintVisible, ZeroConstructor, Transient, IsPlainOldData)
|
||||
bool bRecursiveClasses; // 0x00A9(0x0001) (BlueprintVisible, ZeroConstructor, Transient, IsPlainOldData)
|
||||
bool bIncludeOnlyOnDiskAssets; // 0x00AA(0x0001) (BlueprintVisible, ZeroConstructor, Transient, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x1]; // 0x00AB(0x0001) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AssetRegistry.TagAndValue
|
||||
// 0x0018
|
||||
struct FTagAndValue
|
||||
{
|
||||
struct FName Tag; // 0x0000(0x0008) (BlueprintVisible, ZeroConstructor, Transient, IsPlainOldData)
|
||||
struct FString Value; // 0x0008(0x000C) (BlueprintVisible, ZeroConstructor, Transient)
|
||||
unsigned char UnknownData00[0x4]; // 0x0014(0x0004) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AssetRegistry.AssetBundleEntry
|
||||
// 0x0028
|
||||
struct FAssetBundleEntry
|
||||
{
|
||||
struct FPrimaryAssetId BundleScope; // 0x0000(0x0010)
|
||||
struct FName BundleName; // 0x0010(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FSoftObjectPath> BundleAssets; // 0x0018(0x000C) (ZeroConstructor)
|
||||
unsigned char UnknownData00[0x4]; // 0x0024(0x0004) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AssetRegistry.AssetBundleData
|
||||
// 0x000C
|
||||
struct FAssetBundleData
|
||||
{
|
||||
TArray<struct FAssetBundleEntry> Bundles; // 0x0000(0x000C) (ZeroConstructor)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+161
@@ -0,0 +1,161 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Class AudioMixer.AudioMixerBlueprintLibrary
|
||||
// 0x0000 (0x0020 - 0x0020)
|
||||
class UAudioMixerBlueprintLibrary : public UBlueprintFunctionLibrary
|
||||
{
|
||||
public:
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.AudioMixerBlueprintLibrary");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
static void SetBypassSourceEffectChainEntry(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, int EntryIndex, bool bBypassed);
|
||||
static void RemoveSourceEffectFromPresetChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, int EntryIndex);
|
||||
static void RemoveMasterSubmixEffect(class UObject* WorldContextObject, class USoundEffectSubmixPreset* SubmixEffectPreset);
|
||||
static int GetNumberOfEntriesInSourceEffectChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain);
|
||||
static void ClearMasterSubmixEffects(class UObject* WorldContextObject);
|
||||
static void AddSourceEffectToPresetChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, const struct FSourceEffectChainEntry& Entry);
|
||||
static void AddMasterSubmixEffect(class UObject* WorldContextObject, class USoundEffectSubmixPreset* SubmixEffectPreset);
|
||||
};
|
||||
|
||||
|
||||
// Class AudioMixer.SubmixEffectDynamicsProcessorPreset
|
||||
// 0x0050 (0x0080 - 0x0030)
|
||||
class USubmixEffectDynamicsProcessorPreset : public USoundEffectSubmixPreset
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x28]; // 0x0030(0x0028) MISSED OFFSET
|
||||
struct FSubmixEffectDynamicsProcessorSettings Settings; // 0x0058(0x0028) (Edit, BlueprintVisible)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.SubmixEffectDynamicsProcessorPreset");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void SetSettings(const struct FSubmixEffectDynamicsProcessorSettings& InSettings);
|
||||
};
|
||||
|
||||
|
||||
// Class AudioMixer.SubmixEffectSubmixEQPreset
|
||||
// 0x0018 (0x0048 - 0x0030)
|
||||
class USubmixEffectSubmixEQPreset : public USoundEffectSubmixPreset
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0xC]; // 0x0030(0x000C) MISSED OFFSET
|
||||
struct FSubmixEffectSubmixEQSettings Settings; // 0x003C(0x000C) (Edit, BlueprintVisible)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.SubmixEffectSubmixEQPreset");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void SetSettings(const struct FSubmixEffectSubmixEQSettings& InSettings);
|
||||
};
|
||||
|
||||
|
||||
// Class AudioMixer.SubmixEffectReverbPreset
|
||||
// 0x0060 (0x0090 - 0x0030)
|
||||
class USubmixEffectReverbPreset : public USoundEffectSubmixPreset
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x30]; // 0x0030(0x0030) MISSED OFFSET
|
||||
struct FSubmixEffectReverbSettings Settings; // 0x0060(0x0030) (Edit, BlueprintVisible)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.SubmixEffectReverbPreset");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void SetSettingsWithReverbEffect(class UReverbEffect* InReverbEffect, float WetLevel);
|
||||
void SetSettings(const struct FSubmixEffectReverbSettings& InSettings);
|
||||
};
|
||||
|
||||
|
||||
// Class AudioMixer.SynthSound
|
||||
// 0x0010 (0x0260 - 0x0250)
|
||||
class USynthSound : public USoundWaveProcedural
|
||||
{
|
||||
public:
|
||||
unsigned char UnknownData00[0x10]; // 0x0250(0x0010) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.SynthSound");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Class AudioMixer.SynthComponent
|
||||
// 0x0270 (0x0530 - 0x02C0)
|
||||
class USynthComponent : public USceneComponent
|
||||
{
|
||||
public:
|
||||
unsigned char bAutoDestroy : 1; // 0x02C0(0x0001)
|
||||
unsigned char bStopWhenOwnerDestroyed : 1; // 0x02C0(0x0001)
|
||||
unsigned char bAllowSpatialization : 1; // 0x02C0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char bOverrideAttenuation : 1; // 0x02C0(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x02C1(0x0003) MISSED OFFSET
|
||||
class USoundAttenuation* AttenuationSettings; // 0x02C4(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FSoundAttenuationSettings AttenuationOverrides; // 0x02C8(0x0214) (Edit, BlueprintVisible)
|
||||
class USoundConcurrency* ConcurrencySettings; // 0x04DC(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
class USoundClass* SoundClass; // 0x04E0(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSourcePresetChain* SourceEffectChain; // 0x04E4(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
class USoundSubmix* SoundSubmix; // 0x04E8(0x0004) (Edit, ZeroConstructor, IsPlainOldData)
|
||||
TArray<struct FSoundSubmixSendInfo> SoundSubmixSends; // 0x04EC(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
unsigned char bIsUISound : 1; // 0x04F8(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData01[0x7]; // 0x04F9(0x0007) MISSED OFFSET
|
||||
class USynthSound* Synth; // 0x0500(0x0004) (ZeroConstructor, Transient, IsPlainOldData)
|
||||
class UAudioComponent* AudioComponent; // 0x0504(0x0004) (ExportObject, ZeroConstructor, Transient, InstancedReference, IsPlainOldData)
|
||||
unsigned char UnknownData02[0x28]; // 0x0508(0x0028) MISSED OFFSET
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("Class AudioMixer.SynthComponent");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void Stop();
|
||||
void Start();
|
||||
void SetSubmixSend(class USoundSubmix* Submix, float SendLevel);
|
||||
bool IsPlaying();
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
Executable
+397
@@ -0,0 +1,397 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.SetBypassSourceEffectChainEntry
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSourcePresetChain* PresetChain (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// int EntryIndex (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// bool bBypassed (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::SetBypassSourceEffectChainEntry(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, int EntryIndex, bool bBypassed)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.SetBypassSourceEffectChainEntry");
|
||||
|
||||
UAudioMixerBlueprintLibrary_SetBypassSourceEffectChainEntry_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.PresetChain = PresetChain;
|
||||
params.EntryIndex = EntryIndex;
|
||||
params.bBypassed = bBypassed;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.RemoveSourceEffectFromPresetChain
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSourcePresetChain* PresetChain (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// int EntryIndex (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::RemoveSourceEffectFromPresetChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, int EntryIndex)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.RemoveSourceEffectFromPresetChain");
|
||||
|
||||
UAudioMixerBlueprintLibrary_RemoveSourceEffectFromPresetChain_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.PresetChain = PresetChain;
|
||||
params.EntryIndex = EntryIndex;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.RemoveMasterSubmixEffect
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSubmixPreset* SubmixEffectPreset (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::RemoveMasterSubmixEffect(class UObject* WorldContextObject, class USoundEffectSubmixPreset* SubmixEffectPreset)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.RemoveMasterSubmixEffect");
|
||||
|
||||
UAudioMixerBlueprintLibrary_RemoveMasterSubmixEffect_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.SubmixEffectPreset = SubmixEffectPreset;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.GetNumberOfEntriesInSourceEffectChain
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSourcePresetChain* PresetChain (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// int ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
int UAudioMixerBlueprintLibrary::GetNumberOfEntriesInSourceEffectChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.GetNumberOfEntriesInSourceEffectChain");
|
||||
|
||||
UAudioMixerBlueprintLibrary_GetNumberOfEntriesInSourceEffectChain_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.PresetChain = PresetChain;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.ClearMasterSubmixEffects
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::ClearMasterSubmixEffects(class UObject* WorldContextObject)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.ClearMasterSubmixEffects");
|
||||
|
||||
UAudioMixerBlueprintLibrary_ClearMasterSubmixEffects_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.AddSourceEffectToPresetChain
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSourcePresetChain* PresetChain (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// struct FSourceEffectChainEntry Entry (Parm, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::AddSourceEffectToPresetChain(class UObject* WorldContextObject, class USoundEffectSourcePresetChain* PresetChain, const struct FSourceEffectChainEntry& Entry)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.AddSourceEffectToPresetChain");
|
||||
|
||||
UAudioMixerBlueprintLibrary_AddSourceEffectToPresetChain_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.PresetChain = PresetChain;
|
||||
params.Entry = Entry;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.AddMasterSubmixEffect
|
||||
// (Final, Native, Static, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UObject* WorldContextObject (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// class USoundEffectSubmixPreset* SubmixEffectPreset (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void UAudioMixerBlueprintLibrary::AddMasterSubmixEffect(class UObject* WorldContextObject, class USoundEffectSubmixPreset* SubmixEffectPreset)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.AudioMixerBlueprintLibrary.AddMasterSubmixEffect");
|
||||
|
||||
UAudioMixerBlueprintLibrary_AddMasterSubmixEffect_Params params;
|
||||
params.WorldContextObject = WorldContextObject;
|
||||
params.SubmixEffectPreset = SubmixEffectPreset;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
static auto defaultObj = StaticClass()->GetDefaultObject();
|
||||
defaultObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SubmixEffectDynamicsProcessorPreset.SetSettings
|
||||
// (Final, Native, Public, HasOutParms, BlueprintCallable)
|
||||
// Parameters:
|
||||
// struct FSubmixEffectDynamicsProcessorSettings InSettings (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void USubmixEffectDynamicsProcessorPreset::SetSettings(const struct FSubmixEffectDynamicsProcessorSettings& InSettings)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SubmixEffectDynamicsProcessorPreset.SetSettings");
|
||||
|
||||
USubmixEffectDynamicsProcessorPreset_SetSettings_Params params;
|
||||
params.InSettings = InSettings;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SubmixEffectSubmixEQPreset.SetSettings
|
||||
// (Final, Native, Public, HasOutParms, BlueprintCallable)
|
||||
// Parameters:
|
||||
// struct FSubmixEffectSubmixEQSettings InSettings (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void USubmixEffectSubmixEQPreset::SetSettings(const struct FSubmixEffectSubmixEQSettings& InSettings)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SubmixEffectSubmixEQPreset.SetSettings");
|
||||
|
||||
USubmixEffectSubmixEQPreset_SetSettings_Params params;
|
||||
params.InSettings = InSettings;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SubmixEffectReverbPreset.SetSettingsWithReverbEffect
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class UReverbEffect* InReverbEffect (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float WetLevel (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void USubmixEffectReverbPreset::SetSettingsWithReverbEffect(class UReverbEffect* InReverbEffect, float WetLevel)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SubmixEffectReverbPreset.SetSettingsWithReverbEffect");
|
||||
|
||||
USubmixEffectReverbPreset_SetSettingsWithReverbEffect_Params params;
|
||||
params.InReverbEffect = InReverbEffect;
|
||||
params.WetLevel = WetLevel;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SubmixEffectReverbPreset.SetSettings
|
||||
// (Final, Native, Public, HasOutParms, BlueprintCallable)
|
||||
// Parameters:
|
||||
// struct FSubmixEffectReverbSettings InSettings (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
|
||||
void USubmixEffectReverbPreset::SetSettings(const struct FSubmixEffectReverbSettings& InSettings)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SubmixEffectReverbPreset.SetSettings");
|
||||
|
||||
USubmixEffectReverbPreset_SetSettings_Params params;
|
||||
params.InSettings = InSettings;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SynthComponent.Stop
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
|
||||
void USynthComponent::Stop()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SynthComponent.Stop");
|
||||
|
||||
USynthComponent_Stop_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SynthComponent.Start
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
|
||||
void USynthComponent::Start()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SynthComponent.Start");
|
||||
|
||||
USynthComponent_Start_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SynthComponent.SetSubmixSend
|
||||
// (Final, Native, Public, BlueprintCallable)
|
||||
// Parameters:
|
||||
// class USoundSubmix* Submix (Parm, ZeroConstructor, IsPlainOldData)
|
||||
// float SendLevel (Parm, ZeroConstructor, IsPlainOldData)
|
||||
|
||||
void USynthComponent::SetSubmixSend(class USoundSubmix* Submix, float SendLevel)
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SynthComponent.SetSubmixSend");
|
||||
|
||||
USynthComponent_SetSubmixSend_Params params;
|
||||
params.Submix = Submix;
|
||||
params.SendLevel = SendLevel;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
}
|
||||
|
||||
|
||||
// Function AudioMixer.SynthComponent.IsPlaying
|
||||
// (Final, Native, Public, BlueprintCallable, BlueprintPure, Const)
|
||||
// Parameters:
|
||||
// bool ReturnValue (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
|
||||
bool USynthComponent::IsPlaying()
|
||||
{
|
||||
static UFunction *pFunc = 0;
|
||||
if (!pFunc)
|
||||
pFunc = UObject::FindObject<UFunction>("Function AudioMixer.SynthComponent.IsPlaying");
|
||||
|
||||
USynthComponent_IsPlaying_Params params;
|
||||
|
||||
auto flags = pFunc->FunctionFlags;
|
||||
pFunc->FunctionFlags |= 0x400;
|
||||
|
||||
UObject *currentObj = (UObject *) this;
|
||||
currentObj->ProcessEvent(pFunc, ¶ms);
|
||||
|
||||
pFunc->FunctionFlags = flags;
|
||||
|
||||
return params.ReturnValue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Executable
+118
@@ -0,0 +1,118 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.SetBypassSourceEffectChainEntry
|
||||
struct UAudioMixerBlueprintLibrary_SetBypassSourceEffectChainEntry_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSourcePresetChain* PresetChain; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int EntryIndex; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
bool bBypassed; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.RemoveSourceEffectFromPresetChain
|
||||
struct UAudioMixerBlueprintLibrary_RemoveSourceEffectFromPresetChain_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSourcePresetChain* PresetChain; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int EntryIndex; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.RemoveMasterSubmixEffect
|
||||
struct UAudioMixerBlueprintLibrary_RemoveMasterSubmixEffect_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSubmixPreset* SubmixEffectPreset; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.GetNumberOfEntriesInSourceEffectChain
|
||||
struct UAudioMixerBlueprintLibrary_GetNumberOfEntriesInSourceEffectChain_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSourcePresetChain* PresetChain; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
int ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.ClearMasterSubmixEffects
|
||||
struct UAudioMixerBlueprintLibrary_ClearMasterSubmixEffects_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.AddSourceEffectToPresetChain
|
||||
struct UAudioMixerBlueprintLibrary_AddSourceEffectToPresetChain_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSourcePresetChain* PresetChain; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
struct FSourceEffectChainEntry Entry; // (Parm, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.AudioMixerBlueprintLibrary.AddMasterSubmixEffect
|
||||
struct UAudioMixerBlueprintLibrary_AddMasterSubmixEffect_Params
|
||||
{
|
||||
class UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
class USoundEffectSubmixPreset* SubmixEffectPreset; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SubmixEffectDynamicsProcessorPreset.SetSettings
|
||||
struct USubmixEffectDynamicsProcessorPreset_SetSettings_Params
|
||||
{
|
||||
struct FSubmixEffectDynamicsProcessorSettings InSettings; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SubmixEffectSubmixEQPreset.SetSettings
|
||||
struct USubmixEffectSubmixEQPreset_SetSettings_Params
|
||||
{
|
||||
struct FSubmixEffectSubmixEQSettings InSettings; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SubmixEffectReverbPreset.SetSettingsWithReverbEffect
|
||||
struct USubmixEffectReverbPreset_SetSettingsWithReverbEffect_Params
|
||||
{
|
||||
class UReverbEffect* InReverbEffect; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
float WetLevel; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SubmixEffectReverbPreset.SetSettings
|
||||
struct USubmixEffectReverbPreset_SetSettings_Params
|
||||
{
|
||||
struct FSubmixEffectReverbSettings InSettings; // (ConstParm, Parm, OutParm, ReferenceParm)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SynthComponent.Stop
|
||||
struct USynthComponent_Stop_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AudioMixer.SynthComponent.Start
|
||||
struct USynthComponent_Start_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function AudioMixer.SynthComponent.SetSubmixSend
|
||||
struct USynthComponent_SetSubmixSend_Params
|
||||
{
|
||||
class USoundSubmix* Submix; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
float SendLevel; // (Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function AudioMixer.SynthComponent.IsPlaying
|
||||
struct USynthComponent_IsPlaying_Params
|
||||
{
|
||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Executable
+99
@@ -0,0 +1,99 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:40 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Enums
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Enum AudioMixer.ESubmixEffectDynamicsPeakMode
|
||||
enum class ESubmixEffectDynamicsPeakMode : uint8_t
|
||||
{
|
||||
ESubmixEffectDynamicsPeakMode__MeanSquared = 0,
|
||||
ESubmixEffectDynamicsPeakMode__RootMeanSquared = 1,
|
||||
ESubmixEffectDynamicsPeakMode__Peak = 2,
|
||||
ESubmixEffectDynamicsPeakMode__Count = 3,
|
||||
ESubmixEffectDynamicsPeakMode__ESubmixEffectDynamicsPeakMode_MAX = 4
|
||||
};
|
||||
|
||||
|
||||
// Enum AudioMixer.ESubmixEffectDynamicsProcessorType
|
||||
enum class ESubmixEffectDynamicsProcessorType : uint8_t
|
||||
{
|
||||
ESubmixEffectDynamicsProcessorType__Compressor = 0,
|
||||
ESubmixEffectDynamicsProcessorType__Limiter = 1,
|
||||
ESubmixEffectDynamicsProcessorType__Expander = 2,
|
||||
ESubmixEffectDynamicsProcessorType__Gate = 3,
|
||||
ESubmixEffectDynamicsProcessorType__Count = 4,
|
||||
ESubmixEffectDynamicsProcessorType__ESubmixEffectDynamicsProcessorType_MAX = 5
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// ScriptStruct AudioMixer.SubmixEffectDynamicsProcessorSettings
|
||||
// 0x0028
|
||||
struct FSubmixEffectDynamicsProcessorSettings
|
||||
{
|
||||
ESubmixEffectDynamicsProcessorType DynamicsProcessorType; // 0x0000(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
ESubmixEffectDynamicsPeakMode PeakMode; // 0x0001(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x2]; // 0x0002(0x0002) MISSED OFFSET
|
||||
float LookAheadMsec; // 0x0004(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float AttackTimeMsec; // 0x0008(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float ReleaseTimeMsec; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float ThresholdDb; // 0x0010(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Ratio; // 0x0014(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float KneeBandwidthDb; // 0x0018(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float InputGainDb; // 0x001C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float OutputGainDb; // 0x0020(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char bChannelLinked : 1; // 0x0024(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char bAnalogMode : 1; // 0x0024(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData01[0x3]; // 0x0025(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AudioMixer.SubmixEffectEQBand
|
||||
// 0x0010
|
||||
struct FSubmixEffectEQBand
|
||||
{
|
||||
float Frequency; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Bandwidth; // 0x0004(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float GainDb; // 0x0008(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char bEnabled : 1; // 0x000C(0x0001) (Edit, BlueprintVisible)
|
||||
unsigned char UnknownData00[0x3]; // 0x000D(0x0003) MISSED OFFSET
|
||||
};
|
||||
|
||||
// ScriptStruct AudioMixer.SubmixEffectSubmixEQSettings
|
||||
// 0x000C
|
||||
struct FSubmixEffectSubmixEQSettings
|
||||
{
|
||||
TArray<struct FSubmixEffectEQBand> EQBands; // 0x0000(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
};
|
||||
|
||||
// ScriptStruct AudioMixer.SubmixEffectReverbSettings
|
||||
// 0x0030
|
||||
struct FSubmixEffectReverbSettings
|
||||
{
|
||||
float Density; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Diffusion; // 0x0004(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float Gain; // 0x0008(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float GainHF; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float DecayTime; // 0x0010(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float DecayHFRatio; // 0x0014(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float ReflectionsGain; // 0x0018(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float ReflectionsDelay; // 0x001C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float LateGain; // 0x0020(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float LateDelay; // 0x0024(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float AirAbsorptionGainHF; // 0x0028(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
float WetLevel; // 0x002C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// WidgetBlueprintGeneratedClass Authorization_BP.Authorization_BP_C
|
||||
// 0x00F8 (0x0368 - 0x0270)
|
||||
class UAuthorization_BP_C : public UUAEUserWidget
|
||||
{
|
||||
public:
|
||||
struct FPointerToUberGraphFrame UberGraphFrame; // 0x0270(0x0004) (Transient, DuplicateTransient)
|
||||
class UWidgetAnimation* LOGO_anima; // 0x0274(0x0004) (BlueprintVisible, ExportObject, BlueprintReadOnly, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UWidgetSwitcher* AuthTypeSwitcher; // 0x0278(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_1; // 0x027C(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_2; // 0x0280(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_3; // 0x0284(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_Button_VisitorEnter; // 0x0288(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_Help; // 0x028C(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_LeavePlane; // 0x0290(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_LoginOut; // 0x0294(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_Policy; // 0x0298(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_QQ; // 0x029C(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_Repair; // 0x02A0(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_Service; // 0x02A4(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Button_WX; // 0x02A8(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UCheckBox* CheckBox_Agree; // 0x02AC(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UGridPanel* GridPanel_IPX; // 0x02B0(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UHorizontalBox* HorizontalBox_autoHide_2; // 0x02B4(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UHorizontalBox* HorizontalBox_autoHide_3; // 0x02B8(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UHorizontalBox* QQBox; // 0x02BC(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UHorizontalBox* QQPswdBox; // 0x02C0(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UMultiLineEditableTextBox* Text_ID; // 0x02C4(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UEditableText* Text_Pswd; // 0x02C8(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_7; // 0x02CC(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_9; // 0x02D0(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_11; // 0x02D4(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_12; // 0x02D8(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_14; // 0x02DC(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_15; // 0x02E0(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UTextBlock* TextBlock_Version; // 0x02E4(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UVerticalBox* VerticalBox_autoHide_4; // 0x02E8(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
class UButton* Windows_Login; // 0x02EC(0x0004) (BlueprintVisible, ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate)
|
||||
bool m_checked; // 0x02F0(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x02F1(0x0003) MISSED OFFSET
|
||||
struct FString PlatformName; // 0x02F4(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
class Abp_authorization_C* bp_auth; // 0x0300(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnTemplate, DisableEditOnInstance, IsPlainOldData)
|
||||
struct FScriptMulticastDelegate startGameSounds; // 0x0304(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, BlueprintAssignable)
|
||||
int LoginCount; // 0x0310(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
class UPlayerPrefs_C* MyPlayerPrefs; // 0x0314(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
struct FString SlotName; // 0x0318(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
class Abp_global_C* bpGlobal; // 0x0324(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnTemplate, DisableEditOnInstance, IsPlainOldData)
|
||||
int tempFpsIndex; // 0x0328(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
TMap<int, int> FpsToIndex; // 0x032C(0x0050) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("WidgetBlueprintGeneratedClass Authorization_BP.Authorization_BP_C");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
|
||||
void ShowHelpBtn();
|
||||
void SetSettingVars(class USettingConfig_C* Config);
|
||||
void IsServiceAccepted(bool* accept);
|
||||
void SetCheckBox(bool isCheck);
|
||||
void SetScreenLightness(class USettingConfig_C* Config);
|
||||
void SetLocalSavedQuickMsgSetting();
|
||||
void SetServiceAndPolicyCallType(int calltype);
|
||||
void SetServiceAndPolicyChecked();
|
||||
void ReleaseLoginButtons();
|
||||
void BlockLoginButtons();
|
||||
void updateLoginButtons();
|
||||
void HideHelpBtn();
|
||||
void GetMaxSupportFps(int* maxFpsIndex);
|
||||
void SendPictureSetting();
|
||||
void CheckRendingSafe();
|
||||
void RefreshGameVersion();
|
||||
void ShowEffects(bool Is_show);
|
||||
void UIShow2();
|
||||
void ShowUI();
|
||||
void InitAuthorizationUI();
|
||||
void InitLoginUI();
|
||||
void doAutoLogin();
|
||||
void UpdateRelatedSetting();
|
||||
void DoUpdate();
|
||||
void SetFpsByIndex(int Index);
|
||||
void InitFps(class USettingConfig_C* settingConfig);
|
||||
void SetLbsOffAndDisableMicphone(class USettingConfig_C* settingObj);
|
||||
void InitVoiceSetting(class USettingConfig_C* settingObj);
|
||||
void SetSoudsSetting(const struct FName& ParamName, float ParamValue);
|
||||
void InitUserSetting();
|
||||
void setLoginLimit();
|
||||
void addLoginCount();
|
||||
void clearLoginCount();
|
||||
void redoAutoAuthorization();
|
||||
void doAuthorization();
|
||||
void hideButtons();
|
||||
void showButtons();
|
||||
void QuitGame();
|
||||
void hideAuthorizationUI();
|
||||
void startAuthorization();
|
||||
void showAuthorizationUI();
|
||||
void BndEvt__Button_Login_K2Node_ComponentBoundEvent_249_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_Button_VisitorEnter0_K2Node_ComponentBoundEvent_0_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_QQ2_K2Node_ComponentBoundEvent_1_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_WX1_K2Node_ComponentBoundEvent_2_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__CheckBox_0_K2Node_ComponentBoundEvent_3_OnCheckBoxComponentStateChanged__DelegateSignature(bool bIsChecked);
|
||||
void BndEvt__Button_Service3_K2Node_ComponentBoundEvent_4_OnButtonClickedEvent__DelegateSignature();
|
||||
void StartAutoAuthorization();
|
||||
void BndEvt__Button_1_K2Node_ComponentBoundEvent_34_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_2_K2Node_ComponentBoundEvent_51_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_LeavePlane_K2Node_ComponentBoundEvent_112_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_Help_K2Node_ComponentBoundEvent_129_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_LoginOut_K2Node_ComponentBoundEvent_62_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_Repair_K2Node_ComponentBoundEvent_37_OnButtonClickedEvent__DelegateSignature();
|
||||
void BndEvt__Button_Policy_K2Node_ComponentBoundEvent_146_OnButtonClickedEvent__DelegateSignature();
|
||||
void Construct();
|
||||
void ExecuteUbergraph_Authorization_BP(int EntryPoint);
|
||||
void startGameSounds__DelegateSignature();
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+1223
File diff suppressed because it is too large
Load Diff
+322
@@ -0,0 +1,322 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.ShowHelpBtn
|
||||
struct UAuthorization_BP_C_ShowHelpBtn_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetSettingVars
|
||||
struct UAuthorization_BP_C_SetSettingVars_Params
|
||||
{
|
||||
class USettingConfig_C* Config; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.IsServiceAccepted
|
||||
struct UAuthorization_BP_C_IsServiceAccepted_Params
|
||||
{
|
||||
bool accept; // (Parm, OutParm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetCheckBox
|
||||
struct UAuthorization_BP_C_SetCheckBox_Params
|
||||
{
|
||||
bool isCheck; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetScreenLightness
|
||||
struct UAuthorization_BP_C_SetScreenLightness_Params
|
||||
{
|
||||
class USettingConfig_C* Config; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetLocalSavedQuickMsgSetting
|
||||
struct UAuthorization_BP_C_SetLocalSavedQuickMsgSetting_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetServiceAndPolicyCallType
|
||||
struct UAuthorization_BP_C_SetServiceAndPolicyCallType_Params
|
||||
{
|
||||
int calltype; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetServiceAndPolicyChecked
|
||||
struct UAuthorization_BP_C_SetServiceAndPolicyChecked_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.ReleaseLoginButtons
|
||||
struct UAuthorization_BP_C_ReleaseLoginButtons_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BlockLoginButtons
|
||||
struct UAuthorization_BP_C_BlockLoginButtons_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.updateLoginButtons
|
||||
struct UAuthorization_BP_C_updateLoginButtons_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.HideHelpBtn
|
||||
struct UAuthorization_BP_C_HideHelpBtn_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.GetMaxSupportFps
|
||||
struct UAuthorization_BP_C_GetMaxSupportFps_Params
|
||||
{
|
||||
int maxFpsIndex; // (Parm, OutParm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SendPictureSetting
|
||||
struct UAuthorization_BP_C_SendPictureSetting_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.CheckRendingSafe
|
||||
struct UAuthorization_BP_C_CheckRendingSafe_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.RefreshGameVersion
|
||||
struct UAuthorization_BP_C_RefreshGameVersion_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.ShowEffects
|
||||
struct UAuthorization_BP_C_ShowEffects_Params
|
||||
{
|
||||
bool Is_show; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.UIShow2
|
||||
struct UAuthorization_BP_C_UIShow2_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.ShowUI
|
||||
struct UAuthorization_BP_C_ShowUI_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.InitAuthorizationUI
|
||||
struct UAuthorization_BP_C_InitAuthorizationUI_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.InitLoginUI
|
||||
struct UAuthorization_BP_C_InitLoginUI_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.doAutoLogin
|
||||
struct UAuthorization_BP_C_doAutoLogin_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.UpdateRelatedSetting
|
||||
struct UAuthorization_BP_C_UpdateRelatedSetting_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.DoUpdate
|
||||
struct UAuthorization_BP_C_DoUpdate_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetFpsByIndex
|
||||
struct UAuthorization_BP_C_SetFpsByIndex_Params
|
||||
{
|
||||
int Index; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.InitFps
|
||||
struct UAuthorization_BP_C_InitFps_Params
|
||||
{
|
||||
class USettingConfig_C* settingConfig; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetLbsOffAndDisableMicphone
|
||||
struct UAuthorization_BP_C_SetLbsOffAndDisableMicphone_Params
|
||||
{
|
||||
class USettingConfig_C* settingObj; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.InitVoiceSetting
|
||||
struct UAuthorization_BP_C_InitVoiceSetting_Params
|
||||
{
|
||||
class USettingConfig_C* settingObj; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.SetSoudsSetting
|
||||
struct UAuthorization_BP_C_SetSoudsSetting_Params
|
||||
{
|
||||
struct FName ParamName; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
float ParamValue; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.InitUserSetting
|
||||
struct UAuthorization_BP_C_InitUserSetting_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.setLoginLimit
|
||||
struct UAuthorization_BP_C_setLoginLimit_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.addLoginCount
|
||||
struct UAuthorization_BP_C_addLoginCount_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.clearLoginCount
|
||||
struct UAuthorization_BP_C_clearLoginCount_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.redoAutoAuthorization
|
||||
struct UAuthorization_BP_C_redoAutoAuthorization_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.doAuthorization
|
||||
struct UAuthorization_BP_C_doAuthorization_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.hideButtons
|
||||
struct UAuthorization_BP_C_hideButtons_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.showButtons
|
||||
struct UAuthorization_BP_C_showButtons_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.QuitGame
|
||||
struct UAuthorization_BP_C_QuitGame_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.hideAuthorizationUI
|
||||
struct UAuthorization_BP_C_hideAuthorizationUI_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.startAuthorization
|
||||
struct UAuthorization_BP_C_startAuthorization_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.showAuthorizationUI
|
||||
struct UAuthorization_BP_C_showAuthorizationUI_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Login_K2Node_ComponentBoundEvent_249_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Login_K2Node_ComponentBoundEvent_249_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Button_VisitorEnter0_K2Node_ComponentBoundEvent_0_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Button_VisitorEnter0_K2Node_ComponentBoundEvent_0_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_QQ2_K2Node_ComponentBoundEvent_1_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_QQ2_K2Node_ComponentBoundEvent_1_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_WX1_K2Node_ComponentBoundEvent_2_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_WX1_K2Node_ComponentBoundEvent_2_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__CheckBox_0_K2Node_ComponentBoundEvent_3_OnCheckBoxComponentStateChanged__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__CheckBox_0_K2Node_ComponentBoundEvent_3_OnCheckBoxComponentStateChanged__DelegateSignature_Params
|
||||
{
|
||||
bool bIsChecked; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Service3_K2Node_ComponentBoundEvent_4_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Service3_K2Node_ComponentBoundEvent_4_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.StartAutoAuthorization
|
||||
struct UAuthorization_BP_C_StartAutoAuthorization_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_1_K2Node_ComponentBoundEvent_34_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_1_K2Node_ComponentBoundEvent_34_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_2_K2Node_ComponentBoundEvent_51_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_2_K2Node_ComponentBoundEvent_51_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_LeavePlane_K2Node_ComponentBoundEvent_112_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_LeavePlane_K2Node_ComponentBoundEvent_112_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Help_K2Node_ComponentBoundEvent_129_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Help_K2Node_ComponentBoundEvent_129_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_LoginOut_K2Node_ComponentBoundEvent_62_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_LoginOut_K2Node_ComponentBoundEvent_62_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Repair_K2Node_ComponentBoundEvent_37_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Repair_K2Node_ComponentBoundEvent_37_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.BndEvt__Button_Policy_K2Node_ComponentBoundEvent_146_OnButtonClickedEvent__DelegateSignature
|
||||
struct UAuthorization_BP_C_BndEvt__Button_Policy_K2Node_ComponentBoundEvent_146_OnButtonClickedEvent__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.Construct
|
||||
struct UAuthorization_BP_C_Construct_Params
|
||||
{
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.ExecuteUbergraph_Authorization_BP
|
||||
struct UAuthorization_BP_C_ExecuteUbergraph_Authorization_BP_Params
|
||||
{
|
||||
int EntryPoint; // (BlueprintVisible, BlueprintReadOnly, Parm, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
// Function Authorization_BP.Authorization_BP_C.startGameSounds__DelegateSignature
|
||||
struct UAuthorization_BP_C_startGameSounds__DelegateSignature_Params
|
||||
{
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Classes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// BlueprintGeneratedClass BP_SAVEGAME_UIElemLayout.BP_SAVEGAME_UIElemLayout_C
|
||||
// 0x00F8 (0x0118 - 0x0020)
|
||||
class UBP_SAVEGAME_UIElemLayout_C : public USaveGame
|
||||
{
|
||||
public:
|
||||
TMap<int, struct FBP_STRUCT_UIElemLayoutDetail> LayoutDetailDict1; // 0x0020(0x0050) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
TMap<int, struct FBP_STRUCT_UIElemLayoutDetail> LayoutDetailDict2; // 0x005C(0x0050) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
TMap<int, struct FBP_STRUCT_UIElemLayoutDetail> LayoutDetailDict3; // 0x0098(0x0050) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
bool IsDataValid1; // 0x00D4(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
bool IsDataValid2; // 0x00D5(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
bool IsDataValid3; // 0x00D6(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x1]; // 0x00D7(0x0001) MISSED OFFSET
|
||||
float RushTriggerLength1; // 0x00D8(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float RushTriggerLength2; // 0x00DC(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
float RushTriggerLength3; // 0x00E0(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
struct FString SaveSlotName; // 0x00E4(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
struct FString LayoutName1; // 0x00F0(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
struct FString LayoutName2; // 0x00FC(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
struct FString LayoutName3; // 0x0108(0x000C) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance)
|
||||
int TimeTag; // 0x0114(0x0004) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData)
|
||||
|
||||
static UClass* StaticClass()
|
||||
{
|
||||
static UClass *pStaticClass = 0;
|
||||
if (!pStaticClass)
|
||||
pStaticClass = UObject::FindClass("BlueprintGeneratedClass BP_SAVEGAME_UIElemLayout.BP_SAVEGAME_UIElemLayout_C");
|
||||
return pStaticClass;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:52 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// UserDefinedStruct BP_STRUCT_ActButtonInfo.BP_STRUCT_ActButtonInfo
|
||||
// 0x002C
|
||||
struct FBP_STRUCT_ActButtonInfo
|
||||
{
|
||||
int Btn_Type_0_72A7BDDA4D539877791B30B19CB97C5E; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString Btn_TypeName_1_C1631EF849C229989F4201B7B2E4F5B5; // 0x0004(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
int ActID_2_89F1DAB74AE5AF1F611CE4AC8F9FAE25; // 0x0010(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
struct FString Btn_Name_3_CB1FB8C54883B36537B88AA8946E6E9B; // 0x0014(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
bool IsRedPoint_4_4762A09D4D3A7BDD1094AE91409A4294; // 0x0020(0x0001) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
unsigned char UnknownData00[0x3]; // 0x0021(0x0003) MISSED OFFSET
|
||||
int Btn_Tab_Num_5_11086F8025E813FE02005F990CEB832D; // 0x0024(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
int RedPoint_Type_6_5442EEC06638EC63042412B909CB83E5; // 0x0028(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Functions
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
#include "../SDK.hpp"
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Parameters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
//PUBGM(0.13.5)32位SDK
|
||||
//作者:清华
|
||||
//Telegram:@qinghuanb666
|
||||
//生成时间:Fri Apr 18 20:44:50 2025
|
||||
|
||||
namespace SDK
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
//Script Structs
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// UserDefinedStruct BP_STRUCT_ActiveAwardInfo.BP_STRUCT_ActiveAwardInfo
|
||||
// 0x0014
|
||||
struct FBP_STRUCT_ActiveAwardInfo
|
||||
{
|
||||
struct FString status_2_63049F3D4B573DE822E277BB11CF38C5; // 0x0000(0x000C) (Edit, BlueprintVisible, ZeroConstructor)
|
||||
int id_1_A0702D724E5C3EC2F83B4B9CB00D4F52; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
int value_3_CB44583242127623F9B90AA93F2B0AD4; // 0x0010(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user