Additional testing, entity deletion, and player disconnection
This commit is contained in:
		@ -7,3 +7,5 @@ ADD / /dt
 | 
				
			|||||||
RUN cd /dt; /dt/build.sh
 | 
					RUN cd /dt; /dt/build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CMD ["/dt/builds/server.out"]
 | 
					CMD ["/dt/builds/server.out"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXPOSE 7777/udp
 | 
				
			||||||
@ -8,3 +8,10 @@ if [ -f builds/server.out ]; then
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
g++ main.cpp -o builds/server.out -lenet -lpthread
 | 
					g++ main.cpp -o builds/server.out -lenet -lpthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ $? = 0 ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    echo "Build successfully!"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    exit -1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
@ -28,11 +28,8 @@ void * console_logic(void *)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    while(console_is_running)
 | 
					    while(console_is_running)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if(!std::getline(std::cin, input_string))
 | 
					        if(std::getline(std::cin, input_string))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            std::cout << "Console I/O error!" << std::endl;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(input_string == "stop")
 | 
					            if(input_string == "stop")
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                console_is_running = false;
 | 
					                console_is_running = false;
 | 
				
			||||||
@ -42,6 +39,7 @@ void * console_logic(void *)
 | 
				
			|||||||
                std::cout << "Invalid console command!" << std::endl;
 | 
					                std::cout << "Invalid console command!" << std::endl;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,8 +17,13 @@ class GameMap
 | 
				
			|||||||
        std::string get_entity_dump(void);
 | 
					        std::string get_entity_dump(void);
 | 
				
			||||||
        std::string spawn_entity(std::string,std::string,int,int);
 | 
					        std::string spawn_entity(std::string,std::string,int,int);
 | 
				
			||||||
        std::string move_entity(std::string,std::string,int,int);
 | 
					        std::string move_entity(std::string,std::string,int,int);
 | 
				
			||||||
 | 
					        int get_entity_pos_x(std::string,std::string);
 | 
				
			||||||
 | 
					        int get_entity_pos_y(std::string,std::string);
 | 
				
			||||||
        int get_size_x(void);
 | 
					        int get_size_x(void);
 | 
				
			||||||
        int get_size_y(void);
 | 
					        int get_size_y(void);
 | 
				
			||||||
 | 
					        bool entity_exists(std::string, std::string);
 | 
				
			||||||
 | 
					        bool remove_entity(std::string, std::string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        int ** map_data;
 | 
					        int ** map_data;
 | 
				
			||||||
        int size_x;
 | 
					        int size_x;
 | 
				
			||||||
@ -66,12 +71,36 @@ std::string GameMap::move_entity(std::string entity_id, std::string entity_type,
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
 | 
					        if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if(map_data[entities[i].get_x() + x][entities[i].get_y() + y] % 2 == 1)
 | 
					            GameEntity* entity = &entities[i];
 | 
				
			||||||
 | 
					            //if(map_data[entities[i].get_x() + x][entities[i].get_y() + y] % 2 == 1)
 | 
				
			||||||
 | 
					            //{
 | 
				
			||||||
 | 
					            if(entity->get_x() + x < 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                entities[i].set_x(entities[i].get_x() + x);
 | 
					                entity->set_x(0);
 | 
				
			||||||
                entities[i].set_y(entities[i].get_y() + y);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return entities[i].get_dump();
 | 
					            else if(entity->get_x() + x >= this->get_size_x())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                entity->set_x(this->get_size_x() - 1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                entity->set_x(entities[i].get_x() + x);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if(entity->get_y() + y < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                entity->set_y(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if(entity->get_y() + y >= this->get_size_y())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                entity->set_y(this->get_size_y() - 1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                entity->set_y(entities[i].get_y() + y);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return entity->get_dump();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return "";
 | 
					    return "";
 | 
				
			||||||
@ -137,4 +166,84 @@ int GameMap::get_size_y(void)
 | 
				
			|||||||
    return size_y;
 | 
					    return size_y;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GameMap::entity_exists(std::string entity_id, std::string entity_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for(int i = 0; i < entities.size(); i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        GameEntity* entity = &entities[i];
 | 
				
			||||||
 | 
					        if(entity->get_id() == entity_id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(entity->get_type() == entity_type)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool erase(std::vector<GameEntity> &v, GameEntity key)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for(auto it = v.begin(); it != v.end();)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (it->get_id() == key.get_id())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            it = v.erase(it);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ++it;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GameMap::remove_entity(std::string entity_id, std::string entity_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(int i = 0; i < entities.size(); i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return erase(entities, entities[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int GameMap::get_entity_pos_x(std::string entity_id, std::string entity_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for(int i = 0; i < entities.size(); i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        GameEntity* entity = &entities[i];
 | 
				
			||||||
 | 
					        if(entity->get_id() == entity_id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(entity->get_type() == entity_type)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return entity->get_x();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int GameMap::get_entity_pos_y(std::string entity_id, std::string entity_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for(int i = 0; i < entities.size(); i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        GameEntity* entity = &entities[i];
 | 
				
			||||||
 | 
					        if(entity->get_id() == entity_id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(entity->get_type() == entity_type)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return entity->get_y();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -97,11 +97,22 @@ int main (int argc, char ** argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                case ENET_EVENT_TYPE_DISCONNECT:
 | 
					                case ENET_EVENT_TYPE_DISCONNECT:
 | 
				
			||||||
                    std::cout << event.peer -> data << " disconnected." << std::endl;
 | 
					                    std::cout << event.peer -> data << " disconnected." << std::endl;
 | 
				
			||||||
                    //Remove peer data on disconnect
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // DELETE ENTITY HERE
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //Clear username data and remove entity
 | 
				
			||||||
 | 
					                    std::string username = usernames[event.peer -> incomingPeerID];
 | 
				
			||||||
 | 
					                    if(username != "")
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        std::cout << "Removing '" << username << "'s player data!" << std::endl;
 | 
				
			||||||
 | 
					                        gamemap.remove_entity(username,"player");
 | 
				
			||||||
                        usernames[event.peer -> incomingPeerID] = "";
 | 
					                        usernames[event.peer -> incomingPeerID] = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        std::string resp = "2|delete,player:" + username;
 | 
				
			||||||
 | 
					                        const char* data = resp.c_str();
 | 
				
			||||||
 | 
					                        ENetPacket* packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE);
 | 
				
			||||||
 | 
					                        enet_host_broadcast(server, 0, packet);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    //Open peer for new connection
 | 
				
			||||||
                    event.peer -> data = NULL;
 | 
					                    event.peer -> data = NULL;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,9 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
mkdir -p builds
 | 
					mkdir -p builds
 | 
				
			||||||
g++ tests.cpp -o builds/tests.out -lgtest
 | 
					g++ tests.cpp -o builds/tests.out -lgtest
 | 
				
			||||||
./builds/tests.out
 | 
					if [ $? = 0 ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    ./builds/tests.out
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    exit -1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#include <gtest/gtest.h>
 | 
					#include <gtest/gtest.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gameentity.hpp"
 | 
					#include "gameentity.hpp"
 | 
				
			||||||
#include "gamemap.hpp"
 | 
					#include "gamemap.hpp"
 | 
				
			||||||
@ -61,6 +62,87 @@ TEST(GameMapTest, CheckMapSize)
 | 
				
			|||||||
    EXPECT_EQ(map.get_size_x(), 16);
 | 
					    EXPECT_EQ(map.get_size_x(), 16);
 | 
				
			||||||
    EXPECT_EQ(map.get_size_y(), 4);
 | 
					    EXPECT_EQ(map.get_size_y(), 4);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, CreateEntity)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    EXPECT_TRUE(map.entity_exists(TEST_ENTITY_ID, TEST_ENTITY_TYPE));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, IntialEntityPos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 0,0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, MoveEntityFromZero)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 0,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Move entity
 | 
				
			||||||
 | 
					    map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 2, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 2);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, MoveEntityRelative)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 0,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Move entity
 | 
				
			||||||
 | 
					    map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 2, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Move entity again!
 | 
				
			||||||
 | 
					    map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 1, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 3);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 2);   
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, MoveEntityNegativeFromZero)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 0, 0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    //Move entity
 | 
				
			||||||
 | 
					    map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, -1, -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);   
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, MoveEntityNegativeFromNonZero)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 1, 1);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    //Move entity
 | 
				
			||||||
 | 
					    std::cout << std::string(map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, -2, -2)) << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), 0);   
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, StopEntityFromMovingOutOfBounds)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, map.get_size_x()-1, map.get_size_y()-1);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    //Move entity
 | 
				
			||||||
 | 
					    map.move_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE, 2, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_x(TEST_ENTITY_ID, TEST_ENTITY_TYPE), map.get_size_x() - 1);
 | 
				
			||||||
 | 
					    EXPECT_EQ(map.get_entity_pos_y(TEST_ENTITY_ID, TEST_ENTITY_TYPE), map.get_size_y() - 1);   
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST(GameMapTest, RemoveMapEntity)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GameMap map = CreateMapEntity();
 | 
				
			||||||
 | 
					    map.spawn_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE);
 | 
				
			||||||
 | 
					    EXPECT_TRUE(map.remove_entity(TEST_ENTITY_ID, TEST_ENTITY_TYPE));
 | 
				
			||||||
 | 
					    EXPECT_FALSE(map.entity_exists(TEST_ENTITY_ID, TEST_ENTITY_TYPE));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char* argv[])
 | 
					int main(int argc, char* argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user