PDA

View Full Version : [JX] Vấn đề trên server build source



savatage91
21-01-13, 04:23 PM
Em đang làm 1 sv cho mình với source và sv nên đc share trên diễn đàn . nhưng sau khi build xong chạy sever phát sinh một vài vấn đề như sau.
- sever không load npc và quái trên map
+ vấn đền trên em đã cố gắng khắc phục bằng cách copy script từ 1 sever khác sang .. nhưng không hiểu tại sao npc và map vẫn chưa đc load ra .
- nhân vật có item skill đồ trên người không login vào lại đc
<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>

không biết các vấn đề trên của em có ai bị qua chưa mong đc mọi người giúp đỡ .

thaihoa91
21-01-13, 04:29 PM
Bạn ko nên dùng code của Server khác đem vào, đặc biệt là additem hay thêm NPC, vì bản thân ID Item và ID NPC mỗi Server mỗi khác nhau, trộn có thể dẫn tới nhìu lỗi nặng !

savatage91
21-01-13, 04:43 PM
thaihoa có thể chỉ bảo giúp mình thêm một chút đc không .. hiện h mình cũng chưa hiểu làm sao để một file lua của mình viết ra làm sao để kích hoạt nó ví dụ khi mở sever lên thì file lua này sẽ đc chạy đồng nghĩa với các code trong đó cũng chạy luôn =((

thaihoa91
21-01-13, 04:46 PM
thaihoa có thể chỉ bảo giúp mình thêm một chút đc không .. hiện h mình cũng chưa hiểu làm sao để một file lua của mình viết ra làm sao để kích hoạt nó ví dụ khi mở sever lên thì file lua này sẽ đc chạy đồng nghĩa với các code trong đó cũng chạy luôn =((

Bạn học trong Ebook, LUA đơn giản là bạn viết vào chính file .lua của NPC mà bạn cần đối thoại !

savatage91
21-01-13, 04:49 PM
cái đó mình biết nhưng hiện tại khi sever đang sài là sever nên để down dùng trên source . không có bất kỳ 1 npc nào trong script cả ... mà theo như bạn nói thì không nên copy script từ sv khác ... vậy mình muốn add npc và quái có lẽ phải viết lại 1 lua đúng không ?
và mình cũng có xem qua một số sv hiện tại thấy mọi người viết 1 script riêng mà không hiểu sao gs có thể load scipt của họ ??? mình đang thắc mắc không biết có phải còn code trong gs nữa không ?

thienthanden2
21-01-13, 07:28 PM
cái đó mình biết nhưng hiện tại khi sever đang sài là sever nên để down dùng trên source . không có bất kỳ 1 npc nào trong script cả ... mà theo như bạn nói thì không nên copy script từ sv khác ... vậy mình muốn add npc và quái có lẽ phải viết lại 1 lua đúng không ?
và mình cũng có xem qua một số sv hiện tại thấy mọi người viết 1 script riêng mà không hiểu sao gs có thể load scipt của họ ??? mình đang thắc mắc không biết có phải còn code trong gs nữa không ?

Bạn có thể dùng setting + map + script của sv nhokyeunhac cho newbie vẫn đc bình thường. Map ba lăng có 1 tảng đá, bạn có thể vào file lua của tảng đá đó để code thêm gì cũng đc. Còn khi học skill thì ko vào game đc thì phải sửa lại như sau:
Trong file \JX\swrod3\SwordOnline\Sources\Core\Src\KPlayerDBF uns.cpp tìm cái hàm này và sửa lại y như vầy (đoạn gần DBLOADPERTIME_SKILL) sau đó build lại core là vào đc.

int KPlayer::LoadPlayerFightSkillList(BYTE * pRoleBuffer, BYTE * &pFightBuffer, unsigned int& nParam)
{
KASSERT(pRoleBuffer);
int nSkillCount = 0;
char szSkillId[100];
char szSkillLevel[100];
nSkillCount = ((TRoleData*)(pRoleBuffer))->nFightSkillCount;

if (nSkillCount == 0)
return 1;

if (nParam >= nSkillCount )
return -1;

int nBegin = nParam;
//int nEnd = nBegin + DBLOADPERTIME_SKILL;
//if (nEnd > nSkillCount)
int nEnd = nSkillCount;
nParam = nEnd;
TDBSkillData * pSkillData = NULL;
if (nBegin == 0)
pSkillData = (TDBSkillData *)((BYTE*)pRoleBuffer + ((TRoleData*)pRoleBuffer)->dwFSkillOffset);
else
pSkillData = (TDBSkillData*)pFightBuffer;
for (int i = nBegin ; i < nEnd; i ++, pSkillData ++ )
{
int nSkillId = 0;
int nSkillLevel = 0;
nSkillId = pSkillData->m_nSkillId;
nSkillLevel = pSkillData->m_nSkillLevel;
Npc[m_nIndex].m_SkillList.Add(nSkillId, nSkillLevel);
}
pFightBuffer = (BYTE*) pSkillData;

if (nParam >= nSkillCount) return 1;
else
return 0;
}

savatage91
21-01-13, 07:46 PM
#include "KCore.h"

#ifdef _SERVER
#include "KEngine.h"
#include "KSubWorldSet.h"
#include "KSubWorld.h"
#include "KPlayer.h"
#ifndef _STANDALONE
#include "../../../lib/S3DBInterface.h"
#else
#include "S3DBInterface.h"
#endif
#include "KNpc.h"
#include "KItem.h"
#include "KItemList.h"
#include "KItemGenerator.h"
#include "KItemSet.h"
#include "KNpcSet.h"
#include "KPlayerSet.h"
#include "KItemChangeRes.h"
#include <time.h>
//#include "MyAssert.H"
#include "KTaskFuns.h"


// ÊÇ·ñ½«Êý¾Ý¿â´æÈ¡µµµÄÊý¾Ý± £´æÏÂÀ´ÒÔ¹©µ÷ÊÔ
//#define DEBUGOPT_DB_ROLEDATA_OUT




KList g_DBMsgList;

int KPlayer::AddDBPlayer(char * szPlayerName, int sex, DWORD * pdwID)
{
return FALSE;
}

int KPlayer::LoadDBPlayerInfo(BYTE *pPlayerInfo, int &nStep, unsigned int &nParam)
{
_ASSERT(pPlayerInfo);
int nRet = 0;
int nRetValue = 0;

switch(nStep)
{
case STEP_BASE_INFO:
//Êý¾Ý¿âÖÐÍæ¼Ò»ù±¾ÐÅÏ¢±í
m_pCurStatusOffset = pPlayerInfo;

if ((nRet = LoadPlayerBaseInfo(pPlayerInfo, m_pCurStatusOffset, nParam)) == 1)
{
nRetValue = SendSyncData(nStep, nParam);
nStep++;
nParam = 0;
}
else
{
if (nRet == -1)
{
nStep++;
nParam = 0;
return 0;
}
else
{
nRetValue = SendSyncData(nStep, nParam);
}
}
break;
case STEP_FIGHT_SKILL_LIST:
//************************************************
// Íæ¼ÒµÄÕ½¶·¼¼ÄÜÁбí
if ((nRet = LoadPlayerFightSkillList(pPlayerInfo, m_pCurStatusOffset, nParam)) == 1)
{
nRetValue = SendSyncData(nStep, nParam);
nStep++;
nParam = 0;
}
else
{
if (nRet == -1)
{
nStep++;
nParam = 0;
return 0;
}
// else
// {
// nRetValue = SendSyncData(nStep, nParam);
// }
}
break;
case STEP_LIFE_SKILL_LIST:
//*************************************************
// Íæ¼ÒµÄÉú»î¼¼ÄÜÁбí
if ((nRet = LoadPlayerLifeSkilllList(pPlayerInfo, m_pCurStatusOffset, nParam)) == 1)
{
nRetValue = SendSyncData(nStep, nParam);
nStep++;
nParam = 0;
}
else
{
if (nRet == -1)
{
nStep ++;
nParam = 0;
return 0;
}
else
{
nRetValue = SendSyncData(nStep, nParam);
}
}

break;

case STEP_TASK_LIST:
//*************************************************
// Íæ¼ÒµÄÈÎÎñÁбí
if ((nRet = LoadPlayerTaskList(pPlayerInfo, m_pCurStatusOffset, nParam)) == 1)
{

int i = 0;
for (i = 0; i < TASKVALUE_MAXWAYPOINT_COUNT; i ++)
{
int nWayPoint = m_cTask.nSave[TASKVALUE_SAVEWAYPOINT_BEGIN + i];
if (nWayPoint)
{
KIndexNode * pNewNode = new KIndexNode;
pNewNode->m_nIndex = nWayPoint;
m_PlayerWayPointList.AddTail(pNewNode);
}
}

for (i = 0; i < TASKVALUE_MAXSTATION_COUNT / 2; i ++)
{
DWORD Stations = 0;
if (Stations = (DWORD) m_cTask.GetSaveVal(TASKVALUE_SAVESTATION_BEGIN + i))
{
int nStation1 = (int) HIWORD(Stations);
int nStation2 = (int) LOWORD(Stations);

if (nStation1)
{
KIndexNode * pNewNode = new KIndexNode;
pNewNode->m_nIndex = nStation1;
m_PlayerStationList.AddTail(pNewNode);
}

if (nStation2)
{
KIndexNode * pNewNode = new KIndexNode;
pNewNode->m_nIndex = nStation2;
m_PlayerStationList.AddTail(pNewNode);
}
}
}
g_TimerTask.LoadTask(this);
nRetValue = SendSyncData(nStep, nParam);
nStep++;
nParam = 0;
}
else
{
if (nRet == -1)
{
nStep ++;
nParam = 0;
return 0;
}
else
{
nRetValue = SendSyncData(nStep, nParam);
}
}
break;
case STEP_ITEM_LIST:
//*************************************************
// Íæ¼ÒµÄ×°±¸Áбí
if ((nRet = LoadPlayerItemList(pPlayerInfo, m_pCurStatusOffset, nParam)) == 1)
{
nRetValue = SendSyncData(nStep, nParam);
nStep++;
nParam = 0;
}
else
{
if (nRet == -1)
{
nStep ++;
nParam = 0;
return 0;
}
else
{
nRetValue = SendSyncData(nStep, nParam);
}
}
break;
default:
nStep = STEP_SYNC_END;
break;
}
return nRetValue;
}

int KPlayer::UpdateDBPlayerInfo(BYTE* pPlayerInfo)
{
//×¢Ò⣬´æµµÈ¡µµ¶¼±ØÐë°´ÕÕP� �³Ðò
if (!pPlayerInfo)
return -1;

//Êý¾Ý¿âÖÐÍæ¼Ò»ù±¾ÐÅÏ¢±í
SavePlayerBaseInfo(pPlayerInfo);

// Íæ¼ÒµÄÕ½¶·¼¼ÄÜÁбí
SavePlayerFightSkillList(pPlayerInfo);

// Íæ¼ÒµÄÉú»î¼¼ÄÜÁбí
SavePlayerLifeSkilllList(pPlayerInfo);

// Íæ¼ÒµÄÈÎÎñÁбí
SavePlayerTaskList(pPlayerInfo);

// Íæ¼ÒµÄÎïÆ·Áбí
SavePlayerItemList(pPlayerInfo);

//Íæ¼ÒµÄºÃÓÑÁбí//
// SavePlayerFriendList(pPlayerInfo);

return 1;
}

int KPlayer::LoadPlayerBaseInfo(BYTE * pRoleBuffer, BYTE * &pCurData, unsigned int &nParam)
{
if (!pRoleBuffer)
{
KASSERT(pRoleBuffer);
return -1;
}

TRoleData * pRoleData = (TRoleData*)pRoleBuffer;

if (nParam != 0) return -1;

int nSex;
int nLevel;
#define PLAYER_MALE_NPCTEMPLATEID -1
#define PLAYER_FEMALE_NPCTEMPLATEID -2


nLevel = pRoleData->BaseInfo.ifightlevel;
nSex = pRoleData->BaseInfo.bSex;
if (nSex)
nSex = MAKELONG(nLevel, PLAYER_FEMALE_NPCTEMPLATEID);
else
nSex = MAKELONG(nLevel, PLAYER_MALE_NPCTEMPLATEID);

//µÇÈëµã
m_sLoginRevivalPos.m_nSubWorldID = pRoleData->BaseInfo.irevivalid;
m_sLoginRevivalPos.m_ReviveID = pRoleData->BaseInfo.irevivalx;
//---------------------------------------------------------------------------------------------
label_retry:
POINT Pos;
g_SubWorldSet.GetRevivalPosFromId(m_sLoginRevivalP os.m_nSubWorldID,
m_sLoginRevivalPos.m_ReviveID,
&Pos);

m_sLoginRevivalPos.m_nMpsX = Pos.x;
m_sLoginRevivalPos.m_nMpsY = Pos.y;
//---------------------------------------------------------------------------------------------
PLAYER_REVIVAL_POS tempPos;

if (pRoleData->BaseInfo.cUseRevive)
{
tempPos.m_nSubWorldID = m_sLoginRevivalPos.m_nSubWorldID;
tempPos.m_ReviveID = m_sLoginRevivalPos.m_ReviveID;
tempPos.m_nMpsX = m_sLoginRevivalPos.m_nMpsX;
tempPos.m_nMpsY = m_sLoginRevivalPos.m_nMpsY;
}
else
{
tempPos.m_nSubWorldID = pRoleData->BaseInfo.ientergameid;
tempPos.m_nMpsX = pRoleData->BaseInfo.ientergamex;
tempPos.m_nMpsY = pRoleData->BaseInfo.ientergamey;
}

m_nIndex = NpcSet.Add(nSex,
g_SubWorldSet.SearchWorld(tempPos.m_nSubWorldID),
tempPos.m_nMpsX,
tempPos.m_nMpsY);

if(m_nIndex <= 0)
{
g_DebugLog("[Error!]AddNpc Error DBFuns.cpp");
if (pRoleData->BaseInfo.cUseRevive)
{
return -1;
}
else
{
pRoleData->BaseInfo.cUseRevive = 1;
goto label_retry;
}
}

m_sDeathRevivalPos = m_sLoginRevivalPos;

KNpc* pNpc = &Npc[m_nIndex];
pNpc->m_Kind = kind_player;
pNpc->SetPlayerIdx(m_nPlayerIndex);
pNpc->m_Level = nLevel;

//Íæ¼ÒÐÅÏ¢
strcpy(pNpc->Name, pRoleData->BaseInfo.szName);
m_nForbiddenFlag = pRoleData->BaseInfo.nForbiddenFlag;

m_nAttributePoint = pRoleData->BaseInfo.ileftprop;
m_nSkillPoint = pRoleData->BaseInfo.ileftfight;

m_nStrength = pRoleData->BaseInfo.ipower;
m_nDexterity = pRoleData->BaseInfo.iagility;
m_nVitality = pRoleData->BaseInfo.iouter;
m_nEngergy = pRoleData->BaseInfo.iinside;
m_nLucky = pRoleData->BaseInfo.iluck;
m_cTong.Clear();
m_cTong.DBSetTongNameID(pRoleData->BaseInfo.dwTongID);

m_nCurStrength = m_nStrength;
m_nCurDexterity = m_nDexterity;
m_nCurVitality = m_nVitality;
m_nCurEngergy = m_nEngergy;
m_nCurLucky = m_nLucky;
this->SetFirstDamage();
this->SetBaseAttackRating();
this->SetBaseDefence();

//Íæ¼ÒµÈ¼¶ÐÅÏ¢
m_nExp = pRoleData->BaseInfo.fightexp;
m_nNextLevelExp = PlayerSet.m_cLevelAdd.GetLevelExp(pNpc->m_Level);
m_dwLeadLevel = pRoleData->BaseInfo.ileadlevel;
m_dwLeadExp = pRoleData->BaseInfo.ileadexp;

//ÃÅÅÉÐÅÏ¢
m_cFaction.m_nCurFaction = (char)pRoleData->BaseInfo.nSect;
m_cFaction.m_nFirstAddFaction = (char)pRoleData->BaseInfo.nFirstSect;
m_cFaction.m_nAddTimes = pRoleData->BaseInfo.ijoincount;
pNpc->m_btRankId = pRoleData->BaseInfo.isectrole;
m_nWorldStat = pRoleData->BaseInfo.nWorldStat;
m_nSectStat = pRoleData->BaseInfo.nSectStat;

//ÏÖ½ðºÍÖüÎïÏäÖеÄÇ®
int nCashMoney = 0;
int nSaveMoney = 0;
// this->m_ItemList.Init(GetPlayerIndex());
nCashMoney = pRoleData->BaseInfo.imoney;
nSaveMoney = pRoleData->BaseInfo.isavemoney;
m_ItemList.SetMoney(nCashMoney, nSaveMoney,0);

pNpc->m_Series = pRoleData->BaseInfo.ifiveprop;
pNpc->m_Camp = pRoleData->BaseInfo.iteam;

pNpc->m_nSex = pRoleData->BaseInfo.bSex;

pNpc->m_LifeMax = pRoleData->BaseInfo.imaxlife;
pNpc->m_StaminaMax = pRoleData->BaseInfo.imaxstamina;
pNpc->m_ManaMax = pRoleData->BaseInfo.imaxinner;

pNpc->m_LifeReplenish = PLAYER_LIFE_REPLENISH;
pNpc->m_ManaReplenish = PLAYER_MANA_REPLENISH;
pNpc->m_StaminaGain = PLAYER_STAMINA_GAIN;
pNpc->m_StaminaLoss = PLAYER_STAMINA_LOSS;

this->SetBaseResistData();
SetBaseSpeedAndRadius();
pNpc->RestoreNpcBaseInfo();

pNpc->m_CurrentLife = pRoleData->BaseInfo.icurlife;
pNpc->m_CurrentMana = pRoleData->BaseInfo.icurinner;
pNpc->m_CurrentStamina = pRoleData->BaseInfo.icurstamina;

// PKÐÅÏ¢
m_cPK.SetNormalPKState(pRoleData->BaseInfo.cPkStatus);
m_cPK.SetPKValue(pRoleData->BaseInfo.ipkvalue);

// ³õʼ»¯²¿·ÖÊý¾Ý£¨ÕâЩÊý¾ÝÊ ý¾Ý¿â²»´æ´¢£©
m_BuyInfo.Clear();
m_cMenuState.Release();
m_cChat.Release();
m_cTeam.Release();
m_cTeam.SetCanTeamFlag(m_nPlayerIndex, TRUE);
m_nPeapleIdx = 0;
m_nObjectIdx = 0;
memset(m_szTaskAnswerFun, 0, sizeof(m_szTaskAnswerFun));
m_nAvailableAnswerNum = 0;
Npc[m_nIndex].m_ActionScriptID = 0;
Npc[m_nIndex].m_TrapScriptID = 0;
m_nViewEquipTime = 0;

pNpc->m_Experience = 0;
// memset(pNpc->m_szChatBuffer, 0, sizeof(pNpc->m_szChatBuffer));
// pNpc->m_nCurChatTime = 0;

pNpc->m_WeaponType = g_ItemChangeRes.GetWeaponRes(0, 0, 0);
pNpc->m_ArmorType = g_ItemChangeRes.GetArmorRes(0, 0);
pNpc->m_HelmType = g_ItemChangeRes.GetHelmRes(0, 0);
pNpc->m_HorseType = g_ItemChangeRes.GetHorseRes(0, 0);
pNpc->m_bRideHorse = FALSE;
nParam = 1;
pCurData = (BYTE *)&pRoleData->pBuffer;
// µÇÈëÓÎϷʱս¶·Ä£Ê½
pNpc->m_FightMode = pRoleData->BaseInfo.cFightMode;
// ÊÇ·ñÊÇ´¦ÓÚ¿ç·þÎñÆ÷״̬
if (pRoleData->BaseInfo.cIsExchange)
{
}
return 1;
}

int KPlayer::LoadPlayerItemList(BYTE * pRoleBuffer , BYTE* &pItemBuffer, unsigned int &nParam)
{
KASSERT(pRoleBuffer);

int nItemCount = ((TRoleData *)pRoleBuffer)->nItemCount;
TDBItemData * pItemData = (TDBItemData *)pItemBuffer;

if (nItemCount == 0) return 1;
if (nParam != 0)
// m_ItemList.Init(m_nPlayerIndex);
// else
{
//Èç¹ûÒªÇó»ñµÃµÄÎïÆ·ºÅ´óÓÚÊ µ¼ÊµÄÎïÆ·ÊýÁ¿£¬ÔòÍ˳ö
if (nParam >= nItemCount )
return -1;
}

char szSection[100];
char szSubSection[100];
char szKey[100];
int nItemClass;
int nItemBaseInfoCount ;
int nItemEfficInfoCount;
int nItemRequireInfoCount;
int dwItemID = 0;
int nDetailType = 0;
int nParticularType = 0;
int nSeries = 0;
int nLevel = 0;
int nLocal = 0;
int nItemX = 0;
int nItemY = 0;
int nLucky = 0;
int nBegin = nParam;
int nEnd = nParam + DBLOADPERTIME_ITEM;

if ( nEnd > nItemCount)
nEnd = nItemCount;

nParam = nEnd;

for (int i = nBegin ; i < nEnd; i ++)
{

KItem NewItem;
ZeroMemory(&NewItem, sizeof(KItem));

//Îï¼þ»ù±¾ÐÅÏ¢************************** ************************************
nItemClass = pItemData->iequipclasscode;
NewItem.m_CommonAttrib.nDetailType = pItemData->idetailtype;
NewItem.m_CommonAttrib.nParticularType = pItemData->iparticulartype;
NewItem.m_CommonAttrib.nLevel = pItemData->ilevel;
NewItem.m_CommonAttrib.nSeries = pItemData->iseries;
nItemX = pItemData->ix;
nItemY = pItemData->iy;
nLocal = pItemData->ilocal;

//Ôö¼ÓÎï¼þÖÁÊÀ½çµÄItemSetÖÐ,ÒÔ¼ °Ôö¼Óµ½Íæ¼ÒÎïÆ·ÁбíÖÐ******** ************************************************** ****
//NewItem.SetID(dwItemID);
NewItem.m_GeneratorParam.nGeneratorLevel[0] = pItemData->iparam1;
NewItem.m_GeneratorParam.nGeneratorLevel[1] = pItemData->iparam2;
NewItem.m_GeneratorParam.nGeneratorLevel[2] = pItemData->iparam3;
NewItem.m_GeneratorParam.nGeneratorLevel[3] = pItemData->iparam4;
NewItem.m_GeneratorParam.nGeneratorLevel[4] = pItemData->iparam5;
NewItem.m_GeneratorParam.nGeneratorLevel[5] = pItemData->iparam6;

NewItem.m_GeneratorParam.nVersion = pItemData->iequipversion;
NewItem.m_GeneratorParam.uRandomSeed = pItemData->irandseed;
NewItem.m_GeneratorParam.nLuck = pItemData->ilucky;

BOOL bGetEquiptResult = 0;

//¸ù¾Ý²»Í¬µÄÎï¼þÀàÐͼÓÔØ
//²»Í¬µÄÏà¹Ø×ÊÔ´ÐÅÏ¢
switch(nItemClass)
{
case item_equip : // ×°±¸
bGetEquiptResult = ItemGen.Gen_ExistEquipment(
NewItem.m_CommonAttrib.nDetailType,
NewItem.m_CommonAttrib.nParticularType,
NewItem.m_CommonAttrib.nSeries,
NewItem.m_CommonAttrib.nLevel,
NewItem.m_GeneratorParam.nGeneratorLevel,
NewItem.m_GeneratorParam.nLuck,
NewItem.m_GeneratorParam.nVersion,
&NewItem);
break;
case item_medicine: // Ò©Æ·
bGetEquiptResult = ItemGen.Gen_Medicine(
NewItem.m_CommonAttrib.nDetailType,
NewItem.m_CommonAttrib.nLevel,
NewItem.m_GeneratorParam.nVersion,
&NewItem);
break;

case item_mine: // ¿óʯ
{

}
break;
case item_materials: // Ò©²Ä
{

}
break;
case item_task: // ÈÎÎñ
{
bGetEquiptResult = ItemGen.Gen_Quest(NewItem.m_CommonAttrib.nDetailTy pe, &NewItem);
}
break;
case item_townportal:
{
bGetEquiptResult = ItemGen.Gen_TownPortal(&NewItem);
}
break;
}

// °ÑÉú³ÉµÄ×°±¸µÄÄ;öȵ÷ÕûÎ ªÊý¾Ý¿âÖд洢µÄ¡£
if (pItemData->idurability != 0)
NewItem.SetDurability(pItemData->idurability);

pItemData ++;

int nIndex = ItemSet.Add(&NewItem);

if (nIndex <= 0)
{
KASSERT(0);
continue ;
}
m_ItemList.Add(nIndex, nLocal, nItemX, nItemY);

}

pItemBuffer = (BYTE *)pItemData;

if (nParam >= nItemCount)
return 1;
else
return 0;
}


int KPlayer::LoadPlayerFightSkillList(BYTE * pRoleBuffer, BYTE * &pFightBuffer, unsigned int& nParam)
{
KASSERT(pRoleBuffer);
int nSkillCount = 0;
char szSkillId[100];
char szSkillLevel[100];
nSkillCount = ((TRoleData*)(pRoleBuffer))->nFightSkillCount;

if (nSkillCount == 0)
return 1;

if (nParam >= nSkillCount )
return -1;

int nBegin = nParam;
int nEnd = nBegin + DBLOADPERTIME_SKILL;
if (nEnd > nSkillCount) nEnd = nSkillCount;
nParam = nEnd;
TDBSkillData * pSkillData = NULL;
if (nBegin == 0)
pSkillData = (TDBSkillData *)((BYTE*)pRoleBuffer + ((TRoleData*)pRoleBuffer)->dwFSkillOffset);
else
pSkillData = (TDBSkillData*)pFightBuffer;
for (int i = nBegin ; i < nEnd; i ++, pSkillData ++ )
{
int nSkillId = 0;
int nSkillLevel = 0;
nSkillId = pSkillData->m_nSkillId;
nSkillLevel = pSkillData->m_nSkillLevel;
Npc[m_nIndex].m_SkillList.Add(nSkillId, nSkillLevel);
}
pFightBuffer = (BYTE*) pSkillData;

if (nParam >= nSkillCount) return 1;
else
return 0;
}

int KPlayer::LoadPlayerLifeSkilllList(BYTE * pRoleBuffer, BYTE * &pFriendBuffer, unsigned int& nParam)
{
KASSERT(pRoleBuffer);
int nSkillCount = 0;
char szSkillId[100];
char szSkillLevel[100];
nSkillCount = ((TRoleData*)(pRoleBuffer))->nLiveSkillCount;

if (nSkillCount == 0)
return 1;

if (nParam >= nSkillCount ) return -1;
int nBegin = nParam;
int nEnd = nBegin + DBLOADPERTIME_SKILL;
if (nEnd > nSkillCount) nEnd = nSkillCount;
nParam = nEnd;

TDBSkillData * pSkillData = (TDBSkillData*)pFriendBuffer;
for (int i = nBegin ; i < nEnd; i ++, pSkillData ++ )
{
int nSkillId = 0;
int nSkillLevel = 0;
nSkillId = pSkillData->m_nSkillId;
nSkillLevel = pSkillData->m_nSkillLevel;
Npc[m_nIndex].m_SkillList.Add(nSkillId, nSkillLevel);
}
pFriendBuffer = (BYTE*) pSkillData;

if (nParam >= nSkillCount) return 1;
else
return 0;

}

int KPlayer::LoadPlayerFriendList(BYTE * pRoleBuffer, BYTE * &pFriendBuffer, unsigned int &nParam)
{
KASSERT(pRoleBuffer);

if (nParam == 1)
return 0;
if (nParam == 2)
return 1;

int nFriendCount;
DWORD dwID;
char szBuffer[32], szName[32];
nFriendCount = ((TRoleData*)pRoleBuffer)->nFriendCount;
if (nFriendCount == 0)
{
nParam = 2;
return 1;
}
char * pCurFriend = (char *)pFriendBuffer;
for (int i = 0; i < nFriendCount; i++)
{

strcpy(szName, (char *)pFriendBuffer);
if (!szName[0])
continue;
dwID = g_FileName2Id(szName);
m_cChat.DataBaseAddOne(this->m_nPlayerIndex, dwID, szName);
pFriendBuffer += (strlen(szName) + 1);
}
this->m_cChat.StartSendFriendData();

nParam = 1;
return 0;
}

int KPlayer::LoadPlayerTaskList(BYTE * pRoleBuffer, BYTE * &pTaskBuffer, unsigned int& nParam)
{
KASSERT(pRoleBuffer);
while(m_PlayerStationList.GetHead())
{
KIndexNode * pNode = (KIndexNode * ) m_PlayerStationList.GetHead();
m_PlayerStationList.RemoveHead();
delete pNode;
}
while(m_PlayerWayPointList.GetHead())
{
KIndexNode * pNode = (KIndexNode * ) m_PlayerWayPointList.GetHead();
m_PlayerWayPointList.RemoveHead();
delete pNode;
}

if(nParam == 0) m_cTask.Release();

int nTaskCount = 0;
int nTaskId = 0;
int nTaskDegee = 0;
char szTaskIDKey[100];
char szTaskValueKey[100];
nTaskCount = ((TRoleData* )pRoleBuffer)->nTaskCount;

if (nTaskCount == 0) return 1;
if (nParam >= nTaskCount ) return -1;
int nBegin = nParam;
int nEnd = nBegin + DBLOADPERTIME_TASK;
if (nEnd > nTaskCount) nEnd = nTaskCount;
nParam = nEnd;
TDBTaskData * pTaskData = (TDBTaskData*) pTaskBuffer;
for (int i = nBegin; i < nEnd; i ++ , pTaskData ++)
{
nTaskId = pTaskData->m_nTaskId;
nTaskDegee = pTaskData->m_nTaskValue;
if (nTaskId >= MAX_TASK)
{
KASSERT(0);
continue;//ÈÎÎñID³¬¹ýÉÏÏÞÁË£¡
}
m_cTask.SetSaveVal(nTaskId, nTaskDegee);
}
pTaskBuffer = (BYTE*) pTaskData;
if (nParam >= nTaskCount) return 1;
else
return 0;
}

int KPlayer::SavePlayerBaseInfo(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);
if (m_nIndex <= 0) return -1;

KNpc * pNpc = &Npc[m_nIndex];
TRoleData * pRoleData = (TRoleData*)pRoleBuffer;
//Íæ¼ÒÐÅÏ¢
memset(pRoleData, 0, sizeof(TRoleData));
pRoleData->bBaseNeedUpdate = 1;
strcpy(pRoleData->BaseInfo.szName, m_PlayerName);
if (m_AccoutName[0])
strcpy(pRoleData->BaseInfo.caccname, m_AccoutName);
pRoleData->BaseInfo.nForbiddenFlag = m_nForbiddenFlag;
pRoleData->BaseInfo.ileftprop = m_nAttributePoint;
pRoleData->BaseInfo.ileftfight = m_nSkillPoint;
pRoleData->BaseInfo.ipower = m_nStrength;
pRoleData->BaseInfo.iagility = m_nDexterity;
pRoleData->BaseInfo.iouter = m_nVitality;
pRoleData->BaseInfo.iinside = m_nEngergy;
pRoleData->BaseInfo.iluck = m_nLucky;
pRoleData->BaseInfo.dwTongID = m_cTong.GetTongNameID();

//Íæ¼ÒµÄÏÔʾÐÅÏ¢ -- remark by spe because client ui display changed 2003/07/21
// pRoleData->BaseInfo.ihelmres = pNpc->m_HelmType;
// pRoleData->BaseInfo.iarmorres = pNpc->m_ArmorType;
// pRoleData->BaseInfo.iweaponres = pNpc->m_WeaponType;

//Íæ¼ÒµÈ¼¶ÐÅÏ¢
pRoleData->BaseInfo.fightexp = m_nExp;
pRoleData->BaseInfo.ifightlevel = pNpc->m_Level;

pRoleData->BaseInfo.ileadlevel = m_dwLeadLevel;
pRoleData->BaseInfo.ileadexp = m_dwLeadExp;

//ÃÅÅÉÐÅÏ¢
pRoleData->BaseInfo.nSect = m_cFaction.m_nCurFaction;
pRoleData->BaseInfo.nFirstSect = m_cFaction.m_nFirstAddFaction;
pRoleData->BaseInfo.ijoincount = m_cFaction.m_nAddTimes;
pRoleData->BaseInfo.isectrole = pNpc->m_btRankId;
pRoleData->BaseInfo.nWorldStat = m_nWorldStat;
pRoleData->BaseInfo.nSectStat = m_nSectStat;

//ÏÖ½ðºÍÖüÎïÏäÖеÄÇ®
int nCashMoney = 0;
int nSaveMoney = 0;

nCashMoney = m_ItemList.GetMoney(room_equipment);
nSaveMoney = m_ItemList.GetMoney(room_repository);
pRoleData->BaseInfo.imoney = nCashMoney;
pRoleData->BaseInfo.isavemoney = nSaveMoney;
pRoleData->BaseInfo.ifiveprop = pNpc->m_Series;
pRoleData->BaseInfo.iteam = pNpc->m_Camp;
pRoleData->BaseInfo.bSex = pNpc->m_nSex;
pRoleData->BaseInfo.imaxlife = pNpc->m_LifeMax;
pRoleData->BaseInfo.imaxstamina = pNpc->m_StaminaMax;
pRoleData->BaseInfo.imaxinner = pNpc->m_ManaMax;
pRoleData->BaseInfo.icurlife = pNpc->m_CurrentLife;
pRoleData->BaseInfo.icurinner = pNpc->m_CurrentMana;
pRoleData->BaseInfo.icurstamina = pNpc->m_CurrentStamina;

//µÇÈëµã
pRoleData->BaseInfo.irevivalid = m_sLoginRevivalPos.m_nSubWorldID;
pRoleData->BaseInfo.irevivalx = m_sLoginRevivalPos.m_ReviveID;
pRoleData->BaseInfo.irevivaly = 0;

if (m_bExchangeServer) // ×¼±¸¿ç·þÎñÆ÷£º°Ñ´æÅ̵ãÉèÎ ªÄ¿±êµã
{
pRoleData->BaseInfo.cUseRevive = 0;
pRoleData->BaseInfo.ientergameid = m_sExchangePos.m_dwMapID;
pRoleData->BaseInfo.ientergamex = m_sExchangePos.m_nX;
pRoleData->BaseInfo.ientergamey = m_sExchangePos.m_nY;
pRoleData->BaseInfo.cFightMode = (BYTE)pNpc->m_FightMode;
}
else if (pNpc->m_SubWorldIndex >= 0 && pNpc->m_RegionIndex >= 0 && pNpc->m_Doing != do_death && pNpc->m_Doing != do_revive)
{
pRoleData->BaseInfo.cUseRevive = m_bUseReviveIdWhenLogin;
pRoleData->BaseInfo.ientergameid = SubWorld[pNpc->m_SubWorldIndex].m_SubWorldID;
pNpc->GetMpsPos(&pRoleData->BaseInfo.ientergamex, &pRoleData->BaseInfo.ientergamey);
pRoleData->BaseInfo.cFightMode = (BYTE)pNpc->m_FightMode;
}
else
{
pRoleData->BaseInfo.cUseRevive = 1;
pRoleData->BaseInfo.cFightMode = 0;
if (pNpc->m_Doing == do_death || pNpc->m_Doing == do_revive)
{
pRoleData->BaseInfo.icurlife = pNpc->m_LifeMax;
pRoleData->BaseInfo.icurinner = pNpc->m_ManaMax;
pRoleData->BaseInfo.icurstamina = pNpc->m_StaminaMax;
}
}

//PKÏà¹Ø
pRoleData->BaseInfo.cPkStatus = (BYTE)m_cPK.GetNormalPKState();
pRoleData->BaseInfo.ipkvalue = m_cPK.GetPKValue();
pRoleData->dwFSkillOffset = (BYTE * )pRoleData->pBuffer - (BYTE *)pRoleBuffer;
return 1;

}

int KPlayer::SavePlayerItemList(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);

TRoleData * pRoleData = (TRoleData*) pRoleBuffer;

TDBItemData * pItemData = (TDBItemData*) ((BYTE*)pRoleData + pRoleData->dwItemOffset);

int nItemCount = 0;
char szSection[100];
char szKey[100];

int nIdx = 0;
while(1)
{
nIdx = m_ItemList.m_UseIdx.GetNext(nIdx);
if (nIdx == 0 )
break;
int nItemIndex = m_ItemList.m_Items[nIdx].nIdx;

sprintf(szSection, "%s%d", SECTION_ITEM, nItemCount + 1);
//Íæ¼Ò»ù±¾ÐÅÏ¢************************** ***************************************8
pItemData->iequipclasscode = Item[nItemIndex].m_CommonAttrib.nItemGenre;
pItemData->iequipcode = Item[nItemIndex].GetID();
pItemData->idetailtype = Item[nItemIndex].m_CommonAttrib.nDetailType;
pItemData->iparticulartype = Item[nItemIndex].m_CommonAttrib.nParticularType;
pItemData->ilevel = Item[nItemIndex].m_CommonAttrib.nLevel;
pItemData->iseries = Item[nItemIndex].m_CommonAttrib.nSeries;
pItemData->ilocal = m_ItemList.m_Items[nIdx].nPlace;
pItemData->ix = m_ItemList.m_Items[nIdx].nX;
pItemData->iy = m_ItemList.m_Items[nIdx].nY;
pItemData->iequipversion = Item[nItemIndex].GetItemParam()->nVersion;
pItemData->irandseed = Item[nItemIndex].GetItemParam()->uRandomSeed;
pItemData->iparam1 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[0];
pItemData->iparam2 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[1];
pItemData->iparam3 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[2];
pItemData->iparam4 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[3];
pItemData->iparam5 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[4];
pItemData->iparam6 = Item[nItemIndex].GetItemParam()->nGeneratorLevel[5];
pItemData->ilucky = Item[nItemIndex].GetItemParam()->nLuck;
pItemData->idurability = Item[nItemIndex].GetDurability();
pItemData->iidentify = 0;
//************************************************** ***************************8

pItemData++;
nItemCount ++;
}

pRoleData->nItemCount = nItemCount;

pRoleData->dwFriendOffset = (BYTE *)pItemData - (BYTE * )pRoleData;
pRoleData->dwDataLen = (BYTE*)pItemData - (BYTE*)pRoleBuffer;
return 1;
}

int KPlayer::SavePlayerFightSkillList(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);
if (m_nIndex <= 0)
return FALSE;
TRoleData * pRoleData = (TRoleData *)pRoleBuffer;
TDBSkillData * pSkillData = (TDBSkillData *) (pRoleBuffer + pRoleData->dwFSkillOffset);
int nCount = Npc[m_nIndex].m_SkillList.UpdateDBSkillList((BYTE *)pSkillData);
if (nCount > 0)
{
pRoleData->nFightSkillCount = nCount;
pRoleData->dwLSkillOffset = (BYTE*)pSkillData - pRoleBuffer + sizeof(TDBSkillData) * nCount;
}
else
{
pRoleData->nFightSkillCount = 0;
pRoleData->dwLSkillOffset = (BYTE*)pSkillData - pRoleBuffer;
}
return 1;
}

int KPlayer::SavePlayerLifeSkilllList(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);
TRoleData * pRoleData = (TRoleData *)pRoleBuffer;
TDBSkillData * pSkillData = (TDBSkillData *) (pRoleBuffer + pRoleData->dwLSkillOffset);
pRoleData->dwTaskOffset = (BYTE*)pSkillData - pRoleBuffer;
return 1;
}

