Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Palworld — Реверс функции palspawn и SpawnIndividualActor_ServerInternal

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
445
Реакции
10
Здарова, реверсеры.

Достал из закромов старую функцию palspawn, попытался оживить её под актуальный билд Palworld, но столкнулся с классической проблемой. Оффсеты вроде обновил, сигнатуры подтянул, но результат нулевой.

Что имеем на данный момент:
При попытке вызова функции спавна проигрывается только звук появления пала, но сам актер в мире не отрисовывается и не инициализируется. Похоже, что после последних патчей логика SpawnIndividualActor_ServerInternal изменилась глубже, чем просто смена имен функций или адресов.

Раньше базовая публичная версия работала без костылей, но сейчас явно не хватает какого-то промежуточного этапа инициализации или регистрации актера в менеджере. Напоминаю, что вся эта движуха актуальна только для синглплеера, так как в мультиплеере это дело давно и успешно пофиксили на стороне сервера.

  1. Проверял ли кто-то актуальные структуры в дампе?
  2. Есть ли смысл копать в сторону дополнительных вызовов регистрации сервера для SP?
  3. Возможно, изменились параметры в самой SpawnIndividualActor?

Кто в последнее время ковырял нутрянку палов, поделитесь мыслями по поводу инициализации актеров. Куда копать, чтобы пал всё-таки появлялся, а не просто кричал в пустоту?

Кто уже сталкивался с таким поведением функции?

upd: нашел

Код:
Expand Collapse Copy
 SDK::FNetworkActorSpawnParameters spawnParam = SDK::FNetworkActorSpawnParameters();
spawnParam.NetworkOwner = Engine.GetLocalPlayerCharacter();
spawnParam.Name = Engine.StringLibrary()->Conv_StringToName(L"None");
spawnParam.Owner = Engine.GetLocalPlayerCharacter();
spawnParam.SpawnLocation = Engine.GetLocalPlayerCharacter()->K2_GetActorLocation();
spawnParam.SpawnLocation.X += 10; spawnParam.SpawnLocation.Y += 10;
spawnParam.SpawnRotation = Engine.GetLocalPlayerCharacter()->K2_GetActorRotation();
spawnParam.SpawnScale = { .1, .1, .15 };
spawnParam.ControllerClass = Engine.PalUtility()->GetNPCManager(Engine.GetWorld())->NPCAIControllerBaseClass.Get();
spawnParam.SpawnCollisionHandlingOverride = SDK::ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
spawnParam.bAlwaysRelevant = true;
 
Назад
Сверху Снизу