Browse Source

fix wrong item icons are used

Kolja Strohm 2 years ago
parent
commit
9ae57c43e8

+ 3 - 3
FactoryCraft/CraftingGrid.cpp

@@ -181,7 +181,7 @@ void CraftingGridView::api(char* message)
 				info.maxHp = *(float*)(message += 4);
 				info.durability = *(float*)(message += 4);
 				info.maxDurability = *(float*)(message += 4);
-				info.zItem = itemIcons->z(*(int*)(message += 4));
+                info.zItem = zItemType(*(int*)(message += 4))->zIcon();
 			}
 			slots->add(info);
 		}
@@ -234,7 +234,7 @@ void CraftingGridView::api(char* message)
 				info.maxHp = *(float*)(message + 13);
 				info.durability = *(float*)(message + 17);
 				info.maxDurability = *(float*)(message + 21);
-				info.zItem = itemIcons->z(*(int*)(message + 25));
+                info.zItem = zItemType(*(int*)(message + 25))->zIcon();
 				slots->set(info, i);
 				break;
 			}
@@ -274,7 +274,7 @@ void CraftingGridView::api(char* message)
 				info.maxHp = *(float*)(message += 4);
 				info.durability = *(float*)(message += 4);
 				info.maxDurability = *(float*)(message += 4);
-				info.zItem = itemIcons->z(*(int*)(message += 4));
+                info.zItem = zItemType(*(int*)(message += 4))->zIcon();
 			}
 			outputs->add(info);
 		}

+ 308 - 316
FactoryCraft/FactoryClient.cpp

@@ -1,7 +1,8 @@
+#include "FactoryClient.h"
+
 #include <Bild.h>
 #include <Textur.h>
 
-#include "FactoryClient.h"
 #include "Globals.h"
 
 using namespace Network;
@@ -9,375 +10,366 @@ using namespace Framework;
 
 FactoryClient::FactoryClient()
 {
-	client = 0;
-	background = 0;
-	foreground = 0;
-	backgroundReader = 0;
-	foregroundReader = 0;
-	bgReaderUsage = 0;
-	fgReaderUsage = 0;
+    client = 0;
+    background = 0;
+    foreground = 0;
+    backgroundReader = 0;
+    foregroundReader = 0;
+    bgReaderUsage = 0;
+    fgReaderUsage = 0;
 }
 
 FactoryClient::~FactoryClient()
 {
-	if (client)
-		disconnect();
+    if (client) disconnect();
 }
 
 void FactoryClient::loadServerInfo()
 {
-	// receive type information
-	for (int i = 0; i < blockTypeCount; i++)
-		blockTypes[i]->release();
-	delete[] blockTypes;
-	for (int i = 0; i < itemTypeCount; i++)
-		itemTypes[i]->release();
-	delete[] itemTypes;
-	for (int i = 0; i < entityTypeCount; i++)
-		entityTypes[i]->release();
-	delete[] entityTypes;
-	foregroundReader->lese((char*)&blockTypeCount, 4);
-	blockTypes = new BlockType * [blockTypeCount];
-	for (int i = 0; i < blockTypeCount; i++)
-	{
-		int id;
-		foregroundReader->lese((char*)&id, 4);
-		bool needsInstance;
-		foregroundReader->lese((char*)&needsInstance, 1);
-		int maxHp;
-		foregroundReader->lese((char*)&maxHp, 4);
-		blockTypes[i] = new BlockType(id, needsInstance, ModelInfo(foregroundReader), maxHp);
-	}
-	foregroundReader->lese((char*)&itemTypeCount, 4);
-	itemTypes = new ItemType * [itemTypeCount];
-	for (int i = 0; i < itemTypeCount; i++)
-	{
-		int id;
-		foregroundReader->lese((char*)&id, 4);
-		itemTypes[i] = new ItemType(id, ModelInfo(foregroundReader));
-	}
-	foregroundReader->lese((char*)&entityTypeCount, 4);
-	entityTypes = new EntityType * [entityTypeCount];
-	for (int i = 0; i < entityTypeCount; i++)
-	{
-		int id;
-		foregroundReader->lese((char*)&id, 4);
-		entityTypes[i] = new EntityType(id, ModelInfo(foregroundReader));
-	}
-	// pre rendering item models
-	Kam3D* kam = new Kam3D();
-	Welt3D* w = new Welt3D();
-	w->addDiffuseLight(DiffuseLight{ Vec3<float>(0.5f, 0.5f, -1.f), Vec3<float>(1.f, 1.f, 1.f) });
-	kam->setWelt(w);
-	kam->setBildschirmPosition(0, 0);
-	kam->setBildschirmSize(50, 50);
-	kam->setPosition(Vec3<float>(0, 0, 0));
-	kam->setRotation({ 2.f, 0, -1.f });
-	Bild* b = new Bild();
-	b->neuBild(50, 50, 0);
-	for (int i = 0; i < itemTypeCount; i++)
-	{
-		Model3D* mdl = new Model3D();
-		mdl->setModelDaten(itemTypes[i]->getItemModel());
-		mdl->setModelTextur(itemTypes[i]->getItemTextur());
-		mdl->setPosition(Vec3<float>(-0.8f, -0.45f, -0.4f));
-		mdl->setSize(2.f);
-		w->addZeichnung(mdl);
-		w->tick(0);
-		window->zBildschirm()->lock();
-		DX11Textur* t = (DX11Textur*)window->zBildschirm()->zGraphicsApi()->createOrGetTextur(Text("rendered/items/") + i, dynamic_cast<Bild*>(b->getThis()));
-		window->zBildschirm()->zGraphicsApi()->renderKamera(kam, t);
-		Bild* result = new Bild();
-		t->copyToImage(result);
-		itemIcons->add(result);
-		t->release();
-		window->zBildschirm()->unlock();
-		w->removeZeichnung(mdl);
-	}
-	b->release();
-	kam->release();
+    // receive type information
+    for (int i = 0; i < blockTypeCount; i++)
+        blockTypes[i]->release();
+    delete[] blockTypes;
+    for (int i = 0; i < itemTypeCount; i++)
+        itemTypes[i]->release();
+    delete[] itemTypes;
+    for (int i = 0; i < entityTypeCount; i++)
+        entityTypes[i]->release();
+    delete[] entityTypes;
+    foregroundReader->lese((char*)&blockTypeCount, 4);
+    blockTypes = new BlockType*[blockTypeCount];
+    for (int i = 0; i < blockTypeCount; i++)
+    {
+        int id;
+        foregroundReader->lese((char*)&id, 4);
+        bool needsInstance;
+        foregroundReader->lese((char*)&needsInstance, 1);
+        int maxHp;
+        foregroundReader->lese((char*)&maxHp, 4);
+        blockTypes[i] = new BlockType(
+            id, needsInstance, ModelInfo(foregroundReader), maxHp);
+    }
+    foregroundReader->lese((char*)&itemTypeCount, 4);
+    itemTypes = new ItemType*[itemTypeCount];
+    for (int i = 0; i < itemTypeCount; i++)
+    {
+        int id;
+        foregroundReader->lese((char*)&id, 4);
+        itemTypes[i] = new ItemType(id, ModelInfo(foregroundReader));
+    }
+    foregroundReader->lese((char*)&entityTypeCount, 4);
+    entityTypes = new EntityType*[entityTypeCount];
+    for (int i = 0; i < entityTypeCount; i++)
+    {
+        int id;
+        foregroundReader->lese((char*)&id, 4);
+        entityTypes[i] = new EntityType(id, ModelInfo(foregroundReader));
+    }
+    // pre rendering item models
+    Kam3D* kam = new Kam3D();
+    Welt3D* w = new Welt3D();
+    w->addDiffuseLight(DiffuseLight{
+        Vec3<float>(0.5f, 0.5f, -1.f), Vec3<float>(1.f, 1.f, 1.f)});
+    kam->setWelt(w);
+    kam->setBildschirmPosition(0, 0);
+    kam->setBildschirmSize(50, 50);
+    kam->setPosition(Vec3<float>(0, 0, 0));
+    kam->setRotation({2.f, 0, -1.f});
+    Bild* b = new Bild();
+    b->neuBild(50, 50, 0);
+    for (int i = 0; i < itemTypeCount; i++)
+    {
+        Model3D* mdl = new Model3D();
+        mdl->setModelDaten(itemTypes[i]->getItemModel());
+        mdl->setModelTextur(itemTypes[i]->getItemTextur());
+        mdl->setPosition(Vec3<float>(-0.8f, -0.45f, -0.4f));
+        mdl->setSize(2.f);
+        w->addZeichnung(mdl);
+        w->tick(0);
+        window->zBildschirm()->lock();
+        DX11Textur* t = (DX11Textur*)window->zBildschirm()
+                            ->zGraphicsApi()
+                            ->createOrGetTextur(
+                                Text("rendered/items/") + itemTypes[i]->getId(),
+                                dynamic_cast<Bild*>(b->getThis()));
+        window->zBildschirm()->zGraphicsApi()->renderKamera(kam, t);
+        Bild* result = new Bild();
+        t->copyToImage(result);
+        itemTypes[i]->setBild(result);
+        t->release();
+        window->zBildschirm()->unlock();
+        w->removeZeichnung(mdl);
+    }
+    b->release();
+    kam->release();
 }
 
 bool FactoryClient::connect(Text ip, unsigned short sslPort)
 {
-	if (client)
-		disconnect();
-	client = new SSLKlient();
-	if (!client->verbinde(sslPort, ip))
-		return false;
-	this->ip = ip;
-	return 1;
+    if (client) disconnect();
+    client = new SSLKlient();
+    if (!client->verbinde(sslPort, ip)) return false;
+    this->ip = ip;
+    return 1;
 }
 
 int FactoryClient::ping()
 {
-	ZeitMesser zm;
-	zm.messungStart();
-	if (!client->sende("\3", 1))
-		return -1;
-	char c;
-	client->getNachricht(&c, 1);
-	zm.messungEnde();
-	return (int)(zm.getSekunden() * 1000);
+    ZeitMesser zm;
+    zm.messungStart();
+    if (!client->sende("\3", 1)) return -1;
+    char c;
+    client->getNachricht(&c, 1);
+    zm.messungEnde();
+    return (int)(zm.getSekunden() * 1000);
 }
 
 int FactoryClient::status(Framework::Text name, Framework::Text secret)
 {
-	if (!client->sende("\4", 1))
-		return 404;
-	char c;
-	client->getNachricht(&c, 1);
-	if (c == 1)
-	{
-		char len = (char)name.getLength();
-		client->sende(&len, 1);
-		client->sende(name, len);
-		short sLen = (short)secret.getLength();
-		client->sende((char*)&sLen, 2);
-		client->sende(secret, sLen);
-		char res;
-		client->getNachricht(&res, 1);
-		if (res == 1)
-			return 200;
-		if (res == 0)
-			return 403;
-	}
-	return 404;
+    if (!client->sende("\4", 1)) return 404;
+    char c;
+    client->getNachricht(&c, 1);
+    if (c == 1)
+    {
+        char len = (char)name.getLength();
+        client->sende(&len, 1);
+        client->sende(name, len);
+        short sLen = (short)secret.getLength();
+        client->sende((char*)&sLen, 2);
+        client->sende(secret, sLen);
+        char res;
+        client->getNachricht(&res, 1);
+        if (res == 1) return 200;
+        if (res == 0) return 403;
+    }
+    return 404;
 }
 
