📄 extrafunctions.cpp.svn-base
字号:
/*
Rose Online Server Emulator
Copyright (C) 2006,2007 OSRose Team http://www.osrose.net
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
depeloped with Main erose/hrose source server + some change from the original eich source
*/
#include "worldserver.h"
// Build Item Head
unsigned CWorldServer::BuildItemHead( CItem thisitem )
{
if (thisitem.count==0) return 0;
return ( ( thisitem.itemnum & 0x7ffffff ) << 5 ) | ( thisitem.itemtype & 0x1f );
}
// Build Item Data
unsigned CWorldServer::BuildItemData( CItem thisitem )
{
if (thisitem.count==0) return 0;
if ( thisitem.itemtype >= 10 && thisitem.itemtype <= 13 )
{
return thisitem.count;
}
else
{
unsigned part1 = (thisitem.refine>>4) << 28;
unsigned part2 = (thisitem.appraised?1:0) << 27;
unsigned part3 = (thisitem.socketed?1:0) << 26;
unsigned part4 = (thisitem.lifespan*10) << 16;
unsigned part5 = thisitem.durability << 9;
unsigned part6 = thisitem.stats;
unsigned part7 = thisitem.gem;
return part1 | part2 | part3 | part4 | part5 | part6 | part7;
}
}
// Get Item By Head and Data (Coded by Caali)
CItem CWorldServer::GetItemByHeadAndData( unsigned head, unsigned data )
{
CItem thisitem;
//Get info from ItemHead
thisitem.itemnum = (head >> 5) & 0x7ffffff;
head ^= (thisitem.itemtype & 0x7ffffff) << 5;
thisitem.itemtype = head & 0x1f;
//Get info from ItemData
if( thisitem.itemtype >= 10 && thisitem.itemtype <= 13 ) //Stackable
{
thisitem.refine = 0;
thisitem.appraised = 0;
thisitem.socketed = 0;
thisitem.lifespan = 100;
thisitem.durability = 40;
thisitem.gem = 0;
thisitem.stats = 0;
thisitem.count = (int)data;
}
else //Non-stackable
{
thisitem.refine = (data >> 28) << 4;
data-=(thisitem.refine>>4) << 28;
thisitem.appraised = ((data >> 27)==1)?true:false;
data-=(thisitem.appraised?1:0) << 27;
thisitem.socketed = ((data >> 26)==1)?true:false;
data-=(thisitem.socketed?1:0) << 26;
thisitem.lifespan = (data >> 16) / 10;
data-=(thisitem.lifespan*10) << 16;
thisitem.durability = data >> 9;
data-=thisitem.durability << 9;
thisitem.gem = data;
data-=thisitem.gem;
thisitem.count = 1;
}
return thisitem;
}
//----Build Item refine
unsigned CWorldServer::BuildItemRefine(CItem thisitem)
{
if (thisitem.gem == 0)
return ((thisitem.refine)*256);
else
{
return (0xd00+(thisitem.gem-320)*4)+((thisitem.refine)*256);
}
}
// Send a packet too all connected clients
void CWorldServer::SendToAll( CPacket* pak )
{
for(UINT i=0;i<ClientList.size();i++)
{
CPlayer* otherclient = (CPlayer*) ClientList.at( i )->player;
if (otherclient->Session->inGame)
otherclient->client->SendPacket( pak );
}
}
// Send a packet too all X who are visible
// -- CLIENT --
void CWorldServer::SendToVisible( CPacket* pak, CPlayer* thisclient, bool dothisclient )
{
for(unsigned j=0; j<thisclient->VisiblePlayers.size(); j++)
{
if(thisclient->VisiblePlayers.at( j )->client==NULL) continue;
thisclient->VisiblePlayers.at( j )->client->SendPacket( pak );
}
if(dothisclient && thisclient->client!=NULL)
thisclient->client->SendPacket( pak );
}
void CWorldServer::SendToVisible( CPacket* pak, CPlayer* thisclient, CPlayer* xotherclient )
{
for(unsigned j=0; j<thisclient->VisiblePlayers.size(); j++)
{
CPlayer* otherclient = thisclient->VisiblePlayers.at( j );
if(otherclient==xotherclient)
continue;
if(otherclient->client==NULL) continue;
otherclient->client->SendPacket( pak );
}
}
// -- MONSTER --
void CWorldServer::SendToVisible( CPacket* pak, CMonster* thismon, CDrop* thisdrop )
{
CMap* map = MapList.Index[thismon->Position->Map];
for(UINT i=0;i<map->PlayerList.size();i++)
{
CPlayer* otherclient = map->PlayerList.at(i);
if( IsVisible(otherclient, thismon) )
otherclient->client->SendPacket( pak );
if(thisdrop!=NULL)
{
otherclient->VisibleDrops.push_back( thisdrop );
}
}
}
// -- CHARACTER --
void CWorldServer::SendToVisible( CPacket* pak, CCharacter* character, CDrop* thisdrop )
{
if(character->IsPlayer( ))
{
SendToVisible( pak, (CPlayer*)character );
}
else
if(character->IsMonster( ))
{
SendToVisible( pak, (CMonster*)character, thisdrop );
}
}
// -- DROP --
void CWorldServer::SendToVisible( CPacket* pak, CDrop* thisdrop )
{
CMap* map = MapList.Index[thisdrop->posMap];
for(UINT i=0;i<map->PlayerList.size();i++)
{
CPlayer* otherclient = map->PlayerList.at(i);
if( IsVisible(otherclient, thisdrop) )
otherclient->client->SendPacket( pak );
}
}
// Send a packet too all clients on the specified map
void CWorldServer::SendToMap( CPacket* pak, int mapid )
{
CMap* map = MapList.Index[mapid];
for(UINT i=0;i<map->PlayerList.size();i++)
{
CPlayer* otherclient = map->PlayerList.at(i);
if( otherclient->Session->inGame )
otherclient->client->SendPacket( pak );
}
}
// -----------------------------------------------------------------------------------------
// Check if an object is visible to a client
// -----------------------------------------------------------------------------------------
// -- CLIENT --
bool CWorldServer::IsVisible( CPlayer* thisclient, CPlayer* otherclient )
{
for(unsigned j=0; j<thisclient->VisiblePlayers.size(); j++)
{
if (otherclient==thisclient->VisiblePlayers.at(j))
return true;
}
return false;
}
// -- MOB --
bool CWorldServer::IsVisible( CPlayer* thisclient, CMonster* thismon )
{
for(unsigned j=0; j<thisclient->VisibleMonsters.size(); j++)
{
//LMATEST
//if (thismon==thisclient->VisibleMonsters.at(j)) return true;
if (thismon->clientid==thisclient->VisibleMonsters.at(j)) return true;
}
return false;
}
// -- DROP --
bool CWorldServer::IsVisible( CPlayer* thisclient, CDrop* thisdrop )
{
for(unsigned j=0; j<thisclient->VisibleDrops.size(); j++) {
if (thisdrop==thisclient->VisibleDrops.at(j)) return true;
}
return false;
}
// -- NPC --
bool CWorldServer::IsVisible( CPlayer* thisclient, CNPC* thisnpc )
{
for(unsigned j=0; j<thisclient->VisibleNPCs.size(); j++) {
if (thisnpc==thisclient->VisibleNPCs.at(j)) return true;
}
return false;
}
// This function gets a new clientID for a npc, monster or mob
unsigned CWorldServer::GetNewClientID( )
{
for (unsigned i=1; i<0xffff; i++)
{
if (ClientIDList[i]!=0 && time(NULL)-ClientIDList[i]>10)
{
ClientIDList[i] = 0;
return i;
}
}
return 0;
}
// This function will free our clientID
void CWorldServer::ClearClientID( unsigned int id )
{
ClientIDList[id] = (unsigned)time(NULL);
}
// Search a drop by ID
CDrop* CWorldServer::GetDropByID( UINT id, UINT map )
{
if(map!=0)
return MapList.Index[map]->GetDropInMap( id );
for(unsigned j=0; j<MapList.Map.size(); j++)
{
CDrop* thisdrop = MapList.Map.at(j)->GetDropInMap( id );
if(thisdrop!=NULL)
return thisdrop;
}
return NULL;
}
// Search a Monster by ID
CMonster* CWorldServer::GetMonsterByID( UINT id, UINT map )
{
if(map!=0)
return MapList.Index[map]->GetMonsterInMap( id );
for(UINT i=0;i<MapList.Map.size();i++)
{
CMonster* thismon = MapList.Map.at(i)->GetMonsterInMap( id );
if(thismon!=NULL)
return thismon;
}
return NULL;
}
// Search a Client by Username
CPlayer* CWorldServer::GetClientByUserName( char *username )
{
for(UINT i=0;i<ClientList.size();i++)
{
CPlayer* thisclient = (CPlayer*) ClientList.at(i)->player;
if (strcmp(thisclient->Session->username,username)==0)
return thisclient;
}
return NULL;
}
// Get Client By ID
CPlayer* CWorldServer::GetClientByID( UINT id, UINT map )
{
if(map!=0)
return MapList.Index[map]->GetPlayerInMap( id );
for(UINT i=0;i<ClientList.size();i++)
{
CPlayer* thisclient = (CPlayer*) ClientList.at(i)->player;
if (thisclient->clientid==id)
return thisclient;
}
return NULL;
}
// Search a Client by CharID
CPlayer* CWorldServer::GetClientByCID( UINT id, UINT map )
{
if(map!=0)
return MapList.Index[map]->GetCharIDInMap( id );
for(UINT i=0;i<ClientList.size();i++)
{
CPlayer* thisclient = (CPlayer*) ClientList.at(i)->player;
if (thisclient->CharInfo->charid==id)
return thisclient;
}
return NULL;
}
// Seach a client by Charname
CPlayer* CWorldServer::GetClientByCharName( char* name )
{
for(UINT i=0;i<ClientList.size();i++)
{
CPlayer* thisclient = (CPlayer*) ClientList.at(i)->player;
if (strncmp(thisclient->CharInfo->charname,name, 16)==0)
return thisclient;
}
return NULL;
}
// Get Spawn Area by ID
CSpawnArea* CWorldServer::GetSpawnArea( UINT id, UINT map )
{
if(map!=0)
{
for(unsigned j=0; j<MapList.Index[map]->MonsterSpawnList.size(); j++)
{
CSpawnArea* thisspawn = MapList.Index[map]->MonsterSpawnList.at(j);
if (thisspawn->id==id)
return thisspawn;
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -