/* Copyright (C) 2009 TitanFiesta Dev Team * Licensed under GNU GPL v3 * For license details, see LICENCE in the root folder. */ #include "CGameClient.h" #include "CMap.h" CMap::CMap(CShnRow* MapInfo, CTitanServer* Server) { this->Server = Server; this->MapInfo = MapInfo; Id = MapInfo->cells[0]->wData; MapName = (const char*)MapInfo->cells[1]->strData; Name = (const char*)MapInfo->cells[2]->strData; StartX = MapInfo->cells[3]->dwData; StartY = MapInfo->cells[4]->dwData; KingdomMap = MapInfo->cells[5]->btData; Inside = MapInfo->cells[7]->btData; Tick = 0; Running = true; NextEID = 100; } CMap::~CMap() { } bool CMap::AddClient(CGameClient *Client) { Client->Map = this; rwmClientList.acquireWriteLock(); ClientList.push_back(Client); // Send this client all Entity information. // Setup this clients ident packet CPacket pakident(0x1c06); pakident.Add(Client->Character.ClientId); pakident.AddFixLenStr(Client->Character.Name, 0x10); pakident.Add(Client->Character.Pos.X); pakident.Add(Client->Character.Pos.Y); pakident.Add(0); pakident.Add(0x01); // State pakident.Add(Client->Character.Job); pakident.Add(Client->Character.Profession); pakident.Add(Client->Character.Hair.Style); pakident.Add(Client->Character.Hair.Color); pakident.Add(Client->Character.Face.Style); pakident.Add(Client->Equipment->GetItemId(1)); // Helmet pakident.Add(Client->Equipment->GetItemId(12)); // Weapon pakident.Add(Client->Equipment->GetItemId(7)); // Armor pakident.Add(Client->Equipment->GetItemId(10)); // Shield pakident.Add(Client->Equipment->GetItemId(19)); // Pants pakident.Add(Client->Equipment->GetItemId(21)); // Boots pakident.Fill(0xff, 0x1A); pakident.Add(Client->Equipment->GetItemId(28)); // Pet pakident.Add(Client->Equipment->GetRefine(12) << 4 | Client->Equipment->GetRefine(10)); // Refine pakident.Add(0x00); pakident.Add(0x00); pakident.Add(0xffff); pakident.Add(Client->Character.Emote); pakident.Add(0xffff); pakident.Add(0); pakident.Add(0); pakident.Add(0); pakident.Fill(0x00, 0x28); pakident.Add(0x00); pakident.Add(0x0002); // Send Player List for (std::vector::iterator i = ClientList.begin(); i != ClientList.end(); i++) { CGameClient* c = *i; if (c == NULL) continue; CPacket pakout(0x1c06); pakout.Add(c->Character.ClientId); pakout.AddFixLenStr(c->Character.Name, 0x10); pakout.Add(c->Character.Pos.X); pakout.Add(c->Character.Pos.Y); pakout.Add(0); pakout.Add(0x01); // State pakout.Add(c->Character.Job); pakout.Add(c->Character.Profession); pakout.Add(c->Character.Hair.Style); pakout.Add(c->Character.Hair.Color); pakout.Add(c->Character.Face.Style); pakout.Add(c->Equipment->GetItemId(1)); // Helmet pakout.Add(c->Equipment->GetItemId(12)); // Weapon pakout.Add(c->Equipment->GetItemId(7)); // Armor pakout.Add(c->Equipment->GetItemId(10)); // Shield pakout.Add(c->Equipment->GetItemId(19)); // Pants pakout.Add(c->Equipment->GetItemId(21)); // Boots pakout.Fill(0xff, 0x1A); pakout.Add(c->Equipment->GetItemId(28)); // Pet pakout.Add(c->Equipment->GetRefine(12) << 4 | c->Equipment->GetRefine(10)); // Refine pakout.Add(0x00); // Refine pakout.Add(0x00); pakout.Add(0x00); pakout.Add(0xffff); pakout.Add(c->Character.Emote); pakout.Add(0xffff); pakout.Add(0); pakout.Add(0); pakout.Add(0); pakout.Fill(0x00, 0x28); pakout.Add(0x00); pakout.Add(0x0002); //ClientCount++; Server->SendPacket(Client, &pakout); // Send client to thisclient Server->SendPacket(c, &pakident); // Send this client to other client } //pakout.Set(ClientCount, 0); //Server->SendPacket(Client, &pakout); // Send NPC List // Send Mob List // Send Drop List rwmClientList.releaseWriteLock(); return true; } bool CMap::RemoveClient(CGameClient *Client) { rwmClientList.acquireWriteLock(); CPacket pakout(0x1c0e); pakout.Add(Client->Character.ClientId); // Store the client to erase std::vector::iterator Erase; for (std::vector::iterator i = ClientList.begin(); i != ClientList.end(); i++) { CGameClient* c = *i; if (c == Client) { Erase = i; continue; } // Remove the client from others screen. Server->SendPacket(c, &pakout); } ClientList.erase(Erase); rwmClientList.releaseWriteLock(); Client->Map = NULL; return false; } void CMap::Thread() { // Thread "process" function while (Running) { if (Tick == 0) { rwmClientList.acquireReadLock(); if (ClientList.size() != 0) printf("%s -> %d\n", MapInfo->cells[6]->strData, ClientList.size()); rwmClientList.releaseReadLock(); } ++Tick = Tick % 1000; // Sleep so as to not take all CPU power. boost::this_thread::sleep(boost::posix_time::milliseconds(10)); } } void CMap::SendToAll(CPacket* pak) { rwmClientList.acquireReadLock(); for (std::vector::iterator i = ClientList.begin(); i != ClientList.end(); i++) { Server->SendPacket(*i, pak); } rwmClientList.releaseReadLock(); } word CMap::GetNewEID(){ word NewEID; if (EIDRecycle.empty()){ NewEID = NextEID; if (NextEID != MAX_EID) NextEID++; } else{ NewEID = EIDRecycle.top(); EIDRecycle.pop(); } return NewEID; } void CMap::FreeEID(word EID){ EIDRecycle.push(EID); }