424 lines
9.8 KiB
C++
424 lines
9.8 KiB
C++
// 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<FInternetAddr> 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<uint8> 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<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(jsonString);
|
|
bool b1 = FJsonSerializer::Deserialize(Reader, JsonObject);
|
|
bool b2 = JsonObject.IsValid();
|
|
|
|
if (JsonObject.IsValid() && NumberStatus == 3)
|
|
{
|
|
// get array all commands
|
|
TArray<TSharedPtr<FJsonValue>> JsonObjectArray = JsonObject->GetArrayField(TEXT("comandarray"));
|
|
|
|
UE_LOG(LogTemp, Warning, TEXT("33333333"));
|
|
for (int32 indx = 0; indx < JsonObjectArray.Num(); indx++)
|
|
{
|
|
|
|
TSharedPtr<FJsonValue> value = JsonObjectArray[indx];
|
|
TSharedPtr<FJsonObject> 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;
|
|
}
|
|
}
|