Engine inner working: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| No edit summary | |||
| Line 84: | Line 84: | ||
|     Character collides with items (code seems to have no effect) |     Character collides with items (code seems to have no effect) | ||
| == Quest interaction sequence == | |||
| When the player is clicking on the talk icon , this happens, and sends back to the client all the possible quest options: | |||
|   APlaneshiftPlayerControllerBase::TalkInteraction() | |||
|      ApsCharacter::ShowPopupMenu | |||
|         NpcDialogMenu::ShowMenu | |||
|            eventManager->SendDialogMenuMessageDelayed | |||
| When the player is selecting one option in the npc bubble menu, he sends a chat message to the NPC | |||
|    APlaneshiftPlayerControllerBase::SendChatMessage | |||
|      ChatManager::HandleChatMessage with type CHAT_NPC | |||
|        NpcResponse::ExecuteScript (based on the response found, we execute the script, which may include a number of steps, like say something, do an animation, etc...) | |||
Revision as of 23:53, 3 December 2020
Wander Operation
 WanderOperation::Run()
    CalculateEdgeList()
         FindNearestWaypoint() finds start point
         GetActiveLocate() finds end point
         FindEdgeRoute() finds the route between start and end
    dest = GetNextPathPoint() gets the next path point (not the current one) and returns it
    StartMoveTo(dest) 
    
NPC Brain
 APlaneShiftGameState::BeginPlay()
  calls psNPCManager::Initialize()
      calls ReadNPCsFromDatabase()
         select * from sc_npc_definitions
         populates npcs TMap
    
 spawnManager->RepopulateLive();
   LoadAllNPCCharacterData
      SELECT characters.* where npc_spawn_rule>0
           char = SpawnActor()
           char->Load()
               if (IsNPC()) psAIController->SetBrain( using npcs TMap above)
When a perception happens it goes through:
  psNPCManager::TriggerEvent()
    checks all reactions with this event and it finds also the brains without pawn associated, so I added a check there to skip
Main engine loop on startup
MyProjectServer.exe!UIpNetDriver::InitListen(FNetworkNotify * InNotify, FURL & LocalURL, bool bReuseAddressAndPort, FString & Error) Line 152 C++ MyProjectServer.exe!UWorld::Listen(FURL & InURL) Line 3927 C++ MyProjectServer.exe!UEngine::LoadMap(FWorldContext & WorldContext, FURL URL, UPendingNetGame * Pending, FString & Error) Line 8983 C++ MyProjectServer.exe!UEngine::Browse(FWorldContext & WorldContext, FURL URL, FString & Error) Line 8144 C++ MyProjectServer.exe!UGameInstance::StartGameInstance() Line 262 C++ MyProjectServer.exe!UGameEngine::Init(IEngineLoop * InEngineLoop) Line 465 C++ MyProjectServer.exe!FEngineLoop::Init() Line 1967 C++ MyProjectServer.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 138 C++ MyProjectServer.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 191 C++
Open level command
When you execute the "open" command from console, it will queue the travel to open the map:
MyProject2.exe!UGameInstance::HandleOpenCommand(const wchar_t * Cmd, FOutputDevice & Ar, UWorld * InWorld) Line 295 C++ MyProject2.exe!UGameInstance::Exec(UWorld * InWorld, const wchar_t * Cmd, FOutputDevice & Ar) Line 323 C++ MyProject2.exe!UGameViewportClient::Exec(UWorld * InWorld, const wchar_t * Cmd, FOutputDevice & Ar) Line 2014 C++ MyProject2.exe!ULocalPlayer::Exec(UWorld * InWorld, const wchar_t * Cmd, FOutputDevice & Ar) Line 1457 C++ MyProject2.exe!APlayerController::ConsoleCommand(const FString & Cmd, bool bWriteToLog) Line 350 C++ MyProject2.exe!UConsole::ConsoleCommand(const FString & Command) Line 394 C++ MyProject2.exe!UConsole::InputKey_InputLine(int ControllerId, FKey Key, EInputEvent Event, float AmountDepressed, bool bGamepad) Line 651 C++ MyProject2.exe!UConsole::InputKey(int ControllerId, FKey Key, EInputEvent Event, float AmountDepressed, bool bGamepad) Line 1062 C++ MyProject2.exe!UGameViewportClient::InputKey(FViewport * InViewport, int ControllerId, FKey Key, EInputEvent EventType, float AmountDepressed, bool bGamepad) Line 265 C++
Then at the next tick it will do this:
MyProject2.exe!UEngine::Browse(FWorldContext & WorldContext, FURL URL, FString & Error) Line 8161 C++ MyProject2.exe!UEngine::TickWorldTravel(FWorldContext & Context, float DeltaSeconds) Line 8311 C++ MyProject2.exe!UGameEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 812 C++ MyProject2.exe!FEngineLoop::Tick() Line 2257 C++ MyProject2.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 142 C++
Collision Tests
Inside ApsItemActor::ApsItemActor() no special code
Character collides with items
  Inside ApsItemActor::ApsItemActor()
   mesh->SetCollisionProfileName("NoCollision");
   mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
Character does not collide with items
  Inside EntityManager::CreateItem() after SpawnActor
   mesh->SetCollisionProfileName("NoCollision");
   mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
Character collides with items (code seems to have no effect)
Quest interaction sequence
When the player is clicking on the talk icon , this happens, and sends back to the client all the possible quest options:
 APlaneshiftPlayerControllerBase::TalkInteraction()
    ApsCharacter::ShowPopupMenu
       NpcDialogMenu::ShowMenu
          eventManager->SendDialogMenuMessageDelayed
When the player is selecting one option in the npc bubble menu, he sends a chat message to the NPC
  APlaneshiftPlayerControllerBase::SendChatMessage
    ChatManager::HandleChatMessage with type CHAT_NPC
      NpcResponse::ExecuteScript (based on the response found, we execute the script, which may include a number of steps, like say something, do an animation, etc...)