-int FactoryClient::join(Framework::Text name, Framework::Text &secret, unsigned short port)
+int FactoryClient::join(
+    Framework::Text name, Framework::Text& secret, unsigned short port)
 {
-	client->sende("\1", 1);
-	char len = (char)name.getLength();
-	client->sende(&len, 1);
-	client->sende(name, len);
-	short sLen = (short)secret.getLength();
-	client->sende((char*)&sLen, 2);
-	client->sende(secret, sLen);
-	char res;
-	client->getNachricht(&res, 1);
-	if (res == 1 || res == 2)
-	{
-		if (res == 2)
-		{
-			client->getNachricht((char*)&sLen, 2);
-			char* buffer = new char[sLen + 1];
-			client->getNachricht(buffer, sLen);
-			buffer[sLen] = 0;
-			secret = buffer;
-			delete[] buffer;
-		}
-		int keyLen;
-		client->getNachricht((char*)&keyLen, 4);
-		char* key = new char[keyLen];
-		client->getNachricht(key, keyLen);
-		foreground = new Klient();
-		if (!foreground->verbinde(port, ip))
-		{
-			delete[] key;
-			return false;
-		}
-		if (!foreground->sende((char*)&keyLen, 2))
-		{
-			delete[] key;
-			return false;
-		}
-		if (!foreground->sende(key, keyLen))
-		{
-			delete[] key;
-			return false;
-		}
-		background = new Klient();
-		if (!background->verbinde(port, ip))
-		{
-			delete[] key;
-			foreground->release();
-			foreground = 0;
-			background->release();
-			background = 0;
-			return false;
-		}
-		if (!background->sende((char*)&keyLen, 2))
-		{
-			delete[] key;
-			foreground->release();
-			foreground = 0;
-			background->release();
-			background = 0;
-			return false;
-		}
-		if (!background->sende(key, keyLen))
-		{
-			delete[] key;
-			foreground->release();
-			foreground = 0;
-			background->release();
-			background = 0;
-			return false;
-		}
-		delete[] key;
-		bool bg = 0;
-		if (!foreground->sende((char*)&bg, 1))
-		{
-			delete[] key;
-			return 201;
-		}
-		foregroundReader = new NetworkReader(foreground);
-		bg = 1;
-		if (!background->sende((char*)&bg, 1))
-			return 201;
-		backgroundReader = new NetworkReader(background);
-		client->trenne();
-		loadServerInfo();
-		return 200;
-	}
-	if (res == 0)
-		return 403;
-	return 500;
+    client->sende("\1", 1);
+    char len = (char)name.getLength();
+    client->sende(&len, 1);
+    client->sende(name, len);
+    short sLen = (short)secret.getLength();
+    client->sende((char*)&sLen, 2);
+    client->sende(secret, sLen);
+    char res;
+    client->getNachricht(&res, 1);
+    if (res == 1 || res == 2)
+    {
+        if (res == 2)
+        {
+            client->getNachricht((char*)&sLen, 2);
+            char* buffer = new char[sLen + 1];
+            client->getNachricht(buffer, sLen);
+            buffer[sLen] = 0;
+            secret = buffer;
+            delete[] buffer;
+        }
+        int keyLen;
+        client->getNachricht((char*)&keyLen, 4);
+        char* key = new char[keyLen];
+        client->getNachricht(key, keyLen);
+        foreground = new Klient();
+        if (!foreground->verbinde(port, ip))
+        {
+            delete[] key;
+            return false;
+        }
+        if (!foreground->sende((char*)&keyLen, 2))
+        {
+            delete[] key;
+            return false;
+        }
+        if (!foreground->sende(key, keyLen))
+        {
+            delete[] key;
+            return false;
+        }
+        background = new Klient();
+        if (!background->verbinde(port, ip))
+        {
+            delete[] key;
+            foreground->release();
+            foreground = 0;
+            background->release();
+            background = 0;
+            return false;
+        }
+        if (!background->sende((char*)&keyLen, 2))
+        {
+            delete[] key;
+            foreground->release();
+            foreground = 0;
+            background->release();
+            background = 0;
+            return false;
+        }
+        if (!background->sende(key, keyLen))
+        {
+            delete[] key;
+            foreground->release();
+            foreground = 0;
+            background->release();
+            background = 0;
+            return false;
+        }
+        delete[] key;
+        bool bg = 0;
+        if (!foreground->sende((char*)&bg, 1))
+        {
+            delete[] key;
+            return 201;
+        }
+        foregroundReader = new NetworkReader(foreground);
+        bg = 1;
+        if (!background->sende((char*)&bg, 1)) return 201;
+        backgroundReader = new NetworkReader(background);
+        client->trenne();
+        loadServerInfo();
+        return 200;
+    }
+    if (res == 0) return 403;
+    return 500;
 }
 
 void FactoryClient::disconnect()
 {
-	if (client)
-	{
-		NetworkReader* fgReader = foregroundReader;
-		NetworkReader* bgReader = backgroundReader;
-		backgroundReader = 0;
-		foregroundReader = 0;
-		if (foreground)
-			foreground->trenne();
-		if (background)
-			background->trenne();
-		while (fgReaderUsage > 0 || bgReaderUsage > 0)
-			Sleep(100);
-		delete fgReader;
-		delete bgReader;
-		client->release();
-		client = 0;
-		if (foreground)
-			foreground->release();
-		foreground = 0;
-		if (background)
-			background->release();
-		background = 0;
-	}
+    if (client)
+    {
+        NetworkReader* fgReader = foregroundReader;
+        NetworkReader* bgReader = backgroundReader;
+        backgroundReader = 0;
+        foregroundReader = 0;
+        if (foreground) foreground->trenne();
+        if (background) background->trenne();
+        while (fgReaderUsage > 0 || bgReaderUsage > 0)
+            Sleep(100);
+        delete fgReader;
+        delete bgReader;
+        client->release();
+        client = 0;
+        if (foreground) foreground->release();
+        foreground = 0;
+        if (background) background->release();
+        background = 0;
+    }
 }
 
 NetworkReader* FactoryClient::getNextForegroundMessage()
 {
-	fgReaderUsage++;
-	if (!foreground)
-		return 0;
-	if (!foreground->hatNachricht(0))
-		return 0;
-	return foregroundReader;
+    fgReaderUsage++;
+    if (!foreground) return 0;
+    if (!foreground->hatNachricht(0)) return 0;
+    return foregroundReader;
 }
 
 NetworkReader* FactoryClient::getNextBackgroundMessage()
 {
-	bgReaderUsage++;
-	if (!background)
-		return 0;
-	if (!background->hatNachricht(0))
-		return 0;
-	return backgroundReader;
+    bgReaderUsage++;
+    if (!background) return 0;
+    if (!background->hatNachricht(0)) return 0;
+    return backgroundReader;
 }
 
 void FactoryClient::endMessageReading(bool bg)
 {
-	if (bg)
-		bgReaderUsage--;
-	else
-		fgReaderUsage--;
+    if (bg)
+        bgReaderUsage--;
+    else
+        fgReaderUsage--;
 }
 
 void FactoryClient::sendPlayerAction(char* data, unsigned short length)
 {
-	if (!foreground)
-		return;
-	cs.lock();
-	length += 1;
-	foreground->sende((char*)&length, 2);
-	char msgId = 2;
-	foreground->sende(&msgId, 1);
-	foreground->sende((char*)data, length - 1);
-	cs.unlock();
+    if (!foreground) return;
+    cs.lock();
+    length += 1;
+    foreground->sende((char*)&length, 2);
+    char msgId = 2;
+    foreground->sende(&msgId, 1);
+    foreground->sende((char*)data, length - 1);
+    cs.unlock();
 }
 
 void FactoryClient::sendPlayerMovement(MovementFrame& frame)
 {
-	if (!foreground)
-		return;
-	cs.lock();
-	short length = 38;
-	foreground->sende((char*)&length, 2);
-	char msgId = 2; // player message
-	foreground->sende(&msgId, 1);
-	foreground->sende(&msgId, 1); // set movement
-	foreground->sende((char*)&frame.direction.x, 4);
-	foreground->sende((char*)&frame.direction.y, 4);
-	foreground->sende((char*)&frame.direction.z, 4);
-	foreground->sende((char*)&frame.targetPosition.x, 4);
-	foreground->sende((char*)&frame.targetPosition.y, 4);
-	foreground->sende((char*)&frame.targetPosition.z, 4);
-	foreground->sende((char*)&frame.movementFlags, 4);
-	foreground->sende((char*)&frame.duration, 8);
-	cs.unlock();
+    if (!foreground) return;
+    cs.lock();
+    short length = 38;
+    foreground->sende((char*)&length, 2);
+    char msgId = 2; // player message
+    foreground->sende(&msgId, 1);
+    foreground->sende(&msgId, 1); // set movement
+    foreground->sende((char*)&frame.direction.x, 4);
+    foreground->sende((char*)&frame.direction.y, 4);
+    foreground->sende((char*)&frame.direction.z, 4);
+    foreground->sende((char*)&frame.targetPosition.x, 4);
+    foreground->sende((char*)&frame.targetPosition.y, 4);
+    foreground->sende((char*)&frame.targetPosition.z, 4);
+    foreground->sende((char*)&frame.movementFlags, 4);
+    foreground->sende((char*)&frame.duration, 8);
+    cs.unlock();
 }
 
