📄 extrafunctions.cpp.svn-base
字号:
for(map=0;map<MapList.Map.size();map++)
{
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;
}
}
}
return NULL;
}
// delete a spawn
bool CWorldServer::DeleteSpawn( CSpawnArea* spawn )
{
if(spawn==NULL)
return false;
for(UINT i=0;i<MapList.Index[spawn->map]->MonsterSpawnList.size();i++)
{
if(MapList.Index[spawn->map]->MonsterSpawnList.at(i)==spawn)
{
MapList.Index[spawn->map]->MonsterSpawnList.erase( MapList.Index[spawn->map]->MonsterSpawnList.begin()+i );
delete spawn;
return true;
}
}
return false;
}
// Search NPC by Type
CNPC* CWorldServer::GetNPCByType( UINT npctype )
{
for(UINT i=0;i<MapList.Map.size();i++)
{
CMap* map = GServer->MapList.Map.at(i);
for(UINT j=0;j<map->NPCList.size();j++)
{
CNPC* npc = map->NPCList.at(j);
if(npc->npctype == npctype)
return npc;
}
}
return NULL;
}
// Search NPC by ID
CNPC* CWorldServer::GetNPCByID( UINT id, UINT map )
{
if(map!=0)
return MapList.Index[map]->GetNPCInMap( id );
for(unsigned j=0; j<MapList.Map.size(); j++)
{
CNPC* thisnpc = MapList.Map.at( j )->GetNPCInMap( id );
if (thisnpc!=0)
return thisnpc;
}
return NULL;
}
// Get Telegate by ID
CTeleGate* CWorldServer::GetTeleGateByID( unsigned int id )
{
for(unsigned j=0; j<TeleGateList.size(); j++)
{
CTeleGate* thisgate = TeleGateList.at(j);
if (thisgate->id==id) return thisgate;
}
// Hmm, shit, couldent find it
return NULL;
}
// Get Triangle Area
float CWorldServer::AreaOfTriangle( fPoint p1, fPoint p2, fPoint p3 )
{
return abs((int)((p2.x * p1.y - p1.x * p2.y) + (p3.x * p2.y - p2.x * p3.y) + (p1.x * p3.y - p2.x * p1.y))) / 2;
}
// Get a random point in triangle area
fPoint CWorldServer::RandInTriangle( fPoint p1, fPoint p2, fPoint p3 )
{
fPoint thispoint;
float a = 1.0;
float b = 1.0;
while (a+b>1) { a=(float)(rand()*1.0/RAND_MAX); b=(float)(rand()*1.0/RAND_MAX); }
float c = 1 - a - b;
thispoint.x = (p1.x*a)+(p2.x*b)+(p3.x*c);
thispoint.y = (p1.y*a)+(p2.y*b)+(p3.y*c);
return thispoint;
}
// Get random point in poly
fPoint CWorldServer::RandInPoly( fPoint p[], int pcount )
{
int tnum = 0;
float tval = 0;
float totalarea = 0;
float* areas = new float[pcount-1];
for(int i=0; i<pcount-2; i++) {
totalarea += AreaOfTriangle(p[0], p[i+1], p[i+2]);
areas[i+1] = totalarea;
}
tval = rand() * totalarea / RAND_MAX;
for (tnum=1; tnum<pcount-1; tnum++) { if(tval<=areas[tnum]&&tval>areas[tnum-1]) break; }
return RandInTriangle(p[0], p[tnum], p[tnum+1]);
}
// Get Random point in circle
fPoint CWorldServer::RandInCircle( fPoint center, float radius )
{
fPoint thispoint;
float angle = (float)(rand() * ( pi * 2 ) / RAND_MAX);
float distance = (float)sqrt( rand() * 1.0 / RAND_MAX ) * radius;
thispoint.x = cos(angle) * distance + center.x;
thispoint.y = sin(angle) * distance + center.y;
return thispoint;
}
// Check if a Monster is in a Circle around a Client with a specific range
bool CWorldServer::IsMonInCircle( CPlayer* thisclient, CMonster* thismon, float radius )
{
if ( thisclient->Position->Map!=thismon->Position->Map ) return false;
float dx = ( thisclient->Position->current.x - thismon->Position->current.x );
float dy = ( thisclient->Position->current.y - thismon->Position->current.y );
if ( sqrt( (dx * dx) + (dy * dy) ) <= radius )
{
return true;
}
else
{
return false;
}
}
// Check if a Monster is in a Circle around a point with a specific radius
bool CWorldServer::IsMonInCircle( fPoint center, fPoint position, float radius )
{
float dx = ( center.x - position.x );
float dy = ( center.y - position.y );
if ( sqrt( (dx * dx) + (dy * dy) ) <= radius )
{
return true;
}
else
{
return false;
}
}
// Check if a Player is in a Circle around a Client with a specific range
bool CWorldServer::IsPlayerInCircle( CPlayer* thisclient, CPlayer* otherclient, float radius )
{
if ( thisclient->Position->Map!=otherclient->Position->Map ) return false;
float dx = ( thisclient->Position->current.x - otherclient->Position->current.x );
float dy = ( thisclient->Position->current.y - otherclient->Position->current.y );
if ( sqrt( (dx * dx) + (dy * dy) ) <= radius )
{
return true;
}
else
{
return false;
}
}
// Search Respawn by ID
CRespawnPoint* CWorldServer::GetRespawnByID( unsigned id )
{
for(UINT i=0;i<MapList.Map.size();i++)
{
CMap* thismap = MapList.Map.at(i);
for(UINT j=0;j<thismap->RespawnList.size();j++)
{
CRespawnPoint* thisrespawn = thismap->RespawnList.at(j);
if(thisrespawn->id==id)
return thisrespawn;
}
}
return NULL;
}
// Search Respawn by Map
CRespawnPoint* CWorldServer::GetRespawnByMap( int map )
{
for(UINT j=0;j<MapList.Index[map]->RespawnList.size();j++)
{
if(MapList.Index[map]->RespawnList.at(j)->destMap==map)
return MapList.Index[map]->RespawnList.at(j);
}
return NULL;
}
// Search Skill By ID
CSkills* CWorldServer::GetSkillByID( unsigned int id )
{
unsigned int A=0,B=0,C=0;
for(A=0,B=SkillList.size()-1;A<=B;)
{
if(A==B)
{
CSkills* thisskill = (CSkills*) SkillList.at( A );
if( id = thisskill->id );
return thisskill;
}
C = (A+B)/2;
CSkills* thisskill = (CSkills*) SkillList.at( C );
if(thisskill->id == id)
{
return thisskill;
}
if(thisskill->id > id)
{
B=C-1;
}
else
{
A=C+1;
}
}
Log( MSG_WARNING,"SKILL NOT FOUNDED! %i", id );
return NULL;
}
// Get Monster Drop By ID
CMDrops* CWorldServer::GetDropData( unsigned int id )
{
unsigned int A=0,B=0,C=0;
for(A=0,B=MDropList.size()-1;A<=B;)
{
if(A==B)
{
CMDrops* thismdrop = (CMDrops*) MDropList.at( A );
id = thismdrop->id;
return thismdrop;
}
C = (A+B)/2;
CMDrops* thismdrop = (CMDrops*) MDropList.at( C );
if(thismdrop->id == id){return thismdrop;}
if(thismdrop->id > id){B=C-1;}
else{A=C+1;}
}
Log(MSG_WARNING,"DROP NOT FOUNDED! %i", id );
return NULL;
}
// Get NPC Data by ID
CNPCData* CWorldServer::GetNPCDataByID( unsigned int id )
{
unsigned int A=0,B=0,C=0;
for(A=0,B=NPCData.size()-1;A<=B;)
{
if(A==B)
{
CNPCData* thisnpc = (CNPCData*) NPCData.at( A );
id = thisnpc->id;
return thisnpc;
}
C = (A+B)/2;
CNPCData* thisnpc = (CNPCData*) NPCData.at( C );
if(thisnpc->id == id){return thisnpc;}
if(thisnpc->id > id){B=C-1;}
else{A=C+1;}
}
Log(MSG_WARNING,"NPC NOT FOUNDED! %i", id );
return NULL;
}
// Get Consumible Item Info
CUseInfo* CWorldServer::GetUseItemInfo(CPlayer* thisclient, unsigned int slot )
{
if(thisclient->items[slot].count<1)
return NULL;
CUseInfo* useitem = new (nothrow) CUseInfo;
if(useitem==NULL)
{
Log(MSG_WARNING, "Error allocing memory GetUseItemInfo");
return useitem;
}
useitem->itemnum = 0;
useitem->itemtype = 0;
useitem->usescript = 0;
useitem->usetype = 0;
useitem->usevalue = 0;
unsigned int type = 0;
useitem->itemnum = thisclient->items[slot].itemnum;
useitem->itemtype = thisclient->items[slot].itemtype;
type = UseList.Index[useitem->itemnum]->type;
switch(type)
{
case 311://Medicine
case 312://Food
{
useitem->usescript = 1;
useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[0];
useitem->usevalue = UseList.Index[useitem->itemnum]->useeffect[1];
}
break;
case 313://Magic Item [scrolls/summons/fireworks/etc]
{
// scrolls [maxhp,attackpower up, ... ]
if((useitem->itemnum>79 && useitem->itemnum<93) || (useitem->itemnum>300 && useitem->itemnum<320) || (useitem->itemnum>960 && useitem->itemnum<965))
{
useitem->usescript = 7;
useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[1];
useitem->usevalue = 0;
}
else //Super Cherry - Berry -- Not complete
if((useitem->itemnum>980 && useitem->itemnum<986)|| (useitem->itemnum>986 && useitem->itemnum<989))
{
useitem->usescript = 1;
useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[0];
useitem->usevalue = UseList.Index[useitem->itemnum]->useeffect[1];
}
else //Return Scrolls
if( (useitem->itemnum>349 && useitem->itemnum<355) ||
(useitem->itemnum>359 && useitem->itemnum<365) )
{
if( thisclient->Stats->MP < 33 ){delete useitem;}
thisclient->Stats->MP -= 32;
useitem->usescript = 2;
switch( useitem->itemnum )
{
//Adventure plain [credits to tomiz]
case 350:
useitem->usetype = 22;
useitem->usevalue = 51105310;
break;
//Zant
case 351:
useitem->usetype = 1;
useitem->usevalue = 52405192;
break;
//Junon
case 352:
useitem->usetype = 2;
useitem->usevalue = 55095283;
break;
//Eucar
case 353:
useitem->usetype = 51;
useitem->usevalue = 53665099;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -