KNpcTemplate.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:15k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KNpcTemplate.h"
  3. #define MAX_VALUE_LEN 300
  4. #ifdef _SERVER
  5. KItemDropRateTree g_ItemDropRateBinTree;
  6. static KItemDropRate * g_GenItemDropRate(char * szDropIniFile)
  7. {
  8. if ((!szDropIniFile)|| (!szDropIniFile[0]))
  9. return NULL;
  10. KIniFile IniFile;
  11. if (IniFile.Load(szDropIniFile))
  12. {
  13. KItemDropRate * pnewDrop = new KItemDropRate;
  14. IniFile.GetInteger("Main", "Count", 0, &pnewDrop->nCount);
  15. IniFile.GetInteger("Main", "RandRange", 0, &pnewDrop->nMaxRandRate);
  16. IniFile.GetInteger("Main", "MagicRate", 0, &pnewDrop->nMagicRate);
  17. IniFile.GetInteger("Main", "MoneyRate", 20, &pnewDrop->nMoneyRate);
  18. IniFile.GetInteger("Main", "MoneyScale", 50, &pnewDrop->nMoneyScale);
  19. IniFile.GetInteger("Main", "MinItemLevelScale", 20, &pnewDrop->nMinItemLevelScale);
  20. IniFile.GetInteger("Main", "MaxItemLevelScale", 10, &pnewDrop->nMaxItemLevelScale);
  21. IniFile.GetInteger("Main", "MaxItemLevel", 10, &pnewDrop->nMaxItemLevel);
  22. IniFile.GetInteger("Main", "MinItemLevel", 1, &pnewDrop->nMinItemLevel);
  23. if(pnewDrop->nCount <= 0)
  24. {
  25. delete pnewDrop;
  26. return NULL;
  27. }
  28. pnewDrop->pItemParam = new KItemDropRate::KItemParam[pnewDrop->nCount];
  29. char szSection[10];
  30. KItemDropRate::KItemParam * pItemParam = pnewDrop->pItemParam;
  31. for(int i = 0; i < pnewDrop->nCount; i ++, pItemParam ++)
  32. {
  33. sprintf(szSection, "%d", i + 1);
  34. IniFile.GetInteger(szSection, "Genre", 0, &(pItemParam->nGenre));
  35. IniFile.GetInteger(szSection, "Detail", 0, &(pItemParam->nDetailType));
  36. IniFile.GetInteger(szSection, "Particular", 0, &(pItemParam->nParticulType));
  37. IniFile.GetInteger(szSection, "RandRate", 0, &(pItemParam->nRate));
  38. }
  39. return pnewDrop;
  40. }
  41. else
  42. {
  43. printf("无法找到%sn", szDropIniFile);
  44. return NULL;
  45. }
  46. return NULL;
  47. }
  48. int operator<(KItemDropRateNode Left, KItemDropRateNode Right)
  49. {
  50. return strcmp(Left.m_szFileName, Right.m_szFileName);
  51. };
  52. int operator==(KItemDropRateNode Left, KItemDropRateNode Right)
  53. {
  54. return (strcmp(Left.m_szFileName, Right.m_szFileName) == 0);
  55. };
  56. #endif
  57. void KNpcTemplate::InitNpcBaseData(int nNpcTemplateId)
  58. {
  59. if (nNpcTemplateId < 0 ) return;
  60. int nNpcTempRow = nNpcTemplateId + 2;
  61. g_NpcSetting.GetString(nNpcTempRow, "Name", "", Name, sizeof(Name));
  62. g_NpcSetting.GetInteger(nNpcTempRow, "Kind", 0, (int *)&m_Kind);
  63. g_NpcSetting.GetInteger(nNpcTempRow, "Camp", 0, &m_Camp);
  64. g_NpcSetting.GetInteger(nNpcTempRow, "Series", 0, &m_Series);
  65. g_NpcSetting.GetInteger(nNpcTempRow, "HeadImage", 0, &m_HeadImage);
  66. g_NpcSetting.GetInteger(nNpcTempRow, "ClientOnly", 0, &m_bClientOnly);
  67. g_NpcSetting.GetInteger(nNpcTempRow, "CorpseIdx", 0, &m_CorpseSettingIdx);
  68. g_NpcSetting.GetInteger(nNpcTempRow, "DeathFrame", 12, &m_DeathFrame);
  69. g_NpcSetting.GetInteger(nNpcTempRow, "WalkFrame", 15, &m_WalkFrame);
  70. g_NpcSetting.GetInteger(nNpcTempRow, "RunFrame", 15, &m_RunFrame);
  71. g_NpcSetting.GetInteger(nNpcTempRow, "HurtFrame", 10, &m_HurtFrame);
  72. g_NpcSetting.GetInteger(nNpcTempRow, "WalkSpeed", 5, &m_WalkSpeed);
  73. g_NpcSetting.GetInteger(nNpcTempRow, "AttackSpeed", 20, &m_AttackFrame);
  74. g_NpcSetting.GetInteger(nNpcTempRow, "CastSpeed", 20, &m_CastFrame);
  75. g_NpcSetting.GetInteger(nNpcTempRow, "RunSpeed", 10, &m_RunSpeed);
  76. g_NpcSetting.GetInteger(nNpcTempRow, "StandFrame", 15, &m_StandFrame);
  77. g_NpcSetting.GetInteger(nNpcTempRow, "StandFrame1", 15, &m_StandFrame1);
  78. g_NpcSetting.GetInteger(nNpcTempRow, "Stature", 0,  &m_nStature);
  79. #ifdef _SERVER
  80. g_NpcSetting.GetInteger(nNpcTempRow, "Treasure", 0, &m_Treasure);
  81. g_NpcSetting.GetInteger(nNpcTempRow, "AIMode", 0, &m_AiMode);
  82. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam1", 0, &m_AiParam[0]);
  83. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam2", 0, &m_AiParam[1]);
  84. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam3", 0, &m_AiParam[2]);
  85. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam4", 0, &m_AiParam[3]);
  86. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam5", 0, &m_AiParam[4]);
  87. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam6", 0, &m_AiParam[5]);
  88. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam7", 0, &m_AiParam[6]);
  89. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam8", 0, &m_AiParam[7]);
  90. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam9", 0, &m_AiParam[8]);
  91. g_NpcSetting.GetInteger(nNpcTempRow, "AIParam10", 5, &m_AiParam[9]);
  92. g_NpcSetting.GetInteger(nNpcTempRow, "FireResistMax", 0, &m_FireResistMax);
  93. g_NpcSetting.GetInteger(nNpcTempRow, "ColdResistMax", 0, &m_ColdResistMax);
  94. g_NpcSetting.GetInteger(nNpcTempRow, "LightResistMax", 0, &m_LightResistMax);
  95. g_NpcSetting.GetInteger(nNpcTempRow, "PoisonResistMax", 0, &m_PoisonResistMax);
  96. g_NpcSetting.GetInteger(nNpcTempRow, "PhysicsResistMax", 0, &m_PhysicsResistMax);
  97. g_NpcSetting.GetInteger(nNpcTempRow, "ActiveRadius", 30, &m_ActiveRadius);
  98. g_NpcSetting.GetInteger(nNpcTempRow, "VisionRadius", 40, &m_VisionRadius);
  99. char szDropFile[200];
  100. g_NpcSetting.GetString(nNpcTempRow, "DropRateFile", "", szDropFile, sizeof(szDropFile));
  101. strlwr(szDropFile);
  102. strcpy(m_szDropRateFile, szDropFile);
  103. KItemDropRateNode DropNode;
  104. strcpy(DropNode.m_szFileName, szDropFile);
  105. if (g_ItemDropRateBinTree.Find(DropNode))
  106. {
  107. m_pItemDropRate = DropNode.m_pItemDropRate;
  108. }
  109. else
  110. {
  111. KItemDropRateNode newDropNode;
  112. strcpy(newDropNode.m_szFileName,szDropFile);
  113. newDropNode.m_pItemDropRate = g_GenItemDropRate(szDropFile);
  114. g_ItemDropRateBinTree.Insert(newDropNode);
  115. m_pItemDropRate = newDropNode.m_pItemDropRate;
  116. }
  117. int nAIMaxTime = 0;
  118. g_NpcSetting.GetInteger(nNpcTempRow, "AIMaxTime", 25, (int*)&nAIMaxTime);
  119. m_AIMAXTime = (BYTE)nAIMaxTime;
  120. g_NpcSetting.GetInteger(nNpcTempRow, "HitRecover", 0, &m_HitRecover);
  121. g_NpcSetting.GetInteger(nNpcTempRow, "ReviveFrame", 2400, &m_ReviveFrame);
  122. char szLevelScript[MAX_PATH];
  123. g_NpcSetting.GetString(nNpcTempRow, "LevelScript", "", szLevelScript, MAX_PATH);
  124. if (!szLevelScript[0])
  125. m_dwLevelSettingScript = 0;
  126. else
  127. {
  128. #ifdef WIN32
  129. _strlwr(szLevelScript);
  130. #else
  131. for (int nl = 0; szLevelScript[nl]; nl++)
  132. if (szLevelScript[nl] >= 'A' && szLevelScript[nl] <= 'Z')
  133. szLevelScript[nl] += 'a' - 'A';
  134. #endif
  135. m_dwLevelSettingScript = g_FileName2Id(szLevelScript);
  136. }
  137. #else
  138. g_NpcSetting.GetInteger(nNpcTempRow, "ArmorType", 0, &m_ArmorType);
  139. g_NpcSetting.GetInteger(nNpcTempRow, "HelmType", 0, &m_HelmType);
  140. g_NpcSetting.GetInteger(nNpcTempRow, "WeaponType", 0, &m_WeaponType);
  141. g_NpcSetting.GetInteger(nNpcTempRow, "HorseType", -1, &m_HorseType);
  142. g_NpcSetting.GetInteger(nNpcTempRow, "RideHorse",0, &m_bRideHorse);
  143. g_NpcSetting.GetString(nNpcTempRow, "ActionScript", "", ActionScript,sizeof(ActionScript));
  144. g_NpcSetting.GetString(nNpcTempRow, "LevelScript", "", m_szLevelSettingScript, 100);
  145. #endif
  146. }
  147. void KNpcTemplate::InitNpcLevelData(KTabFile * pKindFile, int nNpcTemplateId, KLuaScript * pLevelScript, int nLevel)
  148. {
  149. if (nNpcTemplateId < 0 || nLevel <= 0 || (!pLevelScript)) return;
  150. int nNpcTempRow = nNpcTemplateId + 2;
  151. int  nTopIndex = 0;
  152. m_nLevel = nLevel;
  153. pLevelScript->SafeCallBegin(&nTopIndex);
  154. {
  155. m_NpcSettingIdx = nNpcTemplateId;
  156. #ifdef _SERVER
  157. //技能
  158. char szValue1[MAX_VALUE_LEN];
  159. char szValue2[MAX_VALUE_LEN];
  160. g_NpcSetting.GetString(nNpcTempRow, "Skill1", "", szValue1, MAX_VALUE_LEN);
  161. g_NpcSetting.GetString(nNpcTempRow, "Level1", "", szValue2, MAX_VALUE_LEN);
  162. if (szValue1[0] && szValue2[0])
  163. m_SkillList.SetNpcSkill(1, SkillString2Id(szValue1), GetNpcLevelDataFromScript(pLevelScript, "Level1", nLevel, szValue2));
  164. g_NpcSetting.GetString(nNpcTempRow, "Skill2", "", szValue1, MAX_VALUE_LEN);
  165. g_NpcSetting.GetString(nNpcTempRow, "Level2", "", szValue2, MAX_VALUE_LEN);
  166. if (szValue1[0] && szValue2[0])
  167. m_SkillList.SetNpcSkill(2, SkillString2Id(szValue1), GetNpcLevelDataFromScript(pLevelScript, "Level2", nLevel, szValue2));
  168. g_NpcSetting.GetString(nNpcTempRow, "Skill3", "", szValue1, MAX_VALUE_LEN);
  169. g_NpcSetting.GetString(nNpcTempRow, "Level3", "", szValue2, MAX_VALUE_LEN);
  170. if (szValue1[0] && szValue2[0])
  171. m_SkillList.SetNpcSkill(3, SkillString2Id(szValue1), GetNpcLevelDataFromScript(pLevelScript, "Level3", nLevel, szValue2));
  172. g_NpcSetting.GetString(nNpcTempRow, "Skill4", "", szValue1, MAX_VALUE_LEN);
  173. g_NpcSetting.GetString(nNpcTempRow, "Level4", "", szValue2, MAX_VALUE_LEN);
  174. if (szValue1[0] && szValue2[0])
  175. m_SkillList.SetNpcSkill(4, SkillString2Id(szValue1), GetNpcLevelDataFromScript(pLevelScript, "Level4", nLevel, szValue2));
  176. //Question  Change as 1Level , only debug version
  177. float nParam1 = 0;
  178. float nParam2 = 0;
  179. float nParam3 = 0;
  180. float nParam = 1;
  181. g_NpcSetting.GetFloat(nNpcTempRow, "ExpParam", 1, &nParam);
  182. g_NpcSetting.GetFloat(nNpcTempRow, "ExpParam1", 0, &nParam1);
  183. g_NpcSetting.GetFloat(nNpcTempRow, "ExpParam2", 0, &nParam2);
  184. g_NpcSetting.GetFloat(nNpcTempRow, "ExpParam3", 0, &nParam3);
  185. m_Experience = nParam * GetNpcLevelDataFromScript(pLevelScript, "Exp", nLevel, nParam1, nParam2, nParam3) / 100;
  186. g_NpcSetting.GetFloat(nNpcTempRow, "LifeParam", 1, &nParam);
  187. g_NpcSetting.GetFloat(nNpcTempRow, "LifeParam1", 0, &nParam1);
  188. g_NpcSetting.GetFloat(nNpcTempRow, "LifeParam2", 0, &nParam2);
  189. g_NpcSetting.GetFloat(nNpcTempRow, "LifeParam3", 0, &nParam3);
  190. m_LifeMax = nParam *  GetNpcLevelDataFromScript(pLevelScript, "Life", nLevel, nParam1, nParam2, nParam3) / 100;
  191. if (m_LifeMax == 0) m_LifeMax = 100;
  192. g_NpcSetting.GetString(nNpcTempRow, "LifeReplenish", "", szValue1, MAX_VALUE_LEN);
  193. m_LifeReplenish = GetNpcLevelDataFromScript(pLevelScript, "LifeReplenish", nLevel, szValue1);
  194. g_NpcSetting.GetFloat(nNpcTempRow, "ARParam", 1, &nParam);
  195. g_NpcSetting.GetFloat(nNpcTempRow, "ARParam1", 0, &nParam1);
  196. g_NpcSetting.GetFloat(nNpcTempRow, "ARParam2", 0, &nParam2);
  197. g_NpcSetting.GetFloat(nNpcTempRow, "ARParam3", 0, &nParam3);
  198. m_AttackRating = nParam * GetNpcLevelDataFromScript(pLevelScript, "AR", nLevel, nParam1, nParam2, nParam3) / 100;
  199. if (m_AttackRating == 0) m_AttackRating = 100;
  200. g_NpcSetting.GetFloat(nNpcTempRow, "DefenseParam", 1, &nParam);
  201. g_NpcSetting.GetFloat(nNpcTempRow, "DefenseParam1", 0, &nParam1);
  202. g_NpcSetting.GetFloat(nNpcTempRow, "DefenseParam2", 0, &nParam2);
  203. g_NpcSetting.GetFloat(nNpcTempRow, "DefenseParam3", 0, &nParam3);
  204. m_Defend = nParam *GetNpcLevelDataFromScript(pLevelScript, "Defense", nLevel, nParam1, nParam2, nParam3) / 100;
  205. g_NpcSetting.GetFloat(nNpcTempRow, "MinDamageParam", 1, &nParam);
  206. g_NpcSetting.GetFloat(nNpcTempRow, "MinDamageParam1", 0, &nParam1);
  207. g_NpcSetting.GetFloat(nNpcTempRow, "MinDamageParam2", 0, &nParam2);
  208. g_NpcSetting.GetFloat(nNpcTempRow, "MinDamageParam3", 0, &nParam3);
  209. m_PhysicsDamage.nValue[0] = nParam * GetNpcLevelDataFromScript(pLevelScript, "MinDamage", nLevel, nParam1, nParam2, nParam3) / 100;
  210. g_NpcSetting.GetFloat(nNpcTempRow, "MaxDamageParam", 1, &nParam);
  211. g_NpcSetting.GetFloat(nNpcTempRow, "MaxDamageParam1", 0, &nParam1);
  212. g_NpcSetting.GetFloat(nNpcTempRow, "MaxDamageParam2", 0, &nParam2);
  213. g_NpcSetting.GetFloat(nNpcTempRow, "MaxDamageParam3", 0, &nParam3);
  214. m_PhysicsDamage.nValue[2] = nParam * GetNpcLevelDataFromScript(pLevelScript, "MaxDamage", nLevel, nParam1, nParam2, nParam3) / 100;
  215. g_NpcSetting.GetString(nNpcTempRow, "RedLum", "", szValue1, MAX_VALUE_LEN);
  216. m_RedLum = GetNpcLevelDataFromScript(pLevelScript, "RedLum", nLevel, szValue1);
  217. g_NpcSetting.GetString(nNpcTempRow, "GreenLum", "", szValue1, MAX_VALUE_LEN);
  218. m_GreenLum = GetNpcLevelDataFromScript(pLevelScript, "GreenLum", nLevel, szValue1);
  219. g_NpcSetting.GetString(nNpcTempRow, "BlueLum", "", szValue1, MAX_VALUE_LEN);
  220. m_BlueLum = GetNpcLevelDataFromScript(pLevelScript, "BlueLum", nLevel, szValue1);
  221. g_NpcSetting.GetString(nNpcTempRow, "FireResist", "", szValue1, MAX_VALUE_LEN);
  222. m_FireResist = GetNpcLevelDataFromScript(pLevelScript, "FireResist", nLevel, szValue1);
  223. g_NpcSetting.GetString(nNpcTempRow, "ColdResist", "", szValue1, MAX_VALUE_LEN);
  224. m_ColdResist = GetNpcLevelDataFromScript(pLevelScript, "ColdResist", nLevel, szValue1);
  225. g_NpcSetting.GetString(nNpcTempRow, "LightResist", "", szValue1, MAX_VALUE_LEN);
  226. m_LightResist = GetNpcLevelDataFromScript(pLevelScript, "LightResist", nLevel, szValue1);
  227. g_NpcSetting.GetString(nNpcTempRow, "PoisonResist", "", szValue1, MAX_VALUE_LEN);
  228. m_PoisonResist = GetNpcLevelDataFromScript(pLevelScript, "PoisonResist", nLevel, szValue1);
  229. g_NpcSetting.GetString(nNpcTempRow, "PhysicsResist", "", szValue1, MAX_VALUE_LEN);
  230. m_PhysicsResist = GetNpcLevelDataFromScript(pLevelScript, "PhysicsResist", nLevel, szValue1);
  231. #endif
  232. #ifndef _SERVER
  233. int nParam1 = 0;
  234. int nParam2 = 0;
  235. int nParam3 = 0;
  236. int nParam = 1;
  237. g_NpcSetting.GetInteger(nNpcTempRow, "LifeParam", 1, &nParam);
  238. g_NpcSetting.GetInteger(nNpcTempRow, "LifeParam1", 0, &nParam1);
  239. g_NpcSetting.GetInteger(nNpcTempRow, "LifeParam2", 0, &nParam2);
  240. g_NpcSetting.GetInteger(nNpcTempRow, "LifeParam3", 0, &nParam3);
  241. m_LifeMax = nParam *  GetNpcLevelDataFromScript(pLevelScript, "Life", nLevel, nParam1, nParam2, nParam3) / 100;
  242. if (m_LifeMax == 0) m_LifeMax = 100;
  243. #endif
  244. }
  245. pLevelScript->SafeCallEnd(nTopIndex);
  246. }
  247. int KNpcTemplate::GetNpcLevelDataFromScript(KLuaScript * pScript, char * szDataName, int nLevel, char * szParam)
  248. {
  249. int nTopIndex = 0;
  250. int nReturn = 0;
  251. if (szParam == NULL|| szParam[0] == 0 || strlen(szParam) < 3)
  252. {
  253. return 0;
  254. }
  255. pScript->SafeCallBegin(&nTopIndex);
  256. pScript->CallFunction("GetNpcLevelData", 1, "dss", nLevel, szDataName, szParam);
  257. nTopIndex = Lua_GetTopIndex(pScript->m_LuaState);
  258. nReturn = (int) Lua_ValueToNumber(pScript->m_LuaState, nTopIndex);
  259. pScript->SafeCallEnd(nTopIndex);
  260. return nReturn;
  261. }
  262. int KNpcTemplate::GetNpcLevelDataFromScript(KLuaScript * pScript, char * szDataName, int nLevel, double nParam1, double nParam2, double nParam3)
  263. {
  264. int nTopIndex = 0;
  265. int nReturn = 0;
  266. pScript->SafeCallBegin(&nTopIndex);
  267. pScript->CallFunction("GetNpcKeyData", 1, "dsnnn", nLevel, szDataName, nParam1, nParam2, nParam3);
  268. nTopIndex = Lua_GetTopIndex(pScript->m_LuaState);
  269. nReturn = (int) Lua_ValueToNumber(pScript->m_LuaState, nTopIndex);
  270. pScript->SafeCallEnd(nTopIndex);
  271. return nReturn;
  272. }
  273. int KNpcTemplate::SkillString2Id(char * szSkillString)
  274. {
  275. if (!szSkillString[0]) return 0;
  276. int nSkillNum = g_OrdinSkillsSetting.GetHeight() - 1;
  277. char szSkillName[100];
  278. for (int i = 0 ;  i < nSkillNum; i ++)
  279. {
  280. g_OrdinSkillsSetting.GetString(i + 2, "SkillName", "", szSkillName, sizeof(szSkillName));
  281. if (g_StrCmp(szSkillString, szSkillName))
  282. {
  283. int nSkillId = 0;
  284. g_OrdinSkillsSetting.GetInteger(i + 2, "SkillId", 0, &nSkillId);
  285. return nSkillId;
  286. }
  287. }
  288. g_DebugLog("无找到该[%s]魔法的Id,请检查!", szSkillString);
  289. return 0;
  290. }