-void FactoryClient::entityAPIRequest(int entityId, char* message, unsigned short length)
+void FactoryClient::entityAPIRequest(
+    int entityId, char* message, unsigned short length)
 {
-	if (!foreground)
-		return;
-	cs.lock();
-	length += 5;
-	foreground->sende((char*)&length, 2);
-	char msgId = 3;
-	foreground->sende(&msgId, 1);
-	foreground->sende((char*)&entityId, 4);
-	foreground->sende(message, length - 5);
-	cs.unlock();
+    if (!foreground) return;
+    cs.lock();
+    length += 5;
+    foreground->sende((char*)&length, 2);
+    char msgId = 3;
+    foreground->sende(&msgId, 1);
+    foreground->sende((char*)&entityId, 4);
+    foreground->sende(message, length - 5);
+    cs.unlock();
 }
 
-void FactoryClient::chunkAPIRequest(Punkt center, char* message, unsigned short length)
+void FactoryClient::chunkAPIRequest(
+    Punkt center, char* message, unsigned short length)
 {
-	length += 10;
-	cs.lock();
-	foreground->sende((char*)&length, 2);
-	char type = 1;
-	foreground->sende(&type, 1);
-	type = 0;
-	foreground->sende(&type, 1);
-	foreground->sende((char*)&center.x, 4);
-	foreground->sende((char*)&center.y, 4);
-	foreground->sende(message, length - 10);
-	cs.unlock();
+    length += 10;
+    cs.lock();
+    foreground->sende((char*)&length, 2);
+    char type = 1;
+    foreground->sende(&type, 1);
+    type = 0;
+    foreground->sende(&type, 1);
+    foreground->sende((char*)&center.x, 4);
+    foreground->sende((char*)&center.y, 4);
+    foreground->sende(message, length - 10);
+    cs.unlock();
 }
 
-void FactoryClient::inventoryAPIRequest(Framework::Either<int, Framework::VecN<int, 4>> target, char* message, unsigned short length)
+void FactoryClient::inventoryAPIRequest(
+    Framework::Either<int, Framework::VecN<int, 4>> target,
+    char* message,
+    unsigned short length)
 {
-	if (!foreground)
-		return;
-	cs.lock();
-	length += target.isA() ? 6 : 18;
-	foreground->sende((char*)&length, 2);
-	char msgId = 4;
-	foreground->sende(&msgId, 1);
-	bool isEntity = target.isA();
-	foreground->sende((char*)&isEntity, 1);
-	if (target.isA())
-	{
-		int id = target.getA();
-		foreground->sende((char*)&id, 4);
-	}
-	else
-	{
-		for (int i = 0; i < 4; i++)
-		{
-			int v = target.getB()[i];
-			foreground->sende((char*)&v, 4);
-		}
-	}
-	foreground->sende(message, length - (target.isA() ? 6 : 18));
-	cs.unlock();
+    if (!foreground) return;
+    cs.lock();
+    length += target.isA() ? 6 : 18;
+    foreground->sende((char*)&length, 2);
+    char msgId = 4;
+    foreground->sende(&msgId, 1);
+    bool isEntity = target.isA();
+    foreground->sende((char*)&isEntity, 1);
+    if (target.isA())
+    {
+        int id = target.getA();
+        foreground->sende((char*)&id, 4);
+    }
+    else
+    {
+        for (int i = 0; i < 4; i++)
+        {
+            int v = target.getB()[i];
+            foreground->sende((char*)&v, 4);
+        }
+    }
+    foreground->sende(message, length - (target.isA() ? 6 : 18));
+    cs.unlock();
 }

+ 52 - 46
FactoryCraft/Globals.cpp

@@ -1,64 +1,70 @@
 #define variable
-#include <Text.h>
 #include "Globals.h"
-#include "ServerSelection.h"
+
+#include <Text.h>
+
 #include "AddServerMenu.h"
 #include "Game.h"
 #include "Load.h"
-
+#include "ServerSelection.h"
 
 void initVariables()
 {
-	dlls = new DLLRegister();
-	menuRegister = new HashMap<Framework::Text, Framework::RCPointer<Menu>>(10, [](Text txt)
-		{
-			return txt.hashCode();
-		});
-	fontRegister = new HashMap<Framework::Text, Framework::RCPointer<Schrift>>(10, [](Text txt)
-		{
-			return txt.hashCode();
-		});
-	window = 0;
-	itemIcons = new RCArray<Bild>();
-	blockTypes = 0;
-	blockTypeCount = 0;
-	itemTypes = 0;
-	itemTypeCount = 0;
-	entityTypes = 0;
-	entityTypeCount = 0;
+    dlls = new DLLRegister();
+    menuRegister = new HashMap<Framework::Text, Framework::RCPointer<Menu>>(
+        10, [](Text txt) { return txt.hashCode(); });
+    fontRegister = new HashMap<Framework::Text, Framework::RCPointer<Schrift>>(
+        10, [](Text txt) { return txt.hashCode(); });
+    window = 0;
+    blockTypes = 0;
+    blockTypeCount = 0;
+    itemTypes = 0;
+    itemTypeCount = 0;
+    entityTypes = 0;
+    entityTypeCount = 0;
 }
 
 void initMenus()
 {
-	menuRegister->put("load", RCPointer<Menu>::of(new LoadMenu(uiFactory.initParam.bildschirm)));
-	menuRegister->put("serverSelection", RCPointer<Menu>::of(new ServerSelectionMenu(uiFactory.initParam.bildschirm)));
-	menuRegister->put("addServer", RCPointer<Menu>::of(new AddServerMenu(uiFactory.initParam.bildschirm)));
-	menuRegister->put("game", RCPointer<Menu>::of(new Game(uiFactory.initParam.bildschirm)));
+    menuRegister->put("load",
+        RCPointer<Menu>::of(new LoadMenu(uiFactory.initParam.bildschirm)));
+    menuRegister->put("serverSelection",
+        RCPointer<Menu>::of(
+            new ServerSelectionMenu(uiFactory.initParam.bildschirm)));
+    menuRegister->put("addServer",
+        RCPointer<Menu>::of(new AddServerMenu(uiFactory.initParam.bildschirm)));
+    menuRegister->put(
+        "game", RCPointer<Menu>::of(new Game(uiFactory.initParam.bildschirm)));
 
-	menuRegister->get("load")->show();
+    menuRegister->get("load")->show();
 }
 
 void releaseVariables()
 {
-	if (World::INSTANCE)
-		World::INSTANCE->release();
-	menuRegister->release();
-	fontRegister->release();
-	dlls->release();
-	itemIcons->release();
-	for (int i = 0; i < blockTypeCount; i++)
-		blockTypes[i]->release();
-	delete[] blockTypes;
-	for (int i = 0; i < itemTypeCount; i++)
-		itemTypes[i]->release();
-	delete[] itemTypes;
-	for (int i = 0; i < entityTypeCount; i++)
-		entityTypes[i]->release();
-	delete[] entityTypes;
-	blockTypes = 0;
-	blockTypeCount = 0;
-	itemTypes = 0;
-	itemTypeCount = 0;
-	entityTypes = 0;
-	entityTypeCount = 0;
+    if (World::INSTANCE) World::INSTANCE->release();
+    menuRegister->release();
+    fontRegister->release();
+    dlls->release();
+    for (int i = 0; i < blockTypeCount; i++)
+        blockTypes[i]->release();
+    delete[] blockTypes;
+    for (int i = 0; i < itemTypeCount; i++)
+        itemTypes[i]->release();
+    delete[] itemTypes;
+    for (int i = 0; i < entityTypeCount; i++)
+        entityTypes[i]->release();
+    delete[] entityTypes;
+    blockTypes = 0;
+    blockTypeCount = 0;
+    itemTypes = 0;
+    itemTypeCount = 0;
+    entityTypes = 0;
+    entityTypeCount = 0;
+}
+
+const ItemType* zItemType(int id)
+{
+    for (int i = 0; i < itemTypeCount; i++)
+        if (itemTypes[i]->getId() == id) return itemTypes[i];
+    return 0;
 }

+ 12 - 10
FactoryCraft/Globals.h

@@ -1,26 +1,27 @@
 #pragma once
 #include <Array.h>
+#include <Bildschirm.h>
+#include <DLLRegister.h>
+#include <Fenster.h>
 #include <HashMap.h>
 #include <RCPointer.h>
-#include <UIInitialization.h>
 #include <Schrift.h>
-#include <DLLRegister.h>
-#include <Bildschirm.h>
-#include <Fenster.h>
+#include <UIInitialization.h>
 
 #include "Menu.h"
 #include "World.h"
 
 #ifndef variable
-#define variable extern
+#    define variable extern
 #endif
 
-variable Framework::HashMap<Framework::Text, Framework::RCPointer<Menu>>* menuRegister;
+variable Framework::HashMap<Framework::Text, Framework::RCPointer<Menu>>*
+    menuRegister;
 variable UIInit uiFactory;
-variable Framework::HashMap<Framework::Text, Framework::RCPointer<Schrift>>* fontRegister;
+variable Framework::HashMap<Framework::Text, Framework::RCPointer<Schrift>>*
+    fontRegister;
 variable DLLRegister* dlls;
 variable Framework::WFenster* window;
-variable RCArray<Bild>* itemIcons;
 variable BlockType** blockTypes;
 variable int blockTypeCount;
 variable ItemType** itemTypes;
@@ -28,7 +29,8 @@ variable int itemTypeCount;
 variable EntityType** entityTypes;
 variable int entityTypeCount;
 
-
 void initVariables();
 void initMenus();
-void releaseVariables();
+void releaseVariables();
+
+const ItemType* zItemType(int id);

+ 3 - 3
FactoryCraft/InventoryView.cpp

@@ -147,7 +147,7 @@ int InventoryView::getSlotByLocalPos(Punkt pos)
 	dragStopId = -1;
 	if (slots)
 	{
-		for (SlotInfo info : *slots)
+		for (SlotInfo &info : *slots)
 		{
 			if (pos.x >= x && pos.x < x + 50 && pos.y >= y && pos.y < y + 50)
 				return info.id;
@@ -184,7 +184,7 @@ void InventoryView::api(char* message)
 				info.maxHp = *(float*)(message += 4);
 				info.durability = *(float*)(message += 4);
 				info.maxDurability = *(float*)(message += 4);
-				info.zItem = itemIcons->z(*(int*)(message += 4));
+                info.zItem = zItemType(*(int*)(message += 4))->zIcon();
 			}
 			slots->add(info);
 		}
@@ -237,7 +237,7 @@ void InventoryView::api(char* message)
 				info.maxHp = *(float*)(message + 13);
 				info.durability = *(float*)(message + 17);
 				info.maxDurability = *(float*)(message + 21);
-				info.zItem = itemIcons->z(*(int*)(message + 25));
+                info.zItem = zItemType(*(int*)(message + 25))->zIcon();
 				slots->set(info, i);
 				break;
 			}

+ 2 - 2
FactoryCraft/ItemBar.cpp

@@ -81,7 +81,7 @@ void ItemBarView::api(char* message)
 				info.maxHp = *(float*)(message += 4);
 				info.durability = *(float*)(message += 4);
 				info.maxDurability = *(float*)(message += 4);
-				info.zItem = itemIcons->z(*(int*)(message += 4));
+                info.zItem = zItemType(*(int*)(message += 4))->zIcon();
 			}
 			slots->add(info);
 		}
@@ -122,7 +122,7 @@ void ItemBarView::api(char* message)
 				info.maxHp = *(float*)(message + 13);
 				info.durability = *(float*)(message + 17);
 				info.maxDurability = *(float*)(message + 21);
-				info.zItem = itemIcons->z(*(int*)(message + 25));
+                info.zItem = zItemType(*(int*)(message + 25))->zIcon();
 				slots->set(info, i);
 				break;
 			}

+ 23 - 8
FactoryCraft/ItemType.cpp

@@ -1,29 +1,44 @@
 
+#include "ItemType.h"
+
 #include <InMemoryBuffer.h>
 
-#include "ItemType.h"
 #include "Registries.h"
 
 ItemType::ItemType(int id, ModelInfo model)
-	: ReferenceCounter(),
-	id(id),
-	model(model)
+    : ReferenceCounter(),
+      id(id),
+      model(model),
+      icon(0)
 {}
 
 ItemType::~ItemType()
-{}
+{
+    if (this->icon) this->icon->release();
+}
 
 int ItemType::getId() const
 {
-	return id;
+    return id;
+}
+
+void ItemType::setBild(Framework::Bild* icon)
+{
+    if (this->icon) this->icon->release();
+    this->icon = icon;
+}
+
+Framework::Bild* ItemType::zIcon() const
+{
+    return icon;
 }
 
 Framework::Model3DData* ItemType::getItemModel() const
 {
-	return model.getModel();
+    return model.getModel();
 }
 
 Framework::Model3DTextur* ItemType::getItemTextur() const
 {
-	return model.getTexture();
+    return model.getTexture();
 }

+ 12 - 7
FactoryCraft/ItemType.h

@@ -1,18 +1,23 @@
 #pragma once
 
+#include <Bild.h>
+
 #include "ModelInfo.h"
 
 class ItemType : public virtual Framework::ReferenceCounter
 {
 protected:
-	const int id;
-	const ModelInfo model;
+    const int id;
+    const ModelInfo model;
+    Framework::Bild* icon;
 
 public:
-	ItemType(int id, ModelInfo model);
-	~ItemType();
+    ItemType(int id, ModelInfo model);
+    ~ItemType();
 
-	int getId() const;
-	Framework::Model3DData* getItemModel() const;
-	Framework::Model3DTextur* getItemTextur() const;
+    int getId() const;
+    void setBild(Framework::Bild* icon);
+    Framework::Bild* zIcon() const;
+    Framework::Model3DData* getItemModel() const;
+    Framework::Model3DTextur* getItemTextur() const;
 };

+ 460 - 363
FactoryCraft/ServerSelection.cpp

@@ -1,438 +1,535 @@
+#include "ServerSelection.h"
+
+#include <AlphaFeld.h>
 #include <AsynchronCall.h>
-#include <Schrift.h>
+#include <Base64.h>
 #include <Bild.h>
-#include <AlphaFeld.h>
-#include <Knopf.h>
 #include <Datei.h>
 #include <JSON.h>
-#include <Base64.h>
+#include <Knopf.h>
+#include <Schrift.h>
 
-#include "ServerSelection.h"
 #include "FactoryClient.h"
 #include "Globals.h"
 #include "Initialisierung.h"
 
 using namespace Framework;
 
-ServerStatus::ServerStatus(Framework::Text name, Framework::Text ip, unsigned short sslPort,  unsigned short port, Framework::HashMap<Framework::Text, Framework::Text>* secrets)
-	: ZeichnungHintergrund(),
-	name(name),
-	ip(ip),
-	sslPort(sslPort),
-	port(port),
-	playerName(""),
-	ping(-1),
-	status("..."),
-	requestId(0),
-	secrets(secrets),
-	closeAF(new AlphaFeld()),
-	join(initKnopf(0, 0, 55, 20, Knopf::Style::Normal, "join"))
+ServerStatus::ServerStatus(Framework::Text name,
+    Framework::Text ip,
+    unsigned short sslPort,
+    unsigned short port,
+    Framework::HashMap<Framework::Text, Framework::Text>* secrets)
+    : ZeichnungHintergrund(),
+      name(name),
+      ip(ip),
+      sslPort(sslPort),
+      port(port),
+      playerName(""),
+      ping(-1),
+      status("..."),
+      statusId(0),
+      requestId(0),
+      secrets(secrets),
+      closeAF(new AlphaFeld()),
+      join(initKnopf(0, 0, 55, 20, Knopf::Style::Normal, "join"))
 {
-	closeAF->setSize(20, 20);
-	closeAF->setFarbe(0x00FF0000);
-	setMausEreignis(_ret1ME);
-	setStyle(Style::Erlaubt | Style::Sichtbar | Style::Rahmen);
-	setRahmenBreite(1);
-	setRahmenFarbe(0xFF3d3d3d);
-	join->setMausEreignis([this](void* p, void* o, MausEreignis me)
-		{
-			if (me.id == ME_RLinks)
-			{
-				FactoryClient* client = new FactoryClient();
-				if (!client->connect(getIp(), getSSLPort()))
-				{
-					lockZeichnung();
-					status = "The Server is currently not reachable";
-					statusId = 404;
-					ping = -1;
-					rend = 1;
-					unlockZeichnung();
-					client->release();
-				}
-				else
-				{
-					Text secret = "";
-					if (this->secrets->has(playerName))
-						secret = this->secrets->get(playerName);
-					bool isNew = secret.getLength() == 0;
-					int stId = client->join(playerName, secret, getPort());
-					lockZeichnung();
-					statusId = stId;
-					if (statusId == 403)
-						status = "The name is already in use";
-					if (statusId == 500)
-						status = "Unknown Server message received";
-					if (statusId == 201)
-						status = "Please try again";
-					unlockZeichnung();
-					if (statusId == 200 || statusId == 201)
-					{
-						if(statusId == 200)
-							((ServerSelectionMenu*)(Menu*)menuRegister->get("serverSelection"))->hide();
-						if (isNew)
-						{
-							this->secrets->put(playerName, secret);
-							((ServerSelectionMenu*)(Menu*)menuRegister->get("serverSelection"))->saveServers();
-						}
-						if (statusId == 200)
-						{
-							World::INSTANCE = new World(dynamic_cast<Bildschirm3D*>(window->zBildschirm()), client);
-							((ServerSelectionMenu*)(Menu*)menuRegister->get("game"))->show();
-						}
-					}
-					else
-						client->release();
-				}
-			}
-			return 1;
-		});
+    closeAF->setSize(20, 20);
+    closeAF->setFarbe(0x00FF0000);
+    setMausEreignis(_ret1ME);
+    setStyle(Style::Erlaubt | Style::Sichtbar | Style::Rahmen);
+    setRahmenBreite(1);
+    setRahmenFarbe(0xFF3d3d3d);
+    join->setMausEreignis([this](void* p, void* o, MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            FactoryClient* client = new FactoryClient();
+            if (!client->connect(getIp(), getSSLPort()))
+            {
+                lockZeichnung();
+                status = "The Server is currently not reachable";
+                statusId = 404;
+                ping = -1;
+                rend = 1;
+                unlockZeichnung();
+                client->release();
+            }
+            else
+            {
+                Text secret = "";
+                if (this->secrets->has(playerName))
+                    secret = this->secrets->get(playerName);
+                bool isNew = secret.getLength() == 0;
+                int stId = client->join(playerName, secret, getPort());
+                lockZeichnung();
+                statusId = stId;
+                if (statusId == 403) status = "The name is already in use";
+                if (statusId == 500) status = "Unknown Server message received";
+                if (statusId == 201) status = "Please try again";
+                unlockZeichnung();
+                if (statusId == 200 || statusId == 201)
+                {
+                    if (statusId == 200)
+                        ((ServerSelectionMenu*)(Menu*)menuRegister->get(
+                             "serverSelection"))
+                            ->hide();
+                    if (isNew)
+                    {
+                        this->secrets->put(playerName, secret);
+                        ((ServerSelectionMenu*)(Menu*)menuRegister->get(
+                             "serverSelection"))
+                            ->saveServers();
+                    }
+                    if (statusId == 200)
+                    {
+                        World::INSTANCE = new World(
+                            dynamic_cast<Bildschirm3D*>(window->zBildschirm()),
+                            client);
+                        ((ServerSelectionMenu*)(Menu*)menuRegister->get("game"))
+                            ->show();
+                    }
+                }
+                else
+                    client->release();
+            }
+        }
+        return 1;
+    });
 }
 
 ServerStatus::~ServerStatus()
 {
-	secrets->release();
-	closeAF->release();
-	join->release();
+    secrets->release();
+    closeAF->release();
+    join->release();
 }
 
 void ServerStatus::updatePlayerName(Framework::Text playerName)
 {
-	lockZeichnung();
-	status = "";
-	this->playerName = playerName;
-	ServerStatus* tmp = dynamic_cast<ServerStatus*>(getThis());
-	int id = ++requestId;
-	unlockZeichnung();
-	new AsynchronCall([tmp, id]()
-		{
-			FactoryClient* client = new FactoryClient();
-			if (!client->connect(tmp->getIp(), tmp->getSSLPort()))
-			{
-				tmp->lockZeichnung();
-				if (tmp->requestId == id)
-				{
-					tmp->status = "The Server is currently not reachable";
-					tmp->statusId = 404;
-					tmp->ping = -1;
-					tmp->rend = 1;
-				}
-				tmp->unlockZeichnung();
-			}
-			else
-			{
-				tmp->lockZeichnung();
-				if (tmp->requestId == id)
-				{
-					Text secret = "";
-					if (tmp->secrets->has(tmp->playerName))
-						secret = tmp->secrets->get(tmp->playerName);
-					tmp->unlockZeichnung();
-					int ping = client->ping();
-					int statusId = client->status(tmp->playerName, secret);
-					tmp->lockZeichnung();
-					if (tmp->requestId == id)
-					{
-						tmp->ping = ping;
-						tmp->statusId = statusId;
-						if (tmp->statusId == 200)
-							tmp->status = "The Server is reachable";
-						if (tmp->statusId == 403)
-							tmp->status = "The name is already in use";
-						tmp->rend = 1;
-					}
-				}
-				tmp->unlockZeichnung();
-			}
-			client->release();
-			tmp->release();
-		});
+    lockZeichnung();
+    status = "";
+    this->playerName = playerName;
+    ServerStatus* tmp = dynamic_cast<ServerStatus*>(getThis());
+    int id = ++requestId;
+    unlockZeichnung();
+    new AsynchronCall([tmp, id]() {
+        FactoryClient* client = new FactoryClient();
+        if (!client->connect(tmp->getIp(), tmp->getSSLPort()))
+        {
+            tmp->lockZeichnung();
+            if (tmp->requestId == id)
+            {
+                tmp->status = "The Server is currently not reachable";
+                tmp->statusId = 404;
+                tmp->ping = -1;
+                tmp->rend = 1;
+            }
+            tmp->unlockZeichnung();
+        }
+        else
+        {
+            tmp->lockZeichnung();
+            if (tmp->requestId == id)
+            {
+                Text secret = "";
+                if (tmp->secrets->has(tmp->playerName))
+                    secret = tmp->secrets->get(tmp->playerName);
+                tmp->unlockZeichnung();
+                int ping = client->ping();
+                int statusId = client->status(tmp->playerName, secret);
+                tmp->lockZeichnung();
+                if (tmp->requestId == id)
+                {
+                    tmp->ping = ping;
+                    tmp->statusId = statusId;
+                    if (tmp->statusId == 200)
+                        tmp->status = "The Server is reachable";
+                    if (tmp->statusId == 403)
+                        tmp->status = "The name is already in use";
+                    tmp->rend = 1;
+                }
+            }
+            tmp->unlockZeichnung();
+        }
+        client->release();
+        tmp->release();
+    });
 }
 
 void ServerStatus::doMausEreignis(Framework::MausEreignis& me, bool userRet)
 {
-	if (me.id == ME_Leaves)
-	{
-		closeAF->setStrength(0);
-		closeAF->setFarbe(0x00FF0000);
-	}
-	else if (me.id == ME_Bewegung)
-	{
-		if (me.mx >= gr.x - 20 && me.mx < gr.x && me.my >= 0 && me.my <= 20)
-		{
-			if (closeAF->getStrength() == 0)
-			{
-				closeAF->setStrength(-5);
-				closeAF->setFarbe(0x30FF0000);
-			}
-		}
-		else
-		{
-			if (closeAF->getStrength() != 0)
-			{
-				closeAF->setStrength(0);
-				closeAF->setFarbe(0x00FF0000);
-			}
-		}
-	}
-	if (me.id == ME_RLinks)
-	{
-		if (me.mx >= gr.x - 20 && me.mx < gr.x && me.my >= 0 && me.my <= 20)
-		{
-			((ServerSelectionMenu*)(Menu*)menuRegister->get("serverSelection"))->removeServer(name);
-			return;
-		}
-	}
-	if (canConnect())
-		join->doPublicMausEreignis(me);
+    if (me.id == ME_Leaves)
+    {
+        closeAF->setStrength(0);
+        closeAF->setFarbe(0x00FF0000);
+    }
+    else if (me.id == ME_Bewegung)
+    {
+        if (me.mx >= gr.x - 20 && me.mx < gr.x && me.my >= 0 && me.my <= 20)
+        {
+            if (closeAF->getStrength() == 0)
+            {
+                closeAF->setStrength(-5);
+                closeAF->setFarbe(0x30FF0000);
+            }
+        }
+        else
+        {
+            if (closeAF->getStrength() != 0)
+            {
+                closeAF->setStrength(0);
+                closeAF->setFarbe(0x00FF0000);
+            }
+        }
+    }
+    if (me.id == ME_RLinks)
+    {
+        if (me.mx >= gr.x - 20 && me.mx < gr.x && me.my >= 0 && me.my <= 20)
+        {
+            ((ServerSelectionMenu*)(Menu*)menuRegister->get("serverSelection"))
+                ->removeServer(name);
+            return;
+        }
+    }
+    if (canConnect()) join->doPublicMausEreignis(me);
 }
 
 bool ServerStatus::tick(double time)
 {
-	join->setPosition(gr.x - 60, gr.y - 25);
-	closeAF->setPosition(gr.x - 20, 0);
-	return ZeichnungHintergrund::tick(time) || join->tick(time) || closeAF->tick(time);
+    join->setPosition(gr.x - 60, gr.y - 25);
+    closeAF->setPosition(gr.x - 20, 0);
+    return ZeichnungHintergrund::tick(time) || join->tick(time)
+        || closeAF->tick(time);
 }
 
 void ServerStatus::render(Framework::Bild& rObj)
 {
-	ZeichnungHintergrund::render(rObj);
-	if (rObj.setDrawOptions(pos, gr))
-	{
-		TextRenderer tr(dynamic_cast<Schrift*>(uiFactory.initParam.schrift->getThis()));
-		tr.setSchriftSize(12);
-		tr.renderText(5, 5, name, rObj, 0xFFFFFFFF);
-		tr.renderText(5, 25, ip + ":" + sslPort + " (" + port + ")", rObj, 0xFF808080);
-		if (requestId && requestId != 404)
-		{
-			int tbr = tr.getTextBreite(Text("ping: ") + ping);
-			if (ping >= 0)
-			{
-				tr.renderText(getBreite() - 25 - tbr, 5, Text("ping: ") + ping, rObj, 0xFFFFFFFF);
-			}
-		}
-		if (statusId == 404 || statusId == 500)
-			tr.renderText(5, 45, status, rObj, 0xFFFF0000);
-		if (statusId == 403 || statusId == 201)
-			tr.renderText(5, 45, status, rObj, 0xFFFFA500);
-		if (statusId == 200)
-			tr.renderText(5, 45, status, rObj, 0xFF00FF00);
-		closeAF->render(rObj);
-		rObj.drawLinie(Punkt(gr.x - 20, 0), Punkt(gr.x, 20), 0xFFFF0000);
-		rObj.drawLinie(Punkt(gr.x - 20, 20), Punkt(gr.x, 0), 0xFFFF0000);
-		if (canConnect())
-			join->render(rObj);
-		rObj.releaseDrawOptions();
-	}
+    ZeichnungHintergrund::render(rObj);
+    if (rObj.setDrawOptions(pos, gr))
+    {
+        TextRenderer tr(
+            dynamic_cast<Schrift*>(uiFactory.initParam.schrift->getThis()));
+        tr.setSchriftSize(12);
+        tr.renderText(5, 5, name, rObj, 0xFFFFFFFF);
+        tr.renderText(
+            5, 25, ip + ":" + sslPort + " (" + port + ")", rObj, 0xFF808080);
+        if (requestId && requestId != 404)
+        {
+            int tbr = tr.getTextBreite(Text("ping: ") + ping);
+            if (ping >= 0)
+            {
+                tr.renderText(getBreite() - 25 - tbr,
+                    5,
+                    Text("ping: ") + ping,
+                    rObj,
+                    0xFFFFFFFF);
+            }
+        }
+        if (statusId == 404 || statusId == 500)
+            tr.renderText(5, 45, status, rObj, 0xFFFF0000);
+        if (statusId == 403 || statusId == 201)
+            tr.renderText(5, 45, status, rObj, 0xFFFFA500);
+        if (statusId == 200) tr.renderText(5, 45, status, rObj, 0xFF00FF00);
+        closeAF->render(rObj);
+        rObj.drawLinie(Punkt(gr.x - 20, 0), Punkt(gr.x, 20), 0xFFFF0000);
+        rObj.drawLinie(Punkt(gr.x - 20, 20), Punkt(gr.x, 0), 0xFFFF0000);
+        if (canConnect()) join->render(rObj);
+        rObj.releaseDrawOptions();
+    }
 }
 
 Framework::Text ServerStatus::getName() const
 {
-	return name;
+    return name;
 }
 
 Framework::Text ServerStatus::getIp() const
 {
-	return ip;
+    return ip;
 }
 
 unsigned short ServerStatus::getSSLPort() const
 {
-	return sslPort;
+    return sslPort;
 }
 
 unsigned short ServerStatus::getPort() const
 {
-	return port;
+    return port;
 }
 
-Framework::HashMap<Framework::Text, Framework::Text>* ServerStatus::zSecrets() const
+Framework::HashMap<Framework::Text, Framework::Text>*
+ServerStatus::zSecrets() const
 {
-	return secrets;
+    return secrets;
 }
 
 bool ServerStatus::canConnect() const
 {
-	return statusId == 200 || statusId == 201;
+    return statusId == 200 || statusId == 201;
 }
 
-
 ServerSelectionMenu::ServerSelectionMenu(Bildschirm* zScreen)
-	: Menu(zScreen)
+    : Menu(zScreen)
 {
-	playerNameLabel = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150, zScreen->getBackBufferSize().y / 2 - 300, 85, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Player Name:");
-	elements.add(playerNameLabel);
-	playerName = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150 + 85, zScreen->getBackBufferSize().y / 2 - 300, 215, 20, TextFeld::Style::TextFeld, "");
-	playerName->setNTastaturEreignis([this](void* p, void* o, TastaturEreignis te)
-		{
-			// set player names of each server
-			for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-				((ServerStatus*)serverList->zEintrag(i))->updatePlayerName(playerName->zText()->getText());
-			saveServers();
-			return 1;
-		});
-	elements.add(playerName);
-	serverLabel = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150, zScreen->getBackBufferSize().y / 2 - 275, 100, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Server:");
-	elements.add(serverLabel);
-	refresh = initKnopf(zScreen->getBackBufferSize().x / 2 + 80, zScreen->getBackBufferSize().y / 2 - 275, 70, 20, Knopf::Style::Normal, "Refresh");
-	refresh->setMausEreignis([this](void* p, void* o, Framework::MausEreignis me)
-		{
-			if (me.id == ME_RLinks)
-			{
-				if (playerName->zText()->getLength() > 0)
-				{
-					for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-						((ServerStatus*)serverList->zEintrag(i))->updatePlayerName(playerName->zText()->getText());
-				}
-			}
-			return 1;
-		});
-	elements.add(refresh);
-	serverList = new ZListe();
-	serverList->setSize(300, 480);
-	serverList->setRahmenBreite(1);
-	serverList->setRahmenFarbe(0xFF6d6d6d);
-	serverList->setPosition(zScreen->getBackBufferSize().x / 2 - 150, zScreen->getBackBufferSize().y / 2 - 250);
-	serverList->setStyle(ZListe::Style::Normal | ZListe::Style::VScroll);
-	serverList->setMausEreignis(_ret1ME);
-	serverList->setVertikalScrollPos(0);
-	serverList->setEntrySeperatorSize(1);
-	serverList->setEntrySeperatorColor(0xFF6d6d6d);
-	elements.add(serverList);
-	add = initKnopf(zScreen->getBackBufferSize().x / 2 - 50, zScreen->getBackBufferSize().y / 2 + 235, 100, 20, Knopf::Style::Normal, "Add Server");
-	elements.add(add);
-	add->setMausEreignis([this](void* p, void* o, Framework::MausEreignis me)
-		{
-			if (me.id == ME_RLinks)
-			{
-				hide();
-				menuRegister->get("addServer")->show();
-			}
-			return 1;
-		});
-	// load server json
-	JSON::JSONValue* json = JSON::loadJSONFromFile("data/server.json");
-	if (json)
-	{
-		// build validator
-		JSON::Validator::JSONValidator* validator = JSON::Validator::JSONValidator::buildForObject()
-			->withRequiredString("playerName")->withDefault("")->finishString()
-			->withRequiredAttribute("server", JSON::Validator::JSONValidator::buildForArray()
-				->withDefault(new JSON::JSONArray())
-				->removeInvalidEntries()
-				->addAcceptedTypeInArray(JSON::Validator::JSONValidator::buildForObject()
-					->withRequiredString("name")->finishString()
-					->withRequiredString("ip")->finishString()
-					->withRequiredNumber("sslPort")->whichIsGreaterOrEqual(0)->whichIsLessOrEqual((double)0xFFFF)->finishNumber()
-					->withRequiredNumber("port")->whichIsGreaterOrEqual(0)->whichIsLessOrEqual((double)0xFFFF)->finishNumber()
-					->withRequiredAttribute("secrets", JSON::Validator::JSONValidator::buildForArray()
-						->addAcceptedObjectInArray()
-						->withRequiredString("secret")->finishString()
-						->withRequiredString("playerName")->finishString()
-						->finishObject()->finishArray())
-					->finishObject())
-				->finishArray())
-			->finishObject();
-		JSON::JSONValue* validJson = validator->getValidParts(json);
-		json->release();
-		if (validJson)
-		{
-			JSON::JSONArray* arr = validJson->asObject()->zValue("server")->asArray();
-			for (int i = 0; i < arr->getLength(); i++)
-			{
-				JSON::JSONObject* obj = arr->zValue(i)->asObject();
-				Framework::HashMap<Framework::Text, Framework::Text>* secrets = new Framework::HashMap<Framework::Text, Framework::Text>(10, [](Text t) { return t.hashCode(); });
-				JSON::JSONArray* secretsJson = obj->zValue("secrets")->asArray();
-				for (int j = 0; j < secretsJson->getLength(); j++)
-				{
-					JSON::JSONObject* obj2 = secretsJson->zValue(j)->asObject();
-					//decode base64 secret
-					char* secretBuffer = 0;
-					int length;
-					Framework::base64Decode(obj2->zValue("secret")->asString()->getString(), &secretBuffer, &length);
-					secrets->put(obj2->zValue("playerName")->asString()->getString(), Framework::Text(secretBuffer));
-					delete[] secretBuffer;
-				}
-				ServerStatus* s = new ServerStatus(obj->zValue("name")->asString()->getString(), obj->zValue("ip")->asString()->getString(), (unsigned short)obj->zValue("sslPort")->asNumber()->getNumber(), (unsigned short)obj->zValue("port")->asNumber()->getNumber(), secrets);
-				s->setSize(300, 65);
-				serverList->addEintrag(s);
-			}
-			playerName->setText(validJson->asObject()->zValue("playerName")->asString()->getString());
-			if (playerName->zText()->getLength() > 0)
-			{
-				for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-					((ServerStatus*)serverList->zEintrag(i))->updatePlayerName(playerName->zText()->getText());
-			}
-			serverList->updateVScroll();
-			validJson->release();
-		}
-		validator->release();
-	}
+    playerNameLabel = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150,
+        zScreen->getBackBufferSize().y / 2 - 300,
+        85,
+        20,
+        TextFeld::Style::Text | TextFeld::Style::VCenter,
+        "Player Name:");
+    elements.add(playerNameLabel);
+    playerName = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150 + 85,
+        zScreen->getBackBufferSize().y / 2 - 300,
+        215,
+        20,
+        TextFeld::Style::TextFeld,
+        "");
+    playerName->setNTastaturEreignis(
+        [this](void* p, void* o, TastaturEreignis te) {
+            // set player names of each server
+            for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+                ((ServerStatus*)serverList->zEintrag(i))
+                    ->updatePlayerName(playerName->zText()->getText());
+            saveServers();
+            return 1;
+        });
+    elements.add(playerName);
+    serverLabel = initTextFeld(zScreen->getBackBufferSize().x / 2 - 150,
+        zScreen->getBackBufferSize().y / 2 - 275,
+        100,
+        20,
+        TextFeld::Style::Text | TextFeld::Style::VCenter,
+        "Server:");
+    elements.add(serverLabel);
+    refresh = initKnopf(zScreen->getBackBufferSize().x / 2 + 80,
+        zScreen->getBackBufferSize().y / 2 - 275,
+        70,
+        20,
+        Knopf::Style::Normal,
+        "Refresh");
+    refresh->setMausEreignis(
+        [this](void* p, void* o, Framework::MausEreignis me) {
+            if (me.id == ME_RLinks)
+            {
+                if (playerName->zText()->getLength() > 0)
+                {
+                    for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+                        ((ServerStatus*)serverList->zEintrag(i))
+                            ->updatePlayerName(playerName->zText()->getText());
+                }
+            }
+            return 1;
+        });
+    elements.add(refresh);
+    serverList = new ZListe();
+    serverList->setSize(300, 480);
+    serverList->setRahmenBreite(1);
+    serverList->setRahmenFarbe(0xFF6d6d6d);
+    serverList->setPosition(zScreen->getBackBufferSize().x / 2 - 150,
+        zScreen->getBackBufferSize().y / 2 - 250);
+    serverList->setStyle(ZListe::Style::Normal | ZListe::Style::VScroll);
+    serverList->setMausEreignis(_ret1ME);
+    serverList->setVertikalScrollPos(0);
+    serverList->setEntrySeperatorSize(1);
+    serverList->setEntrySeperatorColor(0xFF6d6d6d);
+    elements.add(serverList);
+    add = initKnopf(zScreen->getBackBufferSize().x / 2 - 50,
+        zScreen->getBackBufferSize().y / 2 + 235,
+        100,
+        20,
+        Knopf::Style::Normal,
+        "Add Server");
+    elements.add(add);
+    add->setMausEreignis([this](void* p, void* o, Framework::MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            hide();
+            menuRegister->get("addServer")->show();
+        }
+        return 1;
+    });
+    // load server json
+    JSON::JSONValue* json = JSON::loadJSONFromFile("data/server.json");
+    if (json)
+    {
+        // build validator
+        JSON::Validator::JSONValidator* validator
+            = JSON::Validator::JSONValidator::buildForObject()
+                  ->withRequiredString("playerName")
+                  ->withDefault("")
+                  ->finishString()
+                  ->withRequiredAttribute("server",
+                      JSON::Validator::JSONValidator::buildForArray()
+                          ->withDefault(new JSON::JSONArray())
+                          ->removeInvalidEntries()
+                          ->addAcceptedTypeInArray(
+                              JSON::Validator::JSONValidator::buildForObject()
+                                  ->withRequiredString("name")
+                                  ->finishString()
+                                  ->withRequiredString("ip")
+                                  ->finishString()
+                                  ->withRequiredNumber("sslPort")
+                                  ->whichIsGreaterOrEqual(0)
+                                  ->whichIsLessOrEqual((double)0xFFFF)
+                                  ->finishNumber()
+                                  ->withRequiredNumber("port")
+                                  ->whichIsGreaterOrEqual(0)
+                                  ->whichIsLessOrEqual((double)0xFFFF)
+                                  ->finishNumber()
+                                  ->withRequiredAttribute("secrets",
+                                      JSON::Validator::JSONValidator::
+                                          buildForArray()
+                                              ->addAcceptedObjectInArray()
+                                              ->withRequiredString("secret")
+                                              ->finishString()
+                                              ->withRequiredString("playerName")
+                                              ->finishString()
+                                              ->finishObject()
+                                              ->finishArray())
+                                  ->finishObject())
+                          ->finishArray())
+                  ->finishObject();
+        JSON::JSONValue* validJson = validator->getValidParts(json);
+        json->release();
+        if (validJson)
+        {
+            JSON::JSONArray* arr
+                = validJson->asObject()->zValue("server")->asArray();
+            for (int i = 0; i < arr->getLength(); i++)
+            {
+                JSON::JSONObject* obj = arr->zValue(i)->asObject();
+                Framework::HashMap<Framework::Text, Framework::Text>* secrets
+                    = new Framework::HashMap<Framework::Text, Framework::Text>(
+                        10, [](Text t) { return t.hashCode(); });
+                JSON::JSONArray* secretsJson
+                    = obj->zValue("secrets")->asArray();
+                for (int j = 0; j < secretsJson->getLength(); j++)
+                {
+                    JSON::JSONObject* obj2 = secretsJson->zValue(j)->asObject();
+                    // decode base64 secret
+                    char* secretBuffer = 0;
+                    int length;
+                    Framework::base64Decode(
+                        obj2->zValue("secret")->asString()->getString(),
+                        &secretBuffer,
+                        &length);
+                    secrets->put(
+                        obj2->zValue("playerName")->asString()->getString(),
+                        Framework::Text(secretBuffer));
+                    delete[] secretBuffer;
+                }
+                ServerStatus* s = new ServerStatus(
+                    obj->zValue("name")->asString()->getString(),
+                    obj->zValue("ip")->asString()->getString(),
+                    (unsigned short)obj->zValue("sslPort")
+                        ->asNumber()
+                        ->getNumber(),
+                    (unsigned short)obj->zValue("port")
+                        ->asNumber()
+                        ->getNumber(),
+                    secrets);
+                s->setSize(300, 65);
+                serverList->addEintrag(s);
+            }
+            playerName->setText(validJson->asObject()
+                                    ->zValue("playerName")
+                                    ->asString()
+                                    ->getString());
+            if (playerName->zText()->getLength() > 0)
+            {
+                for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+                    ((ServerStatus*)serverList->zEintrag(i))
+                        ->updatePlayerName(playerName->zText()->getText());
+            }
+            serverList->updateVScroll();
+            validJson->release();
+        }
+        validator->release();
+    }
 }
 
-void ServerSelectionMenu::addServer(Framework::Text name, Framework::Text ip, unsigned short sslPort, unsigned short port)
+void ServerSelectionMenu::addServer(Framework::Text name,
+    Framework::Text ip,
+    unsigned short sslPort,
+    unsigned short port)
 {
-	ServerStatus* tmp = new ServerStatus(name, ip, sslPort, port, new HashMap< Framework::Text, Framework::Text>(10, [](Text t)
-		{
-			return t.hashCode();
-		}));
-	tmp->setSize(300, 65);
-	serverList->addEintrag(tmp);
-	tmp->updatePlayerName(playerName->zText()->getText());
-	serverList->updateVScroll();
-	saveServers();
+    ServerStatus* tmp = new ServerStatus(name,
+        ip,
+        sslPort,
+        port,
+        new HashMap<Framework::Text, Framework::Text>(
+            10, [](Text t) { return t.hashCode(); }));
+    tmp->setSize(300, 65);
+    serverList->addEintrag(tmp);
+    tmp->updatePlayerName(playerName->zText()->getText());
+    serverList->updateVScroll();
+    saveServers();
 }
 
 bool ServerSelectionMenu::hasServer(Framework::Text name) const
 {
-	for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-	{
-		if (((ServerStatus*)serverList->zEintrag(i))->getName() == name)
-			return 1;
-	}
-	return 0;
+    for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+    {
+        if (((ServerStatus*)serverList->zEintrag(i))->getName() == name)
+            return 1;
+    }
+    return 0;
 }
 
 void ServerSelectionMenu::removeServer(Framework::Text name) const
 {
-	for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-	{
-		if (((ServerStatus*)serverList->zEintrag(i))->getName() == name)
-			serverList->removeEintrag(i);
-	}
-	serverList->updateVScroll();
-	saveServers();
+    for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+    {
+        if (((ServerStatus*)serverList->zEintrag(i))->getName() == name)
+            serverList->removeEintrag(i);
+    }
+    serverList->updateVScroll();
+    saveServers();
 }
 
 void ServerSelectionMenu::saveServers() const
 {
-	Datei file;
-	file.setDatei("data/server.json");
-	file.open(Datei::Style::schreiben);
-	JSON::JSONObject root;
-	JSON::JSONArray* servers = new JSON::JSONArray();
-	for (int i = 0; i < serverList->getEintragAnzahl(); i++)
-	{
-		JSON::JSONObject* server = new JSON::JSONObject();
-		server->addValue("name", new JSON::JSONString(((ServerStatus*)serverList->zEintrag(i))->getName()));
-		server->addValue("ip", new JSON::JSONString(((ServerStatus*)serverList->zEintrag(i))->getIp()));
-		server->addValue("sslPort", new JSON::JSONNumber(((ServerStatus*)serverList->zEintrag(i))->getSSLPort()));
-		server->addValue("port", new JSON::JSONNumber(((ServerStatus*)serverList->zEintrag(i))->getPort()));
-		JSON::JSONArray* secrets = new JSON::JSONArray();
-		for (auto secretEntry : *((ServerStatus*)serverList->zEintrag(i))->zSecrets())
-		{
-			JSON::JSONObject* secret = new JSON::JSONObject();
-			secret->addValue("playerName", new JSON::JSONString(secretEntry.getKey()));
-			// base64 encode secret
-			Framework::Text secretBase64 = Framework::base64Encode(secretEntry.getValue(), secretEntry.getValue().getLength());
-			secret->addValue("secret", new JSON::JSONString(secretBase64));
-			secrets->addValue(secret);
-		}
-		server->addValue("secrets", secrets);
-		servers->addValue(server);
-	}
-	root.addValue("server", servers);
-	root.addValue("playerName", new JSON::JSONString(playerName->zText()->getText()));
-	Framework::Text json = root.toString();
-	file.schreibe(json, json.getLength());
-	file.close();
+    Datei file;
+    file.setDatei("data/server.json");
+    file.open(Datei::Style::schreiben);
+    JSON::JSONObject root;
+    JSON::JSONArray* servers = new JSON::JSONArray();
+    for (int i = 0; i < serverList->getEintragAnzahl(); i++)
+    {
+        JSON::JSONObject* server = new JSON::JSONObject();
+        server->addValue("name",
+            new JSON::JSONString(
+                ((ServerStatus*)serverList->zEintrag(i))->getName()));
+        server->addValue("ip",
+            new JSON::JSONString(
+                ((ServerStatus*)serverList->zEintrag(i))->getIp()));
+        server->addValue("sslPort",
+            new JSON::JSONNumber(
+                ((ServerStatus*)serverList->zEintrag(i))->getSSLPort()));
+        server->addValue("port",
+            new JSON::JSONNumber(
+                ((ServerStatus*)serverList->zEintrag(i))->getPort()));
+        JSON::JSONArray* secrets = new JSON::JSONArray();
+        for (auto secretEntry :
+            *((ServerStatus*)serverList->zEintrag(i))->zSecrets())
+        {
+            JSON::JSONObject* secret = new JSON::JSONObject();
+            secret->addValue(
+                "playerName", new JSON::JSONString(secretEntry.getKey()));
+            // base64 encode secret
+            Framework::Text secretBase64 = Framework::base64Encode(
+                secretEntry.getValue(), secretEntry.getValue().getLength());
+            secret->addValue("secret", new JSON::JSONString(secretBase64));
+            secrets->addValue(secret);
+        }
+        server->addValue("secrets", secrets);
+        servers->addValue(server);
+    }
+    root.addValue("server", servers);
+    root.addValue(
+        "playerName", new JSON::JSONString(playerName->zText()->getText()));
+    Framework::Text json = root.toString();
+    file.schreibe(json, json.getLength());
+    file.close();
 }

+ 49 - 40
FactoryCraft/ServerSelection.h

@@ -1,59 +1,68 @@
 #pragma once
 
-#include <TextFeld.h>
-#include <Liste.h>
 #include <HashMap.h>
+#include <Knopf.h>
+#include <Liste.h>
+#include <TextFeld.h>
 
 #include "Menu.h"
 
 class ServerStatus : public ZeichnungHintergrund
 {
 private:
-	Framework::Text name;
-	Framework::Text ip;
-	unsigned short sslPort;
-	unsigned short port;
-	Framework::Text playerName;
-	int ping;
-	Framework::Text status;
-	int statusId;
-	int requestId;
-	Framework::HashMap<Framework::Text, Framework::Text> *secrets;
-	Framework::AlphaFeld *closeAF;
-	Framework::Knopf* join;
+    Framework::Text name;
+    Framework::Text ip;
+    unsigned short sslPort;
+    unsigned short port;
+    Framework::Text playerName;
+    int ping;
+    Framework::Text status;
+    int statusId;
+    int requestId;
+    Framework::HashMap<Framework::Text, Framework::Text>* secrets;
+    Framework::AlphaFeld* closeAF;
+    Framework::Knopf* join;
 
 public:
-	ServerStatus(Framework::Text name, Framework::Text ip, unsigned short sslPort, unsigned short port, Framework::HashMap<Framework::Text, Framework::Text> *secrets);
-	~ServerStatus();
-
-	virtual void updatePlayerName(Framework::Text playerName);
-	
-	virtual void doMausEreignis(Framework::MausEreignis& me, bool userRet) override;
-	virtual bool tick(double time) override;
-	virtual void render(Framework::Bild& rObj) override;
-
-	Framework::Text getName() const;
-	Framework::Text getIp() const;
-	unsigned short getSSLPort() const;
-	unsigned short getPort() const;
-	Framework::HashMap<Framework::Text, Framework::Text>* zSecrets() const;
-	bool canConnect() const;
+    ServerStatus(Framework::Text name,
+        Framework::Text ip,
+        unsigned short sslPort,
+        unsigned short port,
+        Framework::HashMap<Framework::Text, Framework::Text>* secrets);
+    ~ServerStatus();
+
+    virtual void updatePlayerName(Framework::Text playerName);
+
+    virtual void doMausEreignis(
+        Framework::MausEreignis& me, bool userRet) override;
+    virtual bool tick(double time) override;
+    virtual void render(Framework::Bild& rObj) override;
+
+    Framework::Text getName() const;
+    Framework::Text getIp() const;
+    unsigned short getSSLPort() const;
+    unsigned short getPort() const;
+    Framework::HashMap<Framework::Text, Framework::Text>* zSecrets() const;
+    bool canConnect() const;
 };
 
 class ServerSelectionMenu : public Menu
 {
 private:
-	Framework::TextFeld* playerName;
-	Framework::TextFeld* playerNameLabel;
-	Framework::TextFeld* serverLabel;
-	Framework::ZListe* serverList;
-	Framework::Knopf* add;
-	Framework::Knopf* refresh;
+    Framework::TextFeld* playerName;
+    Framework::TextFeld* playerNameLabel;
+    Framework::TextFeld* serverLabel;
+    Framework::ZListe* serverList;
+    Framework::Knopf* add;
+    Framework::Knopf* refresh;
 
 public:
-	ServerSelectionMenu(Framework::Bildschirm* zScreen);
-	void addServer(Framework::Text name, Framework::Text ip, unsigned short sslPort, unsigned short port);
-	bool hasServer(Framework::Text name) const;
-	void removeServer(Framework::Text name) const;
-	void saveServers() const;
+    ServerSelectionMenu(Framework::Bildschirm* zScreen);
+    void addServer(Framework::Text name,
+        Framework::Text ip,
+        unsigned short sslPort,
+        unsigned short port);
+    bool hasServer(Framework::Text name) const;
+    void removeServer(Framework::Text name) const;
+    void saveServers() const;
 };