int KPlayer::SavePlayerFriendList(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);

int nFriendNo;
char szBuffer[32];
CChatFriend *pFriend;
TRoleData * pRoleData = (TRoleData *)pRoleBuffer;

nFriendNo = m_cChat.m_cFriendTeam[0].m_nFriendNo;
char * pCurFriend = (char *)((BYTE *)pRoleData + pRoleData->dwFriendOffset);
int nTotalFriendNo = 0;
pFriend = (CChatFriend*)m_cChat.m_cFriendTeam[0].m_cEveryOne.GetHead();
while (pFriend)
{
nTotalFriendNo++;
strcpy(pCurFriend, pFriend->m_szName);
pCurFriend += strlen(pFriend->m_szName) + 1;
pFriend = (CChatFriend*)pFriend->GetNext();
}
pRoleData->nFriendCount = nTotalFriendNo;
_ASSERT(nTotalFriendNo == nFriendNo);
pRoleData->dwDataLen = (BYTE*)pCurFriend - (BYTE*)pRoleBuffer;
return 1;
}


int KPlayer::SavePlayerTaskList(BYTE * pRoleBuffer)
{
_ASSERT(pRoleBuffer);
TRoleData * pRoleData = (TRoleData *) pRoleBuffer;
int nTaskCount = 0;
int nTaskId = 0;
int nTaskDegee = 0;
char szTaskIDKey[100];
char szTaskValueKey[100];

KIndexNode * pNode = (KIndexNode*)m_PlayerStationList.GetHead();
int n = 0;
memset(&m_cTask.nSave[TASKVALUE_SAVESTATION_BEGIN], 0, (TASKVALUE_MAXSTATION_COUNT / 2) * sizeof(int));
memset(&m_cTask.nSave[TASKVALUE_SAVEWAYPOINT_BEGIN], 0, TASKVALUE_MAXWAYPOINT_COUNT * sizeof(int));

while(pNode)
{
if (n >= TASKVALUE_MAXSTATION_COUNT) break;
DWORD dwValue = m_cTask.nSave[TASKVALUE_SAVESTATION_BEGIN + n / 2];
DWORD OrValue = pNode->m_nIndex ;
OrValue = OrValue << ((n % 2) * 16);
dwValue = dwValue | OrValue;
m_cTask.nSave[TASKVALUE_SAVESTATION_BEGIN + n / 2] = dwValue;
n++;
pNode = (KIndexNode*)pNode->GetNext();
}

n = 0;
pNode = (KIndexNode*) m_PlayerWayPointList.GetHead();
while(pNode)
{
if (n >= TASKVALUE_MAXWAYPOINT_COUNT) break;
if (pNode->m_nIndex == 0) continue;
m_cTask.nSave[TASKVALUE_SAVEWAYPOINT_BEGIN + n] = pNode->m_nIndex;
n++;
pNode = (KIndexNode*)pNode->GetNext();
}


g_TimerTask.SaveTask(this);


TDBTaskData * pTaskData = (TDBTaskData *)(pRoleBuffer + pRoleData->dwTaskOffset);
for (int i = 0; i < MAX_TASK; i ++)
{
if (!m_cTask.nSave[i]) continue;

pTaskData->m_nTaskId = i;
pTaskData->m_nTaskValue = m_cTask.GetSaveVal(i);
nTaskCount ++;
pTaskData ++;
}

pRoleData->nTaskCount = nTaskCount;
pRoleData->dwItemOffset = (BYTE *)pTaskData - pRoleBuffer;
return 1;
}
#endif


em thấy code bác share với đây là code trong file của em không khác nhau vậy có cần phải sửa lại nó không bác ?

thienthanden2
21-01-13, 07:55 PM
Coi kỹ lại coi, chưa sửa mà giống sao đc bạn? đọc lại bài trên của mình có nói rõ cần sửa đoạn nào lun đó. (sửa có 3 dòng)