Code:
Code:
case SKILL_DECAY:
return this->SkillDecay(aIndex,bIndex,lpSkill,x,y,combo);
Code:
case SKILL_RED_STORM:
return this->SkillRedStorm(aIndex,bIndex,lpSkill,combo);
Code:
case SKILL_FIVE_SHOT:
return this->SkillFiveShot(aIndex,bIndex,lpSkill,angle,combo);
Code:
case SKILL_BIRDS:
return this->SkillBirds(aIndex,bIndex,lpSkill,angle,combo);
Code:
case SKILL_DRAGON_LORE:
return this->SkillDragonLore(aIndex,bIndex,lpSkill,combo);
Code:
bool CSkillManager::SkillDecay(int aIndex,int bIndex,CSkill* lpSkill,BYTE x,BYTE y,bool combo) // OK
{
LPOBJ lpObj = &gObj[aIndex];
if(this->CheckSkillRange(lpSkill->m_index,lpObj->X,lpObj->Y,x,y) == 0)
{
return 0;
}
int count = 0;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
{
continue;
}
int index = lpObj->VpPlayer2[n].index;
if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
{
continue;
}
if(this->CheckSkillRadio(lpSkill->m_index,x,y,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);
if(combo != 0)
{
this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
}
if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
{
break;
}
}
return 1;
}
Code:
bool CSkillManager::SkillRedStorm(int aIndex,int bIndex,CSkill* lpSkill,bool combo) // OK
{
LPOBJ lpObj = &gObj[aIndex];
int count = 0;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
{
continue;
}
int index = lpObj->VpPlayer2[n].index;
if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
{
continue;
}
if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
gObjAddAttackProcMsgSendDelay(lpObj,50,index,250,lpSkill->m_index,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);
if(combo != 0)
{
this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
}
if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
{
break;
}
}
return 1;
}
Code:
bool CSkillManager::SkillFiveShot(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,bool combo) // OK
{
LPOBJ lpObj = &gObj[aIndex];
int SkillFrustrumX[4],SkillFrustrumY[4];
this->GetSkillFrustrum(SkillFrustrumX,SkillFrustrumY,angle,lpObj->X,lpObj->Y,6.0f,7.0f,2.0f,0.0f);
vec3_t Angle;
Vector(0.0f,6.0f,0.0f,Angle);
vec3_t p[4];
Vector(0.0f,0.0f,40.0f,p[0]);
Vector(0.0f,0.0f,20.0f,p[1]);
Vector(0.0f,0.0f,340.0f,p[2]);
Vector(0.0f,0.0f,320.0f,p[3]);
float Matrix[3][4];
vec3_t vFrustrum[5],vFrustrum2[5];
AngleMatrix(p[0],Matrix);
VectorRotate(Angle,Matrix,vFrustrum[0]);
AngleMatrix(p[1],Matrix);
VectorRotate(Angle,Matrix,vFrustrum[1]);
Vector(0.0f,6.0f,0.0f,vFrustrum[2]);
AngleMatrix(p[2],Matrix);
VectorRotate(Angle,Matrix,vFrustrum[3]);
AngleMatrix(p[3],Matrix);
VectorRotate(Angle,Matrix,vFrustrum[4]);
Vector(0.0f,0.0f,(vec_t)((angle*360)/255),p[0]);
AngleMatrix((float*)p,Matrix);
int ArrowFrustrum[5],ArrowFrustrumX[5],ArrowFrustrumY[5];
for(int n=0;n < 5;n++)
{
VectorRotate(vFrustrum[n],Matrix,vFrustrum2[n]);
ArrowFrustrumX[n] = (int)vFrustrum2[n][0]+lpObj->X;
ArrowFrustrumY[n] = (int)vFrustrum2[n][1]+lpObj->Y;
}
int count = 0;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
{
continue;
}
int index = lpObj->VpPlayer2[n].index;
if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
{
continue;
}
if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
if(this->CheckSkillFrustrum(SkillFrustrumX,SkillFrustrumY,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
for(int i=0;i < 5;i++)
{
if((ArrowFrustrum[i]=((ArrowFrustrumX[i]-lpObj->X)*(gObj[index].Y-lpObj->Y))-((ArrowFrustrumY[i]-lpObj->Y)*(gObj[index].X-lpObj->X))) > -5 && ArrowFrustrum[i] < 5)
{
gAttack.Attack(lpObj,&gObj[index],lpSkill,1,0,0,0,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);
if(combo != 0)
{
this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
}
}
}
if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
{
break;
}
}
return 1;
}
Code:
bool CSkillManager::SkillBirds(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,bool combo) // OK
{
LPOBJ lpObj = &gObj[aIndex];
int SkillFrustrumX[4],SkillFrustrumY[4];
this->GetSkillFrustrum(SkillFrustrumX,SkillFrustrumY,angle,lpObj->X,lpObj->Y,1.5f,6.0f,1.5f,0.0f);
int count = 0;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
{
continue;
}
int index = lpObj->VpPlayer2[n].index;
if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
{
continue;
}
if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
if(this->CheckSkillFrustrum(SkillFrustrumX,SkillFrustrumY,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
if(OBJECT_RANGE(bIndex) != 0 && index == bIndex)
{
gObjAddAttackProcMsgSendDelay(lpObj,50,index,200,lpSkill->m_index,0);
gObjAddAttackProcMsgSendDelay(lpObj,50,index,300,lpSkill->m_index,0);
}
else
{
gObjAddAttackProcMsgSendDelay(lpObj,50,index,200,lpSkill->m_index,0);
}
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);
if(combo != 0)
{
this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
}
if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
{
break;
}
}
return 1;
}
Code:
bool CSkillManager::SkillDragonLore(int aIndex,int bIndex,CSkill* lpSkill,bool combo) // OK
{
#if(GAMESERVER_UPDATE>=601)
LPOBJ lpObj = &gObj[aIndex];
if(OBJECT_RANGE(bIndex) == 0)
{
return 0;
}
LPOBJ lpTarget = &gObj[bIndex];
if(this->CheckSkillRange(lpSkill->m_index,lpObj->X,lpObj->Y,lpTarget->X,lpTarget->Y) == 0)
{
return 0;
}
int count = 0;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
{
continue;
}
int index = lpObj->VpPlayer2[n].index;
if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
{
continue;
}
if(this->CheckSkillRadio(lpSkill->m_index,lpTarget->X,lpTarget->Y,gObj[index].X,gObj[index].Y) == 0)
{
continue;
}
gAttack.Attack(lpObj,&gObj[index],lpSkill,1,0,0,1,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,2,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,3,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,4,0);
gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);
if(combo != 0)
{
this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
}
if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
{
break;
}
}
return 1;
#else
return 0;
#endif
}
SkillManager.h