ERR-038 : sous-systeme LPRoomTransition retire (critere non fiable), defaut d'origine laisse ouvert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
3c955005d1
commit
cf21f655cd
4 changed files with 2 additions and 164 deletions
|
|
@ -917,3 +917,4 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol
|
|||
| CHG-070 | 2026-10-02 | ERR-038 | nouveau `Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp` | relevé (`ERR038_releve_20261002.log`) : la nouvelle pièce est construite ≈ 2 s avant que `destroyDummy` rende les personnages de l'ancienne à la réserve ; le sous-système cache aussitôt, au changement de pièce, les personnages actifs juste avant (hors compagnon et scène en cours), cesse de les suivre dès que le jeu les rend ou les réaffiche, et les réaffiche après 10 s par sécurité ; aucun Blueprint modifié ; build `LifePlay_Build_5.5_ERR038` ; test en jeu en attente | supprimer les 2 fichiers (`git checkout ERR038-avant -- Source`) |
|
||||
| CHG-071 | 2026-10-02 | Ménage | `README.md` : V1.2 en téléchargement principal (lien Mega), V1.1 et V1 en versions précédentes ; suppression de 13 builds 5.5 obsolètes (V1rc, L7a, L7b, L7i, L7i_B12, L7cdj, O1, O1_essai1, O2, O4, O9, O9b, Shipping_V1.2_essai1, ≈ 43 Go) après copie vérifiée de `Saved`, `Content\Saves` et des lanceurs dans `D:\Game\LifePlay_Backup_5.5\builds_supprimees\` ; `08_Guide_Developpeur.md` §4 | lien V1.2 reçu ; place disque | builds : reconstruction depuis les tags git |
|
||||
| CHG-072 | 2026-10-02 | ERR-038 | `LPRoomTransitionSubsystem` : détection par la seule échelle de la racine de `Room`, délai de réaffichage 10 s → 3 s | premier test en jeu concluant (anciens personnages cachés, compagnon présent, nouveaux personnages apparus), mais 2 faux positifs au relevé : nom de lieu vidé un instant sans changement de pièce ; arrivée au restaurant peuplée 3 s avant la construction de la pièce (personnages apparus 10 s en retard) ; build `LifePlay_Build_5.5_ERR038` reconstruit | `git checkout ERR038-apres -- Source/LifePlay/LPRoomTransitionSubsystem.*` |
|
||||
| CHG-073 | 2026-10-02 | ERR-038 | `Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp` supprimés (copie dans `D:\Game\LifePlay_Backup_5.5\ERR038_retrait`) ; build `LifePlay_Build_5.5_ERR038` reconstruit sans le sous-système (vérifié dans l'exécutable) | second test « plus problématique » : relevé `ERR038_apres2_20261002` = 2 déclenchements, tous deux à tort (clients du lieu d'arrivée cachés 3 s) ; le critère temporel ne distingue pas les personnages créés pendant le trajet puis retirés de ceux qui sont conservés ; retrait proposé et accepté par l'utilisateur ; ERR-038 reste ouvert | `git checkout ERR038-apres -- Source/LifePlay` |
|
||||
|
|
|
|||
|
|
@ -42,4 +42,4 @@
|
|||
| ERR-035 | 6 nœuds `GetRandomPointInNavigableRadius` dépréciés (R-04 : `Person` 3, `Room` 2, `AI` 1) | `LogBlueprint` | 6 (compilation), 3 (cuisson) | faible (dette) | L7b | **corrigé (CHG-037, CX-B11)**, retiré à tort (CHG-038), réappliqué (CHG-039) : compilation et cuisson 0 avertissement ; **validé en jeu le 2026-09-30** (build L7b) |
|
||||
| ERR-036 | En extérieur (ex. `forest___vin01.lpworld`), personnages et objets (bois du feu de camp) enfoncés sous la surface du sol ; ils traversent la matière | retour utilisateur 2026-09-30 (capture) | — | faible (visuel) | L7l | **préexistant en 4.27** (confirmé par l'utilisateur), présent aussi en V1/L7a : hors périmètre de la migration ; cause mesurée (CHG-057) : plafond `WallT` à 18 cm du sol en extérieur (échelle Z 0,01), qui masque pieds et pieds des meubles ; correctif CHG-057 (plafond masqué en extérieur) : **corrigé, validé en jeu le 2026-10-01** (forêt : pieds visibles, sol texturé) |
|
||||
| ERR-037 | Quick dress (menu Action) laisse souvent le personnage principal nu | retour utilisateur 2026-10-01 | — | moyenne (visible) | — | **préexistant en 4.27** (confirmé par l'utilisateur le 2026-10-01 : même comportement au travail) : au travail seuls les vêtements « Formal » sont acceptés ; sans bas ni chaussures formels dans l'inventaire, seul le haut est mis. Hors périmètre |
|
||||
| ERR-038 | Au changement de lieu, les personnages de la pièce précédente apparaissent un instant dans la nouvelle, avant d'être détruits et remplacés | retour utilisateur 2026-10-02 (partie O9) | à chaque changement de lieu | faible (visuel) | — | **préexistant en 4.27** (confirmé par l'utilisateur) : tous les lieux sont reconstruits dans le même studio ; les anciens personnages ne sont détruits qu'après la reconstruction. Amélioration possible (les masquer dès le départ), hors périmètre pour l'instant |
|
||||
| ERR-038 | Au changement de lieu, les personnages de la pièce précédente apparaissent un instant dans la nouvelle, avant d'être détruits et remplacés | retour utilisateur 2026-10-02 (partie O9) | à chaque changement de lieu | faible (visuel) | — | **préexistant en 4.27** (confirmé par l'utilisateur) : tous les lieux sont reconstruits dans le même studio ; les anciens personnages ne sont détruits qu'après la reconstruction. Essai de correction par sous-système C++ (`LPRoomTransitionSubsystem`, CHG-070/072) **retiré** (CHG-073) : au moment de la reconstruction, les personnages créés pendant le trajet et retirés 2 s après l'arrivée (le défaut) sont indiscernables des vrais clients du lieu d'arrivée, créés de la même façon et conservés ; le sous-système en cachait donc aussi à tort. Une correction fiable devra se faire dans `GI` (décision de retrait après le trajet), dans un lot dédié. **Ouvert, défaut d'origine** |
|
||||
|
|
|
|||
|
|
@ -1,124 +0,0 @@
|
|||
// Portage UE 5.5 - voir LPRoomTransitionSubsystem.h
|
||||
|
||||
#include "LPRoomTransitionSubsystem.h"
|
||||
|
||||
#include "Components/SceneComponent.h"
|
||||
#include "Engine/GameInstance.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "HAL/PlatformTime.h"
|
||||
#include "LifePlay.h"
|
||||
#include "UObject/UnrealType.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
// Releves ERR-038 : les personnages de l'ancienne piece sont rendus ~2 s apres la reconstruction. Un personnage
|
||||
// encore actif au-dela appartient a la nouvelle piece (le jeu peut peupler l'arrivee avant de la construire).
|
||||
constexpr double SafetySeconds = 3.0;
|
||||
|
||||
template <typename T>
|
||||
T* GetObjectProperty(const UObject* Container, const TCHAR* Name)
|
||||
{
|
||||
const FObjectPropertyBase* Prop = Container ? CastField<FObjectPropertyBase>(Container->GetClass()->FindPropertyByName(Name)) : nullptr;
|
||||
return Prop ? Cast<T>(Prop->GetObjectPropertyValue_InContainer(Container)) : nullptr;
|
||||
}
|
||||
|
||||
/** Contenu d'une variable tableau d'acteurs de GI (DummyPersonsInUse, PersonsUsedThisScene). */
|
||||
TArray<AActor*> GetActorArray(const UObject* Container, const TCHAR* Name)
|
||||
{
|
||||
TArray<AActor*> Result;
|
||||
const FArrayProperty* Prop = Container ? CastField<FArrayProperty>(Container->GetClass()->FindPropertyByName(Name)) : nullptr;
|
||||
const FObjectPropertyBase* Inner = Prop ? CastField<FObjectPropertyBase>(Prop->Inner) : nullptr;
|
||||
if (!Inner)
|
||||
{
|
||||
return Result;
|
||||
}
|
||||
FScriptArrayHelper Helper(Prop, Prop->ContainerPtrToValuePtr<void>(Container));
|
||||
for (int32 i = 0; i < Helper.Num(); ++i)
|
||||
{
|
||||
if (AActor* Actor = Cast<AActor>(Inner->GetObjectPropertyValue(Helper.GetRawPtr(i))))
|
||||
{
|
||||
Result.Add(Actor);
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ULPRoomTransitionSubsystem::Initialize(FSubsystemCollectionBase& Collection)
|
||||
{
|
||||
Super::Initialize(Collection);
|
||||
TickHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &ULPRoomTransitionSubsystem::Tick));
|
||||
}
|
||||
|
||||
void ULPRoomTransitionSubsystem::Deinitialize()
|
||||
{
|
||||
FTSTicker::GetCoreTicker().RemoveTicker(TickHandle);
|
||||
Super::Deinitialize();
|
||||
}
|
||||
|
||||
bool ULPRoomTransitionSubsystem::Tick(float DeltaTime)
|
||||
{
|
||||
const UGameInstance* GI = GetGameInstance();
|
||||
const AActor* Room = GetObjectProperty<AActor>(GI, TEXT("Room"));
|
||||
const USceneComponent* Root = IsValid(Room) ? Room->GetRootComponent() : nullptr;
|
||||
if (!Root)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const TArray<AActor*> InUse = GetActorArray(GI, TEXT("DummyPersonsInUse"));
|
||||
const double Now = FPlatformTime::Seconds();
|
||||
|
||||
// 1. Suivi des personnages caches : rendus a la reserve, reaffiches par le jeu, ou delai de securite depasse.
|
||||
for (auto It = Hidden.CreateIterator(); It; ++It)
|
||||
{
|
||||
AActor* Actor = It.Key().Get();
|
||||
if (!IsValid(Actor) || !InUse.Contains(Actor) || !Actor->IsHidden())
|
||||
{
|
||||
It.RemoveCurrent();
|
||||
}
|
||||
else if (Now - It.Value() > SafetySeconds)
|
||||
{
|
||||
Actor->SetActorHiddenInGame(false);
|
||||
UE_LOG(LogLifePlay, Log, TEXT("Changement de lieu : %s toujours actif apres %.0f s, reaffiche"), *Actor->GetName(), SafetySeconds);
|
||||
It.RemoveCurrent();
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Changement de piece : cacher les personnages actifs au tick precedent, sauf compagnon et scene en cours.
|
||||
// Signature = forme de la piece (echelle de la racine de Room) : elle change a chaque reconstruction (tout trajet
|
||||
// passe par la rue, de forme differente). Le nom du lieu n'est pas utilise : il peut se vider un instant sans
|
||||
// que la piece change (releve ERR038_apres_20261002, 08:55:59).
|
||||
const FString Signature = Root->GetRelativeScale3D().ToString();
|
||||
if (!LastRoomSignature.IsEmpty() && Signature != LastRoomSignature)
|
||||
{
|
||||
const AActor* Companion = GetObjectProperty<AActor>(GI, TEXT("Companion"));
|
||||
const TArray<AActor*> ScenePersons = GetActorArray(GI, TEXT("PersonsUsedThisScene"));
|
||||
int32 Count = 0;
|
||||
for (const TWeakObjectPtr<AActor>& Weak : LastInUse)
|
||||
{
|
||||
AActor* Actor = Weak.Get();
|
||||
if (!IsValid(Actor) || Actor == Companion || ScenePersons.Contains(Actor) || Actor->IsHidden() || !InUse.Contains(Actor))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Actor->SetActorHiddenInGame(true);
|
||||
Hidden.Add(Actor, Now);
|
||||
++Count;
|
||||
}
|
||||
if (Count > 0)
|
||||
{
|
||||
UE_LOG(LogLifePlay, Log, TEXT("Changement de lieu (%s -> %s) : %d personnage(s) de la piece precedente caches"),
|
||||
*LastRoomSignature, *Signature, Count);
|
||||
}
|
||||
}
|
||||
LastRoomSignature = Signature;
|
||||
|
||||
LastInUse.Reset(InUse.Num());
|
||||
for (AActor* Actor : InUse)
|
||||
{
|
||||
LastInUse.Add(Actor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
// Portage UE 5.5 - ERR-038 (amelioration : defaut deja present en 4.27).
|
||||
//
|
||||
// Tous les lieux sont reconstruits par l'acteur Room dans le meme studio. Au changement de lieu, GI.MoveTo
|
||||
// reconstruit la piece puis rend les personnages de la piece precedente a la reserve (destroyDummy : retrait de
|
||||
// DummyPersonsInUse, SetActorHiddenInGame(true), deplacement) environ 2 s plus tard ; entre-temps ils restent
|
||||
// visibles dans la nouvelle piece (releve ERR038_releve_20261002 : 4 personnages du fast-food 2 s dans la maison).
|
||||
//
|
||||
// Ce sous-systeme detecte le changement de piece (echelle de la racine de Room) et cache aussitot
|
||||
// les personnages qui etaient actifs juste avant, sauf le compagnon et les personnes de la scene en cours. Il cesse
|
||||
// de suivre un personnage des que le jeu le rend a la reserve ou le reaffiche lui-meme ;
|
||||
// au-dela de 3 s sans l'un ni l'autre, il le reaffiche (personnage de la nouvelle piece, peuplee avant d'etre construite). Aucun Blueprint n'est modifie.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Containers/Ticker.h"
|
||||
#include "Subsystems/GameInstanceSubsystem.h"
|
||||
#include "LPRoomTransitionSubsystem.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class LIFEPLAY_API ULPRoomTransitionSubsystem : public UGameInstanceSubsystem
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
||||
virtual void Deinitialize() override;
|
||||
|
||||
private:
|
||||
bool Tick(float DeltaTime);
|
||||
|
||||
FTSTicker::FDelegateHandle TickHandle;
|
||||
/** Signature de la piece au tick precedent (echelle de la racine de Room). */
|
||||
FString LastRoomSignature;
|
||||
/** Personnages actifs au tick precedent. */
|
||||
TArray<TWeakObjectPtr<AActor>> LastInUse;
|
||||
/** Personnages caches par ce sous-systeme, avec l'heure a laquelle ils l'ont ete. */
|
||||
TMap<TWeakObjectPtr<AActor>, double> Hidden;
|
||||
};
|
||||
Loading…
Reference in a new issue