/** @file /world/world_handler.cpp Implementace hlavickoveho souboru /world/world_handler.h @author Petr Wolf */ #include "common/xml/package.h" #include "net/netinit.h" #include "common/Interface.h" #include "world/typedefs.h" #include "world/world_handler.h" #include "world/world_server.h" #include "world/world_client.h" namespace World{ TWorldHandler * world_handler = NULL; void initWorldModules() { TWorldHandler::initWorldHandler(); TWorldServer::initWorldServer(); TWorldClient::initWorldClients(); } void destroyWorldModules(){ TWorldHandler::destroyWorldHandler(); TWorldServer::destroyWorldServer(); TWorldClient::destroyWorldClients(); } /////////////////////////////////////////////////////////////////////////////// // init & destroy /////////////////////////////////////////////////////////////////////////////// TWorldHandler::TWorldHandler() { game_mode = GM_NA; // zaregistruji do fronty zprav svuj handler transceiver.fnc = WORLD_HANDLER_MSG_HANDLER; transceiver.iActived = true; transceiver.iPriority = WORLD_SERVER_PRIORITY; transceiver.PrimaryID = MOD_WORLD_HANDLER; KRegisterGlobalTransceiver(&transceiver, MOD_WORLD_HANDLER); } TWorldHandler::~TWorldHandler() { } /////////////////////////////////////////////////////////////////////////////// // staticky cleny /////////////////////////////////////////////////////////////////////////////// void TWorldHandler::initWorldHandler() { world_handler = new TWorldHandler(); } void TWorldHandler::destroyWorldHandler() { delete world_handler; world_handler = NULL; } /////////////////////////////////////////////////////////////////////////////// // world_handler handler /////////////////////////////////////////////////////////////////////////////// RVAL WORLD_HANDLER_MSG_HANDLER(MESSAGE_ID mid, SENDER s, PARAM p) { switch (mid) { case MSG_GAME_MODE: // nastaveni rezimu hry - inicializace modulu NET, WORLD_CLIENT a WORLD_SERVER { PACKET_GAME_MODE * packet = (PACKET_GAME_MODE *)p; // ulozim rezim do pameti world_handler->game_mode = packet->mode; // podle rezimu pripojeni inicializuji WORLD_SERVER a NET switch (packet->mode) { case GM_EDITOR: { // zalozim herni server world_server->init(); } break; case GM_LOCAL: // lokalni hra { // zakladam sitovy lokalni server TNetStartServer msg_s; msg_s.localGame = 1; msg_s.reconnect = 0; msg_s.maxPlayers = MAX_PLAYERS; msg_s.port=DEFAULT_PORT; KSendGlobalMessage(MSG_NET_STARTSERVER, MOD_WORLD_HANDLER, MOD_NET, &msg_s); // zalozim "sitoveho" klienta, ktery bude vsechny lokalni klienty obsluhovat TNetStartClient msg_c; msg_c.localGame = 1; // MUSI BYT 1! Nelze mit sitovy server a sitovy klient v jednom procesu msg_c.connectto = "localhost"; msg_c.port=DEFAULT_PORT; msg_c.profile_name[0]=0; KSendGlobalMessage(MSG_NET_STARTCLIENT, MOD_WORLD_HANDLER, MOD_NET, &msg_c); // zalozim herni server world_server->init(); } break; case GM_NET_SERVER: // sitova hra { // zakladam sitovy server TNetStartServer msg_s; msg_s.localGame = 0; msg_s.reconnect = 1; msg_s.maxPlayers = MAX_PLAYERS; msg_s.port=DEFAULT_PORT; KSendGlobalMessage(MSG_NET_STARTSERVER, MOD_WORLD_HANDLER, MOD_NET, &msg_s); // zalozim "sitoveho" klienta, ktery bude vsechny lokalni klienty obsluhovat TNetStartClient msg_c; msg_c.localGame = 1; // MUSI BYT 1! Nelze mit sitovy server a sitovy klient v jednom procesu msg_c.connectto = "localhost"; msg_c.port=DEFAULT_PORT; msg_c.profile_name[0]=0; KSendGlobalMessage(MSG_NET_STARTCLIENT, MOD_WORLD_HANDLER, MOD_NET, &msg_c); // zalozim herni server world_server->init(); } break; case GM_NET_CLIENT: // pripojeni klienta k sitove hre { // pripojuji se k sitovemu serveru, zalozim sitoveho klienta TNetStartClient msg; msg.localGame = 0; msg.connectto = packet->address; msg.port=DEFAULT_PORT; strcpy(msg.profile_name, packet->nick); KSendGlobalMessage(MSG_NET_STARTCLIENT, MOD_WORLD_HANDLER, MOD_NET, &msg); } break; } } break; case MSG_GAME_PREPARE: { for (int i = 1; i <= MAX_PLAYERS; i++) { if (world_client[i]) TWorldClient::destroyWorldClient(i); } world_client[0] = NULL; } break; case MSG_JOIN_GAME: // pripojeni hrace do hry { world_client_mutex.lock(); TPackage * package = (TPackage *)p; // uz je nejaky klient zalozen? Pokud ano, prevezmu jeho World TWorld * external_world = NULL; TWorldEngine * external_engine = NULL; TClientHistory * external_history = NULL; if (world_client[0]) { external_world = world_client[0]->world; external_engine = world_client[0]->engine; external_history = world_client[0]->history; } else { for (int i = 1; i <= MAX_PLAYERS; i++) { if (world_client[i]) TWorldClient::destroyWorldClient(i); } } // zalozim klienta TWorldClient::initWorldClient(package->getInt(PACKET_JOIN_GAME::player_id, 0, NULL), package->msgTo(), external_world, external_engine, external_history); world_client_mutex.unlock(); } break; } return NULL; } }//namespace