thienthanden2
06-01-13, 11:33 PM
Chào các bạn, hôm nay mình chính thức share code rồng dí cho những bạn chưa biết làm. (Một số sv private hiện nay skill rồng còn chưa đẹp).
Hình demo:
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Đầu tiên các bạn vào file skills.txt sửa chiêu Phi Long Tại Thiên cột MisslesForm thành 1. Vào file missles.txt sửa missle của Phi Long Tại Thiên cột MoveKind thành 5.
Bây giờ tiến hành sửa code:
1.File KMissle.cpp
Hàm KMissle::Activate()
if (m_nFollowNpcIdx > 0)
{
if ( Npc[m_nFollowNpcIdx].m_SubWorldIndex != m_nSubWorldId) //Sau khi sửa
{
m_nFollowNpcIdx = 0;
}
}
Hàm KMissle::OnFly() tìm case MISSLE_MMK_Follow sửa lại như sau:
case MISSLE_MMK_Follow: // Duoi theo muc tieu
{
nDOffsetX = (m_nSpeed * m_nXFactor);
nDOffsetY = (m_nSpeed * m_nYFactor);
int nDistance = 0;
int nSrcMpsX = 0;
int nSrcMpsY = 0;
int nDesMpsX = 0;
int nDesMpsY = 0;
int nSin = 0;
int nCos = 0;
if (Npc[m_nFollowNpcIdx].m_Index)
{
if (m_nCurrentLife == m_nLifeTime/2 - m_nLifeTime/8)
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
if (m_nCurrentLife == (m_nLifeTime/2) + (m_nLifeTime/8))
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
if (m_nCurrentLife == (m_nLifeTime/8)*7)
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
}
}break;
2. File KSkills.cpp
Hàm KSkill::CastMissles tìm case SKILL_MF_Line -> case SKILL_SLT_Npc sửa lại như sau:
case SKILL_SLT_Npc:
{
nTargetId = Param2PCoordinate(nLauncher,nParam1, nParam2, &nDesPX, &nDesPY, SKILL_SLT_Npc);
SubWorld[Npc[nLauncher].m_SubWorldIndex].Map2Mps(Npc[nLauncher].m_RegionIndex, Npc[nLauncher].m_MapX, Npc[nLauncher].m_MapY, Npc[nLauncher].m_OffX, Npc[nLauncher].m_OffY, &nSrcPX, &nSrcPY);
nDirIndex = g_GetDirIndex(nSrcPX, nSrcPY, nDesPX, nDesPY);
nDir = g_DirIndex2Dir(nDirIndex, MaxMissleDir);
SkillParam.nLauncher = nLauncher;
SkillParam.eLauncherType = eLauncherType;
SkillParam.nTargetId = nTargetId;
if (m_nChildSkillNum == 1 && (g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Line || g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Parabola) )
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance; // 放大1024倍
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
CastExtractiveLineMissle(&SkillParam, nDir, nSrcPX, nSrcPY, nCos, nSin, nDesPX, nDesPY);
}
else
if ( g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Follow )
{
if (m_nChildSkillNum == 1)
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance;
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
CastExtractiveLineMissle(&SkillParam, nDir, nSrcPX, nSrcPY, nCos, nSin, nDesPX, nDesPY);
}
else
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance;
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
if (nDir>=0 && nDir<4 || nDir>=60 && nDir<=64) //huong danh 6h
{ nSrcPX -= 60; nDesPX -= 60;
int Lechx = 30;
int Count = 1;
for(int i = 0; i < m_nChildSkillNum; i++)
{
int NewScrX = nSrcPX + Lechx*Count;
int NewDesX = nDesPX + Lechx*Count;
CastExtractiveLineMissle(&SkillParam, nDir, NewScrX, nSrcPY, nCos, nSin, NewDesX, nDesPY);
Count++;
}
}
if (nDir>=4 && nDir<=10) //huong 7h30
{ nSrcPX -= 60; nSrcPY -= 50; nDesPX -= 60; nDesPY -= 50;
int Lechx = 30; int Lechy = 25;
int Count = 1;
for(int i = 0; i < m_nChildSkillNum; i++)
{
int NewScrX = nSrcPX + Lechx*Count;
int NewScrY = nSrcPY + Lechy*Count;
int NewDesX = nDesPX + Lechx*Count;
int NewDesY = nDesPY + Lechy*Count;
CastExtractiveLineMissle(&SkillParam, nDir, NewScrX, NewScrY, nCos, nSin, NewDesX, NewDesY);
Count++;
}
}}}else
CastLine(&SkillParam, nDir, nSrcPX,nSrcPY);
}break;
Hàm KSkill::CastExtractiveLineMissle tìm và thêm:
if (Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Line || Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Parabola || Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Follow) // thêm MISSLE_MMK_Follow
{
Missle[nMissleIndex].m_nXFactor = nXOffset;
Missle[nMissleIndex].m_nYFactor = nYOffset;
}
Như vậy là xong rồi đó các bạn, nhưng ở đây mình mới chỉ làm đánh được hướng 6h đến 8h thôi. nDir có tất cả 64 giá trị. Các hướng còn lại là phần dành cho các bạn làm, cũng quy tắc tương tự như vậy thôi. Chúc các bạn thành công.
Hình demo:
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Đầu tiên các bạn vào file skills.txt sửa chiêu Phi Long Tại Thiên cột MisslesForm thành 1. Vào file missles.txt sửa missle của Phi Long Tại Thiên cột MoveKind thành 5.
Bây giờ tiến hành sửa code:
1.File KMissle.cpp
Hàm KMissle::Activate()
if (m_nFollowNpcIdx > 0)
{
if ( Npc[m_nFollowNpcIdx].m_SubWorldIndex != m_nSubWorldId) //Sau khi sửa
{
m_nFollowNpcIdx = 0;
}
}
Hàm KMissle::OnFly() tìm case MISSLE_MMK_Follow sửa lại như sau:
case MISSLE_MMK_Follow: // Duoi theo muc tieu
{
nDOffsetX = (m_nSpeed * m_nXFactor);
nDOffsetY = (m_nSpeed * m_nYFactor);
int nDistance = 0;
int nSrcMpsX = 0;
int nSrcMpsY = 0;
int nDesMpsX = 0;
int nDesMpsY = 0;
int nSin = 0;
int nCos = 0;
if (Npc[m_nFollowNpcIdx].m_Index)
{
if (m_nCurrentLife == m_nLifeTime/2 - m_nLifeTime/8)
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
if (m_nCurrentLife == (m_nLifeTime/2) + (m_nLifeTime/8))
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
if (m_nCurrentLife == (m_nLifeTime/8)*7)
{
SubWorld[0].Map2Mps(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, &nSrcMpsX, &nSrcMpsY);
Npc[m_nFollowNpcIdx].GetMpsPos(&nDesMpsX, &nDesMpsY);
if (nSrcMpsX != nDesMpsX && nSrcMpsY != nDesMpsY)
{ nDistance = g_GetDistance(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY);}
if ( nDistance != 0)
{
nSin = ((nDesMpsY - nSrcMpsY) << 10) / nDistance;
nCos = ((nDesMpsX - nSrcMpsX) << 10) / nDistance;
if (abs(nSin) <= 1024 && abs(nCos) <= 1024)
{ m_nRefPX = nSrcMpsX;
m_nRefPY = nSrcMpsY;
m_nXFactor = nCos;
m_nYFactor = nSin;
m_nDir = g_DirIndex2Dir(g_GetDirIndex(nSrcMpsX, nSrcMpsY, nDesMpsX, nDesMpsY), MaxMissleDir);
m_nDirIndex = g_Dir2DirIndex(m_nDir, MaxMissleDir); }}
}
}
}break;
2. File KSkills.cpp
Hàm KSkill::CastMissles tìm case SKILL_MF_Line -> case SKILL_SLT_Npc sửa lại như sau:
case SKILL_SLT_Npc:
{
nTargetId = Param2PCoordinate(nLauncher,nParam1, nParam2, &nDesPX, &nDesPY, SKILL_SLT_Npc);
SubWorld[Npc[nLauncher].m_SubWorldIndex].Map2Mps(Npc[nLauncher].m_RegionIndex, Npc[nLauncher].m_MapX, Npc[nLauncher].m_MapY, Npc[nLauncher].m_OffX, Npc[nLauncher].m_OffY, &nSrcPX, &nSrcPY);
nDirIndex = g_GetDirIndex(nSrcPX, nSrcPY, nDesPX, nDesPY);
nDir = g_DirIndex2Dir(nDirIndex, MaxMissleDir);
SkillParam.nLauncher = nLauncher;
SkillParam.eLauncherType = eLauncherType;
SkillParam.nTargetId = nTargetId;
if (m_nChildSkillNum == 1 && (g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Line || g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Parabola) )
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance; // 放大1024倍
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
CastExtractiveLineMissle(&SkillParam, nDir, nSrcPX, nSrcPY, nCos, nSin, nDesPX, nDesPY);
}
else
if ( g_MisslesLib[m_nChildSkillId].m_eMoveKind == MISSLE_MMK_Follow )
{
if (m_nChildSkillNum == 1)
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance;
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
CastExtractiveLineMissle(&SkillParam, nDir, nSrcPX, nSrcPY, nCos, nSin, nDesPX, nDesPY);
}
else
{
if (nSrcPX == nDesPX && nSrcPY == nDesPY) return FALSE ;
nDistance = g_GetDistance(nSrcPX, nSrcPY, nDesPX, nDesPY);
if (nDistance == 0 ) return FALSE;
int nYLength = nDesPY - nSrcPY;
int nXLength = nDesPX - nSrcPX;
int nSin = (nYLength << 10) / nDistance;
int nCos = (nXLength << 10) / nDistance;
if (abs(nSin) > 1024)
return FALSE;
if (abs(nCos) > 1024)
return FALSE;
if (nDir>=0 && nDir<4 || nDir>=60 && nDir<=64) //huong danh 6h
{ nSrcPX -= 60; nDesPX -= 60;
int Lechx = 30;
int Count = 1;
for(int i = 0; i < m_nChildSkillNum; i++)
{
int NewScrX = nSrcPX + Lechx*Count;
int NewDesX = nDesPX + Lechx*Count;
CastExtractiveLineMissle(&SkillParam, nDir, NewScrX, nSrcPY, nCos, nSin, NewDesX, nDesPY);
Count++;
}
}
if (nDir>=4 && nDir<=10) //huong 7h30
{ nSrcPX -= 60; nSrcPY -= 50; nDesPX -= 60; nDesPY -= 50;
int Lechx = 30; int Lechy = 25;
int Count = 1;
for(int i = 0; i < m_nChildSkillNum; i++)
{
int NewScrX = nSrcPX + Lechx*Count;
int NewScrY = nSrcPY + Lechy*Count;
int NewDesX = nDesPX + Lechx*Count;
int NewDesY = nDesPY + Lechy*Count;
CastExtractiveLineMissle(&SkillParam, nDir, NewScrX, NewScrY, nCos, nSin, NewDesX, NewDesY);
Count++;
}
}}}else
CastLine(&SkillParam, nDir, nSrcPX,nSrcPY);
}break;
Hàm KSkill::CastExtractiveLineMissle tìm và thêm:
if (Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Line || Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Parabola || Missle[nMissleIndex].m_eMoveKind == MISSLE_MMK_Follow) // thêm MISSLE_MMK_Follow
{
Missle[nMissleIndex].m_nXFactor = nXOffset;
Missle[nMissleIndex].m_nYFactor = nYOffset;
}
Như vậy là xong rồi đó các bạn, nhưng ở đây mình mới chỉ làm đánh được hướng 6h đến 8h thôi. nDir có tất cả 64 giá trị. Các hướng còn lại là phần dành cho các bạn làm, cũng quy tắc tương tự như vậy thôi. Chúc các bạn thành công.