- #include "MyPlayerState.h"
- #include "MyButton.h"
- #include "TCPClient.h"
- #include "Blueprint/UserWidget.h"
- #include "Components/Button.h"
- #include "Components/ScrollBox.h"
- #include "Components/TextBlock.h"
- #include "Components/VerticalBox.h"
- #include "Components/VerticalBoxSlot.h"
- void AMyPlayerState::BeginPlay()
- {
- FString levelName = GetWorld()->GetMapName();
- levelName.RemoveFromStart(GetWorld()->StreamingLevelsPrefix);
- if (levelName == "StartMap")
- {
- tcpClient = new TCPClient(this);
- canConnectToGameServer = false;
- if ((MatchmakingWidgetClass) && (tcpClient->IsConnected()))
- {
- serversList = new TArray<FSessionInfo*>();
- GetWorld()->GetTimerManager().SetTimer(serverListTimerHandle, this, &AMyPlayerState::OnUpdateServerList, 2, true);
- MatchmakingWidget = CreateWidget<UUserWidget>(GetWorld(),MatchmakingWidgetClass);
- MatchmakingWidget->AddToViewport();
- serverListScrollBoxWidget = Cast<UScrollBox>(MatchmakingWidget->GetWidgetFromName(TEXT("MyScrollBox")));
- UButton* newSessionButton = Cast<UButton>(MatchmakingWidget->GetWidgetFromName(TEXT("NewSession")));
- if (newSessionButton)
- {
- newSessionButton->SetIsEnabled(true);
- newSessionButton->OnClicked.AddDynamic(this, &AMyPlayerState::OnNewSessionClicked);
- }
- }
- }
- }
- void AMyPlayerState::OnNewSessionClicked()
- {
- tcpClient->CreateNewGameSession("My test session");
- }
- void AMyPlayerState::UpdateSessionsList(FString serverinfo)
- {
- TArray<FString> Out; serverinfo.ParseIntoArray(Out, TEXT("|"), true);
- for (int i = 1; i < Out.Num() - 1; i += 2) { FSessionInfo *tempInfo = new FSessionInfo();
- tempInfo->id = FCString::Atoi(*Out[i]);
- tempInfo->name = Out[i + 1];
- tempInfo->serverip = "";
- tempInfo->serverport = -1;
- serversList->Add(tempInfo); }
- }
- void AMyPlayerState::ConnectToGameServer(FSessionInfo session)
- {
- canConnectToGameServer = true; connectToGameServerSession = session;
- }
- void AMyPlayerState::OnUpdateServerList() {
- if (tcpClient) {
- if (tcpClient->IsConnected()) {
- if (serversList->Num() > 0) {
- if ((MatchmakingWidget) && (serverListScrollBoxWidget)) {
- TArray<UWidget*> allChildren = serverListScrollBoxWidget-> GetAllChildren();
- for (int i = 0; i < allChildren.Num(); i++)
- {
- allChildren[i]->RemoveFromParent();
- }
- for (int i = 0; i < serversList->Num(); i++)
- {
- UVerticalBox* ItemWidgetsBox = NewObject<UVerticalBox>();
- serverListScrollBoxWidget->AddChild(ItemWidgetsBox);
- UMyButton* ItemWidget = NewObject<UMyButton>(this);
- ItemWidget->SetSessionInfo((*serversList)[i]->id, tcpClient);
- UTextBlock* ItemWidgetText = NewObject<UTextBlock>();
- ItemWidgetText->SetText(FText::FromString( (*serversList)[i]->name));
- ItemWidget->AddChild(ItemWidgetText);
- UVerticalBoxSlot* Slot = ItemWidgetsBox-> AddChildToVerticalBox(ItemWidget);
- static FMargin Padding(5);
- Slot->SetPadding(Padding);
- }
- }
- }
- if (canConnectToGameServer){ APlayerController* pController = GetWorld()-> GetFirstPlayerController();
- if (pController){ FString cmd = "open " + connectToGameServerSession.serverip + ":" + FString::FromInt(connectToGameServerSession.serverport);
- tcpClient->Stop();
- canConnectToGameServer = false;
- MatchmakingWidget->RemoveFromViewport();
- pController->ConsoleCommand(cmd);
- }
- }
- }
- }
- }