// Fill out your copyright notice in the Description page of Project Settings. #include "MyGameInstance.h" #include "Networking/Public/Interfaces/IPv4/IPv4Address.h" #include "SocketSubsystem.h" #include "Engine/Engine.h" #include "Serialization/JsonReader.h" #include "Serialization/JsonSerializer.h" /* * creates a map of all commands that come from the server */ void UMyGameInstance::CreateMapCommand() { CommandMap.Add(TEXT("waggonvelocity"), 0); CommandMap.Add(TEXT("switchstate"), 1); CommandMap.Add(TEXT("lightstate"), 2); CommandMap.Add(TEXT("createwaggon"), 3); CommandMap.Add(TEXT("teleportwaggon"), 4); CommandMap.Add(TEXT("connectwagon"), 7); CommandMap.Add(TEXT("destroywaggon"), 6); CommandMap.Add(TEXT("waggondoorstate"), 7); CommandMap.Add(TEXT("setfaultwagon"), 8); CommandMap.Add(TEXT("lightstate"), 9); CommandMap.Add(TEXT("switchstate"), 10); CommandMap.Add(TEXT("init"), 99); } int32 UMyGameInstance::getNumberFunction(FString Command) { auto numberComand = CommandMap.Find(Command); return *numberComand; } void UMyGameInstance::createwaggon_Implementation(const FString& value, int32 id) { } void UMyGameInstance::waggonvelocity_Implementation(int32 id, float speed, int32 idspline, float offset) { } void UMyGameInstance::teleportwaggon_Implementation(int32 id, int32 idspline, float offset) { } void UMyGameInstance::destroywaggon_Implementation(int32 id) { } /* void UMyGameInstance::waggondoorstate_Implementation(int32 idtrain, int32 doorleft, int32 doorright) { } void UMyGameInstance::connectwagon_Implementation() { } */ bool UMyGameInstance::StartWorkingAtSocket() { MySocket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false); MySocket->SetNonBlocking(true); // set address ad port socket FIPv4Address ip(127, 0, 0, 1); TSharedRef addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); addr->SetIp(ip.Value); addr->SetPort(6000); bool connected = MySocket->Connect(*addr); if (connected) { // if connected = true make 1 byte and send to socket UE_LOG(LogTemp, Warning, TEXT("CONNCET")); uint8 b1 = 1; int32 BytesSent = 0; int32 size = 1; bool successful = MySocket->Send(&b1, size, BytesSent); if (successful) { UE_LOG(LogTemp, Warning, TEXT("PUSHED 1 byte")); int32 BufferSize = 1; int32 BytesRead = 0; uint8 Response = NULL; // wait response from server bool read = false; while (!read) { MySocket->Recv(&Response, BufferSize, BytesRead); if (Response) { read = true; } } // if response = 3 server is running if (Response == 3) { size = 8; // revers bytes at number 4 int64 next_size = (int64)4 << 56; bool successful2 = MySocket->Send((uint8*)&next_size, size, BytesSent); if (successful2) { UE_LOG(LogTemp, Warning, TEXT("PUSHED 4 INT 64")); size = 4; int32 b15 = 15; bool successful3 = MySocket->Send((uint8*)&b15, size, BytesSent); if (successful3) { UE_LOG(LogTemp, Warning, TEXT("PUSHED 15 INT 32")); return true; } else { UE_LOG(LogTemp, Warning, TEXT("NO PUSHED 15 INT 32")); return false; } } else { UE_LOG(LogTemp, Warning, TEXT("NO PUSHED 4 INT 64")); return false; } } else { UE_LOG(LogTemp, Warning, TEXT("Response != 3")); //return false; return false; } } else { UE_LOG(LogTemp, Warning, TEXT(" NO PUSHED 1 byte")); return false; } } else { UE_LOG(LogTemp, Warning, TEXT("NOT Connecting")); return false; } } /* void UMyGameInstance::setfaultwagon_Implementation(int32 id, int32 index, bool on) { } void UMyGameInstance::lightstate_Implementation(int32 id, int32 state) { } void UMyGameInstance::switchstate_Implementation(int32 id, int32 state) { } */ /* * the function listening socket server * Parameters * @param NumStatus status number that will be sent to the server * 0 - wait initializing * 1 - initialize client * 2 - initializing at all clients * 3 - in process working * 4 - end working */ void UMyGameInstance::listening(int32 NumberStatus) { // push char 105 char i = '\151'; int32 size = 1; int32 BytesSent = 0; MySocket->Send((uint8*)&i, size, BytesSent); int32 BufferSize = 1; int32 BytesRead = 0; uint8 Response = NULL; bool read = false; while (!read) { MySocket->Recv(&Response, BufferSize, BytesRead); if (Response == 3) { //LAstServResp = Response; break; } } SendStatus(NumberStatus); } void UMyGameInstance::SendStatus(int32 NumberStatus) { int32 BytesSentStatus = 0; FString status = FString::Printf(TEXT("{\"status\":%d}"), NumberStatus); // create string status client MySocket->Send((uint8*)TCHAR_TO_UTF8(*status), status.Len(), BytesSentStatus); int32 BytesRead = 0; TArray Response; uint32 BufferSize = 0; bool read = false; FString jsonString; UE_LOG(LogTemp, Warning, TEXT("11111111")); // get json from server and make string json while (!read) { read = MySocket->HasPendingData(BufferSize); if (read) { Response.SetNumUninitialized(BufferSize); MySocket->Recv(Response.GetData(), Response.Num(), BytesRead); for (int i = 0; i < Response.Num(); i++) { const TCHAR c = Response[i]; jsonString.Append(&c); } //GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Yellow, jsonString); break; } } UE_LOG(LogTemp, Warning, TEXT("2222222222")); // make json object and parsing JsonObject = MakeShareable(new FJsonObject); TSharedRef> Reader = TJsonReaderFactory<>::Create(jsonString); bool b1 = FJsonSerializer::Deserialize(Reader, JsonObject); bool b2 = JsonObject.IsValid(); if (JsonObject.IsValid() && NumberStatus == 3) { // get array all commands TArray> JsonObjectArray = JsonObject->GetArrayField(TEXT("comandarray")); UE_LOG(LogTemp, Warning, TEXT("33333333")); for (int32 indx = 0; indx < JsonObjectArray.Num(); indx++) { TSharedPtr value = JsonObjectArray[indx]; TSharedPtr ObjectComand = value->AsObject(); //get name command FString NameComand = ObjectComand->GetStringField(TEXT("comand")); int32 NumberComand = getNumberFunction(NameComand); UE_LOG(LogTemp, Warning, TEXT("4444444 = %d"), NumberComand); if(NumberComand == 0) { UE_LOG(LogTemp, Warning, TEXT(" befor waggonvelocity")); waggonvelocity(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("speed")), ObjectComand->GetNumberField(TEXT("idspline")), ObjectComand->GetNumberField(TEXT("offset"))); UE_LOG(LogTemp, Warning, TEXT(" after waggonvelocity")); } else if (NumberComand == 1) { } else if (NumberComand == 2) { } else if (NumberComand == 3) { UE_LOG(LogTemp, Warning, TEXT(" befor createwaggon")); FString typeTrain = ObjectComand->GetStringField(TEXT("value")); createwaggon(typeTrain, ObjectComand->GetNumberField(TEXT("id"))); UE_LOG(LogTemp, Warning, TEXT(" after createwaggon")); } else if (NumberComand == 4) { UE_LOG(LogTemp, Warning, TEXT(" befor teleportwaggon")); teleportwaggon(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("idspline")), ObjectComand->GetNumberField(TEXT("offset"))); UE_LOG(LogTemp, Warning, TEXT(" after teleportwaggon")); } else if (NumberComand == 5) { UE_LOG(LogTemp, Warning, TEXT(" 55555555555")); UE_LOG(LogTemp, Warning, TEXT(" befor connectwagon")); //int32 ideven = ObjectComand->GetNumberField(TEXT("ideven")); //int32 idodd = ObjectComand->GetNumberField(TEXT("idodd")); //UE_LOG(LogTemp, Warning, TEXT(" ideven = %d"),ideven); //UE_LOG(LogTemp, Warning, TEXT(" idodd = %d"), idodd); //connectwagon(); //UE_LOG(LogTemp, Warning, TEXT(" after connectwagon")); } else if (NumberComand == 6) { destroywaggon(ObjectComand->GetNumberField(TEXT("id"))); } else if (NumberComand == 7) { } else if (NumberComand == 8) { int32 idodd = ObjectComand->GetNumberField(TEXT("idodd")); } else if (NumberComand == 9) { } else if (NumberComand == 10) { } /*switch (NumberComand) { case 0://waggonvelocity { waggonvelocity(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("speed")), ObjectComand->GetNumberField(TEXT("idspline")), ObjectComand->GetNumberField(TEXT("offset"))); break; } case 1://switchstate break; case 2://lightstate break; case 3://createwaggon { FString typeTrain = ObjectComand->GetStringField(TEXT("value")); createwaggon(typeTrain, ObjectComand->GetNumberField(TEXT("id"))); break; } case 4://teleportwaggon { teleportwaggon(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("idspline")), ObjectComand->GetNumberField(TEXT("offset"))); break; } case 5://connectwagon { connectwagon(ObjectComand->GetNumberField(TEXT("ideven")), ObjectComand->GetNumberField(TEXT("idodd"))); break; } case 6: { destroywaggon(ObjectComand->GetNumberField(TEXT("id"))); break; } case 7: { /*waggondoorstate(ObjectComand->GetNumberField(TEXT("idtrain")), ObjectComand->GetNumberField(TEXT("doorleft")), ObjectComand->GetNumberField(TEXT("doorright"))); break; } case 8: { /*setfaultwagon(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("index")), ObjectComand->GetBoolField(TEXT("on"))); break; } case 9: { lightstate(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("state"))); break; } case 10: { switchstate(ObjectComand->GetNumberField(TEXT("id")), ObjectComand->GetNumberField(TEXT("state"))); break; } default: { break; } }*/ } } else { return; } }