From cca54a5e0dd608f0efc1869f34248c450cb186f5 Mon Sep 17 00:00:00 2001 From: Mathew Date: Thu, 13 Aug 2026 22:07:08 +0200 Subject: [PATCH] (Feat) Add Animation Fps Charater --- .claude/CLAUDE.md | 63 ++++++-- Config/DefaultEngine.ini | 17 +- Config/DefaultGame.ini | 11 +- .../Game/Animation/Anim_BP/ABP_FpsArms.uasset | 4 +- .../Game/Animation/Anim_BP/ALI_FpsArms.uasset | 3 + .../Anim_BP/Pickaxe/ABP_Tool_Pickaxe.uasset | 3 + .../Animation/Fps/EnterCrouch_Montage.uasset | 3 + .../Animation/Fps/ExitCrouch_Montage.uasset | 3 + .../Animation/Fps/GrabItem_Montage.uasset | 3 + .../Fps/Pickaxe_Attack_Montage.uasset | 3 + .../Fps/Pickaxe_IdlePickaxe_Idle.uasset | 3 + .../Fps/Pickaxe_WalkPickaxe_Walk.uasset | 3 + .../Animation/Fps/PunchPunch_Montage.uasset | 3 + .../Game/Animation/Fps/Walk_WithItem.uasset | 3 - .../Item/Tools/Wood/DA_Wood_Pickaxe.uasset | 4 +- Content/Game/Player/BP_FpsPlayer.uasset | 4 +- ...ival_projet.uproject => EmberWild.uproject | 2 +- ...l_projet.Target.cs => EmberWild.Target.cs} | 6 +- .../EmberWild.Build.cs} | 4 +- Source/EmberWild/EmberWild.cpp | 6 + .../EmberWild.h} | 0 .../Private/AnimNotify_ItemAction.cpp | 43 +++++ .../Private/CharacterAppearanceComponent.cpp | 0 .../Private/CharacterCustomizationWidget.cpp | 0 .../Private/CharacterPartsDataAsset.cpp | 0 .../Private/CharacterPreviewActor.cpp | 0 .../Private/ConfirmDialogWidget.cpp | 0 .../Private/CookingStation.cpp | 0 .../CookingStation.cpp.tmp.23276.004bf5974d1a | 0 .../Private/CraftingComponent.cpp | 0 .../Private/CraftingIngredientRowWidget.cpp | 0 .../Private/CraftingRecipeBook.cpp | 0 .../Private/CraftingRecipeDataAsset.cpp | 0 .../Private/CraftingRecipeSlotWidget.cpp | 0 .../Private/CraftingStation.cpp | 0 .../Private/CraftingWidget.cpp | 0 .../Private/CustomizationCategoryWidget.cpp | 0 .../Private/CustomizationOptionWidget.cpp | 0 .../Private/FootstepComponent.cpp | 0 .../Private/FootstepSoundsDataAsset.cpp | 0 .../Private/FpsArmsAnimInstance.cpp | 1 + .../Private/FpsPlayer.cpp | 120 +++++++++++++- .../Private/FpsPlayerController.cpp | 0 .../Private/HeadBobComponent.cpp | 0 .../Private/HeldItemComponent.cpp | 136 +++++++++++++++- .../Private/HotbarWidget.cpp | 0 .../Private/InteractionComponent.cpp | 0 .../Private/InteractionPromptWidget.cpp | 0 .../Private/InventoryComponent.cpp | 0 .../Private/InventoryScreenWidget.cpp | 0 .../Private/InventorySlotWidget.cpp | 0 .../Private/InventoryWidget.cpp | 0 .../Private/ItemDataAsset.cpp | 0 .../Private/ItemDetailsWidget.cpp | 0 .../Private/KeyCaptureWidget.cpp | 0 .../Private/KeyboardLayout.cpp | 0 .../Private/MainMenuGameMode.cpp | 0 .../Private/MainMenuPlayerController.cpp | 0 .../Private/MainMenuWidget.cpp | 0 .../Private/MenuCameraSpot.cpp | 0 .../Private/MusicDirector.cpp | 0 .../Private/MusicSubsystem.cpp | 0 .../Private/PauseMenuWidget.cpp | 0 .../Private/PickupItem.cpp | 0 .../Private/PlayerBodyAnimInstance.cpp | 0 .../Private/PlayerNameplateComponent.cpp | 0 .../Private/PlayerNameplateWidget.cpp | 0 .../Private/ScreenFadeComponent.cpp | 0 .../Private/SessionSubsystem.cpp | 0 .../Private/SettingKeyRowWidget.cpp | 0 .../Private/SettingRowWidget.cpp | 0 .../Private/SettingsAudioWidget.cpp | 0 .../Private/SettingsControlsWidget.cpp | 0 .../Private/SettingsDisplayWidget.cpp | 0 .../Private/SettingsGameplayWidget.cpp | 0 .../Private/SettingsGraphicsWidget.cpp | 0 .../Private/SettingsMenuWidget.cpp | 0 .../Private/SettingsTabWidget.cpp | 0 .../Private/StorageContainer.cpp | 0 .../Private/SurvivalAudioSettings.cpp | 0 .../Private/SurvivalGameInstance.cpp | 0 .../Private/SurvivalGameMode.cpp | 0 .../Private/SurvivalPlayerState.cpp | 0 .../Private/SurvivalStatsComponent.cpp | 0 .../Private/SurvivalStatsWidget.cpp | 0 .../Private/SurvivalUserSettings.cpp | 0 .../EmberWild/Public/AnimNotify_ItemAction.h | 54 +++++++ .../Public/CharacterAppearanceComponent.h | 2 +- .../Public/CharacterAppearanceTypes.h | 0 .../Public/CharacterCustomizationWidget.h | 2 +- .../Public/CharacterPartsDataAsset.h | 2 +- .../Public/CharacterPreviewActor.h | 2 +- .../Public/ConfirmDialogWidget.h | 2 +- .../Public/CookingStation.h | 2 +- .../Public/CraftingComponent.h | 2 +- .../Public/CraftingIngredientRowWidget.h | 2 +- .../Public/CraftingRecipeBook.h | 2 +- .../Public/CraftingRecipeDataAsset.h | 2 +- .../Public/CraftingRecipeSlotWidget.h | 2 +- .../Public/CraftingStation.h | 2 +- .../Public/CraftingWidget.h | 2 +- .../Public/CustomizationCategoryWidget.h | 2 +- .../Public/CustomizationOptionWidget.h | 2 +- .../Public/FootstepComponent.h | 2 +- .../Public/FootstepSoundsDataAsset.h | 2 +- .../Public/FpsArmsAnimInstance.h | 19 ++- .../Public/FpsPlayer.h | 148 +++++++++++++++--- .../Public/FpsPlayerController.h | 2 +- .../Public/HeadBobComponent.h | 2 +- .../Public/HeldItemComponent.h | 144 ++++++++++++++++- .../Public/HotbarWidget.h | 2 +- .../Public/Interactable.h | 2 +- .../Public/InteractionComponent.h | 2 +- .../Public/InteractionPromptWidget.h | 2 +- .../Public/InventoryComponent.h | 2 +- .../Public/InventoryDragDropOperation.h | 2 +- .../Public/InventoryScreenWidget.h | 2 +- .../Public/InventorySlotWidget.h | 2 +- .../Public/InventoryWidget.h | 2 +- .../Public/ItemDataAsset.h | 40 ++++- .../Public/ItemDetailsWidget.h | 2 +- .../Public/KeyCaptureWidget.h | 2 +- .../Public/KeyboardLayout.h | 4 +- .../Public/MainMenuGameMode.h | 2 +- .../Public/MainMenuPlayerController.h | 2 +- .../Public/MainMenuWidget.h | 2 +- .../Public/MenuCameraSpot.h | 2 +- .../Public/MusicDirector.h | 2 +- .../Public/MusicPlaylistDataAsset.h | 2 +- .../Public/MusicSubsystem.h | 2 +- .../Public/PauseMenuWidget.h | 2 +- .../Public/PickupItem.h | 2 +- .../Public/PlayerBodyAnimInstance.h | 2 +- .../Public/PlayerNameplateComponent.h | 2 +- .../Public/PlayerNameplateWidget.h | 2 +- .../Public/ScreenFadeComponent.h | 2 +- .../Public/SessionSubsystem.h | 2 +- .../Public/SettingKeyRowWidget.h | 2 +- .../Public/SettingRowWidget.h | 2 +- .../Public/SettingsAudioWidget.h | 2 +- .../Public/SettingsControlsWidget.h | 2 +- .../Public/SettingsDisplayWidget.h | 2 +- .../Public/SettingsGameplayWidget.h | 2 +- .../Public/SettingsGraphicsWidget.h | 2 +- .../Public/SettingsMenuWidget.h | 2 +- .../Public/SettingsTabWidget.h | 2 +- .../Public/StorageContainer.h | 2 +- .../Public/SurvivalAudioSettings.h | 2 +- .../Public/SurvivalGameInstance.h | 2 +- .../Public/SurvivalGameMode.h | 2 +- .../Public/SurvivalGameState.h | 2 +- .../Public/SurvivalPlayerState.h | 2 +- .../Public/SurvivalStatsComponent.h | 2 +- .../Public/SurvivalStatsWidget.h | 2 +- .../Public/SurvivalUserSettings.h | 4 +- ...or.Target.cs => EmberWildEditor.Target.cs} | 6 +- Source/Survival_projet/Survival_projet.cpp | 6 - 157 files changed, 850 insertions(+), 148 deletions(-) create mode 100644 Content/Game/Animation/Anim_BP/ALI_FpsArms.uasset create mode 100644 Content/Game/Animation/Anim_BP/Pickaxe/ABP_Tool_Pickaxe.uasset create mode 100644 Content/Game/Animation/Fps/EnterCrouch_Montage.uasset create mode 100644 Content/Game/Animation/Fps/ExitCrouch_Montage.uasset create mode 100644 Content/Game/Animation/Fps/GrabItem_Montage.uasset create mode 100644 Content/Game/Animation/Fps/Pickaxe_Attack_Montage.uasset create mode 100644 Content/Game/Animation/Fps/Pickaxe_IdlePickaxe_Idle.uasset create mode 100644 Content/Game/Animation/Fps/Pickaxe_WalkPickaxe_Walk.uasset create mode 100644 Content/Game/Animation/Fps/PunchPunch_Montage.uasset delete mode 100644 Content/Game/Animation/Fps/Walk_WithItem.uasset rename Survival_projet.uproject => EmberWild.uproject (95%) rename Source/{Survival_projet.Target.cs => EmberWild.Target.cs} (62%) rename Source/{Survival_projet/Survival_projet.Build.cs => EmberWild/EmberWild.Build.cs} (96%) create mode 100644 Source/EmberWild/EmberWild.cpp rename Source/{Survival_projet/Survival_projet.h => EmberWild/EmberWild.h} (100%) create mode 100644 Source/EmberWild/Private/AnimNotify_ItemAction.cpp rename Source/{Survival_projet => EmberWild}/Private/CharacterAppearanceComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CharacterCustomizationWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CharacterPartsDataAsset.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CharacterPreviewActor.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/ConfirmDialogWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CookingStation.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CookingStation.cpp.tmp.23276.004bf5974d1a (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingIngredientRowWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingRecipeBook.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingRecipeDataAsset.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingRecipeSlotWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingStation.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CraftingWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CustomizationCategoryWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/CustomizationOptionWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/FootstepComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/FootstepSoundsDataAsset.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/FpsArmsAnimInstance.cpp (98%) rename Source/{Survival_projet => EmberWild}/Private/FpsPlayer.cpp (88%) rename Source/{Survival_projet => EmberWild}/Private/FpsPlayerController.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/HeadBobComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/HeldItemComponent.cpp (74%) rename Source/{Survival_projet => EmberWild}/Private/HotbarWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InteractionComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InteractionPromptWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InventoryComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InventoryScreenWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InventorySlotWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/InventoryWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/ItemDataAsset.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/ItemDetailsWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/KeyCaptureWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/KeyboardLayout.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MainMenuGameMode.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MainMenuPlayerController.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MainMenuWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MenuCameraSpot.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MusicDirector.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/MusicSubsystem.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/PauseMenuWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/PickupItem.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/PlayerBodyAnimInstance.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/PlayerNameplateComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/PlayerNameplateWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/ScreenFadeComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SessionSubsystem.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingKeyRowWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingRowWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsAudioWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsControlsWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsDisplayWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsGameplayWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsGraphicsWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsMenuWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SettingsTabWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/StorageContainer.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalAudioSettings.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalGameInstance.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalGameMode.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalPlayerState.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalStatsComponent.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalStatsWidget.cpp (100%) rename Source/{Survival_projet => EmberWild}/Private/SurvivalUserSettings.cpp (100%) create mode 100644 Source/EmberWild/Public/AnimNotify_ItemAction.h rename Source/{Survival_projet => EmberWild}/Public/CharacterAppearanceComponent.h (98%) rename Source/{Survival_projet => EmberWild}/Public/CharacterAppearanceTypes.h (100%) rename Source/{Survival_projet => EmberWild}/Public/CharacterCustomizationWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/CharacterPartsDataAsset.h (99%) rename Source/{Survival_projet => EmberWild}/Public/CharacterPreviewActor.h (98%) rename Source/{Survival_projet => EmberWild}/Public/ConfirmDialogWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/CookingStation.h (99%) rename Source/{Survival_projet => EmberWild}/Public/CraftingComponent.h (99%) rename Source/{Survival_projet => EmberWild}/Public/CraftingIngredientRowWidget.h (96%) rename Source/{Survival_projet => EmberWild}/Public/CraftingRecipeBook.h (95%) rename Source/{Survival_projet => EmberWild}/Public/CraftingRecipeDataAsset.h (98%) rename Source/{Survival_projet => EmberWild}/Public/CraftingRecipeSlotWidget.h (97%) rename Source/{Survival_projet => EmberWild}/Public/CraftingStation.h (96%) rename Source/{Survival_projet => EmberWild}/Public/CraftingWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/CustomizationCategoryWidget.h (96%) rename Source/{Survival_projet => EmberWild}/Public/CustomizationOptionWidget.h (97%) rename Source/{Survival_projet => EmberWild}/Public/FootstepComponent.h (99%) rename Source/{Survival_projet => EmberWild}/Public/FootstepSoundsDataAsset.h (98%) rename Source/{Survival_projet => EmberWild}/Public/FpsArmsAnimInstance.h (89%) rename Source/{Survival_projet => EmberWild}/Public/FpsPlayer.h (84%) rename Source/{Survival_projet => EmberWild}/Public/FpsPlayerController.h (99%) rename Source/{Survival_projet => EmberWild}/Public/HeadBobComponent.h (99%) rename Source/{Survival_projet => EmberWild}/Public/HeldItemComponent.h (54%) rename Source/{Survival_projet => EmberWild}/Public/HotbarWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/Interactable.h (98%) rename Source/{Survival_projet => EmberWild}/Public/InteractionComponent.h (98%) rename Source/{Survival_projet => EmberWild}/Public/InteractionPromptWidget.h (97%) rename Source/{Survival_projet => EmberWild}/Public/InventoryComponent.h (99%) rename Source/{Survival_projet => EmberWild}/Public/InventoryDragDropOperation.h (92%) rename Source/{Survival_projet => EmberWild}/Public/InventoryScreenWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/InventorySlotWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/InventoryWidget.h (99%) rename Source/{Survival_projet => EmberWild}/Public/ItemDataAsset.h (87%) rename Source/{Survival_projet => EmberWild}/Public/ItemDetailsWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/KeyCaptureWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/KeyboardLayout.h (95%) rename Source/{Survival_projet => EmberWild}/Public/MainMenuGameMode.h (91%) rename Source/{Survival_projet => EmberWild}/Public/MainMenuPlayerController.h (99%) rename Source/{Survival_projet => EmberWild}/Public/MainMenuWidget.h (96%) rename Source/{Survival_projet => EmberWild}/Public/MenuCameraSpot.h (93%) rename Source/{Survival_projet => EmberWild}/Public/MusicDirector.h (97%) rename Source/{Survival_projet => EmberWild}/Public/MusicPlaylistDataAsset.h (97%) rename Source/{Survival_projet => EmberWild}/Public/MusicSubsystem.h (99%) rename Source/{Survival_projet => EmberWild}/Public/PauseMenuWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/PickupItem.h (98%) rename Source/{Survival_projet => EmberWild}/Public/PlayerBodyAnimInstance.h (98%) rename Source/{Survival_projet => EmberWild}/Public/PlayerNameplateComponent.h (98%) rename Source/{Survival_projet => EmberWild}/Public/PlayerNameplateWidget.h (94%) rename Source/{Survival_projet => EmberWild}/Public/ScreenFadeComponent.h (97%) rename Source/{Survival_projet => EmberWild}/Public/SessionSubsystem.h (99%) rename Source/{Survival_projet => EmberWild}/Public/SettingKeyRowWidget.h (97%) rename Source/{Survival_projet => EmberWild}/Public/SettingRowWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/SettingsAudioWidget.h (95%) rename Source/{Survival_projet => EmberWild}/Public/SettingsControlsWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/SettingsDisplayWidget.h (98%) rename Source/{Survival_projet => EmberWild}/Public/SettingsGameplayWidget.h (96%) rename Source/{Survival_projet => EmberWild}/Public/SettingsGraphicsWidget.h (97%) rename Source/{Survival_projet => EmberWild}/Public/SettingsMenuWidget.h (99%) rename Source/{Survival_projet => EmberWild}/Public/SettingsTabWidget.h (95%) rename Source/{Survival_projet => EmberWild}/Public/StorageContainer.h (99%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalAudioSettings.h (98%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalGameInstance.h (99%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalGameMode.h (96%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalGameState.h (93%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalPlayerState.h (97%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalStatsComponent.h (98%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalStatsWidget.h (96%) rename Source/{Survival_projet => EmberWild}/Public/SurvivalUserSettings.h (98%) rename Source/{Survival_projetEditor.Target.cs => EmberWildEditor.Target.cs} (60%) delete mode 100644 Source/Survival_projet/Survival_projet.cpp diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 4ddc1be..7fe7164 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -51,10 +51,13 @@ règles de mort), demander avant de coder plutôt que de deviner. ## Compiler ```powershell -& "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat" Survival_projetEditor Win64 Development -Project="d:\Projet\Perso\Unreal\Survival_projet\Survival_projet.uproject" -WaitMutex +& "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat" EmberWildEditor Win64 Development -Project="d:\Projet\Perso\Unreal\Survival_projet\EmberWild.uproject" -WaitMutex ``` -- Un DLL nommé `UnrealEditor-Survival_projet-000N.dll` signifie que **l'éditeur était ouvert** : +*(Le module et le `.uproject` s'appellent désormais **EmberWild** ; seul le dossier sur le disque +est resté `Survival_projet`.)* + +- Un DLL nommé `UnrealEditor-EmberWild-000N.dll` signifie que **l'éditeur était ouvert** : c'est un hot reload. Prévenir l'auteur de fermer et relancer l'éditeur. - `-Rebuild` échoue tant que l'éditeur tourne (DLL verrouillés). - **Ne jamais réécrire en masse les timestamps** des fichiers source pour forcer un build. @@ -243,7 +246,7 @@ distribué par le dépôt Steam. C'est la procédure de référence. ```powershell & "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun ` - -project="D:\Projet\Perso\Unreal\Survival_projet\Survival_projet.uproject" ` + -project="D:\Projet\Perso\Unreal\Survival_projet\EmberWild.uproject" ` -noP4 -platform=Win64 -clientconfig=Development ` -build -cook -stage -pak -compressed -prereqs ` -archive -archivedirectory="D:\Projet\Perso\Unreal\Survival_projet\Build\Package" ` @@ -254,19 +257,28 @@ distribué par le dépôt Steam. C'est la procédure de référence. commande `EmberJoin`. Sans eux, un échec chez le testeur ne dit rien. Premier cook ≈ 18 min, les suivants sont bien plus courts (DDC chaud). -**2. Copier dans le dépôt** — le contenu de `Build\Package\Windows\` va **à la racine** de -`C:\sdk\tools\ContentBuilder\content\`, en excluant `steam_appid.txt` : Steam fournit lui-même -l'AppID au lancement, et le fichier l'écraserait. +**2. Copier et uploader — c'est le MÊME script, il n'y a rien à copier à la main.** +`C:\sdk\tools\ContentBuilder\upload_emberwild.bat` (App **4282850**, dépôt **4282851**) fait les +trois étapes : `rmdir /s /q content` puis `mkdir`, robocopy depuis `Build\Package\Windows` +en `/XF steam_appid.txt`, puis `steamcmd`. Le `.vdf` n'a **pas** de `SetLive`, donc le build monte +sans devenir live ; `upload_emberwild.bat live` utilise l'autre `.vdf` et publie. -**3. Uploader** — `C:\sdk\tools\ContentBuilder\upload_emberwild.bat` (App **4282850**, dépôt -**4282851**). Le `.vdf` n'a **pas** de `SetLive`, donc le build monte sans devenir live. +Deux choses à savoir sur ce script : -**4. Publier sur la branche `develop`**, jamais sur `default`. Et vérifier que *Launch Options* -pointe sur `Survival_projet.exe` — puis **publier les changements**, sinon rien n'est visible +- **Il repart d'un `content\` vide à chaque fois, et c'est indispensable** : le staging d'UAT ne + supprime rien, donc un fichier disparu du jeu — ou renommé, comme au passage + `Survival_projet` → `EmberWild` — resterait dans le dépôt indéfiniment et les testeurs + traîneraient des assets fantômes. +- **Il garde en dur le nom de l'exe** (`EmberWild.exe`) dans ses trois garde-fous : présence du + build, date de l'exe, vérification d'après-copie. Un renommage de projet le casse avec un + « aucun build trouve » trompeur, alors que le build est bien là. + +**3. Publier sur la branche `develop`**, jamais sur `default`. Et vérifier que *Launch Options* +pointe sur `EmberWild.exe` — puis **publier les changements**, sinon rien n'est visible côté client. -**5. Tester à deux** : les deux lancent le jeu **depuis Steam**, l'hôte clique *Jouer*, puis -Échap → *Inviter des amis*. Les logs à lire sont dans `Survival_projet/Saved/Logs/` de chaque +**4. Tester à deux** : les deux lancent le jeu **depuis Steam**, l'hôte clique *Jouer*, puis +Échap → *Inviter des amis*. Les logs à lire sont dans `EmberWild/Saved/Logs/` de chaque côté — `ShowInviteUI` chez l'hôte, `invitation acceptee` puis `voyage vers [...]` chez l'invité. **Deux réglages qui cassent tout si on les oublie** : la *List of Maps to Include* dans les @@ -565,6 +577,33 @@ du joueur dans lui-même. accidentelle). - **Clic gauche** = utiliser l'objet actif de la barre. Bindé sur le **pawn**, donc muet quand l'inventaire est ouvert — le conflit avec le drag & drop se règle tout seul. +- **L'effet du clic gauche part d'un AnimNotify, jamais de l'appui.** Le clic ne fait que lancer + le montage ; c'est `UAnimNotify_ItemAction`, posé dans la timeline au moment de l'impact, qui + appelle `AFpsPlayer::TriggerHeldItemAction()`. Sinon la hache abat l'arbre *avant* de l'avoir + touché — le résultat précède le geste qui aurait dû le produire. L'instant de l'impact + appartient à l'**animation** : un délai en secondes sur le DataAsset serait à re-régler à + chaque animation livrée, et faux dès qu'on touche au Play Rate. Trois points à tenir : + le montage d'usage ne tourne **que sur les bras du joueur local**, donc le notify tombe sur une + seule machine et le routage réseau ne change pas ; un objet **sans `UseMontage` retombe sur + l'effet immédiat** (aucun marqueur ne viendra jamais, le priver d'effet le casserait) ; et la + case visée est **figée à l'appui** (`PendingUseSlotIndex`), la molette pouvant changer d'objet + pendant les trois dixièmes de seconde du geste. +- **Saut des bras FPS : une machine à états, pas des montages.** `JumpStart` → `JumpFallLoop` + → `JumpLanding` / `HardLanding`. Le milieu de la chaîne est une **boucle**, et une boucle ne se + joue pas en montage — c'est ce qui a fait retirer `LandMontage` / `HardLandMontage`, dont le + geste se serait de toute façon superposé à l'état de chute qui venait de démarrer. La sortie de + l'état de chute est pilotée par `ELandingImpact` (`None` / `Soft` / `Hard`), produit par le pawn. + **`Hard` signifie exactement « cette chute a coûté de la vie »** : son seuil est + `FallDamageMinSpeed` et rien d'autre — il n'existe aucun réglage d'animation à côté, qui + finirait par diverger et ferait encaisser le personnage sans qu'il perde un point de vie. Le + seuil bas, lui, reste celui de la secousse de caméra (`LandPunchMinFallSpeed`). Un enum et pas + deux booléens : les trois valeurs mènent aux trois + sorties et s'excluent par construction, donc aucune combinaison ne rend deux transitions valides + en même temps. Il est **remis à `None` dès la première image de vol** (dans `Tick`), ce qui + dispense chaque transition de vérifier `bIsFalling` par-dessus. Deux états de réception distincts + et pas un seul avec un `Blend Poses by bool` : c'est le piège déjà noté pour l'accroupissement, + « Automatic Rule Based on Sequence Player in State » a besoin d'**un** Sequence Player pour lire + sa durée. - **Objets à charges** (`MaxUses > 1`) ne s'empilent jamais. Les valeurs de restauration s'appliquent **par utilisation**. L'usure suit l'objet jusqu'au sol et revient avec lui. - **Mort** : tout tombe au sol autour du corps, respawn au `PlayerStart`, jauges pleines. diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 73657c4..012aa98 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -86,11 +86,22 @@ FontDPIPreset=Standard FontDPI=72 [/Script/Engine.Engine] -+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/Survival_projet") -+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/Survival_projet") +; Le nom du MODULE est grave dans chaque .uasset qui reference une classe C++ : +; un Blueprint derive d'AFpsPlayer stocke "/Script/.FpsPlayer". Renommer +; le module sans redirection casserait donc la classe parente de tous les BP, +; widgets et DataAssets d'un coup. Ces lignes sont lues AVANT la resolution des +; references, donc le moteur charge l'ancien nom et trouve le nouveau. +; +; Elles restent valables tant que des assets non re-sauvegardes portent l'ancien +; nom -- c'est-a-dire indefiniment en pratique, un asset n'etant reecrit que +; quand on y touche. Ne pas les supprimer. ++ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/EmberWild") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/EmberWild") ++ActiveGameNameRedirects=(OldGameName="Survival_projet",NewGameName="/Script/EmberWild") ++ActiveGameNameRedirects=(OldGameName="/Script/Survival_projet",NewGameName="/Script/EmberWild") ; Sans cette ligne le moteur instancie UGameUserSettings et nos reglages de jeu ; n'existent tout simplement pas au runtime. -GameUserSettingsClassName=/Script/Survival_projet.SurvivalUserSettings +GameUserSettingsClassName=/Script/EmberWild.SurvivalUserSettings ; ================================================================== ; Coop Steam (4 joueurs, listen server, P2P par le relais Valve) diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini index 4a01511..93e49dc 100644 --- a/Config/DefaultGame.ini +++ b/Config/DefaultGame.ini @@ -9,6 +9,15 @@ CommonUI.FallbackToDesiredOnAutoRestoreFailure=1 [/Script/EngineSettings.GeneralProjectSettings] ProjectID=4774BE68499C24D0A70C6E87B49DA419 +; Le titre affiche est ce que porte la barre de fenetre du jeu packagee. Il est +; independant du nom du module et de l'exe : on peut donc ecrire le nom commercial +; ("Emberwild", comme sur la fiche Steam) sans toucher au code. +ProjectName=Emberwild +ProjectDisplayedTitle=NSLOCTEXT("[/Script/EngineSettings]", "ProjectDisplayedTitle", "Emberwild") +CompanyName=Highland Game Studio +CompanyDistinguishedName=Highland Game Studio +Homepage="https://highlandgamesstudio.com/" +SupportContact="https://highlandgamesstudio.com/" [/Script/DiscordRichPresence.DiscordRichPresenceSettings] ClientId=1432045921620725933 @@ -58,7 +67,7 @@ bMoviesAreSkippable=True +StartupMovies=UnrealLogo +StartupMovies=StudioLogo -[/Script/Survival_projet.SurvivalAudioSettings] +[/Script/EmberWild.SurvivalAudioSettings] MasterSoundClass=/Game/Game/Sounds/Mix/SC_Master.SC_Master MusicSoundClass=/Game/Game/Sounds/Mix/SC_Music.SC_Music EffectsSoundClass=/Game/Game/Sounds/Mix/SC_SFX.SC_SFX diff --git a/Content/Game/Animation/Anim_BP/ABP_FpsArms.uasset b/Content/Game/Animation/Anim_BP/ABP_FpsArms.uasset index 5ca5215..24cdc81 100644 --- a/Content/Game/Animation/Anim_BP/ABP_FpsArms.uasset +++ b/Content/Game/Animation/Anim_BP/ABP_FpsArms.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:149150efaabbdc44ce9e59d5c12de84cba1ed37fe4d6ccb787637bac9c4c8ae4 -size 123416 +oid sha256:ad5747f953d872477620c09ff7ebef81afd464e4a23364ed2d5b8cf0cc4b6e6a +size 258149 diff --git a/Content/Game/Animation/Anim_BP/ALI_FpsArms.uasset b/Content/Game/Animation/Anim_BP/ALI_FpsArms.uasset new file mode 100644 index 0000000..4d3e0a6 --- /dev/null +++ b/Content/Game/Animation/Anim_BP/ALI_FpsArms.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3219ee907643373dc81910b0882fdaadfa598fecd480485346e72c2b9d0ef5d +size 15400 diff --git a/Content/Game/Animation/Anim_BP/Pickaxe/ABP_Tool_Pickaxe.uasset b/Content/Game/Animation/Anim_BP/Pickaxe/ABP_Tool_Pickaxe.uasset new file mode 100644 index 0000000..97b9261 --- /dev/null +++ b/Content/Game/Animation/Anim_BP/Pickaxe/ABP_Tool_Pickaxe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e126a4fcaa961f45bf60c84e8d997e05369ef9247716b45fab5564fd614dba78 +size 190743 diff --git a/Content/Game/Animation/Fps/EnterCrouch_Montage.uasset b/Content/Game/Animation/Fps/EnterCrouch_Montage.uasset new file mode 100644 index 0000000..df30fe8 --- /dev/null +++ b/Content/Game/Animation/Fps/EnterCrouch_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6b3c4a9cff09156ae067d3a62b35f5431d15684bca4ddc88ed7b5df6895add5 +size 8185 diff --git a/Content/Game/Animation/Fps/ExitCrouch_Montage.uasset b/Content/Game/Animation/Fps/ExitCrouch_Montage.uasset new file mode 100644 index 0000000..0a981a4 --- /dev/null +++ b/Content/Game/Animation/Fps/ExitCrouch_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8072519f2e7ea74c62883361842bb8ed866eba53997ef58fc6d3f6c3598a58ef +size 8181 diff --git a/Content/Game/Animation/Fps/GrabItem_Montage.uasset b/Content/Game/Animation/Fps/GrabItem_Montage.uasset new file mode 100644 index 0000000..53204b1 --- /dev/null +++ b/Content/Game/Animation/Fps/GrabItem_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2460ce689976e82437d544ca404bc6cf31724967ba39a6bf2ea495c5089c139 +size 8011 diff --git a/Content/Game/Animation/Fps/Pickaxe_Attack_Montage.uasset b/Content/Game/Animation/Fps/Pickaxe_Attack_Montage.uasset new file mode 100644 index 0000000..86c76b9 --- /dev/null +++ b/Content/Game/Animation/Fps/Pickaxe_Attack_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47a57437d544d78015f1e4a164644e76ab85b39feddbdeda9f5712a0932d5495 +size 10493 diff --git a/Content/Game/Animation/Fps/Pickaxe_IdlePickaxe_Idle.uasset b/Content/Game/Animation/Fps/Pickaxe_IdlePickaxe_Idle.uasset new file mode 100644 index 0000000..e5ad9d9 --- /dev/null +++ b/Content/Game/Animation/Fps/Pickaxe_IdlePickaxe_Idle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe88cd7697095f11407a5ae6ff56d75fb3e2da905f8602f20b9d8a1107f88d3b +size 427718 diff --git a/Content/Game/Animation/Fps/Pickaxe_WalkPickaxe_Walk.uasset b/Content/Game/Animation/Fps/Pickaxe_WalkPickaxe_Walk.uasset new file mode 100644 index 0000000..e6475bb --- /dev/null +++ b/Content/Game/Animation/Fps/Pickaxe_WalkPickaxe_Walk.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95a7c419fbf29fa810e969e38ddb9a39fa5cac6b0d1bf18ab201a40b67df0382 +size 463756 diff --git a/Content/Game/Animation/Fps/PunchPunch_Montage.uasset b/Content/Game/Animation/Fps/PunchPunch_Montage.uasset new file mode 100644 index 0000000..60c2bfc --- /dev/null +++ b/Content/Game/Animation/Fps/PunchPunch_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62605d44a5b53c13d77bc6e8486424151360da446a9dcbd9f8a9fa0d04556311 +size 8041 diff --git a/Content/Game/Animation/Fps/Walk_WithItem.uasset b/Content/Game/Animation/Fps/Walk_WithItem.uasset deleted file mode 100644 index 9eab2a2..0000000 --- a/Content/Game/Animation/Fps/Walk_WithItem.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7947a03d98e423a8af431f482cb6cc6c5ff67360bce2dae073a186ef1b0c6120 -size 457176 diff --git a/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset index 7ea8412..266a1a3 100644 --- a/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset +++ b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9df3ee9bf90194847eaa9b4972dff193cede9a3e95c15f8cc8ad84daf53f8693 -size 3388 +oid sha256:466226fb7255cb2f5cf0e802bba0b4f5a3c2657615490eb391c5937901b1234e +size 3859 diff --git a/Content/Game/Player/BP_FpsPlayer.uasset b/Content/Game/Player/BP_FpsPlayer.uasset index 328de38..8f02279 100644 --- a/Content/Game/Player/BP_FpsPlayer.uasset +++ b/Content/Game/Player/BP_FpsPlayer.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18d5d5c595f1a0a9d3780f5963cd713aef9e4df4c5f54a94459271c29d6da9d1 -size 41529 +oid sha256:d2c7fb5080757410f46e2ea221d6895f5d41cb4070b70b7880c6a152abdb4a07 +size 42458 diff --git a/Survival_projet.uproject b/EmberWild.uproject similarity index 95% rename from Survival_projet.uproject rename to EmberWild.uproject index 5471422..b0d9dee 100644 --- a/Survival_projet.uproject +++ b/EmberWild.uproject @@ -5,7 +5,7 @@ "Description": "", "Modules": [ { - "Name": "Survival_projet", + "Name": "EmberWild", "Type": "Runtime", "LoadingPhase": "Default", "AdditionalDependencies": [ diff --git a/Source/Survival_projet.Target.cs b/Source/EmberWild.Target.cs similarity index 62% rename from Source/Survival_projet.Target.cs rename to Source/EmberWild.Target.cs index a4d0b14..c518cb9 100644 --- a/Source/Survival_projet.Target.cs +++ b/Source/EmberWild.Target.cs @@ -3,13 +3,13 @@ using UnrealBuildTool; using System.Collections.Generic; -public class Survival_projetTarget : TargetRules +public class EmberWildTarget : TargetRules { - public Survival_projetTarget(TargetInfo Target) : base(Target) + public EmberWildTarget(TargetInfo Target) : base(Target) { Type = TargetType.Game; DefaultBuildSettings = BuildSettingsVersion.V7; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_8; - ExtraModuleNames.Add("Survival_projet"); + ExtraModuleNames.Add("EmberWild"); } } diff --git a/Source/Survival_projet/Survival_projet.Build.cs b/Source/EmberWild/EmberWild.Build.cs similarity index 96% rename from Source/Survival_projet/Survival_projet.Build.cs rename to Source/EmberWild/EmberWild.Build.cs index 4c8a144..e8c433b 100644 --- a/Source/Survival_projet/Survival_projet.Build.cs +++ b/Source/EmberWild/EmberWild.Build.cs @@ -2,9 +2,9 @@ using UnrealBuildTool; -public class Survival_projet : ModuleRules +public class EmberWild : ModuleRules { - public Survival_projet(ReadOnlyTargetRules Target) : base(Target) + public EmberWild(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; diff --git a/Source/EmberWild/EmberWild.cpp b/Source/EmberWild/EmberWild.cpp new file mode 100644 index 0000000..c838732 --- /dev/null +++ b/Source/EmberWild/EmberWild.cpp @@ -0,0 +1,6 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "EmberWild.h" +#include "Modules/ModuleManager.h" + +IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, EmberWild, "EmberWild" ); diff --git a/Source/Survival_projet/Survival_projet.h b/Source/EmberWild/EmberWild.h similarity index 100% rename from Source/Survival_projet/Survival_projet.h rename to Source/EmberWild/EmberWild.h diff --git a/Source/EmberWild/Private/AnimNotify_ItemAction.cpp b/Source/EmberWild/Private/AnimNotify_ItemAction.cpp new file mode 100644 index 0000000..a291d91 --- /dev/null +++ b/Source/EmberWild/Private/AnimNotify_ItemAction.cpp @@ -0,0 +1,43 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "AnimNotify_ItemAction.h" + +#include "Components/SkeletalMeshComponent.h" +#include "Engine/World.h" +#include "FpsPlayer.h" + +void UAnimNotify_ItemAction::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, + const FAnimNotifyEventReference& EventReference) +{ + Super::Notify(MeshComp, Animation, EventReference); + + if (!MeshComp) + { + return; + } + + // L'editeur d'animation joue les notifies dans sa fenetre de previsualisation, + // sur un mesh de preview qui n'appartient a aucun pawn. Le Cast ci-dessous + // suffirait a s'en proteger, mais le monde de preview n'est pas un monde de + // jeu et rien de ce qui suit n'y aurait de sens : on s'arrete plus tot. + const UWorld* World = MeshComp->GetWorld(); + if (!World || !World->IsGameWorld()) + { + return; + } + + // Le montage tourne sur les bras ou sur le corps, deux composants du pawn : + // dans les deux cas le proprietaire du mesh EST le personnage. + if (AFpsPlayer* Player = Cast(MeshComp->GetOwner())) + { + Player->TriggerHeldItemAction(); + } +} + +FString UAnimNotify_ItemAction::GetNotifyName_Implementation() const +{ + // Ce qui s'affiche sur le marqueur dans la timeline du montage. Sans cette + // surcharge le moteur y ecrirait le nom de la classe, prefixe compris. + return TEXT("Item Action"); +} diff --git a/Source/Survival_projet/Private/CharacterAppearanceComponent.cpp b/Source/EmberWild/Private/CharacterAppearanceComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/CharacterAppearanceComponent.cpp rename to Source/EmberWild/Private/CharacterAppearanceComponent.cpp diff --git a/Source/Survival_projet/Private/CharacterCustomizationWidget.cpp b/Source/EmberWild/Private/CharacterCustomizationWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CharacterCustomizationWidget.cpp rename to Source/EmberWild/Private/CharacterCustomizationWidget.cpp diff --git a/Source/Survival_projet/Private/CharacterPartsDataAsset.cpp b/Source/EmberWild/Private/CharacterPartsDataAsset.cpp similarity index 100% rename from Source/Survival_projet/Private/CharacterPartsDataAsset.cpp rename to Source/EmberWild/Private/CharacterPartsDataAsset.cpp diff --git a/Source/Survival_projet/Private/CharacterPreviewActor.cpp b/Source/EmberWild/Private/CharacterPreviewActor.cpp similarity index 100% rename from Source/Survival_projet/Private/CharacterPreviewActor.cpp rename to Source/EmberWild/Private/CharacterPreviewActor.cpp diff --git a/Source/Survival_projet/Private/ConfirmDialogWidget.cpp b/Source/EmberWild/Private/ConfirmDialogWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/ConfirmDialogWidget.cpp rename to Source/EmberWild/Private/ConfirmDialogWidget.cpp diff --git a/Source/Survival_projet/Private/CookingStation.cpp b/Source/EmberWild/Private/CookingStation.cpp similarity index 100% rename from Source/Survival_projet/Private/CookingStation.cpp rename to Source/EmberWild/Private/CookingStation.cpp diff --git a/Source/Survival_projet/Private/CookingStation.cpp.tmp.23276.004bf5974d1a b/Source/EmberWild/Private/CookingStation.cpp.tmp.23276.004bf5974d1a similarity index 100% rename from Source/Survival_projet/Private/CookingStation.cpp.tmp.23276.004bf5974d1a rename to Source/EmberWild/Private/CookingStation.cpp.tmp.23276.004bf5974d1a diff --git a/Source/Survival_projet/Private/CraftingComponent.cpp b/Source/EmberWild/Private/CraftingComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingComponent.cpp rename to Source/EmberWild/Private/CraftingComponent.cpp diff --git a/Source/Survival_projet/Private/CraftingIngredientRowWidget.cpp b/Source/EmberWild/Private/CraftingIngredientRowWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingIngredientRowWidget.cpp rename to Source/EmberWild/Private/CraftingIngredientRowWidget.cpp diff --git a/Source/Survival_projet/Private/CraftingRecipeBook.cpp b/Source/EmberWild/Private/CraftingRecipeBook.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingRecipeBook.cpp rename to Source/EmberWild/Private/CraftingRecipeBook.cpp diff --git a/Source/Survival_projet/Private/CraftingRecipeDataAsset.cpp b/Source/EmberWild/Private/CraftingRecipeDataAsset.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingRecipeDataAsset.cpp rename to Source/EmberWild/Private/CraftingRecipeDataAsset.cpp diff --git a/Source/Survival_projet/Private/CraftingRecipeSlotWidget.cpp b/Source/EmberWild/Private/CraftingRecipeSlotWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingRecipeSlotWidget.cpp rename to Source/EmberWild/Private/CraftingRecipeSlotWidget.cpp diff --git a/Source/Survival_projet/Private/CraftingStation.cpp b/Source/EmberWild/Private/CraftingStation.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingStation.cpp rename to Source/EmberWild/Private/CraftingStation.cpp diff --git a/Source/Survival_projet/Private/CraftingWidget.cpp b/Source/EmberWild/Private/CraftingWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CraftingWidget.cpp rename to Source/EmberWild/Private/CraftingWidget.cpp diff --git a/Source/Survival_projet/Private/CustomizationCategoryWidget.cpp b/Source/EmberWild/Private/CustomizationCategoryWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CustomizationCategoryWidget.cpp rename to Source/EmberWild/Private/CustomizationCategoryWidget.cpp diff --git a/Source/Survival_projet/Private/CustomizationOptionWidget.cpp b/Source/EmberWild/Private/CustomizationOptionWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/CustomizationOptionWidget.cpp rename to Source/EmberWild/Private/CustomizationOptionWidget.cpp diff --git a/Source/Survival_projet/Private/FootstepComponent.cpp b/Source/EmberWild/Private/FootstepComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/FootstepComponent.cpp rename to Source/EmberWild/Private/FootstepComponent.cpp diff --git a/Source/Survival_projet/Private/FootstepSoundsDataAsset.cpp b/Source/EmberWild/Private/FootstepSoundsDataAsset.cpp similarity index 100% rename from Source/Survival_projet/Private/FootstepSoundsDataAsset.cpp rename to Source/EmberWild/Private/FootstepSoundsDataAsset.cpp diff --git a/Source/Survival_projet/Private/FpsArmsAnimInstance.cpp b/Source/EmberWild/Private/FpsArmsAnimInstance.cpp similarity index 98% rename from Source/Survival_projet/Private/FpsArmsAnimInstance.cpp rename to Source/EmberWild/Private/FpsArmsAnimInstance.cpp index 6f89cf4..a008e20 100644 --- a/Source/Survival_projet/Private/FpsArmsAnimInstance.cpp +++ b/Source/EmberWild/Private/FpsArmsAnimInstance.cpp @@ -58,6 +58,7 @@ void UFpsArmsAnimInstance::NativeUpdateAnimation(float DeltaSeconds) bIsSprinting = Player->IsSprinting(); bIsFalling = Movement->IsFalling(); + LandingImpact = Player->GetLandingImpact(); bIsCrouching = Movement->IsCrouching(); VerticalSpeed = Movement->Velocity.Z; diff --git a/Source/Survival_projet/Private/FpsPlayer.cpp b/Source/EmberWild/Private/FpsPlayer.cpp similarity index 88% rename from Source/Survival_projet/Private/FpsPlayer.cpp rename to Source/EmberWild/Private/FpsPlayer.cpp index d003110..2b53380 100644 --- a/Source/Survival_projet/Private/FpsPlayer.cpp +++ b/Source/EmberWild/Private/FpsPlayer.cpp @@ -249,6 +249,11 @@ void AFpsPlayer::Tick(float DeltaTime) if (GetCharacterMovement()->IsFalling()) { LastFallSpeed = GetCharacterMovement()->Velocity.Z; + + // Et on efface la reception precedente des la premiere image de vol : + // c'est ce qui permet aux transitions de la machine a etats de se + // contenter de comparer l'enum, sans verifier bIsFalling par-dessus. + LandingImpact = ELandingImpact::None; } UpdateCameraEffects(DeltaTime); @@ -499,17 +504,55 @@ void AFpsPlayer::Landed(const FHitResult& Hit) FallSpeed, LandPunchMinFallSpeed); } + // Les degats decident de tout : c'est la meme valeur qui fait perdre de la + // vie et qui fait encaisser les bras. Une reception lourde est, par + // definition, une chute qui a fait mal. + const float Damage = ComputeFallDamage(FallSpeed); + + // Pas de garde d'autorite ici : USurvivalStatsComponent::ApplyDamage la pose + // deja, et la dupliquer donnerait deux endroits ou la regle peut changer. + // Chez un client l'appel ne fait donc rien -- sa vie descend par OnRep_Stats. + if (Damage > 0.f && SurvivalStats) + { + SurvivalStats->ApplyDamage(Damage); + } + // Le geste des bras suit le meme seuil bas que la camera : une marche // d'escalier ne doit ni secouer la vue ni faire encaisser le personnage. - if (FallSpeed > LandPunchMinFallSpeed) + // Sous ce seuil l'enum reste a None, et la machine a etats repart droit de + // la chute vers la locomotion sans jouer de reception. + if (FallSpeed <= LandPunchMinFallSpeed) { - UAnimMontage* Montage = (FallSpeed >= HardLandingFallSpeed) ? HardLandMontage : LandMontage; - PlayArmsMontage(Montage); + LandingImpact = ELandingImpact::None; + } + else + { + LandingImpact = (Damage > 0.f) ? ELandingImpact::Hard : ELandingImpact::Soft; } LastFallSpeed = 0.f; } +float AFpsPlayer::ComputeFallDamage(float FallSpeed) const +{ + // Comparaison STRICTE : a vitesse nulle comme a toute vitesse sous le seuil, + // la chute ne coute rien. Avec un >=, un FallDamageMinSpeed mis a zero en + // PIE ferait perdre de la vie a chaque pas. + if (FallSpeed <= FallDamageMinSpeed) + { + return 0.f; + } + + // Lineaire en VITESSE et pas en energie : la vitesse est ce que le joueur + // percoit -- le temps qu'il passe a tomber -- alors qu'un modele en v² + // rendrait les dix derniers metres brutalement mortels sans que rien a + // l'ecran ne l'ait annonce. + return FMath::GetMappedRangeValueClamped( + FVector2D(FallDamageMinSpeed, FMath::Max(FallDamageMaxSpeed, FallDamageMinSpeed + 1.f)), + FVector2D(FallDamageMin, FallDamageMax), + FallSpeed); +} + void AFpsPlayer::OnJumped_Implementation() { Super::OnJumped_Implementation(); @@ -692,18 +735,67 @@ void AFpsPlayer::HandleSprintReleased() void AFpsPlayer::UseSelectedItem() { - const int32 SelectedIndex = InventoryComponent->GetSelectedHotbarIndex(); + // La case est figee ICI, a l'appui, et relue a l'impact : voir + // PendingUseSlotIndex. + PendingUseSlotIndex = InventoryComponent->GetSelectedHotbarIndex(); + + // Le geste part AVANT le routage reseau, et sans rien attendre de lui : il + // n'existe que sur cette machine (bras en OnlyOwnerSee) et doit repondre au + // clic dans la frame. Le faire transiter par le serveur ajouterait un + // aller-retour a la seule partie du systeme que le joueur ressent + // immediatement. + // + // Consequence assumee : le geste se joue meme si le serveur refuse ensuite + // l'action. Sur un coup de pioche c'est invisible ; pour un consommable qui + // n'existe plus, c'est OnRep_Slots qui remet l'affichage d'aplomb. + const EUseMontageResult Result = HeldItemComponent + ? HeldItemComponent->PlayUseMontage() + : EUseMontageResult::NoMontage; + + switch (Result) + { + case EUseMontageResult::Started: + // L'effet appartient desormais au montage : il partira de son marqueur, + // au moment ou la hache touche. Rien a faire de plus a l'appui. + return; + + case EUseMontageResult::AlreadyPlaying: + // Marteler le bouton ne relance pas le bras ; il ne doit pas davantage + // declencher l'effet, sinon un clic maintenu recolterait a chaque image + // pendant que le geste, lui, n'en joue qu'un. + return; + + default: + break; + } + + // Aucun montage a jouer : personne n'enverra de marqueur, l'effet part tout + // de suite. C'est le comportement d'avant, conserve pour les objets sans + // animation -- la plupart des consommables aujourd'hui. + TriggerHeldItemAction(); +} + +void AFpsPlayer::TriggerHeldItemAction() +{ + // Le montage d'usage ne tourne aujourd'hui que sur les bras du joueur local, + // donc cette garde ne rejette rien. Elle est la pour le jour ou un montage + // sera joue sur le CORPS, visible des quatre machines : sans elle, chaque + // coup de hache partirait en autant d'exemplaires qu'il y a de joueurs. + if (!IsLocallyControlled() || !InventoryComponent) + { + return; + } // L'hote agit tout de suite, le client demande. On envoie meme si le slot // parait vide chez nous : c'est le serveur qui fait foi, et son inventaire // peut avoir une frame d'avance sur le notre. if (!HasAuthority()) { - Server_UseItem(SelectedIndex); + Server_UseItem(PendingUseSlotIndex); return; } - PerformUseItem(SelectedIndex); + PerformUseItem(PendingUseSlotIndex); } void AFpsPlayer::Server_UseItem_Implementation(int32 SlotIndex) @@ -1028,6 +1120,15 @@ void AFpsPlayer::OnStartCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdj CrouchTargetAlpha = 1.f; AddCrouchTilt(1.f); + + // Le geste des bras part d'ici et pas d'une transition d'AnimBP : c'est le + // seul endroit qui soit certain que la capsule change VRAIMENT de taille. + // Le CharacterMovement peut refuser un accroupissement, et une machine a + // etats qui suivrait la touche jouerait alors un geste sans rien derriere. + if (HeldItemComponent) + { + HeldItemComponent->PlayCrouchMontage(/*bEntering=*/true); + } } void AFpsPlayer::OnEndCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjust) @@ -1036,4 +1137,11 @@ void AFpsPlayer::OnEndCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjus CrouchTargetAlpha = 0.f; AddCrouchTilt(-1.f); + + // Symetrique exact d'OnStartCrouch : se relever peut etre refuse par un + // plafond bas, et c'est le moteur qui tranche, pas la touche. + if (HeldItemComponent) + { + HeldItemComponent->PlayCrouchMontage(/*bEntering=*/false); + } } diff --git a/Source/Survival_projet/Private/FpsPlayerController.cpp b/Source/EmberWild/Private/FpsPlayerController.cpp similarity index 100% rename from Source/Survival_projet/Private/FpsPlayerController.cpp rename to Source/EmberWild/Private/FpsPlayerController.cpp diff --git a/Source/Survival_projet/Private/HeadBobComponent.cpp b/Source/EmberWild/Private/HeadBobComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/HeadBobComponent.cpp rename to Source/EmberWild/Private/HeadBobComponent.cpp diff --git a/Source/Survival_projet/Private/HeldItemComponent.cpp b/Source/EmberWild/Private/HeldItemComponent.cpp similarity index 74% rename from Source/Survival_projet/Private/HeldItemComponent.cpp rename to Source/EmberWild/Private/HeldItemComponent.cpp index e6e8a4c..52bb29e 100644 --- a/Source/Survival_projet/Private/HeldItemComponent.cpp +++ b/Source/EmberWild/Private/HeldItemComponent.cpp @@ -123,6 +123,13 @@ void UHeldItemComponent::RefreshFromInventory() const FInventorySlot Selected = Inventory->GetSelectedSlot(); SetHeldItem(Selected.IsEmpty() ? nullptr : Selected.Item.Get()); + + // Reposee meme quand SetHeldItem est sortie tot faute de changement : chez un + // client, les premiers rafraichissements tombent avant que le controller soit + // la, donc avant qu'on ait le droit de toucher aux bras. Sans ce rattrapage, + // un joueur qui reapparait avec sa pioche deja selectionnee garderait les + // cycles mains nues jusqu'a ce qu'il change de case. + UpdateArmsAnimLayer(); } void UHeldItemComponent::SetHeldItem(UItemDataAsset* NewItem) @@ -134,6 +141,11 @@ void UHeldItemComponent::SetHeldItem(UItemDataAsset* NewItem) HeldItem = NewItem; ApplyHeldVisuals(); + + // La couche AVANT le montage : le geste de sortie doit se superposer aux + // cycles du nouvel outil, pas a ceux qu'on vient de quitter. L'inverse se + // voit sur la premiere image, la main partant de la mauvaise pose. + UpdateArmsAnimLayer(); PlayEquipMontage(); // En local d'abord, pour que l'objet apparaisse sous les doigts sans attendre @@ -145,29 +157,141 @@ void UHeldItemComponent::SetHeldItem(UItemDataAsset* NewItem) } } +void UHeldItemComponent::UpdateArmsAnimLayer() +{ + AFpsPlayer* Player = GetOwningPlayer(); + if (!Player || !Player->IsLocallyControlled()) + { + return; + } + + USkeletalMeshComponent* Arms = Player->GetFirstPersonArms(); + if (!Arms) + { + return; + } + + // Le mesh REELLEMENT monte fait foi, pas le seul HeldItem : un objet dont on + // a oublie de cocher bShowInHand ferait sinon jouer les cycles de la pioche + // sur une main vide. + const TSubclassOf DesiredLayer = + (bItemVisibleInHand && HeldItem) ? HeldItem->ArmsAnimLayer : nullptr; + + if (DesiredLayer == LinkedArmsLayer) + { + return; + } + + // Delier AVANT de lier, toujours. LinkAnimClassLayers ajoute une couche sans + // retirer la precedente : enchainer hache puis pioche laisserait les deux en + // place, et la hache l'emporterait sur toute fonction que la pioche + // n'implemente pas. Aucun message ne le signale. + if (LinkedArmsLayer) + { + Arms->UnlinkAnimClassLayers(LinkedArmsLayer); + } + + if (DesiredLayer) + { + Arms->LinkAnimClassLayers(DesiredLayer); + } + + LinkedArmsLayer = DesiredLayer; +} + void UHeldItemComponent::PlayEquipMontage() { // Ranger un objet ne joue rien : le pack ne livre que des gestes de sortie // d'outil, et un desequipement sans animation ne se remarque pas -- l'objet // suivant arrive dans la foulee avec le sien. - if (!HeldItem || !HeldItem->EquipMontage) + if (!HeldItem) { return; } + PlayLocalArmsMontage(HeldItem->EquipMontage, /*bSkipIfAlreadyPlaying=*/false); +} + +EUseMontageResult UHeldItemComponent::PlayUseMontage() +{ + // Le test porte sur l'OBJET et pas sur le mesh monte : une pomme n'apparait + // pas dans la main (bShowInHand faux) mais elle occupe bien la case active, + // et la manger ne doit pas declencher un coup de poing. + UAnimMontage* const Montage = HeldItem ? HeldItem->UseMontage.Get() : UnarmedUseMontage.Get(); + + if (!Montage) + { + return EUseMontageResult::NoMontage; + } + + // Le geste deja en cours est distingue AVANT l'appel, parce que + // PlayLocalArmsMontage rend false dans les deux cas et que l'appelant, lui, + // doit les separer : l'un enverra son marqueur d'impact, l'autre jamais. + const AFpsPlayer* Player = GetOwningPlayer(); + const USkeletalMeshComponent* Arms = Player ? Player->GetFirstPersonArms() : nullptr; + const UAnimInstance* ArmsAnim = Arms ? Arms->GetAnimInstance() : nullptr; + if (ArmsAnim && ArmsAnim->Montage_IsPlaying(Montage)) + { + return EUseMontageResult::AlreadyPlaying; + } + + // Chez un pawn distant les bras ne jouent rien (voir PlayLocalArmsMontage) : + // aucun marqueur n'en sortira, d'ou NoMontage plutot qu'un etat a part. La + // garde IsLocallyControlled() du pawn reste seule juge de ce qui part sur + // le reseau. + return PlayLocalArmsMontage(Montage, /*bSkipIfAlreadyPlaying=*/true) + ? EUseMontageResult::Started + : EUseMontageResult::NoMontage; +} + +bool UHeldItemComponent::PlayCrouchMontage(bool bEntering) +{ + UAnimMontage* const Held = bEntering ? HeldEnterCrouchMontage.Get() : HeldExitCrouchMontage.Get(); + UAnimMontage* const Unarmed = bEntering ? UnarmedEnterCrouchMontage.Get() : UnarmedExitCrouchMontage.Get(); + + // Le repli sur la version mains vides est ce qui permet de n'en fournir + // qu'une au depart : les gestes « avec objet » arriveront plus tard sans + // qu'on ait a repasser dans le code. + // + // Le test porte sur le MESH monte et pas sur HeldItem, contrairement au clic + // gauche : ce qui change la posture des genoux, c'est un objet qu'on voit + // dans la main, pas une pomme rangee dans la case active. + UAnimMontage* const Montage = (bItemVisibleInHand && Held) ? Held : Unarmed; + + // Pas de bSkipIfAlreadyPlaying : marteler la touche d'accroupissement doit + // relancer le geste, puisque la capsule, elle, change bel et bien de taille + // a chaque fois. + return PlayLocalArmsMontage(Montage, /*bSkipIfAlreadyPlaying=*/false); +} + +bool UHeldItemComponent::PlayLocalArmsMontage(UAnimMontage* Montage, bool bSkipIfAlreadyPlaying) +{ + if (!Montage) + { + return false; + } + AFpsPlayer* Player = GetOwningPlayer(); // Les bras sont en OnlyOwnerSee : chez l'hote, le pawn de chaque ami porte // AUSSI un squelette de bras que personne ne rend. Y jouer un montage ferait - // tourner quatre machines a etats pour rien. La garde est deja tenue par - // RefreshFromInventory, on la repose ici parce qu'un futur appelant - // l'oublierait. + // tourner quatre machines a etats pour rien. if (!Player || !Player->IsLocallyControlled()) { - return; + return false; } - Player->PlayArmsMontage(HeldItem->EquipMontage); + if (bSkipIfAlreadyPlaying) + { + const USkeletalMeshComponent* Arms = Player->GetFirstPersonArms(); + const UAnimInstance* ArmsAnim = Arms ? Arms->GetAnimInstance() : nullptr; + if (ArmsAnim && ArmsAnim->Montage_IsPlaying(Montage)) + { + return false; + } + } + + return Player->PlayArmsMontage(Montage) > 0.f; } void UHeldItemComponent::Server_SetHeldItem_Implementation(UItemDataAsset* NewItem) diff --git a/Source/Survival_projet/Private/HotbarWidget.cpp b/Source/EmberWild/Private/HotbarWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/HotbarWidget.cpp rename to Source/EmberWild/Private/HotbarWidget.cpp diff --git a/Source/Survival_projet/Private/InteractionComponent.cpp b/Source/EmberWild/Private/InteractionComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/InteractionComponent.cpp rename to Source/EmberWild/Private/InteractionComponent.cpp diff --git a/Source/Survival_projet/Private/InteractionPromptWidget.cpp b/Source/EmberWild/Private/InteractionPromptWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/InteractionPromptWidget.cpp rename to Source/EmberWild/Private/InteractionPromptWidget.cpp diff --git a/Source/Survival_projet/Private/InventoryComponent.cpp b/Source/EmberWild/Private/InventoryComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/InventoryComponent.cpp rename to Source/EmberWild/Private/InventoryComponent.cpp diff --git a/Source/Survival_projet/Private/InventoryScreenWidget.cpp b/Source/EmberWild/Private/InventoryScreenWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/InventoryScreenWidget.cpp rename to Source/EmberWild/Private/InventoryScreenWidget.cpp diff --git a/Source/Survival_projet/Private/InventorySlotWidget.cpp b/Source/EmberWild/Private/InventorySlotWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/InventorySlotWidget.cpp rename to Source/EmberWild/Private/InventorySlotWidget.cpp diff --git a/Source/Survival_projet/Private/InventoryWidget.cpp b/Source/EmberWild/Private/InventoryWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/InventoryWidget.cpp rename to Source/EmberWild/Private/InventoryWidget.cpp diff --git a/Source/Survival_projet/Private/ItemDataAsset.cpp b/Source/EmberWild/Private/ItemDataAsset.cpp similarity index 100% rename from Source/Survival_projet/Private/ItemDataAsset.cpp rename to Source/EmberWild/Private/ItemDataAsset.cpp diff --git a/Source/Survival_projet/Private/ItemDetailsWidget.cpp b/Source/EmberWild/Private/ItemDetailsWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/ItemDetailsWidget.cpp rename to Source/EmberWild/Private/ItemDetailsWidget.cpp diff --git a/Source/Survival_projet/Private/KeyCaptureWidget.cpp b/Source/EmberWild/Private/KeyCaptureWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/KeyCaptureWidget.cpp rename to Source/EmberWild/Private/KeyCaptureWidget.cpp diff --git a/Source/Survival_projet/Private/KeyboardLayout.cpp b/Source/EmberWild/Private/KeyboardLayout.cpp similarity index 100% rename from Source/Survival_projet/Private/KeyboardLayout.cpp rename to Source/EmberWild/Private/KeyboardLayout.cpp diff --git a/Source/Survival_projet/Private/MainMenuGameMode.cpp b/Source/EmberWild/Private/MainMenuGameMode.cpp similarity index 100% rename from Source/Survival_projet/Private/MainMenuGameMode.cpp rename to Source/EmberWild/Private/MainMenuGameMode.cpp diff --git a/Source/Survival_projet/Private/MainMenuPlayerController.cpp b/Source/EmberWild/Private/MainMenuPlayerController.cpp similarity index 100% rename from Source/Survival_projet/Private/MainMenuPlayerController.cpp rename to Source/EmberWild/Private/MainMenuPlayerController.cpp diff --git a/Source/Survival_projet/Private/MainMenuWidget.cpp b/Source/EmberWild/Private/MainMenuWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/MainMenuWidget.cpp rename to Source/EmberWild/Private/MainMenuWidget.cpp diff --git a/Source/Survival_projet/Private/MenuCameraSpot.cpp b/Source/EmberWild/Private/MenuCameraSpot.cpp similarity index 100% rename from Source/Survival_projet/Private/MenuCameraSpot.cpp rename to Source/EmberWild/Private/MenuCameraSpot.cpp diff --git a/Source/Survival_projet/Private/MusicDirector.cpp b/Source/EmberWild/Private/MusicDirector.cpp similarity index 100% rename from Source/Survival_projet/Private/MusicDirector.cpp rename to Source/EmberWild/Private/MusicDirector.cpp diff --git a/Source/Survival_projet/Private/MusicSubsystem.cpp b/Source/EmberWild/Private/MusicSubsystem.cpp similarity index 100% rename from Source/Survival_projet/Private/MusicSubsystem.cpp rename to Source/EmberWild/Private/MusicSubsystem.cpp diff --git a/Source/Survival_projet/Private/PauseMenuWidget.cpp b/Source/EmberWild/Private/PauseMenuWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/PauseMenuWidget.cpp rename to Source/EmberWild/Private/PauseMenuWidget.cpp diff --git a/Source/Survival_projet/Private/PickupItem.cpp b/Source/EmberWild/Private/PickupItem.cpp similarity index 100% rename from Source/Survival_projet/Private/PickupItem.cpp rename to Source/EmberWild/Private/PickupItem.cpp diff --git a/Source/Survival_projet/Private/PlayerBodyAnimInstance.cpp b/Source/EmberWild/Private/PlayerBodyAnimInstance.cpp similarity index 100% rename from Source/Survival_projet/Private/PlayerBodyAnimInstance.cpp rename to Source/EmberWild/Private/PlayerBodyAnimInstance.cpp diff --git a/Source/Survival_projet/Private/PlayerNameplateComponent.cpp b/Source/EmberWild/Private/PlayerNameplateComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/PlayerNameplateComponent.cpp rename to Source/EmberWild/Private/PlayerNameplateComponent.cpp diff --git a/Source/Survival_projet/Private/PlayerNameplateWidget.cpp b/Source/EmberWild/Private/PlayerNameplateWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/PlayerNameplateWidget.cpp rename to Source/EmberWild/Private/PlayerNameplateWidget.cpp diff --git a/Source/Survival_projet/Private/ScreenFadeComponent.cpp b/Source/EmberWild/Private/ScreenFadeComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/ScreenFadeComponent.cpp rename to Source/EmberWild/Private/ScreenFadeComponent.cpp diff --git a/Source/Survival_projet/Private/SessionSubsystem.cpp b/Source/EmberWild/Private/SessionSubsystem.cpp similarity index 100% rename from Source/Survival_projet/Private/SessionSubsystem.cpp rename to Source/EmberWild/Private/SessionSubsystem.cpp diff --git a/Source/Survival_projet/Private/SettingKeyRowWidget.cpp b/Source/EmberWild/Private/SettingKeyRowWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingKeyRowWidget.cpp rename to Source/EmberWild/Private/SettingKeyRowWidget.cpp diff --git a/Source/Survival_projet/Private/SettingRowWidget.cpp b/Source/EmberWild/Private/SettingRowWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingRowWidget.cpp rename to Source/EmberWild/Private/SettingRowWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsAudioWidget.cpp b/Source/EmberWild/Private/SettingsAudioWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsAudioWidget.cpp rename to Source/EmberWild/Private/SettingsAudioWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsControlsWidget.cpp b/Source/EmberWild/Private/SettingsControlsWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsControlsWidget.cpp rename to Source/EmberWild/Private/SettingsControlsWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsDisplayWidget.cpp b/Source/EmberWild/Private/SettingsDisplayWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsDisplayWidget.cpp rename to Source/EmberWild/Private/SettingsDisplayWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsGameplayWidget.cpp b/Source/EmberWild/Private/SettingsGameplayWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsGameplayWidget.cpp rename to Source/EmberWild/Private/SettingsGameplayWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsGraphicsWidget.cpp b/Source/EmberWild/Private/SettingsGraphicsWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsGraphicsWidget.cpp rename to Source/EmberWild/Private/SettingsGraphicsWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsMenuWidget.cpp b/Source/EmberWild/Private/SettingsMenuWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsMenuWidget.cpp rename to Source/EmberWild/Private/SettingsMenuWidget.cpp diff --git a/Source/Survival_projet/Private/SettingsTabWidget.cpp b/Source/EmberWild/Private/SettingsTabWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SettingsTabWidget.cpp rename to Source/EmberWild/Private/SettingsTabWidget.cpp diff --git a/Source/Survival_projet/Private/StorageContainer.cpp b/Source/EmberWild/Private/StorageContainer.cpp similarity index 100% rename from Source/Survival_projet/Private/StorageContainer.cpp rename to Source/EmberWild/Private/StorageContainer.cpp diff --git a/Source/Survival_projet/Private/SurvivalAudioSettings.cpp b/Source/EmberWild/Private/SurvivalAudioSettings.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalAudioSettings.cpp rename to Source/EmberWild/Private/SurvivalAudioSettings.cpp diff --git a/Source/Survival_projet/Private/SurvivalGameInstance.cpp b/Source/EmberWild/Private/SurvivalGameInstance.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalGameInstance.cpp rename to Source/EmberWild/Private/SurvivalGameInstance.cpp diff --git a/Source/Survival_projet/Private/SurvivalGameMode.cpp b/Source/EmberWild/Private/SurvivalGameMode.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalGameMode.cpp rename to Source/EmberWild/Private/SurvivalGameMode.cpp diff --git a/Source/Survival_projet/Private/SurvivalPlayerState.cpp b/Source/EmberWild/Private/SurvivalPlayerState.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalPlayerState.cpp rename to Source/EmberWild/Private/SurvivalPlayerState.cpp diff --git a/Source/Survival_projet/Private/SurvivalStatsComponent.cpp b/Source/EmberWild/Private/SurvivalStatsComponent.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalStatsComponent.cpp rename to Source/EmberWild/Private/SurvivalStatsComponent.cpp diff --git a/Source/Survival_projet/Private/SurvivalStatsWidget.cpp b/Source/EmberWild/Private/SurvivalStatsWidget.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalStatsWidget.cpp rename to Source/EmberWild/Private/SurvivalStatsWidget.cpp diff --git a/Source/Survival_projet/Private/SurvivalUserSettings.cpp b/Source/EmberWild/Private/SurvivalUserSettings.cpp similarity index 100% rename from Source/Survival_projet/Private/SurvivalUserSettings.cpp rename to Source/EmberWild/Private/SurvivalUserSettings.cpp diff --git a/Source/EmberWild/Public/AnimNotify_ItemAction.h b/Source/EmberWild/Public/AnimNotify_ItemAction.h new file mode 100644 index 0000000..18cd9ae --- /dev/null +++ b/Source/EmberWild/Public/AnimNotify_ItemAction.h @@ -0,0 +1,54 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotify.h" +#include "AnimNotify_ItemAction.generated.h" + +/** + * Declenche l'effet de l'objet en main a l'instant precis ou le geste frappe. + * + * ------------------------------------------------------------------ + * Pourquoi un notify plutot que le clic + * ------------------------------------------------------------------ + * + * Le clic gauche et le COUP sont deux choses distinctes, separees par le temps + * que met le bras a descendre. Faire partir le trace de recolte sur l'appui + * donne une hache qui abat l'arbre avant de l'avoir touche : le joueur voit le + * resultat, puis l'animation qui aurait du le produire. C'est le meme + * decalage qu'un bruit de pas joue au debut de la foulee. + * + * L'instant de l'impact n'est pas une valeur qu'on puisse ecrire en C++ : il + * appartient a l'ANIMATION, il change d'un montage a l'autre, et il rebouge a + * chaque fois qu'on retouche la courbe. Un delai en secondes sur le DataAsset + * serait a re-regler a la main a chaque nouvelle animation livree -- et faux + * des qu'on toucherait au Play Rate. Le marqueur, lui, suit le montage. + * + * ------------------------------------------------------------------ + * Reseau : ce notify ne tombe QUE chez le joueur local + * ------------------------------------------------------------------ + * + * Le montage d'usage est joue sur les BRAS, qui sont en OnlyOwnerSee et + * n'existent visuellement que chez le proprietaire du pawn + * (UHeldItemComponent::PlayLocalArmsMontage). Le notify part donc sur une + * seule machine, exactement comme le clic qu'il remplace, et le routage vers + * le serveur reste celui d'avant : AFpsPlayer::TriggerHeldItemAction envoie la + * RPC, le serveur fait autorite. + * + * Corollaire a ne pas oublier le jour ou un montage d'usage sera joue aussi sur + * le CORPS (visible des autres joueurs) : ce montage-la tournerait sur les + * quatre machines, et sans la garde IsLocallyControlled() de + * TriggerHeldItemAction chaque coup de hache partirait en quatre exemplaires. + */ +UCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = "Item Action")) +class EMBERWILD_API UAnimNotify_ItemAction : public UAnimNotify +{ + GENERATED_BODY() + +public: + virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, + const FAnimNotifyEventReference& EventReference) override; + + virtual FString GetNotifyName_Implementation() const override; +}; diff --git a/Source/Survival_projet/Public/CharacterAppearanceComponent.h b/Source/EmberWild/Public/CharacterAppearanceComponent.h similarity index 98% rename from Source/Survival_projet/Public/CharacterAppearanceComponent.h rename to Source/EmberWild/Public/CharacterAppearanceComponent.h index b646c42..4774497 100644 --- a/Source/Survival_projet/Public/CharacterAppearanceComponent.h +++ b/Source/EmberWild/Public/CharacterAppearanceComponent.h @@ -29,7 +29,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAppearanceApplied); * pseudo, et pour la meme raison : elle doit survivre a la mort du pawn. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UCharacterAppearanceComponent : public UActorComponent +class EMBERWILD_API UCharacterAppearanceComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CharacterAppearanceTypes.h b/Source/EmberWild/Public/CharacterAppearanceTypes.h similarity index 100% rename from Source/Survival_projet/Public/CharacterAppearanceTypes.h rename to Source/EmberWild/Public/CharacterAppearanceTypes.h diff --git a/Source/Survival_projet/Public/CharacterCustomizationWidget.h b/Source/EmberWild/Public/CharacterCustomizationWidget.h similarity index 98% rename from Source/Survival_projet/Public/CharacterCustomizationWidget.h rename to Source/EmberWild/Public/CharacterCustomizationWidget.h index 6fdabdf..5234573 100644 --- a/Source/Survival_projet/Public/CharacterCustomizationWidget.h +++ b/Source/EmberWild/Public/CharacterCustomizationWidget.h @@ -56,7 +56,7 @@ enum class ECustomizationCategory : uint8 * Classe Abstract : on cree un WBP_CharacterCustomization qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCharacterCustomizationWidget : public UUserWidget +class EMBERWILD_API UCharacterCustomizationWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CharacterPartsDataAsset.h b/Source/EmberWild/Public/CharacterPartsDataAsset.h similarity index 99% rename from Source/Survival_projet/Public/CharacterPartsDataAsset.h rename to Source/EmberWild/Public/CharacterPartsDataAsset.h index 931e04c..45e3d24 100644 --- a/Source/Survival_projet/Public/CharacterPartsDataAsset.h +++ b/Source/EmberWild/Public/CharacterPartsDataAsset.h @@ -94,7 +94,7 @@ struct FCharacterBodySet * hors bornes a une valeur sure. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UCharacterPartsDataAsset : public UPrimaryDataAsset +class EMBERWILD_API UCharacterPartsDataAsset : public UPrimaryDataAsset { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CharacterPreviewActor.h b/Source/EmberWild/Public/CharacterPreviewActor.h similarity index 98% rename from Source/Survival_projet/Public/CharacterPreviewActor.h rename to Source/EmberWild/Public/CharacterPreviewActor.h index 71c18f2..0756f8b 100644 --- a/Source/Survival_projet/Public/CharacterPreviewActor.h +++ b/Source/EmberWild/Public/CharacterPreviewActor.h @@ -40,7 +40,7 @@ enum class ECharacterPreviewFraming : uint8 * moment -- une fois en partie. */ UCLASS() -class SURVIVAL_PROJET_API ACharacterPreviewActor : public AActor +class EMBERWILD_API ACharacterPreviewActor : public AActor { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/ConfirmDialogWidget.h b/Source/EmberWild/Public/ConfirmDialogWidget.h similarity index 98% rename from Source/Survival_projet/Public/ConfirmDialogWidget.h rename to Source/EmberWild/Public/ConfirmDialogWidget.h index 8e944fb..be54d71 100644 --- a/Source/Survival_projet/Public/ConfirmDialogWidget.h +++ b/Source/EmberWild/Public/ConfirmDialogWidget.h @@ -23,7 +23,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnConfirmDialogCancelled); * Classe Abstract : on cree un WBP_ConfirmDialog qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UConfirmDialogWidget : public UUserWidget +class EMBERWILD_API UConfirmDialogWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CookingStation.h b/Source/EmberWild/Public/CookingStation.h similarity index 99% rename from Source/Survival_projet/Public/CookingStation.h rename to Source/EmberWild/Public/CookingStation.h index e6b39d1..85e75a2 100644 --- a/Source/Survival_projet/Public/CookingStation.h +++ b/Source/EmberWild/Public/CookingStation.h @@ -139,7 +139,7 @@ struct FCookingInteraction * interessante. */ UCLASS() -class SURVIVAL_PROJET_API ACookingStation : public AActor, public IInteractable +class EMBERWILD_API ACookingStation : public AActor, public IInteractable { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingComponent.h b/Source/EmberWild/Public/CraftingComponent.h similarity index 99% rename from Source/Survival_projet/Public/CraftingComponent.h rename to Source/EmberWild/Public/CraftingComponent.h index f301eaa..b89f114 100644 --- a/Source/Survival_projet/Public/CraftingComponent.h +++ b/Source/EmberWild/Public/CraftingComponent.h @@ -70,7 +70,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnCraftOverflow, UItemDataAsset* * futur etabli pourra porter le meme composant avec son propre livre. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UCraftingComponent : public UActorComponent +class EMBERWILD_API UCraftingComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingIngredientRowWidget.h b/Source/EmberWild/Public/CraftingIngredientRowWidget.h similarity index 96% rename from Source/Survival_projet/Public/CraftingIngredientRowWidget.h rename to Source/EmberWild/Public/CraftingIngredientRowWidget.h index 286eee7..65edd96 100644 --- a/Source/Survival_projet/Public/CraftingIngredientRowWidget.h +++ b/Source/EmberWild/Public/CraftingIngredientRowWidget.h @@ -20,7 +20,7 @@ class UTextBlock; * afficher autre chose que ce sur quoi le bouton Fabriquer s'appuie. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCraftingIngredientRowWidget : public UUserWidget +class EMBERWILD_API UCraftingIngredientRowWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingRecipeBook.h b/Source/EmberWild/Public/CraftingRecipeBook.h similarity index 95% rename from Source/Survival_projet/Public/CraftingRecipeBook.h rename to Source/EmberWild/Public/CraftingRecipeBook.h index 9dc0db3..ed39ed6 100644 --- a/Source/Survival_projet/Public/CraftingRecipeBook.h +++ b/Source/EmberWild/Public/CraftingRecipeBook.h @@ -21,7 +21,7 @@ class UCraftingRecipeDataAsset; * la table de craft du jeu. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UCraftingRecipeBook : public UPrimaryDataAsset +class EMBERWILD_API UCraftingRecipeBook : public UPrimaryDataAsset { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingRecipeDataAsset.h b/Source/EmberWild/Public/CraftingRecipeDataAsset.h similarity index 98% rename from Source/Survival_projet/Public/CraftingRecipeDataAsset.h rename to Source/EmberWild/Public/CraftingRecipeDataAsset.h index f7b4cc4..6f06798 100644 --- a/Source/Survival_projet/Public/CraftingRecipeDataAsset.h +++ b/Source/EmberWild/Public/CraftingRecipeDataAsset.h @@ -63,7 +63,7 @@ struct FCraftIngredient * recette la debloquerait pour toutes les parties a la fois. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UCraftingRecipeDataAsset : public UPrimaryDataAsset +class EMBERWILD_API UCraftingRecipeDataAsset : public UPrimaryDataAsset { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingRecipeSlotWidget.h b/Source/EmberWild/Public/CraftingRecipeSlotWidget.h similarity index 97% rename from Source/Survival_projet/Public/CraftingRecipeSlotWidget.h rename to Source/EmberWild/Public/CraftingRecipeSlotWidget.h index f82d6b6..8a55a0c 100644 --- a/Source/Survival_projet/Public/CraftingRecipeSlotWidget.h +++ b/Source/EmberWild/Public/CraftingRecipeSlotWidget.h @@ -19,7 +19,7 @@ class UTextBlock; * son propre clic, parce que c'est elle qui recoit l'evenement souris. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCraftingRecipeSlotWidget : public UUserWidget +class EMBERWILD_API UCraftingRecipeSlotWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingStation.h b/Source/EmberWild/Public/CraftingStation.h similarity index 96% rename from Source/Survival_projet/Public/CraftingStation.h rename to Source/EmberWild/Public/CraftingStation.h index 086a263..e202430 100644 --- a/Source/Survival_projet/Public/CraftingStation.h +++ b/Source/EmberWild/Public/CraftingStation.h @@ -28,7 +28,7 @@ class UStaticMeshComponent; * qui change par instance, comme ItemData sur BP_Pickup. */ UCLASS() -class SURVIVAL_PROJET_API ACraftingStation : public AActor, public IInteractable +class EMBERWILD_API ACraftingStation : public AActor, public IInteractable { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CraftingWidget.h b/Source/EmberWild/Public/CraftingWidget.h similarity index 98% rename from Source/Survival_projet/Public/CraftingWidget.h rename to Source/EmberWild/Public/CraftingWidget.h index 60a30da..81eb533 100644 --- a/Source/Survival_projet/Public/CraftingWidget.h +++ b/Source/EmberWild/Public/CraftingWidget.h @@ -27,7 +27,7 @@ class UUniformGridPanel; * pour relire un etat. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCraftingWidget : public UUserWidget +class EMBERWILD_API UCraftingWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CustomizationCategoryWidget.h b/Source/EmberWild/Public/CustomizationCategoryWidget.h similarity index 96% rename from Source/Survival_projet/Public/CustomizationCategoryWidget.h rename to Source/EmberWild/Public/CustomizationCategoryWidget.h index e167e96..7e1ff94 100644 --- a/Source/Survival_projet/Public/CustomizationCategoryWidget.h +++ b/Source/EmberWild/Public/CustomizationCategoryWidget.h @@ -21,7 +21,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCustomizationCategoryClicked, int * onze entrees. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCustomizationCategoryWidget : public UUserWidget +class EMBERWILD_API UCustomizationCategoryWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/CustomizationOptionWidget.h b/Source/EmberWild/Public/CustomizationOptionWidget.h similarity index 97% rename from Source/Survival_projet/Public/CustomizationOptionWidget.h rename to Source/EmberWild/Public/CustomizationOptionWidget.h index a28cf68..6c1cfa3 100644 --- a/Source/Survival_projet/Public/CustomizationOptionWidget.h +++ b/Source/EmberWild/Public/CustomizationOptionWidget.h @@ -26,7 +26,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCustomizationOptionClicked, int32 * Classe Abstract : on cree un WBP_CustomizationOption qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UCustomizationOptionWidget : public UUserWidget +class EMBERWILD_API UCustomizationOptionWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/FootstepComponent.h b/Source/EmberWild/Public/FootstepComponent.h similarity index 99% rename from Source/Survival_projet/Public/FootstepComponent.h rename to Source/EmberWild/Public/FootstepComponent.h index d77bd25..db51753 100644 --- a/Source/Survival_projet/Public/FootstepComponent.h +++ b/Source/EmberWild/Public/FootstepComponent.h @@ -101,7 +101,7 @@ struct FFootstepGaitSettings * un pas local joue en 3D depuis les chevilles est attenue et sonne creux. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UFootstepComponent : public UActorComponent +class EMBERWILD_API UFootstepComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/FootstepSoundsDataAsset.h b/Source/EmberWild/Public/FootstepSoundsDataAsset.h similarity index 98% rename from Source/Survival_projet/Public/FootstepSoundsDataAsset.h rename to Source/EmberWild/Public/FootstepSoundsDataAsset.h index 55be6d8..e986573 100644 --- a/Source/Survival_projet/Public/FootstepSoundsDataAsset.h +++ b/Source/EmberWild/Public/FootstepSoundsDataAsset.h @@ -108,7 +108,7 @@ struct FFootstepSurfaceSounds * rende depuis un trace, et il tient dans un octet. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UFootstepSoundsDataAsset : public UPrimaryDataAsset +class EMBERWILD_API UFootstepSoundsDataAsset : public UPrimaryDataAsset { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/FpsArmsAnimInstance.h b/Source/EmberWild/Public/FpsArmsAnimInstance.h similarity index 89% rename from Source/Survival_projet/Public/FpsArmsAnimInstance.h rename to Source/EmberWild/Public/FpsArmsAnimInstance.h index 7d387ce..158a2c4 100644 --- a/Source/Survival_projet/Public/FpsArmsAnimInstance.h +++ b/Source/EmberWild/Public/FpsArmsAnimInstance.h @@ -4,10 +4,9 @@ #include "CoreMinimal.h" #include "Animation/AnimInstance.h" +#include "FpsPlayer.h" #include "FpsArmsAnimInstance.generated.h" -class AFpsPlayer; - /** * AnimInstance des bras en vue premiere personne. * @@ -22,7 +21,7 @@ class AFpsPlayer; * de pawn que la replication a deja synchronise (vitesse, sprint, accroupi). */ UCLASS() -class SURVIVAL_PROJET_API UFpsArmsAnimInstance : public UAnimInstance +class EMBERWILD_API UFpsArmsAnimInstance : public UAnimInstance { GENERATED_BODY() @@ -73,6 +72,19 @@ protected: UPROPERTY(BlueprintReadOnly, Category = "Movement") bool bIsFalling = false; + /** + * La reception qui vient d'avoir lieu, ou None tant qu'on est en l'air. + * + * C'est elle qui pilote la SORTIE de l'etat de chute, et il n'y a rien a + * composer autour : les trois valeurs menent aux trois etats de sortie + * (reception normale, reception encaissee, retour direct a la locomotion) et + * s'excluent par construction. Le seuil sous lequel une chute ne merite + * aucune animation vit sur le pawn -- c'est le meme que celui de la secousse + * de camera, pour que les deux effets ne se contredisent jamais. + */ + UPROPERTY(BlueprintReadOnly, Category = "Movement") + ELandingImpact LandingImpact = ELandingImpact::None; + /** * Vitesse verticale signee (cm/s), positive vers le haut. * @@ -102,6 +114,7 @@ protected: UPROPERTY(BlueprintReadOnly, Category = "Held Item") bool bHasItemInHand = false; + /** * Vitesse de lecture du cycle de deplacement, a brancher sur la broche * Play Rate du noeud d'animation. diff --git a/Source/Survival_projet/Public/FpsPlayer.h b/Source/EmberWild/Public/FpsPlayer.h similarity index 84% rename from Source/Survival_projet/Public/FpsPlayer.h rename to Source/EmberWild/Public/FpsPlayer.h index bfd2829..3b81b1f 100644 --- a/Source/Survival_projet/Public/FpsPlayer.h +++ b/Source/EmberWild/Public/FpsPlayer.h @@ -22,6 +22,35 @@ class UItemDataAsset; class USurvivalStatsComponent; struct FInputActionValue; +/** + * Ce que vaut la réception qui vient d'avoir lieu. + * + * Produit par le PAWN, qui est le seul à connaître les deux seuils, et republié + * tel quel par UFpsArmsAnimInstance. Un enum plutôt que deux booléens parce que + * les trois cas s'excluent par construction : la machine à états compare, elle + * n'a aucune condition à recomposer, et il n'existe aucune combinaison où deux + * transitions seraient valides en même temps — c'est-à-dire prises au hasard. + * + * Remis à None dès l'entrée en chute (voir Tick), donc il vaut None pendant tout + * le vol : une transition n'a jamais à vérifier bIsFalling en plus. + */ +UENUM(BlueprintType) +enum class ELandingImpact : uint8 +{ + /** En l'air, ou chute trop faible pour mériter une animation. */ + None, + + /** Réception normale (JumpLanding). */ + Soft, + + /** + * Réception encaissée (HardLanding) — c'est-à-dire, très exactement, une + * chute qui a coûté de la vie. Le seuil n'est pas un réglage d'animation, + * c'est `FallDamageMinSpeed`. + */ + Hard +}; + /** * Ressort amorti à une dimension, partagé par les effets de caméra. * @@ -70,7 +99,7 @@ struct FCameraSpring * dans le Blueprint enfant (BP_FpsPlayer), catégorie "Input". */ UCLASS() -class SURVIVAL_PROJET_API AFpsPlayer : public ACharacter +class EMBERWILD_API AFpsPlayer : public ACharacter { GENERATED_BODY() @@ -100,6 +129,10 @@ public: UFUNCTION(BlueprintPure, Category = "Animation") USkeletalMeshComponent* GetFirstPersonArms() const { return FirstPersonArms; } + /** La réception en cours, ou None en l'air. Lue par les AnimInstance. */ + UFUNCTION(BlueprintPure, Category = "Animation") + ELandingImpact GetLandingImpact() const { return LandingImpact; } + /** * Joue un montage sur les bras du joueur LOCAL, et seulement lui. * @@ -322,34 +355,57 @@ protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Animation") TObjectPtr GrabMontage; - /** - * Réception au sol, version légère (MTG_Land). - * - * Un montage et pas un état de la machine : l'atterrissage est un geste - * PONCTUEL qui doit se superposer à ce que les bras faisaient déjà. Un état - * imposerait de décider combien de temps y rester, et retomber en pleine - * course y bloquerait le cycle de foulée le temps de l'animation. - */ - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Animation") - TObjectPtr LandMontage; - - /** Réception lourde (MTG_HardLand), au-delà de HardLandingFallSpeed. */ - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Animation") - TObjectPtr HardLandMontage; + // ------------------------------------------------------------------ + // Dégâts de chute + // + // C'est ce bloc qui définit la réception encaissée, et pas l'inverse : + // `ELandingImpact::Hard` signifie exactement « cet atterrissage a coûté de la + // vie ». Un seuil d'animation réglé de son côté finirait forcément par + // diverger de celui des dégâts, et le joueur verrait son personnage encaisser + // sans rien perdre — ou pire, perdre de la vie en se réceptionnant + // souplement. Une animation qui ment sur l'état du jeu est pire que pas + // d'animation du tout. + // + // L'atterrissage est un ÉTAT de la machine et non un montage : les trois + // animations livrées (JumpStart, JumpFallLoop, JumpLanding) forment une + // chaîne dont le milieu est une BOUCLE, et une boucle ne se joue pas en + // montage. + // ------------------------------------------------------------------ /** - * Vitesse de chute (cm/s) à partir de laquelle la réception passe en lourde. + * Vitesse de chute (cm/s) à partir de laquelle on prend des dégâts. * * Doit rester nettement au-dessus de la retombée d'un saut sur place - * (~JumpZVelocity, 450 par défaut), sinon chaque saut se termine par une - * réception encaissée et le déplacement devient poussif. + * (~JumpZVelocity, 450 par défaut), sinon sauter coûte de la vie et le + * déplacement devient une punition. * - * Le seuil BAS, lui, est LandPunchMinFallSpeed : sous cette vitesse aucun - * montage n'est joué, exactement comme la caméra ne bouge pas. Une seule - * valeur à comprendre pour les deux effets, qui restent donc cohérents. + * À 800 cm/s, c'est une chute d'environ 3,2 m (v = racine(2·g·h), g = 980). + * Ne pas raisonner en hauteur pour régler cette valeur : la hauteur ne se + * mesure nulle part dans le moteur, alors que la vitesse d'impact est + * exactement ce que le CharacterMovement a sous la main — et elle tient + * compte, gratuitement, d'un saut fait en tombant. */ - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation", meta = (ClampMin = "0")) - float HardLandingFallSpeed = 800.f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fall Damage", meta = (ClampMin = "0")) + float FallDamageMinSpeed = 800.f; + + /** Vitesse (cm/s) au-delà de laquelle les dégâts plafonnent (~20 m de chute). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fall Damage", meta = (ClampMin = "1")) + float FallDamageMaxSpeed = 2000.f; + + /** + * Dégâts pris pile au seuil. Volontairement non nul : franchir la limite + * doit se sentir, sinon le seuil n'existe que dans le code. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fall Damage", meta = (ClampMin = "0")) + float FallDamageMin = 15.f; + + /** Dégâts pris à FallDamageMaxSpeed et au-delà. À 100, la chute est mortelle. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fall Damage", meta = (ClampMin = "0")) + float FallDamageMax = 100.f; + + /** Les dégâts de la chute qui vient d'avoir lieu, 0 sous le seuil. */ + UFUNCTION(BlueprintPure, Category = "Fall Damage") + float ComputeFallDamage(float FallSpeed) const; /** * Balancement de tête procédural : respiration à l'arrêt, pas à la marche, @@ -678,13 +734,42 @@ protected: void HandleCrouchReleased(); /** - * Clic gauche : agit avec l'objet actif de la barre rapide. - * Aujourd'hui seuls les consommables font quelque chose ; c'est ici que - * viendront les outils et les armes. + * Clic gauche : lance le GESTE de l'objet actif de la barre rapide. + * + * Elle ne produit plus l'effet elle-même — c'est le marqueur + * `UAnimNotify_ItemAction` posé dans le montage qui le fait, au moment où le + * geste frappe. Sans montage à jouer, elle retombe sur l'effet immédiat : + * un objet qui n'a pas d'animation n'aura jamais de marqueur, et le priver + * d'effet serait un objet cassé plutôt qu'un objet sans animation. */ void UseSelectedItem(); +public: + /** + * L'objet en main agit MAINTENANT. Appelée par l'AnimNotify du montage. + * + * Publique et `BlueprintCallable` pour cette seule raison : c'est le point + * d'entrée de l'animation vers le gameplay, y compris depuis un notify + * Blueprint. Elle ne fait rien d'autre que ce que faisait la seconde moitié + * de `UseSelectedItem` : router vers l'autorité. + */ + UFUNCTION(BlueprintCallable, Category = "Items") + void TriggerHeldItemAction(); + private: + /** + * La case visée par le clic, retenue jusqu'à l'impact. + * + * Relire la case active au moment du marqueur serait faux : trois dixièmes + * de seconde séparent l'appui de l'impact, et la molette peut passer sur un + * autre objet entre-temps — le coup de hache partirait alors avec la pomme + * qu'on vient de sélectionner. Changer d'objet coupe bien le montage en + * cours (`PlayEquipMontage` ne saute pas), mais seulement quand le nouvel + * objet a un montage d'équipement : ce n'est pas une garantie sur laquelle + * s'appuyer. + */ + int32 PendingUseSlotIndex = INDEX_NONE; + // ------------------------------------------------------------------ // Réseau // @@ -781,6 +866,17 @@ private: /** Vitesse verticale mémorisée pendant la chute, pour calibrer l'atterrissage. */ float LastFallSpeed = 0.f; + /** + * La réception en cours, lue par les AnimInstance. + * + * Écrite à deux endroits et deux seulement : remise à None dans Tick tant + * qu'on est en l'air, posée à sa vraie valeur dans Landed(). C'est ce qui + * garantit qu'elle vaut None pendant tout le vol — sans quoi la machine à + * états prendrait sa transition de réception avec la valeur du saut + * précédent, dès la première image de chute. + */ + ELandingImpact LandingImpact = ELandingImpact::None; + /** Répliqué pour que les autres joueurs voient la bonne vitesse et la bonne anim. */ UPROPERTY(ReplicatedUsing = OnRep_IsSprinting) bool bIsSprinting = false; diff --git a/Source/Survival_projet/Public/FpsPlayerController.h b/Source/EmberWild/Public/FpsPlayerController.h similarity index 99% rename from Source/Survival_projet/Public/FpsPlayerController.h rename to Source/EmberWild/Public/FpsPlayerController.h index 8ecfb14..825382b 100644 --- a/Source/Survival_projet/Public/FpsPlayerController.h +++ b/Source/EmberWild/Public/FpsPlayerController.h @@ -33,7 +33,7 @@ struct FInputActionValue; * Si tu creais le HUD dans AFpsPlayer, il disparaitrait a chaque respawn. */ UCLASS() -class SURVIVAL_PROJET_API AFpsPlayerController : public APlayerController +class EMBERWILD_API AFpsPlayerController : public APlayerController { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/HeadBobComponent.h b/Source/EmberWild/Public/HeadBobComponent.h similarity index 99% rename from Source/Survival_projet/Public/HeadBobComponent.h rename to Source/EmberWild/Public/HeadBobComponent.h index 5148f35..55a1629 100644 --- a/Source/Survival_projet/Public/HeadBobComponent.h +++ b/Source/EmberWild/Public/HeadBobComponent.h @@ -85,7 +85,7 @@ struct FHeadBobProfile * la camera. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UHeadBobComponent : public UActorComponent +class EMBERWILD_API UHeadBobComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/HeldItemComponent.h b/Source/EmberWild/Public/HeldItemComponent.h similarity index 54% rename from Source/Survival_projet/Public/HeldItemComponent.h rename to Source/EmberWild/Public/HeldItemComponent.h index 90fc965..f4c6a32 100644 --- a/Source/Survival_projet/Public/HeldItemComponent.h +++ b/Source/EmberWild/Public/HeldItemComponent.h @@ -4,15 +4,41 @@ #include "CoreMinimal.h" #include "Components/ActorComponent.h" +#include "ItemDataAsset.h" #include "HeldItemComponent.generated.h" class AFpsPlayer; +class UAnimInstance; class UItemDataAsset; class UStaticMeshComponent; /** Diffuse a chaque changement d'objet en main, nul compris. L'UI et l'anim s'y abonnent. */ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHeldItemChanged, UItemDataAsset*, NewItem); +/** + * Ce qu'a fait PlayUseMontage, du point de vue de l'appelant. + * + * Trois etats et pas un booleen, parce que l'appelant en tire trois conduites + * differentes : un geste qui demarre porte son propre marqueur d'impact et il + * n'y a plus qu'a attendre ; un geste deja en cours en enverra un lui aussi ; + * une absence de montage, elle, ne produira JAMAIS de marqueur et doit retomber + * sur l'effet immediat. Les confondre donne soit un objet sans montage qui ne + * fait plus rien du tout, soit un clic martele qui declenche l'effet a chaque + * image pendant que le bras, lui, ne rejoue pas. + */ +UENUM(BlueprintType) +enum class EUseMontageResult : uint8 +{ + /** Le geste vient de demarrer : son AnimNotify declenchera l'effet. */ + Started, + + /** Le meme geste tournait deja ; on ne l'a pas relance. */ + AlreadyPlaying, + + /** Rien a jouer -- l'objet n'a pas de UseMontage, ou les bras sont distants. */ + NoMontage +}; + /** * Montre dans la main l'objet occupant la case active de la barre rapide. * @@ -47,7 +73,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHeldItemChanged, UItemDataAsset*, * clignoter ce qu'il tient deja. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UHeldItemComponent : public UActorComponent +class EMBERWILD_API UHeldItemComponent : public UActorComponent { GENERATED_BODY() @@ -71,6 +97,7 @@ public: UFUNCTION(BlueprintPure, Category = "Held Item") bool HasItemInHand() const { return bItemVisibleInHand; } + /** * Relit la case active et met la main a jour. * @@ -81,6 +108,24 @@ public: UFUNCTION(BlueprintCallable, Category = "Held Item") void RefreshFromInventory(); + /** + * Joue le geste du clic gauche avec l'objet en main. + * + * Appelee par le PAWN au moment de l'input, donc chez le joueur local et + * AVANT tout aller-retour reseau : un coup de pioche qui attendrait la + * reponse du serveur partirait avec un temps de retard sur le clic, et c'est + * la premiere chose qu'on sent dans un jeu. + * + * Il ne fait QUE l'animation : l'effet de l'objet part du marqueur + * UAnimNotify_ItemAction pose dans le montage, pour tomber au moment de + * l'impact et pas a l'appui. D'ou le retour a trois etats, que l'appelant + * doit lire -- voir EUseMontageResult. + * + * @return ce qu'il est advenu du geste. + */ + UFUNCTION(BlueprintCallable, Category = "Held Item") + EUseMontageResult PlayUseMontage(); + UPROPERTY(BlueprintAssignable, Category = "Held Item") FOnHeldItemChanged OnHeldItemChanged; @@ -99,6 +144,67 @@ public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Held Item") FName ThirdPersonSocket = TEXT("hand_r"); + /** + * Geste du clic gauche quand les mains sont VIDES (MTG_Punch). + * + * Ici et pas sur un DataAsset, pour la raison evidente qu'il n'y a pas + * d'objet a qui le demander. Ici et pas sur AFpsPlayer a cote de GrabMontage, + * parce que c'est ce composant qui choisit quel geste part au clic : deux + * moities de la meme decision dans deux classes finiraient par diverger. + * + * Il ne sert QUE quand aucun objet n'occupe la case active. Un objet en main + * sans UseMontage ne joue rien -- retomber sur le poing ferait boxer le + * joueur en mangeant une pomme. + */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Held Item") + TObjectPtr UnarmedUseMontage; + + // ------------------------------------------------------------------ + // Accroupissement + // + // Des MONTAGES et pas des etats de la machine, alors que CrouchIdle et + // CrouchWalk, eux, sont bien des etats. La frontiere est la meme que partout + // ailleurs : ce qui DURE est un etat, ce qui ARRIVE est un montage. Plier les + // genoux prend trois dixiemes de seconde et se superpose au cycle en cours. + // + // Raison technique par-dessus, et elle est decisive : un etat dont la sortie + // depend de la fin de l'animation utilise « Automatic Rule Based on Sequence + // Player in State », qui a besoin d'un Sequence Player pour lire sa duree. Un + // etat qui contiendrait un choix entre deux animations -- avec et sans objet + // -- lui retire cette certitude, et il faudrait ecrire des durees en dur dans + // les transitions, a re-regler a chaque animation livree. + // + // Ici et pas sur UItemDataAsset : le geste est GENERIQUE, deux variantes en + // tout. Le jour ou un outil voudra la sienne, un champ optionnel sur son + // DataAsset primera sur ceux-ci, sans rien casser. + // ------------------------------------------------------------------ + + /** Geste d'accroupissement, mains vides (MTG_EnterCrouch). */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Held Item|Crouch") + TObjectPtr UnarmedEnterCrouchMontage; + + /** Meme geste, un objet en main. Vide = on rejoue la version mains vides. */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Held Item|Crouch") + TObjectPtr HeldEnterCrouchMontage; + + /** Geste de relevee, mains vides (MTG_ExitCrouch). */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Held Item|Crouch") + TObjectPtr UnarmedExitCrouchMontage; + + /** Meme geste, un objet en main. Vide = on rejoue la version mains vides. */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Held Item|Crouch") + TObjectPtr HeldExitCrouchMontage; + + /** + * Joue le geste d'accroupissement ou de relevee, selon ce qu'on tient. + * + * Appelee par AFpsPlayer depuis OnStartCrouch / OnEndCrouch, qui sont deja + * surchargees : le pawn sait exactement quand la capsule change de taille, + * personne n'a a le deviner. + */ + UFUNCTION(BlueprintCallable, Category = "Held Item|Crouch") + bool PlayCrouchMontage(bool bEntering); + protected: virtual void BeginPlay() override; virtual void OnUnregister() override; @@ -137,6 +243,30 @@ private: */ void PlayEquipMontage(); + /** + * Joue un montage sur les bras du joueur LOCAL, et lui seul. + * + * @param bSkipIfAlreadyPlaying vrai pour le clic gauche : marteler le bouton + * relancerait le geste depuis le debut a chaque image, ce qui donne un + * bras qui tremble au lieu de frapper. Faux pour l'equipement, ou + * changer d'outil doit couper net le geste precedent. + * @return true si un montage a demarre. + */ + bool PlayLocalArmsMontage(class UAnimMontage* Montage, bool bSkipIfAlreadyPlaying); + + /** + * Branche ou debranche la couche d'animation de l'objet sur les bras. + * + * Locale elle aussi, et pour la meme raison que le montage : les bras sont en + * OnlyOwnerSee. Chez l'hote, lier une couche sur le squelette de bras d'un ami + * ferait evaluer un graphe que personne ne rend. + * + * Idempotente : elle compare a la couche deja liee et ne fait rien si elle est + * la bonne. C'est ce qui permet de l'appeler a chaque rafraichissement + * d'inventaire sans relancer le graphe. + */ + void UpdateArmsAnimLayer(); + /** * Cache le mesh du CORPS chez le joueur qui controle ce pawn, et lui seul. * @@ -192,6 +322,18 @@ private: */ bool bItemVisibleInHand = false; + /** + * La couche actuellement liee aux bras, ou nulle. + * + * Indispensable, et pas un simple cache : LinkAnimClassLayers AJOUTE une + * couche, elle ne remplace pas la precedente. Sans garder ce qui est en + * place pour le delier, passer de la hache a la pioche laisserait les deux + * branchees -- et c'est la premiere qui gagnerait sur les fonctions que la + * seconde n'implemente pas. + */ + UPROPERTY(Transient) + TSubclassOf LinkedArmsLayer; + /** Evite de repeter l'avertissement de socket introuvable a chaque montage. */ bool bLoggedMissingSocket = false; }; diff --git a/Source/Survival_projet/Public/HotbarWidget.h b/Source/EmberWild/Public/HotbarWidget.h similarity index 98% rename from Source/Survival_projet/Public/HotbarWidget.h rename to Source/EmberWild/Public/HotbarWidget.h index e728f1d..96b5002 100644 --- a/Source/Survival_projet/Public/HotbarWidget.h +++ b/Source/EmberWild/Public/HotbarWidget.h @@ -28,7 +28,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnHotbarSlotHovered, UInventoryC * existant s'en occupe deja sans aucun code supplementaire. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UHotbarWidget : public UUserWidget +class EMBERWILD_API UHotbarWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/Interactable.h b/Source/EmberWild/Public/Interactable.h similarity index 98% rename from Source/Survival_projet/Public/Interactable.h rename to Source/EmberWild/Public/Interactable.h index d5ba405..a665542 100644 --- a/Source/Survival_projet/Public/Interactable.h +++ b/Source/EmberWild/Public/Interactable.h @@ -31,7 +31,7 @@ class UInteractable : public UInterface * Actor->Interact() directement. Seul le wrapper Execute_ sait router * l'appel vers une implementation Blueprint. */ -class SURVIVAL_PROJET_API IInteractable +class EMBERWILD_API IInteractable { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InteractionComponent.h b/Source/EmberWild/Public/InteractionComponent.h similarity index 98% rename from Source/Survival_projet/Public/InteractionComponent.h rename to Source/EmberWild/Public/InteractionComponent.h index 097939f..48d94d3 100644 --- a/Source/Survival_projet/Public/InteractionComponent.h +++ b/Source/EmberWild/Public/InteractionComponent.h @@ -31,7 +31,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnInteractionPromptChanged, const F * revenir toucher a ce fichier. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UInteractionComponent : public UActorComponent +class EMBERWILD_API UInteractionComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InteractionPromptWidget.h b/Source/EmberWild/Public/InteractionPromptWidget.h similarity index 97% rename from Source/Survival_projet/Public/InteractionPromptWidget.h rename to Source/EmberWild/Public/InteractionPromptWidget.h index c3899df..1d33bd8 100644 --- a/Source/Survival_projet/Public/InteractionPromptWidget.h +++ b/Source/EmberWild/Public/InteractionPromptWidget.h @@ -27,7 +27,7 @@ class UTextBlock; * qui glisse d'un emplacement du grill a l'autre sur le meme acteur. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UInteractionPromptWidget : public UUserWidget +class EMBERWILD_API UInteractionPromptWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InventoryComponent.h b/Source/EmberWild/Public/InventoryComponent.h similarity index 99% rename from Source/Survival_projet/Public/InventoryComponent.h rename to Source/EmberWild/Public/InventoryComponent.h index 0bf38e3..0e3a4f3 100644 --- a/Source/Survival_projet/Public/InventoryComponent.h +++ b/Source/EmberWild/Public/InventoryComponent.h @@ -58,7 +58,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSelectedHotbarSlotChanged, int32, * disparaitre en silence. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UInventoryComponent : public UActorComponent +class EMBERWILD_API UInventoryComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InventoryDragDropOperation.h b/Source/EmberWild/Public/InventoryDragDropOperation.h similarity index 92% rename from Source/Survival_projet/Public/InventoryDragDropOperation.h rename to Source/EmberWild/Public/InventoryDragDropOperation.h index 689e91e..0665761 100644 --- a/Source/Survival_projet/Public/InventoryDragDropOperation.h +++ b/Source/EmberWild/Public/InventoryDragDropOperation.h @@ -16,7 +16,7 @@ class UInventoryComponent; * reel au moment du drop au lieu d'appliquer une donnee perimee. */ UCLASS() -class SURVIVAL_PROJET_API UInventoryDragDropOperation : public UDragDropOperation +class EMBERWILD_API UInventoryDragDropOperation : public UDragDropOperation { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InventoryScreenWidget.h b/Source/EmberWild/Public/InventoryScreenWidget.h similarity index 98% rename from Source/Survival_projet/Public/InventoryScreenWidget.h rename to Source/EmberWild/Public/InventoryScreenWidget.h index 3710ea6..0a7e007 100644 --- a/Source/Survival_projet/Public/InventoryScreenWidget.h +++ b/Source/EmberWild/Public/InventoryScreenWidget.h @@ -36,7 +36,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnInventoryScreenTabChanged, bool, * Classe Abstract : on cree un WBP_InventoryScreen qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UInventoryScreenWidget : public UUserWidget +class EMBERWILD_API UInventoryScreenWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InventorySlotWidget.h b/Source/EmberWild/Public/InventorySlotWidget.h similarity index 98% rename from Source/Survival_projet/Public/InventorySlotWidget.h rename to Source/EmberWild/Public/InventorySlotWidget.h index 8f64317..e2f8ef5 100644 --- a/Source/Survival_projet/Public/InventorySlotWidget.h +++ b/Source/EmberWild/Public/InventorySlotWidget.h @@ -29,7 +29,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnInventorySlotHoverChanged, int32 * que c'est elle qui recoit les evenements souris. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UInventorySlotWidget : public UUserWidget +class EMBERWILD_API UInventorySlotWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/InventoryWidget.h b/Source/EmberWild/Public/InventoryWidget.h similarity index 99% rename from Source/Survival_projet/Public/InventoryWidget.h rename to Source/EmberWild/Public/InventoryWidget.h index 956b902..a0d6bb1 100644 --- a/Source/Survival_projet/Public/InventoryWidget.h +++ b/Source/EmberWild/Public/InventoryWidget.h @@ -24,7 +24,7 @@ class UUniformGridPanel; * grille s'agrandira toute seule au prochain rafraichissement. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UInventoryWidget : public UUserWidget +class EMBERWILD_API UInventoryWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/ItemDataAsset.h b/Source/EmberWild/Public/ItemDataAsset.h similarity index 87% rename from Source/Survival_projet/Public/ItemDataAsset.h rename to Source/EmberWild/Public/ItemDataAsset.h index 1886dba..6c6e2b5 100644 --- a/Source/Survival_projet/Public/ItemDataAsset.h +++ b/Source/EmberWild/Public/ItemDataAsset.h @@ -43,7 +43,7 @@ enum class EToolType : uint8 * pommes du jeu. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UItemDataAsset : public UPrimaryDataAsset +class EMBERWILD_API UItemDataAsset : public UPrimaryDataAsset { GENERATED_BODY() @@ -144,6 +144,29 @@ public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held") bool bShowInHand = false; + /** + * Couche d'animation des BRAS quand cet objet est en main (ABP_Tool_Axe...). + * + * C'est un « Linked Anim Layer » : un Animation Blueprint qui implemente + * l'interface de couche de ABP_FpsArms et REMPLACE ses cycles le temps qu'on + * tienne l'objet. Vide = les bras gardent leurs cycles mains nues. + * + * Ce champ est la raison d'etre de tout le mecanisme, et elle est humaine + * plutot que technique : ajouter un outil ne doit demander NI recompilation + * C++, NI ouverture de ABP_FpsArms. Un animateur livre son AnimBP de couche, + * on le glisse ici, c'est fini. L'alternative -- un enum de posture lu par un + * « Blend Poses by Enum » -- coutait une valeur d'enum, une recompilation, et + * un branchement a la main dans CHAQUE etat de la machine : le travail + * croissait en outils x etats, pas en outils. + * + * Contrainte a tenir : la couche doit etre batie sur le meme squelette que + * les bras, et implementer la meme interface. Une classe qui n'implemente + * rien se lie sans erreur et ne change simplement rien -- symptome silencieux + * dont il faut se souvenir. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held", meta = (EditCondition = "bShowInHand")) + TSubclassOf ArmsAnimLayer; + /** * Mesh tenu en main. Vide = on reprend WorldMesh. * @@ -188,6 +211,21 @@ public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held") TObjectPtr EquipMontage; + /** + * Geste du CLIC GAUCHE avec cet objet en main (MTG_Pickaxe_Attack...). + * + * « Use » et pas « Attack » : le clic gauche est une seule action dont le + * sens depend de ce qu'on tient -- frapper avec une pioche, boire a une + * gourde, allumer une torche. Un champ par verbe finirait en AttackMontage, + * EatMontage, DrinkMontage pour un seul bouton. + * + * Il ne fait QUE l'animation. Ce que l'objet produit reste dans + * AFpsPlayer::PerformUseItem, cote serveur -- l'un se voit tout de suite chez + * soi, l'autre doit faire autorite. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held") + TObjectPtr UseMontage; + /** Le mesh a montrer en main, en appliquant le repli sur WorldMesh. */ UFUNCTION(BlueprintPure, Category = "Item|Held") UStaticMesh* GetHeldMesh() const { return HeldMesh ? HeldMesh.Get() : WorldMesh.Get(); } diff --git a/Source/Survival_projet/Public/ItemDetailsWidget.h b/Source/EmberWild/Public/ItemDetailsWidget.h similarity index 98% rename from Source/Survival_projet/Public/ItemDetailsWidget.h rename to Source/EmberWild/Public/ItemDetailsWidget.h index 150d504..154c9a7 100644 --- a/Source/Survival_projet/Public/ItemDetailsWidget.h +++ b/Source/EmberWild/Public/ItemDetailsWidget.h @@ -25,7 +25,7 @@ class UTextBlock; * page et les libelles appartiennent au Widget Blueprint. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UItemDetailsWidget : public UUserWidget +class EMBERWILD_API UItemDetailsWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/KeyCaptureWidget.h b/Source/EmberWild/Public/KeyCaptureWidget.h similarity index 98% rename from Source/Survival_projet/Public/KeyCaptureWidget.h rename to Source/EmberWild/Public/KeyCaptureWidget.h index 29e9d3f..72487b5 100644 --- a/Source/Survival_projet/Public/KeyCaptureWidget.h +++ b/Source/EmberWild/Public/KeyCaptureWidget.h @@ -41,7 +41,7 @@ enum class EKeyCaptureState : uint8 * Classe Abstract : on cree un WBP_KeyCapture qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UKeyCaptureWidget : public UUserWidget +class EMBERWILD_API UKeyCaptureWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/KeyboardLayout.h b/Source/EmberWild/Public/KeyboardLayout.h similarity index 95% rename from Source/Survival_projet/Public/KeyboardLayout.h rename to Source/EmberWild/Public/KeyboardLayout.h index 60b82bb..c567c90 100644 --- a/Source/Survival_projet/Public/KeyboardLayout.h +++ b/Source/EmberWild/Public/KeyboardLayout.h @@ -43,12 +43,12 @@ namespace KeyboardLayout * disposition (espace, modificateurs, manette...), si la plateforme n'est pas * geree, ou si l'OS ne sait pas repondre. Jamais de touche invalide en sortie. */ - SURVIVAL_PROJET_API FKey RemapKeyToActiveLayout(const FKey& ReferenceKey); + EMBERWILD_API FKey RemapKeyToActiveLayout(const FKey& ReferenceKey); /** * L'identifiant de la disposition active, pour le journal : "0000040C" pour * le francais, "00000409" pour l'anglais US. Sert au diagnostic quand un * testeur signale des touches inattendues -- c'est la premiere chose a lire. */ - SURVIVAL_PROJET_API FString GetActiveLayoutId(); + EMBERWILD_API FString GetActiveLayoutId(); } diff --git a/Source/Survival_projet/Public/MainMenuGameMode.h b/Source/EmberWild/Public/MainMenuGameMode.h similarity index 91% rename from Source/Survival_projet/Public/MainMenuGameMode.h rename to Source/EmberWild/Public/MainMenuGameMode.h index a6d0b1f..e832703 100644 --- a/Source/Survival_projet/Public/MainMenuGameMode.h +++ b/Source/EmberWild/Public/MainMenuGameMode.h @@ -18,7 +18,7 @@ * MAP, pas un objet qu'on pose dedans. Il se choisit dans World Settings. */ UCLASS() -class SURVIVAL_PROJET_API AMainMenuGameMode : public AGameModeBase +class EMBERWILD_API AMainMenuGameMode : public AGameModeBase { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MainMenuPlayerController.h b/Source/EmberWild/Public/MainMenuPlayerController.h similarity index 99% rename from Source/Survival_projet/Public/MainMenuPlayerController.h rename to Source/EmberWild/Public/MainMenuPlayerController.h index 5e3f728..05fcaba 100644 --- a/Source/Survival_projet/Public/MainMenuPlayerController.h +++ b/Source/EmberWild/Public/MainMenuPlayerController.h @@ -49,7 +49,7 @@ enum class EMenuPendingAction : uint8 * Comme dans le jeu, l'UI vit sur le controller et pas sur un acteur du monde. */ UCLASS() -class SURVIVAL_PROJET_API AMainMenuPlayerController : public APlayerController +class EMBERWILD_API AMainMenuPlayerController : public APlayerController { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MainMenuWidget.h b/Source/EmberWild/Public/MainMenuWidget.h similarity index 96% rename from Source/Survival_projet/Public/MainMenuWidget.h rename to Source/EmberWild/Public/MainMenuWidget.h index fdb8fa5..3a1ba9f 100644 --- a/Source/Survival_projet/Public/MainMenuWidget.h +++ b/Source/EmberWild/Public/MainMenuWidget.h @@ -20,7 +20,7 @@ class UButton; * widget n'existe que sur la machine du joueur local, le serveur ne le voit pas. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UMainMenuWidget : public UUserWidget +class EMBERWILD_API UMainMenuWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MenuCameraSpot.h b/Source/EmberWild/Public/MenuCameraSpot.h similarity index 93% rename from Source/Survival_projet/Public/MenuCameraSpot.h rename to Source/EmberWild/Public/MenuCameraSpot.h index 1511432..2f23c36 100644 --- a/Source/Survival_projet/Public/MenuCameraSpot.h +++ b/Source/EmberWild/Public/MenuCameraSpot.h @@ -17,7 +17,7 @@ * caracteres, et la classe a un endroit ou porter ses propres reglages. */ UCLASS() -class SURVIVAL_PROJET_API AMenuCameraSpot : public ACameraActor +class EMBERWILD_API AMenuCameraSpot : public ACameraActor { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MusicDirector.h b/Source/EmberWild/Public/MusicDirector.h similarity index 97% rename from Source/Survival_projet/Public/MusicDirector.h rename to Source/EmberWild/Public/MusicDirector.h index 6fefede..d0b2bcf 100644 --- a/Source/Survival_projet/Public/MusicDirector.h +++ b/Source/EmberWild/Public/MusicDirector.h @@ -28,7 +28,7 @@ class UMusicPlaylistDataAsset; * son BeginPlay. */ UCLASS(ClassGroup = "Audio", meta = (DisplayName = "Music Director")) -class SURVIVAL_PROJET_API AMusicDirector : public AInfo +class EMBERWILD_API AMusicDirector : public AInfo { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MusicPlaylistDataAsset.h b/Source/EmberWild/Public/MusicPlaylistDataAsset.h similarity index 97% rename from Source/Survival_projet/Public/MusicPlaylistDataAsset.h rename to Source/EmberWild/Public/MusicPlaylistDataAsset.h index a6f2f6b..5c5d086 100644 --- a/Source/Survival_projet/Public/MusicPlaylistDataAsset.h +++ b/Source/EmberWild/Public/MusicPlaylistDataAsset.h @@ -22,7 +22,7 @@ class USoundBase; * mettre de l'etat le partagerait aussi. */ UCLASS(BlueprintType) -class SURVIVAL_PROJET_API UMusicPlaylistDataAsset : public UPrimaryDataAsset +class EMBERWILD_API UMusicPlaylistDataAsset : public UPrimaryDataAsset { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/MusicSubsystem.h b/Source/EmberWild/Public/MusicSubsystem.h similarity index 99% rename from Source/Survival_projet/Public/MusicSubsystem.h rename to Source/EmberWild/Public/MusicSubsystem.h index 5e19fe1..35607e1 100644 --- a/Source/Survival_projet/Public/MusicSubsystem.h +++ b/Source/EmberWild/Public/MusicSubsystem.h @@ -55,7 +55,7 @@ enum class EMusicLevelChangeMode : uint8 * musique sans une ligne de plus. */ UCLASS() -class SURVIVAL_PROJET_API UMusicSubsystem : public UGameInstanceSubsystem +class EMBERWILD_API UMusicSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/PauseMenuWidget.h b/Source/EmberWild/Public/PauseMenuWidget.h similarity index 98% rename from Source/Survival_projet/Public/PauseMenuWidget.h rename to Source/EmberWild/Public/PauseMenuWidget.h index 7877e8f..013c041 100644 --- a/Source/Survival_projet/Public/PauseMenuWidget.h +++ b/Source/EmberWild/Public/PauseMenuWidget.h @@ -19,7 +19,7 @@ class UButton; * Classe Abstract : on cree un WBP_PauseMenu qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UPauseMenuWidget : public UUserWidget +class EMBERWILD_API UPauseMenuWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/PickupItem.h b/Source/EmberWild/Public/PickupItem.h similarity index 98% rename from Source/Survival_projet/Public/PickupItem.h rename to Source/EmberWild/Public/PickupItem.h index acb7ab0..62a7e40 100644 --- a/Source/Survival_projet/Public/PickupItem.h +++ b/Source/EmberWild/Public/PickupItem.h @@ -20,7 +20,7 @@ class UStaticMeshComponent; * juste l'ItemData sur chaque instance posee dans le niveau. */ UCLASS() -class SURVIVAL_PROJET_API APickupItem : public AActor, public IInteractable +class EMBERWILD_API APickupItem : public AActor, public IInteractable { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/PlayerBodyAnimInstance.h b/Source/EmberWild/Public/PlayerBodyAnimInstance.h similarity index 98% rename from Source/Survival_projet/Public/PlayerBodyAnimInstance.h rename to Source/EmberWild/Public/PlayerBodyAnimInstance.h index 5bd045a..c50701f 100644 --- a/Source/Survival_projet/Public/PlayerBodyAnimInstance.h +++ b/Source/EmberWild/Public/PlayerBodyAnimInstance.h @@ -33,7 +33,7 @@ class AFpsPlayer; * information -- exactement le reproche fait a UPlayerNameplateComponent. */ UCLASS() -class SURVIVAL_PROJET_API UPlayerBodyAnimInstance : public UAnimInstance +class EMBERWILD_API UPlayerBodyAnimInstance : public UAnimInstance { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/PlayerNameplateComponent.h b/Source/EmberWild/Public/PlayerNameplateComponent.h similarity index 98% rename from Source/Survival_projet/Public/PlayerNameplateComponent.h rename to Source/EmberWild/Public/PlayerNameplateComponent.h index 5d5a3aa..3a769ae 100644 --- a/Source/Survival_projet/Public/PlayerNameplateComponent.h +++ b/Source/EmberWild/Public/PlayerNameplateComponent.h @@ -33,7 +33,7 @@ class APlayerState; * meme chaine sur le reseau. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UPlayerNameplateComponent : public UWidgetComponent +class EMBERWILD_API UPlayerNameplateComponent : public UWidgetComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/PlayerNameplateWidget.h b/Source/EmberWild/Public/PlayerNameplateWidget.h similarity index 94% rename from Source/Survival_projet/Public/PlayerNameplateWidget.h rename to Source/EmberWild/Public/PlayerNameplateWidget.h index 3476de1..fb69875 100644 --- a/Source/Survival_projet/Public/PlayerNameplateWidget.h +++ b/Source/EmberWild/Public/PlayerNameplateWidget.h @@ -21,7 +21,7 @@ class UTextBlock; * mise en page. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API UPlayerNameplateWidget : public UUserWidget +class EMBERWILD_API UPlayerNameplateWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/ScreenFadeComponent.h b/Source/EmberWild/Public/ScreenFadeComponent.h similarity index 97% rename from Source/Survival_projet/Public/ScreenFadeComponent.h rename to Source/EmberWild/Public/ScreenFadeComponent.h index ad7652d..194cf30 100644 --- a/Source/Survival_projet/Public/ScreenFadeComponent.h +++ b/Source/EmberWild/Public/ScreenFadeComponent.h @@ -23,7 +23,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnScreenFadeFinished); * AUDIO, que le voile ne sait pas faire. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API UScreenFadeComponent : public UActorComponent +class EMBERWILD_API UScreenFadeComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SessionSubsystem.h b/Source/EmberWild/Public/SessionSubsystem.h similarity index 99% rename from Source/Survival_projet/Public/SessionSubsystem.h rename to Source/EmberWild/Public/SessionSubsystem.h index 0a90762..310ca37 100644 --- a/Source/Survival_projet/Public/SessionSubsystem.h +++ b/Source/EmberWild/Public/SessionSubsystem.h @@ -44,7 +44,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSessionTravelPending); * deux instances sur la meme machine sans client Steam. */ UCLASS() -class SURVIVAL_PROJET_API USessionSubsystem : public UGameInstanceSubsystem +class EMBERWILD_API USessionSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingKeyRowWidget.h b/Source/EmberWild/Public/SettingKeyRowWidget.h similarity index 97% rename from Source/Survival_projet/Public/SettingKeyRowWidget.h rename to Source/EmberWild/Public/SettingKeyRowWidget.h index 9ec2a26..c7bd9c9 100644 --- a/Source/Survival_projet/Public/SettingKeyRowWidget.h +++ b/Source/EmberWild/Public/SettingKeyRowWidget.h @@ -25,7 +25,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSettingKeyRebindRequested, FName, * Classe Abstract : on cree un WBP_SettingKeyRow qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingKeyRowWidget : public UUserWidget +class EMBERWILD_API USettingKeyRowWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingRowWidget.h b/Source/EmberWild/Public/SettingRowWidget.h similarity index 98% rename from Source/Survival_projet/Public/SettingRowWidget.h rename to Source/EmberWild/Public/SettingRowWidget.h index d0fd326..f7dec1a 100644 --- a/Source/Survival_projet/Public/SettingRowWidget.h +++ b/Source/EmberWild/Public/SettingRowWidget.h @@ -30,7 +30,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSettingRowIndexChanged, int32, Ne * Classe Abstract : on cree un WBP_SettingRow qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingRowWidget : public UUserWidget +class EMBERWILD_API USettingRowWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsAudioWidget.h b/Source/EmberWild/Public/SettingsAudioWidget.h similarity index 95% rename from Source/Survival_projet/Public/SettingsAudioWidget.h rename to Source/EmberWild/Public/SettingsAudioWidget.h index d239862..400f293 100644 --- a/Source/Survival_projet/Public/SettingsAudioWidget.h +++ b/Source/EmberWild/Public/SettingsAudioWidget.h @@ -21,7 +21,7 @@ class USettingRowWidget; * WBP_SettingRow par ligne, nomme exactement comme le BindWidget correspondant. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsAudioWidget : public USettingsTabWidget +class EMBERWILD_API USettingsAudioWidget : public USettingsTabWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsControlsWidget.h b/Source/EmberWild/Public/SettingsControlsWidget.h similarity index 98% rename from Source/Survival_projet/Public/SettingsControlsWidget.h rename to Source/EmberWild/Public/SettingsControlsWidget.h index b1d3210..d90d019 100644 --- a/Source/Survival_projet/Public/SettingsControlsWidget.h +++ b/Source/EmberWild/Public/SettingsControlsWidget.h @@ -25,7 +25,7 @@ class USettingKeyRowWidget; * Classe Abstract : on cree un WBP_SettingsControls qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsControlsWidget : public USettingsTabWidget +class EMBERWILD_API USettingsControlsWidget : public USettingsTabWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsDisplayWidget.h b/Source/EmberWild/Public/SettingsDisplayWidget.h similarity index 98% rename from Source/Survival_projet/Public/SettingsDisplayWidget.h rename to Source/EmberWild/Public/SettingsDisplayWidget.h index ecba2c9..261b70a 100644 --- a/Source/Survival_projet/Public/SettingsDisplayWidget.h +++ b/Source/EmberWild/Public/SettingsDisplayWidget.h @@ -24,7 +24,7 @@ class USurvivalUserSettings; * Classe Abstract : on cree un WBP_SettingsDisplay qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsDisplayWidget : public USettingsTabWidget +class EMBERWILD_API USettingsDisplayWidget : public USettingsTabWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsGameplayWidget.h b/Source/EmberWild/Public/SettingsGameplayWidget.h similarity index 96% rename from Source/Survival_projet/Public/SettingsGameplayWidget.h rename to Source/EmberWild/Public/SettingsGameplayWidget.h index bfc45d8..3d1b4eb 100644 --- a/Source/Survival_projet/Public/SettingsGameplayWidget.h +++ b/Source/EmberWild/Public/SettingsGameplayWidget.h @@ -20,7 +20,7 @@ class USurvivalUserSettings; * WBP_SettingRow par ligne, nomme exactement comme le BindWidget correspondant. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsGameplayWidget : public USettingsTabWidget +class EMBERWILD_API USettingsGameplayWidget : public USettingsTabWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsGraphicsWidget.h b/Source/EmberWild/Public/SettingsGraphicsWidget.h similarity index 97% rename from Source/Survival_projet/Public/SettingsGraphicsWidget.h rename to Source/EmberWild/Public/SettingsGraphicsWidget.h index 1cb5688..964ca2d 100644 --- a/Source/Survival_projet/Public/SettingsGraphicsWidget.h +++ b/Source/EmberWild/Public/SettingsGraphicsWidget.h @@ -24,7 +24,7 @@ class USurvivalUserSettings; * Classe Abstract : on cree un WBP_SettingsGraphics qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsGraphicsWidget : public USettingsTabWidget +class EMBERWILD_API USettingsGraphicsWidget : public USettingsTabWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsMenuWidget.h b/Source/EmberWild/Public/SettingsMenuWidget.h similarity index 99% rename from Source/Survival_projet/Public/SettingsMenuWidget.h rename to Source/EmberWild/Public/SettingsMenuWidget.h index 7458640..f7038a2 100644 --- a/Source/Survival_projet/Public/SettingsMenuWidget.h +++ b/Source/EmberWild/Public/SettingsMenuWidget.h @@ -35,7 +35,7 @@ DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSettingsKeyCaptureResult, FKey, CapturedKey * Classe Abstract : on cree un WBP_Settings qui en herite. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsMenuWidget : public UUserWidget +class EMBERWILD_API USettingsMenuWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SettingsTabWidget.h b/Source/EmberWild/Public/SettingsTabWidget.h similarity index 95% rename from Source/Survival_projet/Public/SettingsTabWidget.h rename to Source/EmberWild/Public/SettingsTabWidget.h index 5ad8700..d3eea0c 100644 --- a/Source/Survival_projet/Public/SettingsTabWidget.h +++ b/Source/EmberWild/Public/SettingsTabWidget.h @@ -16,7 +16,7 @@ class USettingsMenuWidget; * donc aucune ligne dans USettingsMenuWidget. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USettingsTabWidget : public UUserWidget +class EMBERWILD_API USettingsTabWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/StorageContainer.h b/Source/EmberWild/Public/StorageContainer.h similarity index 99% rename from Source/Survival_projet/Public/StorageContainer.h rename to Source/EmberWild/Public/StorageContainer.h index 60afcc0..37f9ae3 100644 --- a/Source/Survival_projet/Public/StorageContainer.h +++ b/Source/EmberWild/Public/StorageContainer.h @@ -55,7 +55,7 @@ struct FStorageStartingItem * se rendort des que l'angle est atteint. */ UCLASS() -class SURVIVAL_PROJET_API AStorageContainer : public AActor, public IInteractable +class EMBERWILD_API AStorageContainer : public AActor, public IInteractable { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalAudioSettings.h b/Source/EmberWild/Public/SurvivalAudioSettings.h similarity index 98% rename from Source/Survival_projet/Public/SurvivalAudioSettings.h rename to Source/EmberWild/Public/SurvivalAudioSettings.h index ae67bd9..df3ab25 100644 --- a/Source/Survival_projet/Public/SurvivalAudioSettings.h +++ b/Source/EmberWild/Public/SurvivalAudioSettings.h @@ -30,7 +30,7 @@ * ouvrirait la porte a deux references qui divergent. */ UCLASS(config = Game, defaultconfig, meta = (DisplayName = "Survival Audio")) -class SURVIVAL_PROJET_API USurvivalAudioSettings : public UDeveloperSettings +class EMBERWILD_API USurvivalAudioSettings : public UDeveloperSettings { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalGameInstance.h b/Source/EmberWild/Public/SurvivalGameInstance.h similarity index 99% rename from Source/Survival_projet/Public/SurvivalGameInstance.h rename to Source/EmberWild/Public/SurvivalGameInstance.h index b361990..04c1e1a 100644 --- a/Source/Survival_projet/Public/SurvivalGameInstance.h +++ b/Source/EmberWild/Public/SurvivalGameInstance.h @@ -22,7 +22,7 @@ class ULocalPlayer; * monde et doit disparaitre avec lui. */ UCLASS() -class SURVIVAL_PROJET_API USurvivalGameInstance : public UGameInstance +class EMBERWILD_API USurvivalGameInstance : public UGameInstance { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalGameMode.h b/Source/EmberWild/Public/SurvivalGameMode.h similarity index 96% rename from Source/Survival_projet/Public/SurvivalGameMode.h rename to Source/EmberWild/Public/SurvivalGameMode.h index 5a84fd7..69d99aa 100644 --- a/Source/Survival_projet/Public/SurvivalGameMode.h +++ b/Source/EmberWild/Public/SurvivalGameMode.h @@ -21,7 +21,7 @@ * cabler GameState et PlayerState. */ UCLASS() -class SURVIVAL_PROJET_API ASurvivalGameMode : public AGameModeBase +class EMBERWILD_API ASurvivalGameMode : public AGameModeBase { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalGameState.h b/Source/EmberWild/Public/SurvivalGameState.h similarity index 93% rename from Source/Survival_projet/Public/SurvivalGameState.h rename to Source/EmberWild/Public/SurvivalGameState.h index 80a27a5..81fee2c 100644 --- a/Source/Survival_projet/Public/SurvivalGameState.h +++ b/Source/EmberWild/Public/SurvivalGameState.h @@ -22,7 +22,7 @@ * ressources partagees. Pas les stats d'un joueur, qui vont sur son PlayerState. */ UCLASS() -class SURVIVAL_PROJET_API ASurvivalGameState : public AGameStateBase +class EMBERWILD_API ASurvivalGameState : public AGameStateBase { GENERATED_BODY() }; diff --git a/Source/Survival_projet/Public/SurvivalPlayerState.h b/Source/EmberWild/Public/SurvivalPlayerState.h similarity index 97% rename from Source/Survival_projet/Public/SurvivalPlayerState.h rename to Source/EmberWild/Public/SurvivalPlayerState.h index 27d4df3..c2f6ccc 100644 --- a/Source/Survival_projet/Public/SurvivalPlayerState.h +++ b/Source/EmberWild/Public/SurvivalPlayerState.h @@ -20,7 +20,7 @@ * AFpsPlayer : elle appartient au JOUEUR, pas au corps. */ UCLASS() -class SURVIVAL_PROJET_API ASurvivalPlayerState : public APlayerState +class EMBERWILD_API ASurvivalPlayerState : public APlayerState { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalStatsComponent.h b/Source/EmberWild/Public/SurvivalStatsComponent.h similarity index 98% rename from Source/Survival_projet/Public/SurvivalStatsComponent.h rename to Source/EmberWild/Public/SurvivalStatsComponent.h index c656ef0..9b308f8 100644 --- a/Source/Survival_projet/Public/SurvivalStatsComponent.h +++ b/Source/EmberWild/Public/SurvivalStatsComponent.h @@ -24,7 +24,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSurvivalDeath); * de faim en trente minutes" se lit, "0.055 par seconde" non. */ UCLASS(ClassGroup = (Survival), meta = (BlueprintSpawnableComponent)) -class SURVIVAL_PROJET_API USurvivalStatsComponent : public UActorComponent +class EMBERWILD_API USurvivalStatsComponent : public UActorComponent { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalStatsWidget.h b/Source/EmberWild/Public/SurvivalStatsWidget.h similarity index 96% rename from Source/Survival_projet/Public/SurvivalStatsWidget.h rename to Source/EmberWild/Public/SurvivalStatsWidget.h index 8cf3ec1..4d78bd3 100644 --- a/Source/Survival_projet/Public/SurvivalStatsWidget.h +++ b/Source/EmberWild/Public/SurvivalStatsWidget.h @@ -16,7 +16,7 @@ class USurvivalStatsComponent; * qu'une fois par seconde ou lors d'une consommation. */ UCLASS(Abstract) -class SURVIVAL_PROJET_API USurvivalStatsWidget : public UUserWidget +class EMBERWILD_API USurvivalStatsWidget : public UUserWidget { GENERATED_BODY() diff --git a/Source/Survival_projet/Public/SurvivalUserSettings.h b/Source/EmberWild/Public/SurvivalUserSettings.h similarity index 98% rename from Source/Survival_projet/Public/SurvivalUserSettings.h rename to Source/EmberWild/Public/SurvivalUserSettings.h index 5c2007e..a8a0297 100644 --- a/Source/Survival_projet/Public/SurvivalUserSettings.h +++ b/Source/EmberWild/Public/SurvivalUserSettings.h @@ -106,13 +106,13 @@ namespace SurvivalSettingsRange * Pour que le moteur instancie CETTE classe et pas la sienne, Config/DefaultEngine.ini * contient : * [/Script/Engine.Engine] - * GameUserSettingsClassName=/Script/Survival_projet.SurvivalUserSettings + * GameUserSettingsClassName=/Script/EmberWild.SurvivalUserSettings * * Les UPROPERTY(config) sont lues et ecrites automatiquement : aucun code de * serialisation a maintenir. */ UCLASS() -class SURVIVAL_PROJET_API USurvivalUserSettings : public UGameUserSettings +class EMBERWILD_API USurvivalUserSettings : public UGameUserSettings { GENERATED_BODY() diff --git a/Source/Survival_projetEditor.Target.cs b/Source/EmberWildEditor.Target.cs similarity index 60% rename from Source/Survival_projetEditor.Target.cs rename to Source/EmberWildEditor.Target.cs index b8db49b..7cab31d 100644 --- a/Source/Survival_projetEditor.Target.cs +++ b/Source/EmberWildEditor.Target.cs @@ -3,13 +3,13 @@ using UnrealBuildTool; using System.Collections.Generic; -public class Survival_projetEditorTarget : TargetRules +public class EmberWildEditorTarget : TargetRules { - public Survival_projetEditorTarget( TargetInfo Target) : base(Target) + public EmberWildEditorTarget( TargetInfo Target) : base(Target) { Type = TargetType.Editor; DefaultBuildSettings = BuildSettingsVersion.V7; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_8; - ExtraModuleNames.Add("Survival_projet"); + ExtraModuleNames.Add("EmberWild"); } } diff --git a/Source/Survival_projet/Survival_projet.cpp b/Source/Survival_projet/Survival_projet.cpp deleted file mode 100644 index d6100f4..0000000 --- a/Source/Survival_projet/Survival_projet.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#include "Survival_projet.h" -#include "Modules/ModuleManager.h" - -IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, Survival_projet, "Survival_projet" );