PageRenderTime 73ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/SERVER/GameServer/AppServer/script/Script.cpp

https://bitbucket.org/ichenq/stardust
C++ | 3774 lines | 3132 code | 381 blank | 261 comment | 777 complexity | 4545a9738346a6151df3656808f991f8 MD5 | raw file
  1. #include "StdAfx.h"
  2. #include "script.h"
  3. #include "variablelist.h"
  4. #include "..\player.h"
  5. #include "..\ServerRegion.h"
  6. #include "../goods/cgoods.h"
  7. #include "../monster.h"
  8. #include "../moveshape.h"
  9. #include "../public/StrType.h"
  10. #include "../public/StrUnifyInput.h"
  11. #include <vector>
  12. #include <string>
  13. CScript::tagStrValueInfo::tagStrValueInfo(void)
  14. :pStrValue(NULL),lStrValueLen(0)
  15. {
  16. }
  17. CScript::tagStrValueInfo::~tagStrValueInfo(void)
  18. {
  19. }
  20. /************************************************
  21. * 运行一个脚本文件 RunScript(...); *
  22. ************************************************/
  23. listScript g_Scripts; // 脚本链表表头
  24. FreeScript g_FreeScriptList; // 预分配的空闲脚本内存
  25. map<CScript*,string> g_UsingScript; // 正在使用的Script
  26. CVariableList* CScript::g_StackVarList = NULL;
  27. list<CGUID> CScript::m_DelScripts;
  28. CVariableList* CScript::GetStackVarListInst(void)
  29. {
  30. if(NULL == g_StackVarList)
  31. g_StackVarList = MP_NEW CVariableList;
  32. return g_StackVarList;
  33. }
  34. void CScript::ReleaseStackVarListInst(void)
  35. {
  36. MP_DELETE(g_StackVarList);
  37. }
  38. ///////////////////
  39. CScript* PopFreeScript(const char* pszName)
  40. {
  41. CScript* tempScript = NULL;
  42. if( g_FreeScriptList.size() > 0 ) //有空闲Script内存块
  43. {
  44. tempScript = g_FreeScriptList.front();
  45. g_FreeScriptList.pop_front();
  46. }
  47. else
  48. {
  49. tempScript = MP_NEW CScript;
  50. }
  51. tempScript->ResetVariableList();
  52. tempScript->ResetChildScriptInfo();
  53. tempScript->SetSrcShape(NULL);
  54. tempScript->SetDesShape(NULL);
  55. tempScript->SetRegion(NULL);
  56. if(pszName)
  57. g_UsingScript[tempScript]=pszName;
  58. else
  59. g_UsingScript[tempScript]="";
  60. return tempScript;
  61. }
  62. void PushFreeScript(CScript* freeScript)
  63. {
  64. if(NULL == freeScript) return;
  65. g_UsingScript.erase(freeScript);
  66. // 如果空闲队列没有达到最大数量
  67. if(g_FreeScriptList.size() <= CGlobeSetup::GetSetup()->lMaxPreAllocedScriptNum)
  68. {
  69. freeScript->GetSelfVariableList()->Release();
  70. g_FreeScriptList.push_back(freeScript);
  71. }
  72. else //清除多余空闲内存
  73. {
  74. MP_DELETE(freeScript);
  75. }
  76. }
  77. //输出脚本信息
  78. void OutputScriptInfo()
  79. {
  80. char pszInfo[1024]="";
  81. _snprintf(pszInfo,1024,"g_UsingScript:%d,g_Scripts:%d",g_UsingScript.size(),g_Scripts.size());
  82. PutStringToFile("ScriptInfo",pszInfo);
  83. map<CScript*,string>::iterator it = g_UsingScript.begin();
  84. for(;it != g_UsingScript.end();it++)
  85. {
  86. bool bFlag = false;
  87. char pszSrcGuid[50]="";
  88. const CGUID& guid = (*it).first->GetID();
  89. (*it).first->GetSrcID().tostring(pszSrcGuid);
  90. if(guid != NULL_GUID)
  91. bFlag = ( g_Scripts.find(guid ) != g_Scripts.end() );
  92. _snprintf(pszInfo,1024,"(SrcType:%d,SrcGuid:%s)flag:%d,IsHang:%d,HangFun:%d,fileame:%s",(*it).first->GetSrcType(),pszSrcGuid,bFlag,(*it).first->IsHang(),(*it).first->GetHangFunc(),(*it).second.c_str());
  93. PutStringToFile("ScriptInfo",pszInfo);
  94. }
  95. }
  96. // 客户端选择有效性判断
  97. bool ClientOptIsValid(const CGUID& scriptid, const char* szClientOpt)
  98. {
  99. if(scriptid == NULL_GUID) return true;
  100. listScript::iterator itr = g_Scripts.find(scriptid);
  101. if(itr != g_Scripts.end())
  102. {
  103. if( !itr->second->GetClientOptInfo()
  104. || itr->second->GetClientOptInfo()[0] == '\0') return true;
  105. if(strstr(itr->second->GetClientOptInfo(), szClientOpt))
  106. return true;
  107. else
  108. return false;
  109. }
  110. return false;
  111. }
  112. // 清除脚本的客户端选择检查数据
  113. void ClearClientOptData(const CGUID& scriptid)
  114. {
  115. listScript::iterator itr = g_Scripts.find(scriptid);
  116. if(itr != g_Scripts.end())
  117. {
  118. if(itr->second)
  119. itr->second->SetClientOptInfo("");
  120. }
  121. }
  122. // 外部调用脚本
  123. double RunScript(stRunScript *p, char* pData, int paramA, int paramB)
  124. {
  125. if(p==NULL || pData==NULL)
  126. return false;
  127. #ifdef _RUNSTACKINFO_
  128. char pszStatckInfo[10240]="";
  129. _snprintf(pszStatckInfo,10240,"RunScript(FileName:%s) Start",p->pszFileName?p->pszFileName:"");
  130. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  131. #endif
  132. CScript* tempScript = NULL;
  133. double lIndexID = 0; //全局的唯一脚本ID
  134. tempScript = PopFreeScript(p->pszFileName);
  135. #ifdef _SCRIPT_INFO_
  136. DWORD BeginTime = timeGetTime();
  137. tempScript->m_RunTime = 0;
  138. #endif
  139. // 初始化script对象
  140. tempScript->m_dwLastTime=0;
  141. if(p->srcShape && (OBJECT_TYPE)p->srcShape->GetType() == TYPE_PLAYER)
  142. tempScript->SetPlayerID(p->srcShape->GetExID());
  143. else
  144. tempScript->SetPlayerID(NULL_GUID);
  145. tempScript->SetRegion(p->pRegion);
  146. tempScript->SetSrcShape(p->srcShape);
  147. tempScript->SetDesShape(p->desShape);
  148. tempScript->SetUsedItemID(p->guUsedItemID);
  149. POINT pointXY;
  150. pointXY.x = -1;
  151. pointXY.y = -1;
  152. tempScript->SetDropGoodsPoint(pointXY);
  153. CGUID guid;
  154. CGUID::CreateGUID(guid);
  155. tempScript->SetID(guid);
  156. // 加载脚本内容
  157. double ret = 0; // 返回值
  158. if( tempScript->LoadScript(p->pszFileName, pData) )
  159. {
  160. tempScript->GetVariableList()->AddVar("$ParamA", paramA);
  161. tempScript->GetVariableList()->AddVar("$ParamB", paramB);
  162. tempScript->GetVariableList()->AddVar("$Ret", 0.0f);
  163. // 执行脚本
  164. if( tempScript->RunStep() == CScript::SR_HANG )
  165. {
  166. g_Scripts[guid] = tempScript;
  167. #ifdef _RUNSTACKINFO_
  168. _snprintf(pszStatckInfo,10240,"RunScript(FileName:%s) Hang",p->pszFileName?p->pszFileName:"");
  169. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  170. #endif
  171. #ifdef _SCRIPT_INFO_
  172. tempScript->m_RunTime += timeGetTime() - BeginTime;
  173. #endif
  174. return 0;
  175. }
  176. else
  177. {
  178. ret = tempScript->GetVariableList()->GetVarValue("$Ret", 0);
  179. }
  180. }
  181. #ifdef _SCRIPT_INFO_
  182. GetGame()->AddScriptInfo((p->pszFileName?p->pszFileName:""), timeGetTime() - BeginTime);
  183. tempScript->m_RunTime = 0;
  184. #endif
  185. PushFreeScript(tempScript);
  186. #ifdef _RUNSTACKINFO_
  187. _snprintf(pszStatckInfo,10240,"RunScript(FileName:%s) End",p->pszFileName?p->pszFileName:"");
  188. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  189. #endif
  190. return ret;
  191. }
  192. // 往脚本里添加参数
  193. static void _AddParamList( CScript *pScript, const VarPairListType &var_list )
  194. {
  195. CVariableList *pVarList = pScript->GetVariableList();
  196. for( VarPairListType::const_iterator it = var_list.begin(); it != var_list.end(); ++ it )
  197. {
  198. const stVarPair &vp = *it;
  199. switch( vp.ValueType )
  200. {
  201. case stVarPair::VT_NUMBER:
  202. pVarList->AddVar( vp.Name.c_str(), vp.NumValue );
  203. break;
  204. case stVarPair::VT_STRING:
  205. pVarList->AddVar( vp.Name.c_str(), vp.StrValue.c_str() );
  206. break;
  207. case stVarPair::VT_GUID:
  208. pVarList->AddGuid( vp.Name.c_str(), vp.GuidValue );
  209. break;
  210. default:
  211. // error
  212. break;
  213. }
  214. }
  215. // add ret
  216. pVarList->AddVar( "$Ret", (double)0 );
  217. }
  218. double RunScript( stRunScript *p, char *pData, const VarPairListType &var_list )
  219. {
  220. if( p == NULL || pData == NULL )
  221. {
  222. return false;
  223. }
  224. CScript* tempScript = NULL;
  225. double lIndexID = 0; //全局的唯一脚本ID
  226. tempScript = PopFreeScript(p->pszFileName);
  227. tempScript->m_dwLastTime=0;
  228. if(p->srcShape && (OBJECT_TYPE)p->srcShape->GetType() == TYPE_PLAYER)
  229. tempScript->SetPlayerID(p->srcShape->GetExID());
  230. else
  231. tempScript->SetPlayerID(NULL_GUID);
  232. tempScript->SetRegion(p->pRegion);
  233. tempScript->SetSrcShape(p->srcShape);
  234. tempScript->SetDesShape(p->desShape);
  235. tempScript->SetUsedItemID(p->guUsedItemID);
  236. POINT pointXY;
  237. pointXY.x = -1;
  238. pointXY.y = -1;
  239. tempScript->SetDropGoodsPoint(pointXY);
  240. CGUID guid;
  241. CGUID::CreateGUID(guid);
  242. tempScript->SetID(guid);
  243. // 加载脚本内容
  244. double ret = 0; // 返回值
  245. if( tempScript->LoadScript(p->pszFileName, pData) )
  246. {
  247. _AddParamList( tempScript, var_list );
  248. // 执行脚本
  249. if( tempScript->RunStep() == CScript::SR_HANG )
  250. {
  251. g_Scripts[guid] = tempScript;
  252. return 0;
  253. }
  254. else
  255. {
  256. ret = tempScript->GetVariableList()->GetVarValue("$Ret", 0);
  257. }
  258. }
  259. PushFreeScript(tempScript);
  260. return ret;
  261. }
  262. long DelectAllScripByShape(const CGUID& PlayerGuid)
  263. {
  264. for(itScript it=g_Scripts.begin(); it!=g_Scripts.end(); it++)
  265. {
  266. CScript* p = (CScript*)(*it).second;
  267. if( p && p->GetSrcID() == PlayerGuid )
  268. {
  269. CScript::PushDelScript((*it).first);
  270. }
  271. }
  272. return true;
  273. }
  274. //删除玩家的Talkbox脚本
  275. long DelPlayerTalkBoxScript(const CGUID& PlayerGuid, SCRIPT_FUNC_DEF funcDef)
  276. {
  277. for(itScript it=g_Scripts.begin(); it!=g_Scripts.end(); it++)
  278. {
  279. CScript* p = (CScript*)(*it).second;
  280. if( p && p->GetSrcID() == PlayerGuid &&
  281. p->IsHang() &&
  282. (p->GetHangFunc() == funcDef) )
  283. {
  284. CScript::PushDelScript((*it).first);
  285. }
  286. }
  287. return true;
  288. }
  289. //删除某个ID对应的脚本
  290. long DelectPlayerScript(const CGUID &ScriptID,const CGUID& PlayerGuid)
  291. {
  292. itScript it = g_Scripts.find(ScriptID);
  293. if(it != g_Scripts.end())
  294. {
  295. CScript* p = (CScript*)(*it).second;
  296. if(p && p->GetSrcID() == PlayerGuid)
  297. {
  298. CScript::PushDelScript(ScriptID);
  299. }
  300. }
  301. return true;
  302. }
  303. //在脚本链表中清除PLAYER对应的脚本
  304. long DelectPlayerScript(CPlayer* pPlayer,char* strFile)
  305. {
  306. if(pPlayer==NULL || strFile == NULL)
  307. return false;
  308. for(itScript it=g_Scripts.begin(); it!=g_Scripts.end(); it++)
  309. {
  310. CScript* p = (CScript*)(*it).second;
  311. if( p && p->GetSrcID() == pPlayer->GetExID() && p->GetFileName() &&
  312. strcmp(strFile,p->GetFileName()) == 0 )
  313. {
  314. CScript::PushDelScript((*it).first);
  315. }
  316. }
  317. return true;
  318. }
  319. //判断某个万家的脚本是否正在执行
  320. bool ScriptIfExit(CPlayer* pPlayer,char* strFile)
  321. {
  322. if(pPlayer==NULL || strFile == NULL)
  323. return false;
  324. for(itScript it=g_Scripts.begin(); it!=g_Scripts.end();it++)
  325. {
  326. CScript* p = (CScript*)(*it).second;
  327. if( p && p->GetPlayerID() == pPlayer->GetExID() && p->GetFileName() &&
  328. strcmp(strFile,p->GetFileName()) == 0 )
  329. {
  330. return true;
  331. }
  332. }
  333. return false;
  334. }
  335. //继续执行一个脚本
  336. long ContinueRunScript(const CGUID& ScriptID, CVariableList* stackVarList)
  337. {
  338. itScript it = g_Scripts.find(ScriptID);
  339. if(it != g_Scripts.end())
  340. {
  341. CScript* pScript = (*it).second;
  342. if(pScript)
  343. {
  344. pScript->ResetShape();
  345. if( pScript->ContinueRun(stackVarList) != CScript::SR_HANG )
  346. {
  347. CScript::PushDelScript(ScriptID);
  348. return 1;
  349. }
  350. else
  351. {
  352. return 0;
  353. }
  354. }
  355. return 1;
  356. }
  357. return 0;
  358. }
  359. //得到一个脚本的全局ID
  360. long GetScriptIndex()
  361. {
  362. static double lID = 0;
  363. return ++lID;
  364. }
  365. /************************************************
  366. * -= 脚本类 =- *
  367. * 读入并执行脚本文件 *
  368. * (1)用以控制NPC的行为 *
  369. * (2)编写特定的情节 *
  370. * (3)制作任务 *
  371. * (4)动态改变游戏中的各种数据[巫师] *
  372. ************************************************/
  373. ////////////////
  374. // 函数列表
  375. double CScript::m_LoadFunctionNum=0;
  376. CScript::STRING2PFUNC* CScript::s_FunctionList2=0;
  377. double CScript::m_MaxFunction=0;
  378. ////////////////
  379. // 全局变量
  380. CVariableList* CScript::m_GeneralVariableList=NULL;
  381. CVariableList* CScript::m_BuffSkillVariableList=NULL;
  382. //////////////////////////////////////
  383. // 操作符列表 (数值越大,优先级越大)
  384. CScript::stOperation CScript::m_OperationList[MAX_OPERATION]=
  385. {
  386. "", 0,
  387. ";",1,
  388. "||",2,
  389. "&&",3,
  390. "==",4, "!=",4, ">",4, "<",4, ">=",4, "<=",4,
  391. "=",5, "+=",5, "-=",5, "*=",5, "/=",5, "%=",5,
  392. "&",6, "|",6,
  393. "+",7, "-",7,
  394. "*",8, "/",8, "%",8
  395. };
  396. ///////////////
  397. // 构建
  398. CScript::CScript(CShape* srcShape, CRegion *Region, CShape *desShape, CGUID& guUsedItemID, DWORD dwDiedMonsterIndex)
  399. :m_strRunScriptName("")
  400. {
  401. m_FileName[0] = 0;
  402. m_Data=NULL;
  403. m_DataLen=0;
  404. m_Block=0;
  405. m_szClientUpdateVarName[0] = '\0';
  406. m_szClientOptInfo = NULL;
  407. m_lClientOptInfoLen = 0;
  408. m_VarNum = 0;
  409. m_dwLastTime=0;
  410. m_guIndexID = NULL_GUID;
  411. if(srcShape && (OBJECT_TYPE)srcShape->GetType() == TYPE_PLAYER)
  412. m_PlayerGuid=srcShape->GetExID();
  413. else
  414. m_PlayerGuid=NULL_GUID;
  415. m_pRegion = Region;
  416. p_SrcShape = srcShape;
  417. p_DesShape = desShape;
  418. m_guUsedItemID = guUsedItemID;
  419. m_ptDropGoods.x = -1;
  420. m_ptDropGoods.y = -1;
  421. m_pChildScriptInfo = NULL;
  422. m_pSelfVariableList = MP_NEW CVariableList;
  423. m_pVariableList = NULL;
  424. }
  425. /////////////////////
  426. // 释放
  427. CScript::~CScript()
  428. {
  429. M_FREE(m_szClientOptInfo, sizeof(char)*MAX_VAR_LEN);
  430. M_FREE(m_Data, sizeof(char)*(m_DataLen+1)); //释放
  431. m_DataLen=0;
  432. for (int i=0;i<MAX_VAR;i++)
  433. {
  434. M_FREE(m_strValueInfo[i].pStrValue, m_strValueInfo[i].lStrValueLen);
  435. m_strValueInfo[i].pStrValue = NULL;
  436. m_strValueInfo[i].lStrValueLen = 0;
  437. }
  438. MP_DELETE(m_pSelfVariableList);
  439. if(m_pChildScriptInfo)
  440. {
  441. MP_DELETE(m_pChildScriptInfo->pChildScript);
  442. MP_DELETE(m_pChildScriptInfo);
  443. }
  444. }
  445. void CScript::SetClientOptInfo(const char* szInfo)
  446. {
  447. if(szInfo)
  448. {
  449. M_FREE(m_szClientOptInfo, m_lClientOptInfoLen);
  450. long lLen = strlen(szInfo);
  451. m_szClientOptInfo = (char*)M_ALLOC(sizeof(char)*(lLen+1));
  452. strcpy_s(m_szClientOptInfo, m_lClientOptInfoLen, szInfo);
  453. m_lClientOptInfoLen = lLen+1;
  454. }
  455. }
  456. //释放子脚本
  457. void CScript::ReleaseChildScript()
  458. {
  459. if(m_pChildScriptInfo)
  460. {
  461. if(m_pChildScriptInfo->pChildScript)
  462. m_pChildScriptInfo->pChildScript->ReleaseChildScript();
  463. PushFreeScript(m_pChildScriptInfo->pChildScript);
  464. MP_DELETE(m_pChildScriptInfo);
  465. }
  466. }
  467. void CScript::PushDelScript(const CGUID& guid)
  468. {
  469. m_DelScripts.push_back(guid);
  470. return;
  471. }
  472. //删除标记的脚本
  473. void CScript::DelScript()
  474. {
  475. list<CGUID>::iterator it = m_DelScripts.begin();
  476. for(;it != m_DelScripts.end();it++)
  477. {
  478. itScript itScript = g_Scripts.find((*it));
  479. if(itScript != g_Scripts.end())
  480. {
  481. CScript* pScript = (*itScript).second;
  482. if(pScript)
  483. {
  484. pScript->ReleaseChildScript();
  485. PushFreeScript((*itScript).second);
  486. }
  487. g_Scripts.erase(itScript);
  488. }
  489. }
  490. m_DelScripts.clear();
  491. return;
  492. }
  493. // ------------------------------ 初始化 ------------------------------
  494. ///////////////////////
  495. // 读取函数列表
  496. void CScript::LoadFunction(const char *filename, char* pData)
  497. {
  498. SAFE_DELETE(s_FunctionList2);
  499. s_FunctionList2 = new STRING2PFUNC;
  500. //-----------------------------------------------------
  501. //基本语法函数
  502. (*s_FunctionList2)["goto"] = &CScript::Goto;
  503. (*s_FunctionList2)["if"] = &CScript::If;
  504. (*s_FunctionList2)["wait"] = &CScript::wait;
  505. (*s_FunctionList2)["random"] = &CScript::random;
  506. (*s_FunctionList2)["Int"] = &CScript::Int;
  507. (*s_FunctionList2)["Round"] = &CScript::RoundNum;
  508. (*s_FunctionList2)["RGB"] = &CScript::Rgb;
  509. (*s_FunctionList2)["localvar"] = &CScript::LocalVar;
  510. (*s_FunctionList2)["define"] = &CScript::define;
  511. (*s_FunctionList2)["undefine"] = &CScript::undefine;
  512. (*s_FunctionList2)["ifdef"] = &CScript::Ifdef;
  513. (*s_FunctionList2)["destdefine"] = &CScript::DestDefine;
  514. (*s_FunctionList2)["destundefine"] = &CScript::DestUndefine;
  515. (*s_FunctionList2)["ifdestdef"] = &CScript::IfDestDef;
  516. (*s_FunctionList2)["Time"] = &CScript::Time;
  517. (*s_FunctionList2)["Year"] = &CScript::Year;
  518. (*s_FunctionList2)["Month"] = &CScript::Month;
  519. (*s_FunctionList2)["Day"] = &CScript::Day;
  520. (*s_FunctionList2)["Hour"] = &CScript::Hour;
  521. (*s_FunctionList2)["Minute"] = &CScript::Minute;
  522. (*s_FunctionList2)["DayOfWeek"] = &CScript::DayOfWeek;
  523. (*s_FunctionList2)["HourDiff"] = &CScript::HourDiff;
  524. (*s_FunctionList2)["MinuteDiff"] = &CScript::MinuteDiff;
  525. (*s_FunctionList2)["Second"] = &CScript::Second;
  526. (*s_FunctionList2)["CheckGuidIsNull"] = &CScript::CheckGuidIsNull;
  527. (*s_FunctionList2)["GetCurTick"] = &CScript::GetCurTick;
  528. (*s_FunctionList2)["GetPow"] = &CScript::GetPow;
  529. (*s_FunctionList2)["GetSubString"] = &CScript::GetSubString;
  530. //-----------------------------------------------------
  531. //系统全局函数
  532. (*s_FunctionList2)["FormatGUID"] = &CScript::FormatGUID;
  533. (*s_FunctionList2)["ListOnlineGM"] = &CScript::ListOnlineGM;
  534. (*s_FunctionList2)["ListSilencePlayer"] = &CScript::ListSilencePlayer;
  535. (*s_FunctionList2)["ListBanedPlayer"] = &CScript::ListBanedPlayer;
  536. (*s_FunctionList2)["GetOnlinePlayers"] = &CScript::GetOnlinePlayers;
  537. (*s_FunctionList2)["PostRegionInfo"] = &CScript::PostRegionInfo;
  538. (*s_FunctionList2)["PostRegionInfoByIndex"] = &CScript::PostRegionInfoByIndex;
  539. (*s_FunctionList2)["PostWorldInfo"] = &CScript::PostWorldInfo;
  540. (*s_FunctionList2)["PostWorldInfoByIndex"] = &CScript::PostWorldInfoByIndex;
  541. (*s_FunctionList2)["PostCountryInfo"] = &CScript::PostCountryInfo;
  542. (*s_FunctionList2)["KickAllPlayer"] = &CScript::KickAllPlayer;
  543. (*s_FunctionList2)["KickRegionPlayer"] = &CScript::KickRegionPlayer;
  544. (*s_FunctionList2)["RegisterGlobalTimer"] = &CScript::RegisterGlobalTimer;
  545. (*s_FunctionList2)["UnRegisterGlobalTimer"] = &CScript::UnRegisterGlobalTimer;
  546. (*s_FunctionList2)["KickPlayer"] = &CScript::KickPlayer;
  547. (*s_FunctionList2)["KickAround"] = &CScript::KickAround;
  548. (*s_FunctionList2)["BanPlayer"] = &CScript::BanPlayer;
  549. (*s_FunctionList2)["SilencePlayer"] = &CScript::SilencePlayer;
  550. (*s_FunctionList2)["GetTextRes"] = &CScript::GetTextRes;
  551. (*s_FunctionList2)["SetPlayerRegion"] = &CScript::SetPlayerRegion;
  552. (*s_FunctionList2)["SetPlayerRegionEx"] = &CScript::SetPlayerRegionEx;
  553. (*s_FunctionList2)["RollRegionInfo"] = &CScript::RollRegionInfo;
  554. (*s_FunctionList2)["RollWorldInfo"] = &CScript::RollWorldInfo;
  555. (*s_FunctionList2)["GetPlayerRegion"] = &CScript::GetPlayerRegion;
  556. (*s_FunctionList2)["ChangePlayerRegion"] = &CScript::ChangePlayerRegion;
  557. (*s_FunctionList2)["ChangePlayerName"] = &CScript::ChangePlayerName;
  558. //-----------------------------------------------------
  559. //所有对象(怪物、采集物、角色)基本使用函数
  560. (*s_FunctionList2)["SetAttrInt"] = &CScript::SetAttrInt;
  561. (*s_FunctionList2)["SetAttrStr"] = &CScript::SetAttrStr;
  562. (*s_FunctionList2)["SetAttrGuid"] = &CScript::SetAttrGuid;
  563. (*s_FunctionList2)["GetAttr"] = &CScript::GetAttr;
  564. (*s_FunctionList2)["GetScriptAttr"] = &CScript::GetScriptAttr;
  565. (*s_FunctionList2)["ChangeAttr"] = &CScript::ChangeAttr;
  566. (*s_FunctionList2)["RegisterTimer"] = &CScript::RegisterTimer;
  567. (*s_FunctionList2)["UnRegisterTimer"] = &CScript::UnRegisterTimer;
  568. (*s_FunctionList2)["PlayMotion"] = &CScript::PlayMotion;
  569. (*s_FunctionList2)["DesRunScript"] = &CScript::DesRunScript;
  570. (*s_FunctionList2)["GetPlayerNumByAround"] = &CScript::GetPlayerNumByAround;
  571. (*s_FunctionList2)["GetMonsterNumByAround"] = &CScript::GetMonsterNumByAround;
  572. (*s_FunctionList2)["GetSameMonsterNumByAround"] = &CScript::GetSameMonsterNumByAround;
  573. (*s_FunctionList2)["SetDelTime"] = &CScript::SetDelTime;
  574. (*s_FunctionList2)["SetDelTimeByGuid"] = &CScript::SetDelTimeByGuid;
  575. (*s_FunctionList2)["GetSrcShapeGUID"] = &CScript::GetSrcShapeGUID;
  576. (*s_FunctionList2)["GetDesShapeGUID"] = &CScript::GetDesShapeGUID;
  577. (*s_FunctionList2)["ChangeMoveSpeed"] = &CScript::ChangeMoveSpeed;
  578. (*s_FunctionList2)["SetMoveSpeed"] = &CScript::SetMoveSpeed;
  579. (*s_FunctionList2)["ChangeBaseSpeed"] = &CScript::ChangeBaseSpeed;
  580. (*s_FunctionList2)["GetCurrentSpeed"] = &CScript::GetCurrentSpeed;
  581. (*s_FunctionList2)["GetDestIntVar"] = &CScript::GetDestIntVar;
  582. (*s_FunctionList2)["SetDestIntVar"] = &CScript::SetDestIntVar;
  583. (*s_FunctionList2)["GetDestStrVar"] = &CScript::GetDestStrVar;
  584. (*s_FunctionList2)["SetDestStrVar"] = &CScript::SetDestStrVar;
  585. (*s_FunctionList2)["GetDestGuidVar"] = &CScript::GetDestGuidVar;
  586. (*s_FunctionList2)["SetDestGuidVar"] = &CScript::SetDestGuidVar;
  587. (*s_FunctionList2)["IsShapeValid"] = &CScript::IsShapeValid;
  588. //-----------------------------------------------------
  589. //怪物相关函数
  590. //1、基本函数
  591. (*s_FunctionList2)["SetMonsterAttr"] = &CScript::SetMonsterAttr;
  592. (*s_FunctionList2)["GetMonsterAttr"] = &CScript::GetMonsterAttr;
  593. (*s_FunctionList2)["ChangeMonsterAttr"] = &CScript::ChangeMonsterAttr;
  594. (*s_FunctionList2)["AddHpBar"] = &CScript::AddHpBar;
  595. (*s_FunctionList2)["GetHpLevel"] = &CScript::GetHpLevel;
  596. (*s_FunctionList2)["GetKillerID"] = &CScript::GetKillerID;
  597. (*s_FunctionList2)["GetKillerType"] = &CScript::GetKillerType;
  598. (*s_FunctionList2)["SetBeneficiary"] = &CScript::SetBeneficiary;
  599. (*s_FunctionList2)["GetBeneficiaryID"] = &CScript::GetBeneficiaryID;
  600. (*s_FunctionList2)["GetBeneficiaryType"] = &CScript::GetBeneficiaryType;
  601. (*s_FunctionList2)["GetBeneTeamGuid"] = &CScript::GetBeneTeamGuid;
  602. (*s_FunctionList2)["DelRegionMonsterByName"] = &CScript::DelRegionMonsterByName;
  603. //2、怪物AI相关函数
  604. (*s_FunctionList2)["MonsterTalk"] = &CScript::MonsterTalk;
  605. (*s_FunctionList2)["MonsterTalkByIndex"] = &CScript::MonsterTalkByIndex;
  606. (*s_FunctionList2)["MonsterTalkByGUID"] = &CScript::MonsterTalkByGUID;
  607. (*s_FunctionList2)["MonsterTalkByGuidByIndex"] = &CScript::MonsterTalkByGuidByIndex;
  608. (*s_FunctionList2)["UseSkillByID"] = &CScript::UseSkillByID;
  609. (*s_FunctionList2)["UseSkillByIDOnCell"] = &CScript::UseSkillByIDOnCell;
  610. (*s_FunctionList2)["UseSkillSync"] = &CScript::UseSkillSync;
  611. (*s_FunctionList2)["UseSkillSyncWithTrace"] = &CScript::UseSkillSyncWithTrace;
  612. (*s_FunctionList2)["UseSkillOnCellSync"] = &CScript::UseSkillOnCellSync;
  613. (*s_FunctionList2)["MoveToCellOnPeace"] = &CScript::MoveToCellOnPeace;
  614. (*s_FunctionList2)["MoveToCellOnFight"] = &CScript::MoveToCellOnFight;
  615. (*s_FunctionList2)["MoveToCellAround"] = &CScript::MoveToCellAround;
  616. (*s_FunctionList2)["MoveByStepOnPeace"] = &CScript::MoveByStepOnPeace;
  617. (*s_FunctionList2)["MoveByStepOnFight"] = &CScript::MoveByStepOnFight;
  618. (*s_FunctionList2)["SendExpActOnPeace"] = &CScript::SendExpActOnPeace;
  619. (*s_FunctionList2)["SendExpActOnFight"] = &CScript::SendExpActOnFight;
  620. (*s_FunctionList2)["MoveByTimeOnPeace"] = &CScript::MoveByTimeOnPeace;
  621. (*s_FunctionList2)["MovebyTimeOnFight"] = &CScript::MovebyTimeOnFight;
  622. (*s_FunctionList2)["CallFriendAround"] = &CScript::CallFriendAround;
  623. (*s_FunctionList2)["CallMonsterAround"] = &CScript::CallMonsterAround;
  624. (*s_FunctionList2)["Stand"] = &CScript::Stand;
  625. (*s_FunctionList2)["StandOnce"] = &CScript::StandOnce;
  626. (*s_FunctionList2)["ChangeAI"] = &CScript::ChangeAI;
  627. (*s_FunctionList2)["StartCycle"] = &CScript::StartCycle;
  628. (*s_FunctionList2)["EndCycle"] = &CScript::EndCycle;
  629. (*s_FunctionList2)["EscapeByTimeOnFight"] = &CScript::EscapeByTimeOnFight;
  630. (*s_FunctionList2)["DeleteSpring"] = &CScript::DeleteSpring;
  631. (*s_FunctionList2)["EndEscape"] = &CScript::EndEscape;
  632. (*s_FunctionList2)["EndEscapeByGUID"] = &CScript::EndEscapeByGUID;
  633. (*s_FunctionList2)["SetBefoolID"] = &CScript::SetBefoolID;
  634. (*s_FunctionList2)["CleanBefoolID"] = &CScript::CleanBefoolID;
  635. (*s_FunctionList2)["SetForceTarget"] = &CScript::SetForceTarget;
  636. (*s_FunctionList2)["CleanForceTatget"] = &CScript::CleanForceTatget;
  637. (*s_FunctionList2)["ChangeWeaknessState"] = &CScript::ChangeWeaknessState;
  638. (*s_FunctionList2)["EscapeByAround"] = &CScript::EscapeByAround;
  639. (*s_FunctionList2)["MonsterRunScriptsAround"] = &CScript::MonsterRunScriptsAround;
  640. (*s_FunctionList2)["MonsterIsFight"] = &CScript::MonsterIsFight;
  641. (*s_FunctionList2)["SetMonsterFight"] = &CScript::SetMonsterFight;
  642. (*s_FunctionList2)["CallFriendAttack"] = &CScript::CallFriendAttack;
  643. (*s_FunctionList2)["CallMonsterAttack"] = &CScript::CallMonsterAttack;
  644. (*s_FunctionList2)["MonsterAttackObjectByAround"] = &CScript::MonsterAttackObjectByAround;
  645. (*s_FunctionList2)["MonsterAttackObject"] = &CScript::MonsterAttackObject;
  646. (*s_FunctionList2)["SetMonsterDir"] = &CScript::SetMonsterDir;
  647. (*s_FunctionList2)["ReLiveMonster"] = &CScript::ReLiveMonster;
  648. (*s_FunctionList2)["GetMonsterTarget"] = &CScript::GetMonsterTarget;
  649. (*s_FunctionList2)["SetMonsterTarget"] = &CScript::SetMonsterTarget;
  650. (*s_FunctionList2)["GetMonsterPos"] = &CScript::GetMonsterPos;
  651. (*s_FunctionList2)["CreateMonster"] = &CScript::CreateMonster;
  652. (*s_FunctionList2)["CreateMonsterEx"] = &CScript::CreateMonsterEx;
  653. (*s_FunctionList2)["DelMonster"] = &CScript::DelMonster;
  654. (*s_FunctionList2)["DelMonsterEx"] = &CScript::DelMonsterEx;
  655. (*s_FunctionList2)["DelMonsterRect"] = &CScript::DelMonsterRect;
  656. (*s_FunctionList2)["KillMonster"] = &CScript::KillMonster;
  657. (*s_FunctionList2)["GetMonsterRefeashTime"] = &CScript::GetMonsterRefeashTime;
  658. (*s_FunctionList2)["GetPlayerByDistance"] = &CScript::GetPlayerByDistance;
  659. (*s_FunctionList2)["GetDistanceFromPlayer"] = &CScript::GetDistanceFromPlayer;
  660. (*s_FunctionList2)["GetAttackablePlayer"] = &CScript::GetAttackablePlayer;
  661. (*s_FunctionList2)["ChooseTargetByOccu"] = &CScript::ChooseTargetByOccu;
  662. //-----------------------------------------------------
  663. //采集物相关函数
  664. (*s_FunctionList2)["CreateCollection"] = &CScript::CreateCollection;
  665. (*s_FunctionList2)["CreateCollectionEx"] = &CScript::CreateCollectionEx;
  666. (*s_FunctionList2)["DelCollection"] = &CScript::DelCollection;
  667. //-----------------------------------------------------
  668. //建物相关函数
  669. //对门的操作
  670. (*s_FunctionList2)["SetDoor"] = &CScript::SetDoor;
  671. (*s_FunctionList2)["GetDoor"] = &CScript::GetDoor;
  672. //-----------------------------------------------------
  673. //角色相关函数
  674. //1.基本函数
  675. (*s_FunctionList2)["ChangeMe"] = &CScript::ChangeMe;
  676. (*s_FunctionList2)["GetMe"] = &CScript::GetMe;
  677. (*s_FunctionList2)["SetMe"] = &CScript::SetMe;
  678. (*s_FunctionList2)["ChangeDest"] = &CScript::ChangeDest;
  679. (*s_FunctionList2)["GetDest"] = &CScript::GetDest;
  680. (*s_FunctionList2)["SetDest"] = &CScript::SetDest;
  681. (*s_FunctionList2)["SetPlayerPos"] = &CScript::SetPlayerPos;
  682. (*s_FunctionList2)["SetPlayerDir"] = &CScript::SetPlayerDir;
  683. (*s_FunctionList2)["AddAreaCreditByAreaId"] = &CScript::AddAreaCreditByAreaId;
  684. (*s_FunctionList2)["AddAreaCredit"] = &CScript::AddAreaCredit;
  685. (*s_FunctionList2)["SetAreaCredit"] = &CScript::SetAreaCredit;
  686. (*s_FunctionList2)["SetAreaCreditByAreaId"] = &CScript::SetAreaCreditByAreaId;
  687. (*s_FunctionList2)["GetAreaCredit"] = &CScript::GetAreaCredit;
  688. (*s_FunctionList2)["GetAreaCreditLevel"] = &CScript::GetAreaCreditLevel;
  689. (*s_FunctionList2)["GetOrganCreditLevel"] = & CScript::GetOrganCreditLevel;
  690. (*s_FunctionList2)["AddOrganCredit"] = & CScript::AddOrganCredit;
  691. (*s_FunctionList2)["SetOrganCredit"] = & CScript::SetOrganCredit;
  692. (*s_FunctionList2)["GetCountry"] = &CScript::GetCountry;
  693. (*s_FunctionList2)["ChangeCountry"] = &CScript::ChangeCountry;
  694. (*s_FunctionList2)["GetContribute"] = &CScript::GetContribute;
  695. (*s_FunctionList2)["SetContribute"] = &CScript::SetContribute;
  696. (*s_FunctionList2)["IsCharged"] = &CScript::IsCharged;
  697. (*s_FunctionList2)["SetCharged"] = &CScript::SetCharged;
  698. (*s_FunctionList2)["GetName"] = &CScript::GetName;
  699. (*s_FunctionList2)["ChangePlayer"] = &CScript::ChangePlayer;
  700. (*s_FunctionList2)["SetPlayer"] = &CScript::SetPlayer;
  701. (*s_FunctionList2)["GetPlayer"] = &CScript::GetPlayer;
  702. (*s_FunctionList2)["SetPlayerLevel"] = &CScript::SetPlayerLevel;
  703. (*s_FunctionList2)["IsPlayerOnline"] = &CScript::IsPlayerOnline;
  704. (*s_FunctionList2)["ChangeMoneyByName"] = &CScript::ChangeMoneyByName;
  705. (*s_FunctionList2)["GetMoneyByName"] = &CScript::GetMoneyByName;
  706. (*s_FunctionList2)["SetMoneyByName"] = &CScript::SetMoneyByName;
  707. (*s_FunctionList2)["ChangeSilverByName"] = &CScript::ChangeSilverByName;
  708. (*s_FunctionList2)["GetSilverByName"] = &CScript::GetSilverByName;
  709. (*s_FunctionList2)["SetSilverByName"] = &CScript::SetSilverByName;
  710. (*s_FunctionList2)["AddTicketByName"] = &CScript::AddTicketByName;
  711. (*s_FunctionList2)["GetTicketByName"] = &CScript::GetTicketByName;
  712. (*s_FunctionList2)["SetPlayerExp"] = &CScript::SetPlayerExp;
  713. (*s_FunctionList2)["ChangePlayerExp"] = &CScript::ChangePlayerExp;
  714. (*s_FunctionList2)["SetPlayerOccuExp"] = &CScript::SetPlayerOccuExp;
  715. (*s_FunctionList2)["ChangePlayerOccuExp"] = &CScript::ChangePlayerOccuExp;
  716. (*s_FunctionList2)["GetPlayerOccuExp"] = &CScript::GetPlayerOccuExp;
  717. (*s_FunctionList2)["SetPlayerOccuLvl"] = &CScript::SetPlayerOccuLvl;
  718. (*s_FunctionList2)["GetPlayerOccuLvl"] = &CScript::GetPlayerOccuLvl;
  719. (*s_FunctionList2)["SetPlayerOccuSp"] = &CScript::SetPlayerOccuSp;
  720. (*s_FunctionList2)["ChangePlayerOccuSp"] = &CScript::ChangePlayerOccuSp;
  721. (*s_FunctionList2)["GetPlayerOccuSp"] = &CScript::GetPlayerOccuSp;
  722. (*s_FunctionList2)["ChangePlayerOccuExpSp"] = &CScript::ChangePlayerOccuExpSp;
  723. (*s_FunctionList2)["IsGM"] = &CScript::IsGM;
  724. (*s_FunctionList2)["ShowPlayerInfo"] = &CScript::ShowPlayerInfo;
  725. (*s_FunctionList2)["ShowPlayerGoods"] = &CScript::ShowPlayerGoods;
  726. (*s_FunctionList2)["ShowGeneralVariable"] = &CScript::ShowGeneralVariable;
  727. (*s_FunctionList2)["DurancePlayer"] = &CScript::DurancePlayer;
  728. (*s_FunctionList2)["CheckReliveByOrigin"] = &CScript::CheckReliveByOrigin;
  729. (*s_FunctionList2)["CheckReliveGoods"] = &CScript::CheckReliveGoods;
  730. (*s_FunctionList2)["Onstate"] = &CScript::Onstate;
  731. (*s_FunctionList2)["GetActive"] = &CScript::GetActive;
  732. (*s_FunctionList2)["AddActive"] = &CScript::AddActive;
  733. (*s_FunctionList2)["TakeActive"] = &CScript::TakeActive;
  734. (*s_FunctionList2)["ResetActive"] = &CScript::ResetActive;
  735. (*s_FunctionList2)["GetServer"] = &CScript::GetServer;
  736. (*s_FunctionList2)["GetOtherOneInMarriageTeam"] = &CScript::GetOtherOneInMarriageTeam;
  737. (*s_FunctionList2)["GetPlayerMarriageStep"] = &CScript::GetPlayerMarriageStep;
  738. (*s_FunctionList2)["SetPlayerMarriageStep"] = &CScript::SetPlayerMarriageStep;
  739. (*s_FunctionList2)["SetPlayerSpouse"] = &CScript::SetPlayerSpouse;
  740. (*s_FunctionList2)["DelPlayerSpouse"] = &CScript::DelPlayerSpouse;
  741. (*s_FunctionList2)["GetPlayerSpouse"] = &CScript::GetPlayerSpouse;
  742. (*s_FunctionList2)["GetPlayerSpouseName"] = &CScript::GetPlayerSpouseName;
  743. (*s_FunctionList2)["GetElementProperty"] = &CScript::GetElementProperty;
  744. (*s_FunctionList2)["SetElementProperty"] = &CScript::SetElementProperty;
  745. (*s_FunctionList2)["SetActiveRatio"] = &CScript::SetActiveRatio;
  746. (*s_FunctionList2)["GetActiveRatio"] = &CScript::GetActiveRatio;
  747. (*s_FunctionList2)["GetCostYuanBao"] = &CScript::GetCostYuanBao;
  748. //稳定挂机时间
  749. (*s_FunctionList2)["SetStableHookTime"] = &CScript::SetStableHookTime;
  750. (*s_FunctionList2)["AddStableHookTime"] = &CScript::AddStableHookTime;
  751. (*s_FunctionList2)["GetStableHookTime"] = &CScript::GetStableHookTime;
  752. //2.扩展函数
  753. (*s_FunctionList2)["GetOccuValueRatio"] = &CScript::GetOccuValueRatio;
  754. (*s_FunctionList2)["GetOccuLvlCoe"] = &CScript::GetOccuLvlCoe;
  755. (*s_FunctionList2)["ChangeOccu"] = &CScript::ChangeOccu;
  756. (*s_FunctionList2)["CheckLevel"] = &CScript::CheckLevel;
  757. (*s_FunctionList2)["CheckOccuLvl"] = &CScript::CheckOccuLvl;
  758. (*s_FunctionList2)["ReLive"] = &CScript::ReLive;
  759. (*s_FunctionList2)["ScriptIsRun"] = &CScript::ScriptIsRun;
  760. (*s_FunctionList2)["RemoveScript"] = &CScript::RemoveScript;
  761. (*s_FunctionList2)["AutoMove"] = &CScript::AutoMove;
  762. (*s_FunctionList2)["MovePlayer"] = &CScript::MovePlayer;
  763. (*s_FunctionList2)["GodMode"] = &CScript::GodMode;
  764. (*s_FunctionList2)["ResidentMode"] = &CScript::ResidentMode;
  765. //-----------------------------------------------------
  766. //物品相关函数
  767. (*s_FunctionList2)["AddGoods"] = &CScript::AddGoods;
  768. (*s_FunctionList2)["AddArmament"] = &CScript::AddArmament;
  769. (*s_FunctionList2)["AddArmamentForGM"] = &CScript::AddArmamentForGM;
  770. (*s_FunctionList2)["DelGoods"] = &CScript::DelGoods;
  771. (*s_FunctionList2)["AddGoodsToRgn"] = &CScript::AddGoodsToRgn;
  772. (*s_FunctionList2)["CheckGoods"] = &CScript::CheckGoods;
  773. (*s_FunctionList2)["CheckGoodsInBank"] = &CScript::CheckGoodsInBank;
  774. (*s_FunctionList2)["OpenGoodsExWindow"] = &CScript::OpenGoodsExWindow;
  775. (*s_FunctionList2)["BindGoods"] = &CScript::BindGoods;
  776. (*s_FunctionList2)["FrostGoods"] = &CScript::FrostGoods;
  777. (*s_FunctionList2)["CheckSpace"] = &CScript::CheckSpace;
  778. (*s_FunctionList2)["GetGoodsNum"] = &CScript::GetGoodsNum;
  779. (*s_FunctionList2)["GetGoodsFree"] = &CScript::GetGoodsFree;
  780. (*s_FunctionList2)["GetEquipIDByPos"] = &CScript::GetEquipIDByPos;
  781. (*s_FunctionList2)["GetEquipNameByPos"] = &CScript::GetEquipNameByPos;
  782. (*s_FunctionList2)["GetPlayerGoodsAddonProperty"] = &CScript::GetPlayerGoodsAddonProperty;
  783. (*s_FunctionList2)["SetPlayerGoodsAddonProperty"] = &CScript::SetPlayerGoodsAddonProperty;
  784. (*s_FunctionList2)["GetGoodsBaseType"] = &CScript::GetGoodsBaseType;
  785. (*s_FunctionList2)["OpenGoodsEnchase"] = &CScript::OpenGoodsEnchase;
  786. (*s_FunctionList2)["DelPlayerGoods"] = &CScript::DelPlayerGoods;
  787. (*s_FunctionList2)["DelUsedGoods"] = &CScript::DelUsedGoods;
  788. (*s_FunctionList2)["CheckUsedGoods"] = &CScript::CheckUsedGoods;
  789. (*s_FunctionList2)["GetUsedGoodsPropertiy1"] = &CScript::GetUsedGoodsPropertiy1;
  790. (*s_FunctionList2)["GetUsedGoodsPropertiy2"] = &CScript::GetUsedGoodsPropertiy2;
  791. (*s_FunctionList2)["SetUsedGoodsPropertiy1"] = &CScript::SetUsedGoodsPropertiy1;
  792. (*s_FunctionList2)["SetUsedGoodsPropertiy2"] = &CScript::SetUsedGoodsPropertiy2;
  793. (*s_FunctionList2)["BuyGoods"] = &CScript::BuyGoods;
  794. (*s_FunctionList2)["GetGoodsAddonProperty"] = &CScript::GetGoodsAddonProperty;
  795. (*s_FunctionList2)["FullRefine"] = &CScript::FullRefine;
  796. (*s_FunctionList2)["GetWeaponStr"] = &CScript::GetWeaponStr;
  797. (*s_FunctionList2)["AddMedal"] = &CScript::AddMedal;
  798. (*s_FunctionList2)["DelMedal"] = &CScript::DelMedal;
  799. (*s_FunctionList2)["GetMedal"] = &CScript::GetMedal;
  800. (*s_FunctionList2)["GetMedalNum"] = &CScript::GetMedalNum;
  801. (*s_FunctionList2)["GetShowMedalName"] = &CScript::GetShowMedalName;
  802. (*s_FunctionList2)["IsEquipEnchased"] = &CScript::IsEquipEnchased;
  803. (*s_FunctionList2)["GetGoodsDisplayName"] = &CScript::GetGoodsDisplayName;
  804. (*s_FunctionList2)["BeginMake"] = &CScript::BeginMake;
  805. (*s_FunctionList2)["FinishMake"] = &CScript::FinishMake;
  806. (*s_FunctionList2)["BackToCity"] = &CScript::BackToCity;
  807. (*s_FunctionList2)["BeginContainerGoodsOpt"] = &CScript::BeginContainerGoodsOpt;
  808. (*s_FunctionList2)["GetOptGoodsInContainer"] = &CScript::GetOptGoodsInContainer;
  809. (*s_FunctionList2)["PutOptGoodsInContainer"] = &CScript::PutOptGoodsInContainer;
  810. (*s_FunctionList2)["RemoveOptGoodsInContainer"] = &CScript::RemoveOptGoodsInContainer;
  811. (*s_FunctionList2)["RefreshContainerTxt"] = &CScript::RefreshContainerTxt;
  812. (*s_FunctionList2)["RefreshContainerGold"] = &CScript::RefreshContainerGold;
  813. (*s_FunctionList2)["EndContainerGoodsOpt"] = &CScript::EndContainerGoodsOpt;
  814. (*s_FunctionList2)["GetGoodsOriginalName"] = &CScript::GetGoodsOriginalName;
  815. (*s_FunctionList2)["GetGoodsAddonPropertyValues"] = &CScript::GetGoodsAddonPropertyValues;
  816. (*s_FunctionList2)["SetGoodsAddonPropertyValues"] = &CScript::SetGoodsAddonPropertyValues;
  817. (*s_FunctionList2)["ResetGoodsStochastic"] = &CScript::ResetGoodsStochastic;
  818. (*s_FunctionList2)["DelGoodsByGuid"] = &CScript::DelGoodsByGuid;
  819. (*s_FunctionList2)["AddGoodsReturnGuid"] = &CScript::AddGoodsReturnGuid;
  820. (*s_FunctionList2)["IsFrostGoods"] = &CScript::IsFrostGoods;
  821. (*s_FunctionList2)["GetUsedGoodsOriginalName"] = &CScript::GetUsedGoodsOriginalName;
  822. (*s_FunctionList2)["GetUsedGoodsGuid"] = &CScript::GetUsedGoodsGuid;
  823. (*s_FunctionList2)["UploadGoods"] = &CScript::UploadGoods;
  824. (*s_FunctionList2)["SetAddonDesc"] = &CScript::SetAddonDesc;
  825. (*s_FunctionList2)["GetAddonDesc"] = &CScript::GetAddonDesc;
  826. (*s_FunctionList2)["AddGoodsToServer"] = &CScript::AddGoodsToServer;
  827. (*s_FunctionList2)["AddGoodsToClient"] = &CScript::AddGoodsToClient;
  828. //-----------------------------------------------------
  829. //任务相关函数
  830. (*s_FunctionList2)["AddQuest"] = &CScript::AddQuest;
  831. (*s_FunctionList2)["GetCurrentMasterRoleID"] = &CScript::GetCurrentMasterRoleID;
  832. (*s_FunctionList2)["CompleteQuest"] = &CScript::CompleteQuest;
  833. (*s_FunctionList2)["DisbandQuest"] = &CScript::DisbandQuest;
  834. (*s_FunctionList2)["GetQuestState"] = &CScript::GetQuestState;
  835. (*s_FunctionList2)["GetValidQuestNum"] = &CScript::GetValidQuestNum;
  836. (*s_FunctionList2)["UpdateQuestStep"] = &CScript::UpdateQuestStep;
  837. (*s_FunctionList2)["UpdateQuestParamData"] = &CScript::UpdateQuestParamData;
  838. (*s_FunctionList2)["UpdateQuestData"] = &CScript::UpdateQuestData;
  839. (*s_FunctionList2)["GetMercQuest"] = &CScript::GetMercQuest;
  840. (*s_FunctionList2)["SetMercQuest"] = &CScript::SetMercQuest;
  841. (*s_FunctionList2)["GetRoleStepNum"] = &CScript::GetRoleStepNum;
  842. (*s_FunctionList2)["GetParam"] = &CScript::GetParam;
  843. (*s_FunctionList2)["GetRoleAccParam"] = &CScript::GetRoleAccParam;
  844. (*s_FunctionList2)["SetRoleAccParam"] = &CScript::SetRoleAccParam;
  845. (*s_FunctionList2)["AddRoleAccParam"] = &CScript::AddRoleAccParam;
  846. (*s_FunctionList2)["GetRoleRegionID"] = &CScript::GetRoleRegionID;
  847. (*s_FunctionList2)["SetRoleRegionID"] = &CScript::SetRoleRegionID;
  848. (*s_FunctionList2)["GetRoleRegionX"] = &CScript::GetRoleRegionX;
  849. (*s_FunctionList2)["SetRoleRegionX"] = &CScript::SetRoleRegionX;
  850. (*s_FunctionList2)["GetRoleRegionY"] = &CScript::GetRoleRegionY;
  851. (*s_FunctionList2)["SetRoleRegionY"] = &CScript::SetRoleRegionY;
  852. (*s_FunctionList2)["GetRoleSum"] = &CScript::GetRoleSum;
  853. (*s_FunctionList2)["GetChapter"] = &CScript::GetChapter;
  854. (*s_FunctionList2)["SetChapter"] = &CScript::SetChapter;
  855. (*s_FunctionList2)["AddFinishedRoleRecord"] = &CScript::AddFinishedRoleRecord;
  856. (*s_FunctionList2)["DelFinishedRoleRecord"] = &CScript::DelFinishedRoleRecord;
  857. (*s_FunctionList2)["GetRoleFinishedRecord"] = &CScript::GetRoleFinishedRecord;
  858. (*s_FunctionList2)["GetStepText"] = &CScript::GetStepText;
  859. (*s_FunctionList2)["GetText"] = &CScript::GetText;
  860. (*s_FunctionList2)["GetTextType"] = &CScript::GetTextType;
  861. (*s_FunctionList2)["GetAttributeRoleName"] = &CScript::GetAttributeRoleName;
  862. (*s_FunctionList2)["GetAttributeBeRecord"] = &CScript::GetAttributeBeRecord;
  863. (*s_FunctionList2)["GetAttributeRoleType"] = &CScript::GetAttributeRoleType;
  864. (*s_FunctionList2)["GetAttributeEmbracerNPCID"] = &CScript::GetAttributeEmbracerNPCID;
  865. (*s_FunctionList2)["GetAttributeShowAble"] = &CScript::GetAttributeShowAble;
  866. (*s_FunctionList2)["GetAttributeExpRatio"] = &CScript::GetAttributeExpRatio;
  867. (*s_FunctionList2)["GetAttributeRepeated"] = &CScript::GetAttributeRepeated;
  868. (*s_FunctionList2)["GetAttributeDeadLost"] = &CScript::GetAttributeDeadLost;
  869. (*s_FunctionList2)["GetAttributeLostRepeated"] = &CScript::GetAttributeLostRepeated;
  870. (*s_FunctionList2)["GetAttributeMinGrade"] = &CScript::GetAttributeMinGrade;
  871. (*s_FunctionList2)["GetAttributeMaxGrade"] = &CScript::GetAttributeMaxGrade;
  872. (*s_FunctionList2)["GetAttributeOccupationRestrict"] = &CScript::GetAttributeOccupationRestrict;
  873. (*s_FunctionList2)["GetAttributeEngageArmsRepute"] = &CScript::GetAttributeEngageArmsRepute;
  874. (*s_FunctionList2)["GetAttributeChapterNum"] = &CScript::GetAttributeChapterNum;
  875. (*s_FunctionList2)["GetAttributeNextRoleID"] = &CScript::GetAttributeNextRoleID;
  876. (*s_FunctionList2)["GetLabelPrefix"] = &CScript::GetLabelPrefix;
  877. (*s_FunctionList2)["GetLabelSum"] = &CScript::GetLabelSum;
  878. (*s_FunctionList2)["GetAimAMTType"] = &CScript::GetAimAMTType;
  879. (*s_FunctionList2)["GetAimType"] = &CScript::GetAimType;
  880. (*s_FunctionList2)["GetAimId"] = &CScript::GetAimId;
  881. (*s_FunctionList2)["GetAimNum"] = &CScript::GetAimNum;
  882. (*s_FunctionList2)["GetAimParameIndex"] = &CScript::GetAimParameIndex;
  883. (*s_FunctionList2)["GetDropFrom"] = &CScript::GetDropFrom;
  884. (*s_FunctionList2)["GetDropOdds"] = &CScript::GetDropOdds;
  885. (*s_FunctionList2)["GetAimName"] = &CScript::GetAimName;
  886. (*s_FunctionList2)["GetPrepareParam"] = &CScript::GetPrepareParam;
  887. (*s_FunctionList2)["GetStepEncouragementSum"] = &CScript::GetStepEncouragementSum;
  888. (*s_FunctionList2)["GetQuestEncouragementSum"] = &CScript::GetQuestEncouragementSum;
  889. (*s_FunctionList2)["GetSetpEncouragementName"] = &CScript::GetSetpEncouragementName;
  890. (*s_FunctionList2)["GetQuestEncouragementName"] = &CScript::GetQuestEncouragementName;
  891. (*s_FunctionList2)["GetSetpEncouragementType"] = &CScript::GetSetpEncouragementType;
  892. (*s_FunctionList2)["GetQuestEncouragementType"] = &CScript::GetQuestEncouragementType;
  893. (*s_FunctionList2)["GetSetpEncouragementID"] = &CScript::GetSetpEncouragementID;
  894. (*s_FunctionList2)["GetQuestEncouragementID"] = &CScript::GetQuestEncouragementID;
  895. (*s_FunctionList2)["GetSetpEncouragementNum"] = &CScript::GetSetpEncouragementNum;
  896. (*s_FunctionList2)["GetQuestEncouragementNum"] = &CScript::GetQuestEncouragementNum;
  897. (*s_FunctionList2)["GetStepEncouragementCell"] = &CScript::GetStepEncouragementCell;
  898. (*s_FunctionList2)["GetQuestEncouragementCell"] = &CScript::GetQuestEncouragementCell;
  899. (*s_FunctionList2)["GetStepSum"] = &CScript::GetStepSum;
  900. (*s_FunctionList2)["GetStepAimNum"] = &CScript::GetStepAimNum;
  901. (*s_FunctionList2)["FindRoleIsInSystem"] = &CScript::FindRoleIsInSystem;
  902. (*s_FunctionList2)["FindRoleStepIsInSystem"] = &CScript::FindRoleStepIsInSystem;
  903. (*s_FunctionList2)["ResetMercQuestUpdateTime"] = &CScript::ResetMercQuestUpdateTime;
  904. (*s_FunctionList2)["AcquireMercQuest"] = &CScript::AcquireMercQuest;
  905. (*s_FunctionList2)["SendMercQuestToClient"] = &CScript::SendMercQuestToClient;
  906. (*s_FunctionList2)["OpenMercQuestInterface"] = &CScript::OpenMercQuestInterface;
  907. (*s_FunctionList2)["GetMercQuestData"] = &CScript::GetMercQuestData;
  908. (*s_FunctionList2)["SetMercQuestData"] = &CScript::SetMercQuestData;
  909. (*s_FunctionList2)["GetQuestMassPoint"] = &CScript::GetQuestMassPoint;
  910. (*s_FunctionList2)["UpdateAllMercQuestList"] = &CScript::ResetAllMercQuestData;
  911. (*s_FunctionList2)["IsInMercQuestList"] = &CScript::IsInMercQuestList;
  912. (*s_FunctionList2)["SetMasterQuest"] = &CScript::SetMasterQuest;
  913. (*s_FunctionList2)["SetRoleProtect"] = &CScript::SetRoleProtect;
  914. (*s_FunctionList2)["OpenShareQuestInterface"] = &CScript::OpenShareQuestInterface;
  915. (*s_FunctionList2)["GetTeamCurrQuest"] = &CScript::GetTeamCurrQuest;
  916. (*s_FunctionList2)["SetTeamCurrQuest"] = &CScript::SetTeamCurrQuest;
  917. (*s_FunctionList2)["DelTeamShareQuest"] = &CScript::DelTeamShareQuest;
  918. (*s_FunctionList2)["IsCompleteQuest"] = &CScript::IsCompleteQuest;
  919. (*s_FunctionList2)["GetQuestOdds"] = &CScript::GetQuestOdds;
  920. (*s_FunctionList2)["CanAcceptMercQuest"] = &CScript::CanAcceptMercQuest;
  921. (*s_FunctionList2)["OpenIndexQuestInterface"] = &CScript::OpenIndexQuestInterface;
  922. (*s_FunctionList2)["SetIndexQuestParamNum"] = &CScript::SetIndexQuestParamNum;
  923. (*s_FunctionList2)["SetIndexQuestState"] = &CScript::SetIndexQuestState;
  924. (*s_FunctionList2)["ResetIndexQuest"] = &CScript::ResetIndexQuest;
  925. //-----------------------------------------------------
  926. //副职业相关函数
  927. (*s_FunctionList2)["CanCollect"] = &CScript::CanCollect;
  928. (*s_FunctionList2)["CanCheckCollect"] = &CScript::CanCheckCollect;
  929. (*s_FunctionList2)["CheckCollect"] = &CScript::CheckCollect;
  930. (*s_FunctionList2)["LockCollection"] = &CScript::LockCollection;
  931. (*s_FunctionList2)["OutlockCollection"] = &CScript::OutlockCollection;
  932. (*s_FunctionList2)["CanFacture"] = &CScript::CanFacture;
  933. (*s_FunctionList2)["Facture"] = &CScript::Facture;
  934. (*s_FunctionList2)["FactureSkillStudyBegin"] = &CScript::FactureSkillStudyBegin;
  935. (*s_FunctionList2)["ClearFactureList"] = &CScript::ClearFactureList;
  936. (*s_FunctionList2)["AddFacture"] = &CScript::AddFacture;
  937. (*s_FunctionList2)["DelFacture"] = &CScript::DelFacture;
  938. (*s_FunctionList2)["FindFacture"] = &CScript::FindFacture;
  939. (*s_FunctionList2)["GetFactureNeedsLevel"] = &CScript::GetFactureNeedsLevel;
  940. (*s_FunctionList2)["GetFactureNeedsDOccu"] = &CScript::GetFactureNeedsDOccu;
  941. (*s_FunctionList2)["UpdateEffect"] = &CScript::UpdateEffect;
  942. (*s_FunctionList2)["AddFactureExp"] = &CScript::AddFactureExp;
  943. (*s_FunctionList2)["AddCollectionExp"] = &CScript::AddCollectionExp;
  944. //-----------------------------------------------------
  945. //技能状态相关函数
  946. //1、基本技能相关的函数
  947. (*s_FunctionList2)["AddState"] = &CScript::AddState;
  948. (*s_FunctionList2)["AddSkill"] = &CScript::AddSkill;
  949. (*s_FunctionList2)["DelSkill"] = &CScript::DelSkill;
  950. (*s_FunctionList2)["SetSkillLevel"] = &CScript::SetSkillLevel;
  951. (*s_FunctionList2)["GetSkillLevel"] = &CScript::GetSkillLevel;
  952. (*s_FunctionList2)["CheckStudySkill"] = &CScript::CheckStudySkill;
  953. (*s_FunctionList2)["GetAllStateNum"] = &CScript::GetAllStateNum;
  954. (*s_FunctionList2)["DelNewState"] = &CScript::DelNewState;
  955. (*s_FunctionList2)["DelDeBuff"] = &CScript::DelDeBuff;
  956. (*s_FunctionList2)["AddStateToShape"] = &CScript::AddStateToShape;
  957. (*s_FunctionList2)["DelAllBuff"] = &CScript::DelAllBuff;
  958. (*s_FunctionList2)["Modulus"] = &CScript::Modulus;
  959. //2、技能脚本中用到的函数
  960. (*s_FunctionList2)["AddNewState"] = &CScript::AddNewState;
  961. (*s_FunctionList2)["RemoverNewState"] = &CScript::RemoverNewState;
  962. (*s_FunctionList2)["SetMoveShapeAttrEx"] = &CScript::SetMoveShapeAttrEx;
  963. (*s_FunctionList2)["GetMoveShapeAttrEx"] = &CScript::GetMoveShapeAttrEx;
  964. (*s_FunctionList2)["ChangeMoveShapeAttrEx"] = &CScript::ChangeMoveShapeAttrEx;
  965. (*s_FunctionList2)["AddDeBuffToObj"] = &CScript::AddDeBuffToObj;
  966. (*s_FunctionList2)["ReLiveSkill"] = &CScript::ReLiveSkill;
  967. (*s_FunctionList2)["SetEventDestObj"] = &CScript::SetEventDestObj;
  968. (*s_FunctionList2)["GetBaseModuleLv"] = &CScript::GetBaseModuleLv;
  969. (*s_FunctionList2)["GetDistance"] = &CScript::GetDistance;
  970. (*s_FunctionList2)["GetPkResult"] = &CScript::GetPkResult;
  971. (*s_FunctionList2)["GetObjectType"] = &CScript::GetObjectType;
  972. (*s_FunctionList2)["GetShieldNO"] = &CScript::GetShieldNO;
  973. (*s_FunctionList2)["SendSkillList"] = &CScript::SendSkillList;
  974. (*s_FunctionList2)["SetTarget"] = &CScript::SetTarget;
  975. (*s_FunctionList2)["GetDesEnergyRatio"] = &CScript::GetDesEnergyRatio;
  976. (*s_FunctionList2)["GetEnergyRatio"] = &CScript::GetEnergyRatio;
  977. (*s_FunctionList2)["DeductEnergy"] = &CScript::DeductEnergy;
  978. (*s_FunctionList2)["GetSkillParam"] = &CScript::GetSkillParam;
  979. (*s_FunctionList2)["GetSkillElement"] = &CScript::GetSkillElement;
  980. (*s_FunctionList2)["GetSkillUseType"] = &CScript::GetSkillUseType;
  981. (*s_FunctionList2)["GetStateParamByID"] = &CScript::GetStateParamByID;
  982. (*s_FunctionList2)["GetStateParamByIndex"] = &CScript::GetStateParamByIndex;
  983. (*s_FunctionList2)["CheckStateFirer"] = &CScript::CheckStateFirer;
  984. (*s_FunctionList2)["BeedAttackEvent"] = &CScript::BeedAttackEvent;
  985. (*s_FunctionList2)["GetSkillLv"] = &CScript::GetSkillLv;
  986. (*s_FunctionList2)["ReLiveInScript"] = &CScript::ReLiveInScript;
  987. (*s_FunctionList2)["BeginUseSkill"] = &CScript::BeginUseSkill;
  988. (*s_FunctionList2)["GetGuidByParam"] = &CScript::GetGuidByParam;
  989. (*s_FunctionList2)["RunScriptByDest"] = &CScript::RunScriptByDest;
  990. (*s_FunctionList2)["GetGoodsAddProperty"] = &CScript::GetGoodsAddProperty;
  991. (*s_FunctionList2)["GetGoodsPlacePos"] = &CScript::GetGoodsPlacePos;
  992. (*s_FunctionList2)["DelGoodsByPlacePos"] = &CScript::DelGoodsByPlacePos;
  993. (*s_FunctionList2)["SucceedUseItem"] = &CScript::SucceedUseItem;
  994. (*s_FunctionList2)["GetActModify"] = &CScript::GetActModify;
  995. (*s_FunctionList2)["SendUnLockGoodsMsg"] = &CScript::SendUnLockGoodsMsg;
  996. (*s_FunctionList2)["GetBeneficiaryInfo"] = &CScript::GetBeneficiaryInfo;
  997. (*s_FunctionList2)["GetKillerInfo"] = &CScript::GetKillerInfo;
  998. (*s_FunctionList2)["GetModType"] = &CScript::GetModType;
  999. (*s_FunctionList2)["GetAttackerType"] = &CScript::GetAttackerType;
  1000. (*s_FunctionList2)["GetFunMoHua"] = &CScript::GetFunMoHua;
  1001. (*s_FunctionList2)["GetBModifier"] = &CScript::GetBModifier;
  1002. (*s_FunctionList2)["GetPrevent"] = &CScript::GetPrevent;
  1003. (*s_FunctionList2)["GetPartDamageOut"] = &CScript::GetPartDamageOut;
  1004. (*s_FunctionList2)["OnCostYuanBao"] = &CScript::OnCostYuanBao;
  1005. //-----------------------------------------------------
  1006. //定义了和客户端交互,客户端可视相关的脚本函数
  1007. (*s_FunctionList2)["AddInfo"] = &CScript::AddInfo;
  1008. (*s_FunctionList2)["AddDestInfo"] = &CScript::AddDestInfo;
  1009. (*s_FunctionList2)["AddInfoByIndex"] = &CScript::AddInfoByIndex;
  1010. (*s_FunctionList2)["GameMessage"] = &CScript::GameMessage;
  1011. (*s_FunctionList2)["TalkBox"] = &CScript::TalkBox;
  1012. (*s_FunctionList2)["PicTalkBox"] = &CScript::PicTalkBox;
  1013. (*s_FunctionList2)["EndTalkBox"] = &CScript::EndTalkBox;
  1014. (*s_FunctionList2)["EndPixyTalkBox"] = &CScript::EndPixyTalkBox;
  1015. (*s_FunctionList2)["TalkBoxByIndex"] = &CScript::TalkBoxByIndex;
  1016. (*s_FunctionList2)["StoryTalkBox"] = &CScript::StoryTalkBox;
  1017. (*s_FunctionList2)["StoryTalkBoxByIndex"] = &CScript::StoryTalkBoxByIndex;
  1018. (*s_FunctionList2)["PixyTalkBox"] = &CScript::PixyTalkBox;
  1019. (*s_FunctionList2)["PixyTalkBoxByIndex"] = &CScript::PixyTalkBoxByIndex;
  1020. (*s_FunctionList2)["PlayEffectByIndex"] = &CScript::PlayEffectByIndex;
  1021. (*s_FunctionList2)["PlayerTalk"] = &CScript::PlayerTalk;
  1022. (*s_FunctionList2)["PlayerTalkByIndex"] = &CScript::PlayerTalkByIndex;
  1023. (*s_FunctionList2)["PackGlint"] = &CScript::PackGlint;
  1024. (*s_FunctionList2)["PostPlayerInfo"] = &CScript::PostPlayerInfo;
  1025. (*s_FunctionList2)["PostDestPlayerInfo"] = &CScript::PostDestPlayerInfo;
  1026. (*s_FunctionList2)["PostPlayerInfoByIndex"] = &CScript::PostPlayerInfoByIndex;
  1027. (*s_FunctionList2)["PostDestPlayerInfoByIndex"] = &CScript::PostDestPlayerInfoByIndex;
  1028. (*s_FunctionList2)["ShowString"] = &CScript::ShowString;
  1029. (*s_FunctionList2)["Weather"] = &CScript::Weather;
  1030. (*s_FunctionList2)["PlayEffect"] = &CScript::PlayEffect;
  1031. (*s_FunctionList2)["PlayAction"] = &CScript::PlayAction;
  1032. (*s_FunctionList2)["PlaySound"] = &CScript::PlaySound;
  1033. (*s_FunctionList2)["Play3DSound"] = &CScript::Play3DSound;
  1034. (*s_FunctionList2)["PlayBkMusic"] = &CScript::PlayBkMusic;
  1035. (*s_FunctionList2)["StopBkMusic"] = &CScript::StopBkMusic;
  1036. (*s_FunctionList2)["AddGoodToShortCutBar"] = &CScript::AddGoodToShortCutBar;
  1037. (*s_FunctionList2)["AddSkillToShortCutBar"] = &CScript::AddSkillToShortCutBar;
  1038. (*s_FunctionList2)["TransforCamera"] = &CScript::TransforCamera;
  1039. (*s_FunctionList2)["OperaInterface"] = &CScript::OperaInterface;
  1040. (*s_FunctionList2)["HelpHint"] = &CScript::HelpHint;
  1041. (*s_FunctionList2)["InterfaceHint"] = &CScript::InterfaceHint;
  1042. (*s_FunctionList2)["PlayVideo"] = &CScript::PlayVideo;
  1043. (*s_FunctionList2)["StopVideo"] = &CScript::StopVideo;
  1044. (*s_FunctionList2)["UpdateScriptVarValue"] = &CScript::UpdateScriptVarValue;
  1045. (*s_FunctionList2)["SendExpAction"] = &CScript::SendExpAction;
  1046. (*s_FunctionList2)["GetPlayerAllProperties"] = &CScript::GetPlayerAllProperties;
  1047. (*s_FunctionList2)["GetPlayerAllVariables"] = &CScript::GetPlayerAllVariables;
  1048. (*s_FunctionList2)["ViewPlayerAllVariableList"] = &CScript::ViewPlayerAllVariableList;
  1049. (*s_FunctionList2)["OpenReliveWindow"] = &CScript::OpenReliveWindow;
  1050. (*s_FunctionList2)["OpenReLiveByGoodsWindow"] = &CScript::OpenReLiveByGoodsWindow;
  1051. //-----------------------------------------------------
  1052. //队伍帮会组织相关函数
  1053. //1、队伍函数
  1054. (*s_FunctionList2)["GetTeamNum"] = &CScript::GetTeamNum;
  1055. (*s_FunctionList2)["GetTeamNumInRgn"] = &CScript::GetTeamNumInRgn;
  1056. (*s_FunctionList2)["GetTeamerName"] = &CScript::GetTeamerName;
  1057. (*s_FunctionList2)["GetTeamGUID"] = &CScript::GetTeamGUID;
  1058. (*s_FunctionList2)["GetPlayerTeamGUID"] = &CScript::GetPlayerTeamGUID;
  1059. (*s_FunctionList2)["IsTeamCaptain"] = &CScript::IsTeamCaptain;
  1060. (*s_FunctionList2)["CheckRgnOnlyTeam"] = &CScript::CheckRgnOnlyTeam;
  1061. (*s_FunctionList2)["GetTeamCaptainPos"] = &CScript::GetTeamCaptainPos;
  1062. (*s_FunctionList2)["SetRegionForTeam"] = &CScript::SetRegionForTeam;
  1063. (*s_FunctionList2)["SetTeamRegion"] = &CScript::SetTeamRegion;
  1064. (*s_FunctionList2)["IsTeammatesAroundMe"] = &CScript::IsTeammatesAroundMe;
  1065. (*s_FunctionList2)["InLvlDifference"] = &CScript::InLvlDifference;
  1066. (*s_FunctionList2)["InLvlSpace"] = &CScript::InLvlSpace;
  1067. (*s_FunctionList2)["RunScriptForTeam"] = &CScript::RunScriptForTeam;
  1068. //2.帮会组织
  1069. (*s_FunctionList2)["CreateFaction"] = &CScript::CreateFaction;
  1070. (*s_FunctionList2)["CreateUnion"] = &CScript::CreateUnion;
  1071. (*s_FunctionList2)["OpenApplyBoard"] = &CScript::OpenApplyBoard;
  1072. (*s_FunctionList2)["OpenFacIconBoard"] = &CScript::OpenFacIconBoard;
  1073. (*s_FunctionList2)["SetFactionRecruitState"] = &CScript::SetFactionRecruitState;
  1074. (*s_FunctionList2)["GetFactionLevel"] = &CScript::GetFactionLevel;
  1075. (*s_FunctionList2)["GetFactionIDByPlayerName"] = &CScript::GetFactionIDByPlayerName;
  1076. (*s_FunctionList2)["GetUinionIDByPlayerName"] = &CScript::GetUinionIDByPlayerName;
  1077. (*s_FunctionList2)["AddFacRes"] = &CScript::AddFacRes;
  1078. (*s_FunctionList2)["AddFacExp"] = &CScript::AddFacExp;
  1079. (*s_FunctionList2)["AddFacMemberContribute"] = &CScript::AddFacMemberContribute;
  1080. (*s_FunctionList2)["GetMemContribute"]=&CScript::GetMemContribute;
  1081. (*s_FunctionList2)["GetFacRes"]=&CScript::GetFacRes;
  1082. (*s_FunctionList2)["GetFacExp"]=&CScript::GetFacExp;
  1083. (*s_FunctionList2)["IsFacMaster"] = &CScript::IsFacMaster;
  1084. (*s_FunctionList2)["AddFacTickets"]=&CScript::AddFacTickets;
  1085. (*s_FunctionList2)["AddFacBaseBattle"]=&CScript::AddFacBaseBattle;
  1086. (*s_FunctionList2)["ChangeBaseInfo"]=&CScript::ChangeBaseInfo;
  1087. (*s_FunctionList2)["AddBattleVal"]=&CScript::AddBattleVal;
  1088. (*s_FunctionList2)["AddArmyInvest"]=&CScript::AddArmyInvest;
  1089. (*s_FunctionList2)["GetFacTickets"]=&CScript::GetFacTickets;
  1090. (*s_FunctionList2)["GetBattleVal"]=&CScript::GetBattleVal;
  1091. (*s_FunctionList2)["GetArmyInvest"]=&CScript::GetArmyInvest;
  1092. (*s_FunctionList2)["GetJoinBattle"]=&CScript::GetJoinBattle;
  1093. (*s_FunctionList2)["AddTech"]=&CScript::AddTech;
  1094. (*s_FunctionList2)["GetTechLv"]=&CScript::GetTechLv;
  1095. (*s_FunctionList2)["GetFactionName"]=&CScript::GetFactionName;
  1096. (*s_FunctionList2)["ChangeEnemy"]=&CScript::ChangeEnemy;
  1097. (*s_FunctionList2)["GetFacBaseBattle"]=&CScript::GetFacBaseBattle;
  1098. (*s_FunctionList2)["SendBaseInfo"]=&CScript::SendBaseInfo;
  1099. (*s_FunctionList2)["GetFacLevel"]=&CScript::GetFacLevel;
  1100. (*s_FunctionList2)["FacDisplay"]=&CScript::FacDisplay;
  1101. //队伍帮会组织相关函数
  1102. //1、场景相关函数
  1103. (*s_FunctionList2)["GetRgnAttr"] = &CScript::GetRgnAttr;
  1104. (*s_FunctionList2)["SetRgnAttr"] = &CScript::SetRgnAttr;
  1105. (*s_FunctionList2)["GetCellType"] = &CScript::GetCellType;
  1106. (*s_FunctionList2)["RegionIsExit"] = &CScript::RegionIsExit;
  1107. (*s_FunctionList2)["GetRegionID"] = &CScript::GetRegionID;
  1108. (*s_FunctionList2)["GetMapInfo"] = &CScript::GetMapInfo;
  1109. (*s_FunctionList2)["GetCountryOwningRegion"] = &CScript::GetCountryOwningRegion;
  1110. (*s_FunctionList2)["SetBlock"] = &CScript::SetBlock;
  1111. (*s_FunctionList2)["GetRegionRandomPos"] = &CScript::GetRegionRandomPos;
  1112. (*s_FunctionList2)["GetRandomPosInRange"] = &CScript::GetRandomPosInRange;
  1113. (*s_FunctionList2)["GetLineDir"] = &CScript::GetLineDir;
  1114. (*s_FunctionList2)["GetNextPosByDir"] = &CScript::GetNextPosByDir;
  1115. (*s_FunctionList2)["GetRegionPlayerNum"] = &CScript::GetRegionPlayerNum;
  1116. (*s_FunctionList2)["RunScriptForAllPlayerInRgn"] = &CScript::RunScriptForAllPlayerInRgn;
  1117. //1、副本相关函数
  1118. (*s_FunctionList2)["CreatePRgn"] = &CScript::CreatePRgn;
  1119. (*s_FunctionList2)["CreatePHRgn"] = &CScript::CreatePHRgn;
  1120. (*s_FunctionList2)["CreateTRgn"] = &CScript::CreateTRgn;
  1121. (*s_FunctionList2)["GetPlayerPDupRgnID"] = &CScript::GetPlayerPDupRgnID;
  1122. (*s_FunctionList2)["GetPlayerPHDupRgnID"] = &CScript::GetPlayerPHDupRgnID;
  1123. (*s_FunctionList2)["GetTeamDupRgnID"] = &CScript::GetTeamDupRgnID;
  1124. (*s_FunctionList2)["GetNormalDupRgnID"] = &CScript::GetNormalDupRgnID;
  1125. (*s_FunctionList2)["ChangeRgn"] = &CScript::ChangeRgnByTemplateID;
  1126. (*s_FunctionList2)["ChangeDupRgn"] = &CScript::ChangeDupRgn;
  1127. (*s_FunctionList2)["AddRgnVar"] = &CScript::AddRgnVar;
  1128. (*s_FunctionList2)["SetRgnVar"] = &CScript::SetRgnVar;
  1129. (*s_FunctionList2)["DelRgnVar"] = &CScript::DelRgnVar;
  1130. (*s_FunctionList2)["GetRgnVar"] = &CScript::GetRgnVar;
  1131. (*s_FunctionList2)["DeleteRgn"] = &CScript::DeleteRgn;
  1132. (*s_FunctionList2)["GetTemplateIDByGUID"] = &CScript::GetTemplateIDByGUID;
  1133. (*s_FunctionList2)["GetCurRgnGUID"] = &CScript::GetCurRgnGUID;
  1134. (*s_FunctionList2)["GetDupTypeByGUID"] = &CScript::GetDupTypeByGUID;
  1135. (*s_FunctionList2)["GetDupRgnOnwerGUID"] = &CScript::GetDupRgnOnwerGUID;
  1136. (*s_FunctionList2)["CreatePHGoods"] = &CScript::CreatePHGoods;
  1137. (*s_FunctionList2)["DeletePHGoods"] = &CScript::DeletePHGoods;
  1138. (*s_FunctionList2)["GetDupRgnMaxNum"] = &CScript::GetDupRgnMaxNum;
  1139. (*s_FunctionList2)["GetDupRgnGUIDByOnwerGUID"] = &CScript::GetPHRgnGUIDByOnwerName;
  1140. (*s_FunctionList2)["DeleteMonster"] = &CScript::DeleteMonster;
  1141. (*s_FunctionList2)["CreateDupRgnEntity"] = &CScript::CreateDupRgnEntity;
  1142. (*s_FunctionList2)["RunDupRgnScript"] = &CScript::RunDupRgnScript;
  1143. (*s_FunctionList2)["GetDupRgnNum"] = &CScript::GetDupRgnNum;
  1144. (*s_FunctionList2)["GetDupRgnMaxNum"] = &CScript::GetDupRgnMaxNum;
  1145. (*s_FunctionList2)["SetDupRgnOperFlag"] = &CScript::SetDupRgnOperFlag;
  1146. (*s_FunctionList2)["GetTeamMaterIDByPos"] = &CScript::GetTeamMaterIDByPos;
  1147. (*s_FunctionList2)["EditDupRgnName"] = &CScript::EditDupRgnName;
  1148. (*s_FunctionList2)["GetPlayerGUID"] = &CScript::GetPlayerGUID;
  1149. (*s_FunctionList2)["GetDestGUID"] = &CScript::GetDestGUID;
  1150. (*s_FunctionList2)["GetCurPlayerPDupRgnID"] = &CScript::GetCurPlayerPDupRgnID;
  1151. (*s_FunctionList2)["GetCurPlayerPHDupRgnID"] = &CScript::GetCurPlayerPHDupRgnID;
  1152. (*s_FunctionList2)["GetLocalGSID"] = &CScript::GetLocalGSID;
  1153. (*s_FunctionList2)["GetGUIDByPlayerName"] = &CScript::GetGUIDByPlayerName;
  1154. (*s_FunctionList2)["GetPGUIDByPlayerName"] = &CScript::GetPGUIDByPlayerName;
  1155. (*s_FunctionList2)["GetPHGUIDByPlayerName"] = &CScript::GetPHGUIDByPlayerName;
  1156. (*s_FunctionList2)["GetTGUIDByPlayerName"] = &CScript::GetTGUIDByPlayerName;
  1157. (*s_FunctionList2)["ChangeDupRgnByRgnID"] = &CScript::ChangeDupRgnByRgnID;
  1158. (*s_FunctionList2)["SetPlayerPDupRgnID"] = &CScript::SetPlayerPDupRgnID;
  1159. (*s_FunctionList2)["SetPlayerPHDupRgnID"] = &CScript::SetPlayerPHDupRgnID;
  1160. (*s_FunctionList2)["AddTeamRgnID"] = &CScript::AddTeamRgnID;
  1161. (*s_FunctionList2)["DelTeamRgnID"] = &CScript::DelTeamRgnID;
  1162. (*s_FunctionList2)["ClearTeamRgnID"] = &CScript::ClearTeamRgnID;
  1163. (*s_FunctionList2)["SwapTeamRgnID"] = &CScript::SwapTeamRgnID;
  1164. (*s_FunctionList2)["GetTeamRgnIDNum"] = &CScript::GetTeamRgnIDNum;
  1165. (*s_FunctionList2)["GetTeamRgnIDByIndex"] = &CScript::GetTeamRgnIDByIndex;
  1166. (*s_FunctionList2)["GetTeamRgnTemplatIDByIndex"] = &CScript::GetTeamRgnTemplatIDByIndex;
  1167. (*s_FunctionList2)["ViewRgnVar"] = &CScript::ViewRgnVar;
  1168. (*s_FunctionList2)["EvaluateGUID"] = &CScript::EvaluateGUID;
  1169. (*s_FunctionList2)["ViewRgnValidByGUID"] = &CScript::ViewRgnValidByGUID;
  1170. (*s_FunctionList2)["GetDupRgnPlayerMaxNum"] = &CScript::GetDupRgnPlayerMaxNum;
  1171. (*s_FunctionList2)["GetDupRgnOperFlag"] = &CScript::GetDupRgnOperFlag;
  1172. (*s_FunctionList2)["GetCallerGUID"] = &CScript::GetCallerGUID;
  1173. (*s_FunctionList2)["ViewDupRgnData"] = &CScript::ViewDupRgnData;
  1174. (*s_FunctionList2)["CallScriptByGUID"] = &CScript::CallScriptByGUID;
  1175. (*s_FunctionList2)["ClearCurGSDupRgn"] = &CScript::ClearCurGSDupRgn;
  1176. (*s_FunctionList2)["ReFreshPlayerDupRgnList"] = &CScript::ReFreshPlayerDupRgnList;
  1177. (*s_FunctionList2)["SetRgnStrongPointState"] = &CScript::SetRgnStrongPointState;
  1178. (*s_FunctionList2)["GetRgnStrongPointState"] = &CScript::GetRgnStrongPointState;
  1179. (*s_FunctionList2)["GetRegionCampPlayerNum"] = &CScript::GetRegionCampPlayerNum;
  1180. //其他的脚本相关函数
  1181. //1、国家相关函数
  1182. //............................................
  1183. //2.战斗系统相关函数
  1184. (*s_FunctionList2)["SentaiQueue"] = &CScript::SentaiQueue;
  1185. (*s_FunctionList2)["GetPlayerSentaiPoints"] = &CScript::GetPlayerSentaiPoints;
  1186. (*s_FunctionList2)["ChangePlayerSentaiPoints"] = &CScript::ChangePlayerSentaiPoints;
  1187. (*s_FunctionList2)["GetTeamSentaiPoints"] = &CScript::GetTeamSentaiPoints;
  1188. (*s_FunctionList2)["EndMatch"] = &CScript::EndMatch;
  1189. (*s_FunctionList2)["EndTeamMatch"] = &CScript::EndTeamMatch;
  1190. (*s_FunctionList2)["IsSentaiSys"] = &CScript::IsSentaiSys;
  1191. //............................................
  1192. //3.跑商系统相关函数
  1193. (*s_FunctionList2)["OpenBusiness"] = &CScript::OpenBusiness;
  1194. (*s_FunctionList2)["IsBusinessState"] = &CScript::IsBusinessState;
  1195. (*s_FunctionList2)["UseHiggleSkill"] = &CScript::UseHiggleSkill;
  1196. (*s_FunctionList2)["UseCheckingSkill"] = &CScript::UseCheckingSkill;
  1197. (*s_FunctionList2)["UseChafferSkill"] = &CScript::UseChafferSkill;
  1198. (*s_FunctionList2)["OpenInvest"] = &CScript::OpenInvest;
  1199. (*s_FunctionList2)["RemoveBusinessState"] = &CScript::RemoveBusinessState;
  1200. (*s_FunctionList2)["OpenFBusiness"] = &CScript::OpenFBusiness;
  1201. //4.邮件系统函数
  1202. (*s_FunctionList2)["SendSysMail"] = &CScript::SendSysMail;
  1203. (*s_FunctionList2)["ReceiveSysMail"] = &CScript::ReceiveSysMail;
  1204. (*s_FunctionList2)["ReceiveMail"] = &CScript::ReceiveMail;
  1205. //5.奖励相关
  1206. (*s_FunctionList2)["OpenBouns"] = &CScript::OpenBouns;
  1207. // Fox@20090104 宠物
  1208. (*s_FunctionList2)["CreatePet"] = &CScript::CreatePet;
  1209. (*s_FunctionList2)["DelPet"] = &CScript::DelPet;
  1210. (*s_FunctionList2)["RelivePet"] = &CScript::RelivePet;
  1211. (*s_FunctionList2)["AddPetSkill"] = &CScript::AddPetSkill;
  1212. (*s_FunctionList2)["GetFocusPet"] = &CScript::GetFocusPet;
  1213. // 反外挂相关函数
  1214. (*s_FunctionList2)["ChangeActivity"] = &CScript::ChangeActivity;
  1215. (*s_FunctionList2)["ACKickPlayer"] = &CScript::ACKickPlayer;
  1216. (*s_FunctionList2)["StopCheckAC"] = &CScript::StopCheckAC;
  1217. (*s_FunctionList2)["GetACAttr"] = &CScript::GetACAttr;
  1218. (*s_FunctionList2)["StartCheackAC"] =&CScript::StartCheackAC;
  1219. // 隐匿功能相关函数
  1220. (*s_FunctionList2)["GetRegionHideFlagById"] = &CScript::GetRegionHideFlagById;
  1221. (*s_FunctionList2)["GetPlayerCanHideByGuid"] = &CScript::GetPlayerCanHideByGuid;
  1222. (*s_FunctionList2)["SetPlayerCanHideByGuid"] = &CScript::SetPlayerCanHideByGuid;
  1223. (*s_FunctionList2)["GetPlayerHideFlagByGuid"] = &CScript::GetPlayerHideFlagByGuid;
  1224. (*s_FunctionList2)["SetPlayerHideFlagByGuid"] = &CScript::SetPlayerHideFlagByGuid;
  1225. (*s_FunctionList2)["GetHideName"] = &CScript::GetHideName;
  1226. (*s_FunctionList2)["GMViewHideNameAround"] = &CScript::GMViewHideNameAround;
  1227. //GM脚本接口
  1228. (*s_FunctionList2)["GMAddSkill"] = &CScript::GMAddSkill;
  1229. (*s_FunctionList2)["GMDelSkill"] = &CScript::GMDelSkill;
  1230. // 定时器功能相关函数
  1231. (*s_FunctionList2)["SetTimer"] = &CScript::SetTimer;
  1232. (*s_FunctionList2)["CloseTimer"] = &CScript::CloseTimer;
  1233. (*s_FunctionList2)["GetPlayerTimer"] = &CScript::GetPlayerTimer;
  1234. (*s_FunctionList2)["GetTimer"] = &CScript::GetTimer;
  1235. //彩票系统
  1236. (*s_FunctionList2)["OpenLotteryPage"] = &CScript::OpenLotteryPage;
  1237. (*s_FunctionList2)["DoLottery"] = &CScript::DoLottery;
  1238. (*s_FunctionList2)["SetWorldCredit"] = &CScript::SetWorldCredit;
  1239. (*s_FunctionList2)["GetPersonalCredit"] = &CScript::GetPersonalCredit;
  1240. (*s_FunctionList2)["SetCurHighestCredit"] = &CScript::SetCurHighestCredit;
  1241. (*s_FunctionList2)["GetPersonalCreditTotal"] = &CScript::GetPersonalCreditTotal;
  1242. (*s_FunctionList2)["SetWorldCreditVelue"] = &CScript::SetWorldCreditVelue;
  1243. (*s_FunctionList2)["GetWorldCreditMax"] = &CScript::GetWorldCreditMax;
  1244. (*s_FunctionList2)["SendWorldCredit"] = &CScript::SendWorldCredit;
  1245. (*s_FunctionList2)["SendLotteryChat"] = &CScript::SendLotteryChat;
  1246. (*s_FunctionList2)["GetLotteryRe"] = &CScript::GetLotteryRe;
  1247. //获得玩家的升级经验
  1248. (*s_FunctionList2)["GetNextTotalExp"] = &CScript::GetNextTotalExp;
  1249. // 结婚日志
  1250. (*s_FunctionList2)["MarriageLog"] = &CScript::MarriageLog;
  1251. }
  1252. ////////////////////////
  1253. // 释放函数列表
  1254. void CScript::ReleaseFunction()
  1255. {
  1256. if(s_FunctionList2)
  1257. s_FunctionList2->clear();
  1258. SAFE_DELETE(s_FunctionList2);
  1259. }
  1260. ///////////////////////
  1261. // 读入全局变量列表
  1262. void CScript::LoadGeneralVariable(BYTE* pByte,long lPos)
  1263. {
  1264. ReleaseGeneralVariable();
  1265. m_GeneralVariableList = MP_NEW CVariableList;
  1266. GetGeneralVariableList()->DecordFromByteArray(pByte,lPos, false/*非玩家脚本*/);
  1267. }
  1268. void CScript::IniBuffSkillVariableList()
  1269. {
  1270. m_BuffSkillVariableList = MP_NEW CVariableList;
  1271. }
  1272. ////////////////////////
  1273. // 释放全局变量列表
  1274. void CScript::ReleaseGeneralVariable()
  1275. {
  1276. MP_DELETE(m_GeneralVariableList);
  1277. }
  1278. // ------------------------------ 工具 ------------------------------
  1279. /////////////////////
  1280. // 转到下一行
  1281. int CScript::GotoNextLine()
  1282. {
  1283. char tmp=m_Data[m_Point];
  1284. while( 1 )
  1285. {
  1286. m_Point++;
  1287. tmp=m_Data[m_Point];
  1288. if (tmp == '\n' || tmp == '\r')
  1289. {
  1290. m_Point++;
  1291. break;
  1292. }
  1293. if( tmp == EOF || tmp == '\0') break;
  1294. }
  1295. m_Line++;
  1296. m_Word=0;
  1297. return m_Point;
  1298. }
  1299. ///////////////////////
  1300. // 跳到指定位置
  1301. int CScript::JumpTo(const char *Prompt)
  1302. {
  1303. int lp=m_Point; //保存现场
  1304. m_Point=0;
  1305. char CmdStr[MAX_VAR_LEN];
  1306. while(1)
  1307. {
  1308. ReadCmd( CmdStr ); //读一行指令
  1309. if( CmdStr[strlen(CmdStr)-2] == ':' ) //返回
  1310. {
  1311. int p=(int)strlen(CmdStr);
  1312. CmdStr[p-1] = 0;
  1313. CmdStr[p-2] = 0;
  1314. if( strcmp( CmdStr, Prompt ) == 0 )
  1315. {
  1316. return m_Point;
  1317. }
  1318. }
  1319. if( m_Point >= m_DataLen-1 )
  1320. {
  1321. char str[10240];
  1322. _snprintf(str, 10240, "Prompt <%s> in file %s is not found!", Prompt, m_FileName);
  1323. PutDebugString(str);
  1324. m_Point=lp;
  1325. return 0;
  1326. }
  1327. }
  1328. }
  1329. ///////////////////////
  1330. // 跳到下一块 { }
  1331. int CScript::JumpToNextBlock()
  1332. {
  1333. int lp=m_Point; //保存现场
  1334. char CmdStr[MAX_VAR_LEN]="";
  1335. int tmp=0;
  1336. ReadCmd( CmdStr );
  1337. if( CmdStr[0] != '{' )
  1338. {
  1339. return m_Point;
  1340. }
  1341. m_Point=lp;
  1342. while(1)
  1343. {
  1344. ReadCmd( CmdStr ); //读一行指令
  1345. if( CmdStr[0] == '{' ) //
  1346. {
  1347. tmp++;
  1348. }
  1349. if( CmdStr[0] == '}' ) //
  1350. {
  1351. tmp--;
  1352. // 块结束
  1353. if( tmp == 0 )
  1354. {
  1355. lp=m_Point;
  1356. ReadCmd( CmdStr );
  1357. if( stricmp( CmdStr, "else;" ) != 0 )
  1358. m_Point = lp;
  1359. return m_Point;
  1360. }
  1361. }
  1362. if( m_Point >= m_DataLen-1 )
  1363. {
  1364. m_Point = m_DataLen-1;
  1365. return 0;
  1366. }
  1367. }
  1368. }
  1369. // ----------------------------------------------------------------------------
  1370. // 语句处理
  1371. //-----------------------------------------------------------------------------
  1372. ////////////////////////
  1373. // 读入一个脚本
  1374. bool CScript::LoadScript(const char *filename, char* pData)
  1375. {
  1376. // 非文件读入和文件读入
  1377. if( pData )
  1378. {
  1379. M_FREE( m_Data, sizeof(char)*(m_DataLen+1) );
  1380. m_DataLen=(int)strlen(pData);
  1381. m_Data=(char*)M_ALLOC(sizeof(char)*(m_DataLen+1));
  1382. memcpy(m_Data, pData, m_DataLen);
  1383. m_Data[m_DataLen] = 0;
  1384. //初始化指针
  1385. m_Point=0; //当前指针
  1386. m_Line=m_Word=0; //当前行列
  1387. m_bHang = false;
  1388. if(filename)
  1389. strcpy_s(m_FileName, MAX_PATH, filename);
  1390. return true;
  1391. }
  1392. //文件读入
  1393. else if(filename != NULL)
  1394. {
  1395. strcpy_s(m_FileName, MAX_PATH, filename);
  1396. strlwr(m_FileName);
  1397. M_FREE( m_Data, sizeof(char)*(m_DataLen+1) );
  1398. //复制内存
  1399. {
  1400. FILE *fp;
  1401. if( (fp=fopen(m_FileName, "rb")) == NULL )
  1402. {
  1403. return false;
  1404. }
  1405. m_DataLen=GetFileLength(m_FileName); //文件长度
  1406. m_Data=(char*)M_ALLOC(sizeof(char)*(m_DataLen+1));
  1407. fread(m_Data, m_DataLen, 1, fp);
  1408. m_Data[m_DataLen] = 0;
  1409. fclose(fp);
  1410. }
  1411. //初始化指针
  1412. m_Point=0; //当前指针
  1413. m_Line=m_Word=0; //当前行列
  1414. m_bHang=false;
  1415. return true;
  1416. }
  1417. return false;
  1418. }
  1419. bool CScript::ReadForCmd(long& beginPos, long& endPos) //读入for循环体内的全部脚本
  1420. {
  1421. //临时变量
  1422. char chr;
  1423. beginPos = -1;
  1424. long blockNum = 0;
  1425. for(int i=m_Point; i<m_DataLen; i++)
  1426. {
  1427. chr=m_Data[i];
  1428. //注释 "//... && /*....*/"
  1429. if( m_Data[i] == '/' && m_Data[i+1] == '/' )
  1430. {
  1431. m_Point++;
  1432. i=GotoNextLine()-1;
  1433. continue;
  1434. }
  1435. if( m_Data[i] == '/' && m_Data[i+1] == '*' )
  1436. {
  1437. i++;
  1438. while( 1 )
  1439. {
  1440. i++;
  1441. if( m_Data[i] == '*' && m_Data[i+1] == '/' )
  1442. {
  1443. i+=2;
  1444. chr=m_Data[i];
  1445. break;
  1446. }
  1447. if( i>=m_DataLen-1 )
  1448. {
  1449. m_Point=m_DataLen-1;
  1450. return false;
  1451. }
  1452. }
  1453. }
  1454. //程序块 { ... }
  1455. //指令开始
  1456. if( chr == '{' )
  1457. {
  1458. for(int j=i; j<m_DataLen; j++)
  1459. {
  1460. chr=m_Data[j];
  1461. //注释 "//... && /*....*/"
  1462. if( m_Data[j] == '/' && m_Data[j+1] == '/' )
  1463. {
  1464. m_Point++;
  1465. j=GotoNextLine()-1;
  1466. continue;
  1467. }
  1468. if( m_Data[j] == '/' && m_Data[j+1] == '*' )
  1469. {
  1470. j++;
  1471. while( 1 )
  1472. {
  1473. j++;
  1474. if( m_Data[j] == '*' && m_Data[j+1] == '/' )
  1475. {
  1476. j+=2;
  1477. chr=m_Data[j];
  1478. break;
  1479. }
  1480. if( j>=m_DataLen-1 )
  1481. {
  1482. m_Point=m_DataLen-1;
  1483. return false;
  1484. }
  1485. }
  1486. }
  1487. if(chr == '{')
  1488. {
  1489. if(beginPos == -1) beginPos = j;
  1490. blockNum++;
  1491. }
  1492. if( chr == '}' ) //指令结束
  1493. {
  1494. m_Point=j;
  1495. endPos = m_Point;
  1496. blockNum--;
  1497. if(blockNum == 0)
  1498. return true; //返回
  1499. else
  1500. {
  1501. m_Point++;
  1502. continue;
  1503. }
  1504. }
  1505. m_Point++;
  1506. }
  1507. m_Point=m_DataLen-1;
  1508. }
  1509. }
  1510. m_Point=m_DataLen-1;
  1511. return false;
  1512. }
  1513. /////////////////////
  1514. // 读取一行指令
  1515. bool CScript::ReadCmd(char *Ret, int MaxLen)
  1516. {
  1517. //临时变量
  1518. register char chr;
  1519. for(int i=m_Point; i<m_DataLen; i++)
  1520. {
  1521. chr=m_Data[i];
  1522. //注释 "//... && /*....*/"
  1523. if( m_Data[i] == '/' && m_Data[i+1] == '/' )
  1524. {
  1525. m_Point++;
  1526. i=GotoNextLine()-1;
  1527. continue;
  1528. }
  1529. if( m_Data[i] == '/' && m_Data[i+1] == '*' )
  1530. {
  1531. i++;
  1532. while( 1 )
  1533. {
  1534. i++;
  1535. if( m_Data[i] == '*' && m_Data[i+1] == '/' )
  1536. {
  1537. i+=2;
  1538. chr=m_Data[i];
  1539. break;
  1540. }
  1541. if( i>=m_DataLen-1 )
  1542. {
  1543. m_Point=m_DataLen-1;
  1544. strcpy_s(Ret, MAX_VAR_LEN, "");
  1545. return false;
  1546. }
  1547. }
  1548. }
  1549. //程序块 { ... }
  1550. //if( chr == '{' ) m_Block++;
  1551. //if( chr == '}' ) m_Block--;
  1552. //指令开始
  1553. if( chr == '{' || chr == '}' || chr == '<' || chr == '>' || chr == '#' || chr == '$' || chr == '@' || chr >= 'a' && chr <= 'z' || chr >= 'A' && chr <= 'Z' )
  1554. {
  1555. int m=0;
  1556. bool bInString = false;
  1557. for(int j=i; j<m_DataLen; j++)
  1558. {
  1559. chr=m_Data[j];
  1560. if ( chr == '\"' ) bInString=!bInString;
  1561. if( bInString == false &&
  1562. (chr == ';' || chr == '\t' || chr == '\n' || chr == '\r' )) //指令结束
  1563. {
  1564. m_Point=j;
  1565. Ret[m]=';';
  1566. Ret[m+1]=0;
  1567. return true; //返回
  1568. }
  1569. // 跳过字符串提行后的制表符
  1570. if (bInString && (chr == '\n' || chr == '\r'))
  1571. {
  1572. int n = j+1;
  1573. while(m_Data[n] == '\t')
  1574. {
  1575. n++;
  1576. }
  1577. j = n-1;
  1578. }
  1579. Ret[m]=chr;
  1580. m++;
  1581. if( m >= MaxLen ) //指令超过长度
  1582. {
  1583. m_Point=j;
  1584. Ret[m]=';';
  1585. Ret[m+1]=0;
  1586. char str[10240];
  1587. _snprintf(str, 10240, "Script Script Command '%s' is too long", Ret);
  1588. PutDebugString(str);
  1589. return true;
  1590. }
  1591. }
  1592. m_Point=m_DataLen-1;
  1593. strcpy_s(Ret, MAX_VAR_LEN, "");
  1594. }
  1595. }
  1596. m_Point=m_DataLen-1;
  1597. strcpy_s(Ret, MAX_VAR_LEN, "");
  1598. return false;
  1599. }
  1600. ///////////////////////
  1601. // 运行一行脚本
  1602. void CScript::RunLine(const char *cmdline)
  1603. {
  1604. memset(m_Operation, 0, MAX_VAR * sizeof(int));
  1605. memset(m_Value, 0, MAX_VAR * sizeof(double));
  1606. for (int i=0;i<MAX_VAR;i++)
  1607. {
  1608. M_FREE(m_strValueInfo[i].pStrValue, m_strValueInfo[i].lStrValueLen);
  1609. m_strValueInfo[i].pStrValue = NULL;
  1610. m_strValueInfo[i].lStrValueLen = 0;
  1611. }
  1612. m_VarNum = 0;
  1613. Check(cmdline); //分解
  1614. //求出所有变量的值
  1615. for(int i=0; i<m_VarNum; i++)
  1616. {
  1617. ComputeVar(i);
  1618. //如果是IF语句
  1619. if( m_Var[i].length() > 1 && m_Var[i][0]=='i' && m_Var[i][1]=='f' && m_Value[i]==(int)false )
  1620. {
  1621. if( m_VarNum == 1 )
  1622. {
  1623. JumpToNextBlock(); // 跳到下一块{ }
  1624. break;
  1625. }
  1626. else
  1627. break;
  1628. }
  1629. //如果是Next语句直接跳过程序块
  1630. if( m_Var[i] == "else" )
  1631. {
  1632. JumpToNextBlock(); // 跳到下一块{ }
  1633. break;
  1634. }
  1635. }
  1636. //计算
  1637. Count();
  1638. }
  1639. /////////////////////
  1640. // 分解
  1641. void CScript::Check(const char *cmdline)
  1642. {
  1643. int oper_num=0, str_num=0, now=0; //(0=变量 1=操作符);
  1644. int nBracket=0, nFountion=0; //括号匹配
  1645. register char tmp;
  1646. const long lVarLen = 3072;
  1647. char strVar[lVarLen]="";
  1648. bool bArray=false; //是否在数组型变量中
  1649. bool bInString=false; //是否在字符串中
  1650. int arrayNum = 0; // 数组括号个数'['
  1651. int j=0;
  1652. while( cmdline[j]==' ' || cmdline[j] == '\t' ) {j++;}
  1653. long lCmdLineLen = strlen(cmdline);
  1654. for(unsigned int i=j; i<lCmdLineLen; i++)
  1655. {
  1656. if(str_num>= lVarLen)
  1657. {
  1658. char pszInfo[2048]="";
  1659. _snprintf(pszInfo,2048,"脚本变量名长度超过%d(cmdline:%s)",lVarLen,cmdline);
  1660. AddLogText(pszInfo);
  1661. break;
  1662. }
  1663. tmp=cmdline[i];
  1664. if (tmp=='\"')
  1665. bInString=!bInString;
  1666. if( bInString ){
  1667. strVar[str_num++]=tmp;
  1668. continue;
  1669. }
  1670. if( now==0 ) //变量
  1671. {
  1672. if( tmp == ';' ) //完成
  1673. {
  1674. strVar[str_num]='\0';
  1675. m_Var[oper_num] = strVar;
  1676. if( strVar[0] == '$' ) m_VarClass[oper_num]=VC_VAR; //变量
  1677. else if( strVar[0] == '#' ) m_VarClass[oper_num]=VC_STRING; //字符串
  1678. else if( strVar[0] == '\"' )
  1679. {
  1680. m_VarClass[oper_num]=VC_CONST; //字符串常量
  1681. m_Var[oper_num] = strVar;
  1682. }
  1683. else if(strVar[0] == '@') //GUID变量
  1684. m_VarClass[oper_num]=VC_GUID;
  1685. else m_VarClass[oper_num]=VC_CONST; //常量
  1686. m_Operation[oper_num]=1;
  1687. m_VarNum=oper_num+1;
  1688. return;
  1689. }
  1690. //小括号
  1691. if( nBracket == 0 && tmp == '(' && str_num == 0 )
  1692. {
  1693. nBracket++;
  1694. }
  1695. else if( nBracket > 0 )
  1696. {
  1697. if( tmp == '(' ) nBracket++;
  1698. if( tmp == ')' ) nBracket--;
  1699. if( nBracket == 0 )
  1700. {
  1701. strVar[str_num++]=tmp;
  1702. now=1;
  1703. strVar[str_num]='\0';
  1704. m_Var[oper_num] = strVar;
  1705. m_VarClass[oper_num]=VC_BRACKET;
  1706. str_num=0;
  1707. i++;
  1708. while( cmdline[i]==' ' || cmdline[i] == '\t' ) {i++;}
  1709. i--;
  1710. continue;
  1711. }
  1712. else
  1713. {
  1714. strVar[str_num++]=tmp;
  1715. continue;
  1716. }
  1717. }
  1718. //函数型变量
  1719. if( nFountion == 0 && tmp == '(' && str_num > 0 && !bArray )
  1720. {
  1721. nFountion++;
  1722. }
  1723. else if( nFountion > 0 )
  1724. {
  1725. if( tmp == '(' ) nFountion++;
  1726. else if( tmp == ')' ) nFountion--;
  1727. if( nFountion ==0 )
  1728. {
  1729. strVar[str_num++]=tmp;
  1730. strVar[str_num]='\0';
  1731. now=1;
  1732. m_Var[oper_num] = strVar;
  1733. m_VarClass[oper_num]=VC_FUNCTION;
  1734. str_num=0;
  1735. i++;
  1736. while( cmdline[i]==' ' || cmdline[i] == '\t' ) {i++;}
  1737. i--;
  1738. continue;
  1739. }
  1740. else
  1741. {
  1742. strVar[str_num++]=tmp;
  1743. continue;
  1744. }
  1745. }
  1746. if( tmp == '[' )
  1747. {
  1748. bArray=true;
  1749. arrayNum++;
  1750. }
  1751. else if( tmp == ']' )
  1752. {
  1753. arrayNum--;
  1754. strVar[str_num++]=tmp;
  1755. }
  1756. if( arrayNum == 0 && bArray == true) // 到了最后一个匹配的']'
  1757. {
  1758. now=1;
  1759. bArray=false;
  1760. strVar[str_num]='\0';
  1761. m_Var[oper_num] = strVar;
  1762. m_VarClass[oper_num]=VC_ARRAY;
  1763. str_num=0;
  1764. i++;
  1765. while( cmdline[i]==' ' || cmdline[i] == '\t' ) {i++;}
  1766. i--;
  1767. continue;
  1768. }
  1769. //普通变量和常量
  1770. if( !bArray && ((IsOperation(tmp) && str_num >0 )|| tmp==' ' || tmp == '\t' ) )
  1771. {
  1772. now=1;
  1773. strVar[str_num]='\0';
  1774. m_Var[oper_num] = strVar;
  1775. if( strVar[0] == '$' ) m_VarClass[oper_num]=VC_VAR; //变量
  1776. else if( strVar[0] == '#' ) m_VarClass[oper_num]=VC_STRING; //字符串
  1777. else if( strVar[0] == '\"' )
  1778. {
  1779. m_VarClass[oper_num]=VC_CONST; //字符串常量
  1780. m_Var[oper_num] = strVar;
  1781. }
  1782. else if(strVar[0] == '@') //GUID变量
  1783. m_VarClass[oper_num]=VC_GUID;
  1784. else
  1785. m_VarClass[oper_num]=VC_CONST; //常量
  1786. str_num=0;
  1787. while( cmdline[i]==' ' || cmdline[i] == '\t' ) {i++;}
  1788. i--;
  1789. }
  1790. else
  1791. {
  1792. strVar[str_num++]=tmp;
  1793. }
  1794. }
  1795. else if( now==1 ) //操作符
  1796. {
  1797. if( tmp == ';' ) //完成
  1798. {
  1799. m_Operation[oper_num]=1;
  1800. m_VarNum=oper_num+1;
  1801. return;
  1802. }
  1803. if( IsChar(tmp) || tmp=='\"' || tmp==' ' || tmp == '\t' || tmp == '(' || ( tmp=='-' && str_num > 0 ))
  1804. {
  1805. strVar[str_num]='\0';
  1806. now=0;
  1807. str_num=0;
  1808. m_Operation[oper_num] = OperationNum(strVar);
  1809. if( m_Operation[oper_num] == -1 )
  1810. {
  1811. char str[10240];
  1812. _snprintf(str, 10240, "\r\n脚本语法错误: %s", cmdline);
  1813. PutDebugString(str);
  1814. m_Operation[oper_num] = 1; // 付值为 ';'
  1815. }
  1816. while( cmdline[i]==' ' || tmp == '\t' ) {i++;}
  1817. oper_num++;
  1818. i--;
  1819. }
  1820. else
  1821. {
  1822. strVar[str_num++]=tmp;
  1823. }
  1824. }
  1825. }
  1826. }
  1827. /////////////////////////
  1828. // 计算一个变量的值
  1829. bool CScript::ComputeVar(int num)
  1830. {
  1831. if( num > m_VarNum )
  1832. {
  1833. AddLogText("欲求的变量超出范围");
  1834. return false;
  1835. }
  1836. if( m_Operation[num] == 10 ) //如果该变量后面是 '=' (赋值)就直接返回,后面再进行操作
  1837. {
  1838. return true;
  1839. }
  1840. switch( m_VarClass[num] )
  1841. {
  1842. case VC_CONST: //常量(直接转换)
  1843. if (VC_STRING==GetValueType(m_Var[num].c_str()))
  1844. {
  1845. int pos=DumpString(m_strValueInfo[num].pStrValue, m_strValueInfo[num].lStrValueLen, &m_Var[num][1]);
  1846. m_strValueInfo[num].lStrValueLen = pos+1;
  1847. (m_strValueInfo[num].pStrValue)[pos-1]=0;
  1848. }
  1849. else
  1850. {
  1851. m_Value[num]=atof(m_Var[num].c_str());
  1852. }
  1853. break;
  1854. case VC_VAR: //变量(查表求值)
  1855. {
  1856. m_Value[num] = GetScriptVarValue((CMoveShape*)p_SrcShape, m_Var[num].c_str(),0);
  1857. }
  1858. break;
  1859. case VC_ARRAY: //数组(查表求值)
  1860. {
  1861. // 数组下标值
  1862. int lArray = CVariableList::VAR_NOT_FOUND;
  1863. char MainVarName[256];
  1864. char InnVarName[256];
  1865. char* MainVarNamePtr = MainVarName;
  1866. char* InnVarNamePtr = InnVarName;
  1867. char* varTypeFlag = (char*)m_Var[num].c_str();
  1868. long tempPos = 0;
  1869. double ret = CheckParamStringForArray(varTypeFlag, strlen(varTypeFlag), &MainVarNamePtr, 256, &InnVarNamePtr, 256, tempPos);
  1870. if(ret == 1.0f) // 是数组
  1871. {
  1872. if(InnVarNamePtr[0] == '$') // 下标是变量
  1873. lArray = GetScriptVarValue((CMoveShape*)p_SrcShape, InnVarName, 0);
  1874. else
  1875. lArray = atoi(InnVarName);
  1876. if(varTypeFlag[0] == '$') // 整数数组
  1877. {
  1878. if(lArray != CVariableList::VAR_NOT_FOUND)
  1879. m_Value[num]=GetScriptVarValue( (CMoveShape*)p_SrcShape, MainVarName, lArray );
  1880. }
  1881. else if(varTypeFlag[0] == '#') // 字符串数组
  1882. {
  1883. if(lArray != CVariableList::VAR_NOT_FOUND)
  1884. {
  1885. // 找到对应字符串
  1886. char arrayStr[256];
  1887. _snprintf(arrayStr, 256, "%s%d", MainVarName, lArray);
  1888. const char* strPtr = GetScriptVarValue((CMoveShape*)p_SrcShape, arrayStr);
  1889. long lLen = DumpString(m_strValueInfo[num].pStrValue, m_strValueInfo[num].lStrValueLen, strPtr);
  1890. m_strValueInfo[num].lStrValueLen = lLen+1;
  1891. }
  1892. }
  1893. else if(varTypeFlag[0] == '@')
  1894. {
  1895. if(lArray != CVariableList::VAR_NOT_FOUND)
  1896. {
  1897. // 找到对应字符串
  1898. char arrayStr[256];
  1899. _snprintf(arrayStr, 256, "%s%d", MainVarName, lArray);
  1900. m_guidValue[num] = GetScriptGuidValue((CMoveShape*)p_SrcShape, arrayStr);
  1901. }
  1902. }
  1903. }
  1904. else
  1905. {
  1906. char outStr[1024];
  1907. _snprintf(outStr, 1024, "computvar() array oper Err, var[%s]!", m_Var[num].c_str());
  1908. AddLogText(outStr);
  1909. }
  1910. }
  1911. break;
  1912. case VC_STRING: //字符串
  1913. {
  1914. const char* strPtr = GetScriptVarValue((CMoveShape*)p_SrcShape, m_Var[num].c_str());
  1915. long lLen = DumpString(m_strValueInfo[num].pStrValue, m_strValueInfo[num].lStrValueLen, strPtr);
  1916. m_strValueInfo[num].lStrValueLen = lLen+1;
  1917. }
  1918. break;
  1919. case VC_FUNCTION: //函数(运行该语句并返回值)
  1920. {
  1921. // 返回字符串
  1922. if (num>0 && m_Operation[num-1]==10 && m_VarClass[num-1]==VC_STRING)
  1923. {
  1924. char* pstr = NULL;
  1925. long lLen = 0;
  1926. RunFunction(m_Var[num].c_str(), pstr);
  1927. if (!pstr)
  1928. lLen = DumpString(m_strValueInfo[num].pStrValue, m_strValueInfo[num].lStrValueLen, "");
  1929. else
  1930. lLen = DumpString(m_strValueInfo[num].pStrValue, m_strValueInfo[num].lStrValueLen, pstr);
  1931. m_strValueInfo[num].lStrValueLen = lLen+1;
  1932. break;
  1933. }
  1934. m_Value[num]=RunFunction( m_Var[num].c_str() );
  1935. }
  1936. break;
  1937. case VC_BRACKET: //小括号(递归)
  1938. {
  1939. m_Var[num][0]=' ';
  1940. m_Var[num][m_Var[num].length()-1]=';';
  1941. CScript *pTemptScript = PopFreeScript(m_Var[num].c_str());
  1942. InitChildScriptData(pTemptScript);
  1943. //设置变量
  1944. pTemptScript->SetVariableList(m_pVariableList);
  1945. pTemptScript->RunLine(m_Var[num].c_str());
  1946. m_Value[num] = pTemptScript->m_Value[0];
  1947. PushFreeScript(pTemptScript);
  1948. }
  1949. break;
  1950. case VC_GUID:
  1951. {
  1952. m_guidValue[num] = GetScriptGuidValue((CMoveShape*)p_SrcShape, m_Var[num].c_str());
  1953. }
  1954. break;
  1955. }
  1956. return true;
  1957. }
  1958. /////////////////////
  1959. // 是否是操作符
  1960. bool CScript::IsOperation(char chr)
  1961. {
  1962. for(int i=0; i<MAX_OPERATION; i++)
  1963. {
  1964. if( chr == m_OperationList[i].Name[0] )
  1965. return true;
  1966. }
  1967. return false;
  1968. }
  1969. ///////////////////////
  1970. // 获取操作符编号
  1971. int CScript::OperationNum(const char *string)
  1972. {
  1973. for(int i=0; i<MAX_OPERATION; i++)
  1974. {
  1975. if( strcmp( string, m_OperationList[i].Name ) == 0 )
  1976. return i;
  1977. }
  1978. return -1;
  1979. }
  1980. /////////////////////
  1981. // 是否是变量
  1982. bool CScript::IsChar(char chr)
  1983. {
  1984. if( chr == '$' || chr == '#' || chr >= 'a' && chr <= 'z' || chr >='A' && chr <= 'Z' || chr >='0' && chr <= '9' )
  1985. return true;
  1986. return false;
  1987. }
  1988. //////////////////////
  1989. // 找出最高优先级
  1990. int CScript::FindHighest()
  1991. {
  1992. int level=-1, ret=0;
  1993. for(int i=0; i<m_VarNum; i++)
  1994. {
  1995. if( level < m_OperationList[ m_Operation[i] ].Level )
  1996. {
  1997. level=m_OperationList[ m_Operation[i] ].Level;
  1998. ret=i;
  1999. }
  2000. }
  2001. return ret;
  2002. }
  2003. ////////////////////////
  2004. // 前一个可用的变量
  2005. int CScript::Prew(int num)
  2006. {
  2007. for(int i=num; i>=0; i--)
  2008. {
  2009. if( m_Value[i] != ERROR_CODE )
  2010. {
  2011. return i;
  2012. }
  2013. }
  2014. return 0;
  2015. }
  2016. //前一个可用的字符串变量
  2017. int CScript::PrewString(int num)
  2018. {
  2019. for(int i=num; i>=0; i--)
  2020. {
  2021. if( m_strValueInfo[i].pStrValue != 0 )
  2022. {
  2023. return i;
  2024. }
  2025. }
  2026. return -1;
  2027. }
  2028. //////////////////
  2029. // 计算出结果
  2030. int CScript::Count()
  2031. {
  2032. int n, p;
  2033. if( m_VarNum <=0 ) return 0;
  2034. /*
  2035. 0 "", 0,
  2036. 1 ";",1,
  2037. 2 "||",2,
  2038. 3 "&&",3,
  2039. 4 "==",4, "!=",4, ">",4, "<",4, ">=",4, "<=",4,
  2040. 10 "=",5, "+=",5, "-=",5, "*=",5, "/=",5, "%=",5,
  2041. 16 "+",6, "-",6,
  2042. 18 "*",7, "/",7, "%",7
  2043. */
  2044. while(1)
  2045. {
  2046. n=FindHighest();
  2047. switch( m_Operation[n] )
  2048. {
  2049. case 0:
  2050. case 1: // ';' 结束
  2051. return m_Value[0];
  2052. case 2: // '||'
  2053. p=Prew(n);
  2054. m_Value[p] = m_Value[p] || m_Value[n+1];
  2055. m_Value[n+1]=ERROR_CODE;
  2056. m_Operation[n]=0;
  2057. break;
  2058. case 3: // '&&'
  2059. p=Prew(n);
  2060. m_Value[p] = m_Value[p] && m_Value[n+1];
  2061. m_Value[n+1]=ERROR_CODE;
  2062. m_Operation[n]=0;
  2063. break;
  2064. case 4: // '=='
  2065. p=Prew(n);
  2066. if ( m_VarClass[p]==VC_STRING || (m_Var[p][0] == '#' && m_VarClass[p] == VC_ARRAY) )
  2067. {
  2068. if(m_strValueInfo[p].pStrValue && m_strValueInfo[n+1].pStrValue)
  2069. m_Value[p] = ( strcmp(m_strValueInfo[p].pStrValue, m_strValueInfo[n+1].pStrValue)==0)?true:false;
  2070. else
  2071. m_Value[p] = false;
  2072. }
  2073. else if(m_VarClass[p] == VC_GUID || (m_Var[n][0] == '@' && m_VarClass[n] == VC_ARRAY))
  2074. {
  2075. m_Value[p] = ( m_guidValue[p] == m_guidValue[n+1] )?true:false;
  2076. }
  2077. else // 其它类型
  2078. {
  2079. if(VC_STRING == GetValueType(m_Var[p].c_str()))
  2080. {
  2081. if(m_strValueInfo[p].pStrValue && m_strValueInfo[n+1].pStrValue)
  2082. m_Value[p] = ( strcmp(m_strValueInfo[p].pStrValue,m_strValueInfo[n+1].pStrValue)==0)?true:false;
  2083. else
  2084. m_Value[p] = false;
  2085. }
  2086. else
  2087. {
  2088. if( (m_Value[p] - m_Value[n+1]) >= -0.0001f && (m_Value[p] - m_Value[n+1]) <= 0.0001f )
  2089. m_Value[p] = true;
  2090. else
  2091. m_Value[p] = false;
  2092. }
  2093. }
  2094. m_Value[n+1]=ERROR_CODE;
  2095. m_Operation[n]=0;
  2096. break;
  2097. case 5: // '!='
  2098. p=Prew(n);
  2099. if ( m_VarClass[p]==VC_STRING || (m_Var[p][0] == '#' && m_VarClass[p] == VC_ARRAY) )
  2100. {
  2101. if(m_strValueInfo[p].pStrValue && m_strValueInfo[n+1].pStrValue)
  2102. m_Value[p] = ( strcmp(m_strValueInfo[p].pStrValue, m_strValueInfo[n+1].pStrValue)==0)?false:true;
  2103. else
  2104. m_Value[p] = false;
  2105. }
  2106. else if(m_VarClass[p] == VC_GUID || (m_Var[n][0] == '@' && m_VarClass[n] == VC_ARRAY))
  2107. {
  2108. m_Value[p] = ( m_guidValue[p] == m_guidValue[n+1] )?false:true;
  2109. }
  2110. else
  2111. {
  2112. if(VC_STRING == GetValueType(m_Var[p].c_str()))
  2113. {
  2114. if(m_strValueInfo[p].pStrValue && m_strValueInfo[n+1].pStrValue)
  2115. m_Value[p] = ( strcmp(m_strValueInfo[p].pStrValue, m_strValueInfo[n+1].pStrValue)==0)?false:true;
  2116. else
  2117. m_Value[p] = false;
  2118. }
  2119. else
  2120. {
  2121. if( fabs(m_Value[p] - m_Value[n+1]) >= 0.00001f )
  2122. m_Value[p] = true;
  2123. else
  2124. m_Value[p] = false;
  2125. }
  2126. }
  2127. m_Value[n+1]=ERROR_CODE;
  2128. m_Operation[n]=0;
  2129. break;
  2130. case 6: // '>'
  2131. p=Prew(n);
  2132. if(m_VarClass[p] == VC_GUID)
  2133. {
  2134. TestLog(CStringReading::LoadString(IDS_GS_SCRIPT,STR_GS_SCRIPT_CANTOPERWITHGUIDVAR), ">");
  2135. break;
  2136. }
  2137. if( (m_Value[p] - m_Value[n+1]) > 0 )
  2138. m_Value[p] = true;
  2139. else
  2140. m_Value[p] = false;
  2141. m_Value[n+1]=ERROR_CODE;
  2142. m_Operation[n]=0;
  2143. break;
  2144. case 7: // '<'
  2145. p=Prew(n);
  2146. if(m_VarClass[p] == VC_GUID)
  2147. {
  2148. TestLog(CStringReading::LoadString(IDS_GS_SCRIPT,STR_GS_SCRIPT_CANTOPERWITHGUIDVAR), "<");
  2149. break;
  2150. }
  2151. if( (m_Value[p] - m_Value[n+1]) < 0 )
  2152. m_Value[p] = true;
  2153. else
  2154. m_Value[p] = false;
  2155. m_Value[n+1]=ERROR_CODE;
  2156. m_Operation[n]=0;
  2157. break;
  2158. case 8: // '>='
  2159. p=Prew(n);
  2160. if(m_VarClass[p] == VC_GUID)
  2161. {
  2162. TestLog(CStringReading::LoadString(IDS_GS_SCRIPT,STR_GS_SCRIPT_CANTOPERWITHGUIDVAR), ">=");
  2163. break;
  2164. }
  2165. if( ((m_Value[p] - m_Value[n+1]) > 0) || (fabs(m_Value[p] - m_Value[n+1]) < 0.0001f) )
  2166. m_Value[p] = true;
  2167. else
  2168. m_Value[p] = false;
  2169. m_Value[n+1]=ERROR_CODE;
  2170. m_Operation[n]=0;
  2171. break;
  2172. case 9: // '<='
  2173. p=Prew(n);
  2174. if(m_VarClass[p] == VC_GUID)
  2175. {
  2176. TestLog(CStringReading::LoadString(IDS_GS_SCRIPT,STR_GS_SCRIPT_CANTOPERWITHGUIDVAR), "<=");
  2177. break;
  2178. }
  2179. if( ((m_Value[p] - m_Value[n+1]) < 0) || (fabs(m_Value[p] - m_Value[n+1]) < 0.0001f) )
  2180. m_Value[p] = true;
  2181. else
  2182. m_Value[p] = false;
  2183. m_Value[n+1]=ERROR_CODE;
  2184. m_Operation[n]=0;
  2185. break;
  2186. case 10: // '='
  2187. if ( m_VarClass[n]==VC_STRING || (m_Var[n][0] == '#' && m_VarClass[n] == VC_ARRAY) )
  2188. {
  2189. long lLen = DumpString(m_strValueInfo[n].pStrValue, m_strValueInfo[n].lStrValueLen, m_strValueInfo[n+1].pStrValue);
  2190. m_strValueInfo[n].lStrValueLen = lLen+1;
  2191. M_FREE(m_strValueInfo[n+1].pStrValue, sizeof(char)*m_strValueInfo[n+1].lStrValueLen);
  2192. m_strValueInfo[n+1].pStrValue = NULL;
  2193. m_strValueInfo[n+1].lStrValueLen = 0;
  2194. m_Value[n+1]=ERROR_CODE;
  2195. m_Operation[n]=0;
  2196. goto _SetVar;
  2197. }
  2198. else if( m_VarClass[n]==VC_GUID || (m_Var[n][0] == '@' && m_VarClass[n] == VC_ARRAY) )
  2199. {
  2200. m_guidValue[n]=m_guidValue[n+1];
  2201. m_guidValue[n+1]=NULL_GUID;
  2202. m_Operation[n]=0;
  2203. goto _SetVar;
  2204. }
  2205. else
  2206. {
  2207. m_Value[n]=m_Value[n+1];
  2208. m_Value[n+1]=ERROR_CODE;
  2209. m_Operation[n]=0;
  2210. goto _SetVar;
  2211. }
  2212. case 11: // '+='
  2213. m_Value[n]+=m_Value[n+1];
  2214. m_Value[n+1]=ERROR_CODE;
  2215. m_Operation[n]=0;
  2216. goto _SetVar;
  2217. case 12: // '-='
  2218. m_Value[n]-=m_Value[n+1];
  2219. m_Value[n+1]=ERROR_CODE;
  2220. m_Operation[n]=0;
  2221. goto _SetVar;
  2222. case 13: // '*='
  2223. m_Value[n]*=m_Value[n+1];
  2224. m_Value[n+1]=ERROR_CODE;
  2225. m_Operation[n]=0;
  2226. goto _SetVar;
  2227. case 14: // '/='
  2228. m_Value[n]/=m_Value[n+1];
  2229. m_Value[n+1]=ERROR_CODE;
  2230. m_Operation[n]=0;
  2231. goto _SetVar;
  2232. case 15: // '%='
  2233. m_Value[n] = ((long)m_Value[n] % (long)m_Value[n+1]);
  2234. m_Value[n+1]=ERROR_CODE;
  2235. m_Operation[n]=0;
  2236. goto _SetVar;
  2237. case 16: // '&'
  2238. p=Prew(n);
  2239. m_Value[p] = ((long)m_Value[p] & (long)m_Value[n+1]);
  2240. m_Value[n+1]=ERROR_CODE;
  2241. m_Operation[n]=0;
  2242. break;
  2243. case 17: // '|'
  2244. p=Prew(n);
  2245. m_Value[p] = ((long)m_Value[p] | (long)m_Value[n+1]);
  2246. m_Value[n+1]=ERROR_CODE;
  2247. m_Operation[n]=0;
  2248. break;
  2249. case 18: // '+'
  2250. {
  2251. int nPrewNum = Prew(n);
  2252. int nPrewStr = PrewString(n);
  2253. // 字符串连接
  2254. if ((nPrewStr >=0 && nPrewNum<=nPrewStr) || m_strValueInfo[n+1].pStrValue!=0)
  2255. {
  2256. if (nPrewNum<=nPrewStr)
  2257. p = nPrewStr;
  2258. else
  2259. p = nPrewNum;
  2260. size_t len=1;
  2261. if(m_strValueInfo[p].pStrValue!=0)
  2262. len+=strlen(m_strValueInfo[p].pStrValue);
  2263. else
  2264. len+=32;
  2265. if (m_strValueInfo[n+1].pStrValue!=0)
  2266. len+=strlen(m_strValueInfo[n+1].pStrValue);
  2267. else
  2268. len+=32;
  2269. char* temp=(char*)M_ALLOC(sizeof(char)*len);
  2270. //char* str1;
  2271. //char* str2;
  2272. //int len1,len2;
  2273. //处理第一个参数
  2274. if (m_strValueInfo[p].pStrValue!=0){
  2275. strcpy_s(temp, len, m_strValueInfo[p].pStrValue);
  2276. }
  2277. else
  2278. itoa(m_Value[p],temp,10);
  2279. if (m_strValueInfo[n+1].pStrValue!=0)
  2280. strcat_s(temp, len, m_strValueInfo[n+1].pStrValue);
  2281. else
  2282. itoa(m_Value[n+1],&temp[strlen(temp)],10);
  2283. M_FREE(m_strValueInfo[p].pStrValue, sizeof(char)*m_strValueInfo[p].lStrValueLen);
  2284. m_strValueInfo[p].pStrValue = NULL;
  2285. m_strValueInfo[p].lStrValueLen = 0;
  2286. m_strValueInfo[p].pStrValue=temp;
  2287. m_strValueInfo[p].lStrValueLen = (long)(sizeof(char)*len);
  2288. M_FREE(m_strValueInfo[n+1].pStrValue, sizeof(char)*m_strValueInfo[n+1].lStrValueLen);
  2289. m_strValueInfo[n+1].pStrValue = NULL;
  2290. m_strValueInfo[n+1].lStrValueLen = 0;
  2291. m_Value[n+1]=ERROR_CODE;
  2292. m_Operation[n]=0;
  2293. }
  2294. else{
  2295. p = nPrewNum;
  2296. m_Value[p]=m_Value[p] + m_Value[n+1];
  2297. m_Value[n+1]=ERROR_CODE;
  2298. m_Operation[n]=0;
  2299. }
  2300. }
  2301. break;
  2302. case 19: // '-'
  2303. p=Prew(n);
  2304. m_Value[p]=m_Value[p] - m_Value[n+1];
  2305. m_Value[n+1]=ERROR_CODE;
  2306. m_Operation[n]=0;
  2307. break;
  2308. case 20: // '*'
  2309. p=Prew(n);
  2310. m_Value[p]=m_Value[p] * m_Value[n+1];
  2311. m_Value[n+1]=ERROR_CODE;
  2312. m_Operation[n]=0;
  2313. break;
  2314. case 21: // '/'
  2315. p=Prew(n);
  2316. if (m_Value[n+1]!=0)
  2317. m_Value[p]=m_Value[p] / m_Value[n+1];
  2318. m_Value[n+1]=ERROR_CODE;
  2319. m_Operation[n]=0;
  2320. break;
  2321. case 22: // '%'
  2322. p=Prew(n);
  2323. m_Value[p]=((long)m_Value[p] % (long)m_Value[n+1]);
  2324. m_Value[n+1]=ERROR_CODE;
  2325. m_Operation[n]=0;
  2326. break;
  2327. }
  2328. }
  2329. _SetVar:
  2330. //给变量付值
  2331. if( m_VarClass[n] == VC_VAR )
  2332. {
  2333. double result = (double)SetScriptVarValue((CMoveShape*)p_SrcShape, m_Var[n].c_str(), 0, m_Value[n]);
  2334. }
  2335. else if( m_VarClass[n] == VC_STRING ) // 字符串
  2336. {
  2337. double result = (double)SetScriptVarValue((CMoveShape*)p_SrcShape, m_Var[n].c_str(), m_strValueInfo[n].pStrValue);
  2338. }
  2339. else if(m_VarClass[n] == VC_ARRAY ) // 数组(字符串和整数)
  2340. {
  2341. // 数组下标值
  2342. int lArray = CVariableList::VAR_NOT_FOUND;
  2343. char MainVarName[256];
  2344. char InnVarName[256];
  2345. char* MainVarNamePtr = MainVarName;
  2346. char* InnVarNamePtr = InnVarName;
  2347. char* varTypeFlag = (char*)m_Var[n].c_str();
  2348. long tempPos = 0;
  2349. double ret = CheckParamStringForArray(varTypeFlag, strlen(varTypeFlag), &MainVarNamePtr, 256, &InnVarNamePtr, 256, tempPos);
  2350. if(ret == 1.0f)
  2351. {
  2352. if(InnVarNamePtr[0] == '$') // 下标是变量
  2353. lArray = GetScriptVarValue((CMoveShape*)p_SrcShape, InnVarName, 0);
  2354. else
  2355. lArray = atoi(InnVarName);
  2356. if(varTypeFlag[0] == '$') // 整数数组
  2357. {
  2358. if(lArray != CVariableList::VAR_NOT_FOUND)
  2359. SetScriptVarValue( (CMoveShape*)p_SrcShape, MainVarName, lArray, m_Value[n] );
  2360. }
  2361. else if(varTypeFlag[0] == '#') // 字符串数组
  2362. {
  2363. if(lArray != CVariableList::VAR_NOT_FOUND)
  2364. {
  2365. // 找到对应字符串
  2366. char arrayStr[256];
  2367. _snprintf(arrayStr, 256, "%s%d", MainVarName, lArray);
  2368. SetScriptVarValue((CMoveShape*)p_SrcShape, arrayStr, m_strValueInfo[n].pStrValue);
  2369. }
  2370. }
  2371. else if(varTypeFlag[0] == '@') // GUID数组
  2372. {
  2373. if(lArray != CVariableList::VAR_NOT_FOUND)
  2374. {
  2375. // 找到对应字符串
  2376. char arrayStr[256];
  2377. _snprintf(arrayStr, 256, "%s%d", MainVarName, lArray);
  2378. SetScriptGuidValue((CMoveShape*)p_SrcShape, arrayStr, m_guidValue[n]);
  2379. }
  2380. }
  2381. }
  2382. else
  2383. {
  2384. char outStr[1024];
  2385. _snprintf(outStr, 1024, "count() array oper Err, var[%s]!", m_Var[n].c_str());
  2386. AddLogText(outStr);
  2387. }
  2388. }
  2389. else if( m_VarClass[n] == VC_GUID )
  2390. {
  2391. double result = (double)CVariableList::VAR_NOT_FOUND;
  2392. SetScriptGuidValue((CMoveShape*)p_SrcShape, m_Var[n].c_str(), m_guidValue[n]);
  2393. }
  2394. return 0;
  2395. }
  2396. // -------------------------------------------------------
  2397. // 函数
  2398. // -------------------------------------------------------
  2399. //////////////////////////
  2400. // 获取函数名称
  2401. char *CScript::GetFunctionName(const char *CmdStr, long& lLen)
  2402. {
  2403. int Len=(int)strlen(CmdStr);
  2404. int n=0;
  2405. char chr, *Ret;
  2406. Ret=(char*)M_ALLOC(sizeof(char)*(Len+1));
  2407. Ret[0] = '\0';
  2408. lLen = Len+1;
  2409. //memset(Ret, 0, Len+1);
  2410. for(int i=0; i<Len; i++)
  2411. {
  2412. chr=CmdStr[i];
  2413. if( chr == '(' || chr == ' ' || chr == '\t' || chr == '\n' || chr == '\r' || chr == ';' )
  2414. {
  2415. Ret[n] = '\0';
  2416. return Ret;
  2417. }
  2418. Ret[n]=chr;
  2419. n++;
  2420. }
  2421. return Ret;
  2422. }
  2423. /////////////////////////
  2424. // 取得整形参数(如果没有该参数,那么返回ERROR_CODE)
  2425. double CScript::GetIntParam(const char *CmdStr, int num)
  2426. {
  2427. int Len=(int)strlen(CmdStr), j, ParamNum=0, nBracket=0;
  2428. char chr, *Ret;
  2429. bool bInString=false;
  2430. Ret=(char*)M_ALLOC(sizeof(char)*(Len+1));
  2431. Ret[0] = '\0';
  2432. //查找参数头
  2433. int i=0;
  2434. for(; i<Len; i++)
  2435. {
  2436. if( CmdStr[i] == '(' ) goto _Next;
  2437. }
  2438. goto _Error;
  2439. _Next:
  2440. for(j=i+1; j<Len; j++)
  2441. {
  2442. chr=CmdStr[j];
  2443. // 判断是否进入字符串
  2444. if( chr == '\"' ) bInString=!bInString;
  2445. // 如果不在字符串内部
  2446. if( !bInString )
  2447. {
  2448. if( chr == '(' )
  2449. {
  2450. nBracket++; // 进入一层括号
  2451. }
  2452. else if( chr == ')' )
  2453. {
  2454. if( nBracket > 0 ) // 退出一层括号
  2455. {
  2456. nBracket--;
  2457. }
  2458. else if( nBracket == 0 ) // 完成-没有找到指定的参数
  2459. {
  2460. goto _Error;
  2461. }
  2462. }
  2463. else if( nBracket==0 && IsCompart(chr) ) // 参数加一
  2464. {
  2465. while( !IsCompart(CmdStr[j]) ) { j++;} // 去掉逗号前面的空格
  2466. chr=CmdStr[j];
  2467. ParamNum++;
  2468. }
  2469. }
  2470. //对应的参数
  2471. if( ParamNum==num )
  2472. {
  2473. while( IsCompart(CmdStr[j]) ) { j++;} // 去掉逗号
  2474. int n = 0;
  2475. bInString=false;
  2476. nBracket=0;
  2477. for(int k=j; k<Len; k++)
  2478. {
  2479. chr=CmdStr[k];
  2480. if( chr == '\"' ) bInString=!bInString;
  2481. if( !bInString )
  2482. {
  2483. if( chr == '(' ) nBracket++;
  2484. else if( chr == ')' && nBracket>0 ) nBracket--;
  2485. else if( nBracket==0 && ( IsCompart(chr) || chr == ')' ))
  2486. {
  2487. Ret[n]=';';
  2488. Ret[n+1] = '\0';
  2489. CScript *pTemptScript = PopFreeScript(Ret);
  2490. InitChildScriptData(pTemptScript);
  2491. //设置变量
  2492. pTemptScript->SetVariableList(m_pVariableList);
  2493. pTemptScript->RunLine(Ret);
  2494. double ret=pTemptScript->m_Value[0];
  2495. M_FREE(Ret, sizeof(char)*(Len+1));
  2496. Ret = NULL;
  2497. if(pTemptScript->m_strValueInfo[0].pStrValue!=NULL) //类型不对
  2498. ret = ERROR_CODE;
  2499. PushFreeScript(pTemptScript);
  2500. return ret;
  2501. }
  2502. }
  2503. Ret[n]=chr;
  2504. n++;
  2505. }
  2506. goto _Error;
  2507. }
  2508. }
  2509. _Error:
  2510. M_FREE(Ret, sizeof(char)*(Len+1));
  2511. return ERROR_CODE;
  2512. }
  2513. ///////////////////////////
  2514. // 取得字符串参数(如果没有该参数,那么返回一个空的字符串)
  2515. char *CScript::GetStringParam(const char *CmdStr, int num)
  2516. {
  2517. char* pRet=NULL; //存放返回值
  2518. char* pCurrent; //当前搜索的位置
  2519. char* pParam=NULL; //参数的起始位置
  2520. bool bInString=false; //是否在字符串中
  2521. int ParamNum;
  2522. int ParamLength=0; //参数的字符串长度
  2523. int nBracket;
  2524. //找第一个'('
  2525. for( pCurrent = (char*)CmdStr; *pCurrent!=0; pCurrent++ )
  2526. {
  2527. if (*pCurrent=='(') break;
  2528. }
  2529. //到参数开始的地方
  2530. pCurrent++;
  2531. ParamNum=0;
  2532. nBracket=0;
  2533. for(; *pCurrent!=0; pCurrent++)
  2534. {
  2535. //记录需要的参数
  2536. if(ParamNum==num)
  2537. {
  2538. if (0==pParam)
  2539. {
  2540. pParam=pCurrent;
  2541. ParamLength=0;
  2542. }
  2543. ParamLength++;
  2544. }
  2545. if( *pCurrent == '\"' )
  2546. {
  2547. bInString=!bInString;
  2548. }
  2549. if( !bInString )
  2550. {
  2551. if( *pCurrent == '(' ) nBracket++;
  2552. else if(*pCurrent == ')') nBracket--;
  2553. if((nBracket==0 && IsCompart(*pCurrent)) || nBracket<0)
  2554. {
  2555. if (ParamLength>0)
  2556. break;//如果参数已经找到,就直接跳出进行处理
  2557. ParamNum++;
  2558. }
  2559. }
  2560. }
  2561. //有此参数 (包括两边的引号)
  2562. if (ParamLength>=2)
  2563. {
  2564. pRet=(char*)M_ALLOC(sizeof(char)*MAX_VAR_LEN);
  2565. memcpy(pRet,pParam,ParamLength);
  2566. pRet[ParamLength-1]=';';
  2567. pRet[ParamLength]=0;
  2568. CScript *pTemptScript = PopFreeScript(pRet);
  2569. InitChildScriptData(pTemptScript);
  2570. //设置变量
  2571. pTemptScript->SetVariableList(m_pVariableList);
  2572. pTemptScript->RunLine(pRet);
  2573. if (0 == pTemptScript->m_strValueInfo[0].pStrValue)
  2574. {
  2575. _snprintf(pRet, MAX_VAR_LEN, "%f", pTemptScript->m_Value[0]);
  2576. }
  2577. else
  2578. {
  2579. strcpy_s(pRet, MAX_VAR_LEN, pTemptScript->m_strValueInfo[0].pStrValue);
  2580. }
  2581. PushFreeScript(pTemptScript);
  2582. }
  2583. else
  2584. {
  2585. pRet=NULL;
  2586. //pRet[0]=0;
  2587. }
  2588. return pRet;
  2589. }
  2590. char *CScript::GetOperation(const char *CmdStr, int num)
  2591. {
  2592. int Len=(int)strlen(CmdStr), n=0, j, ParamNum=0, nBracket=0;
  2593. char chr, *Ret;
  2594. bool bInString=false;
  2595. Ret=(char*)M_ALLOC(sizeof(char)*(Len+1));
  2596. Ret[0] = '\0';
  2597. //查找参数头
  2598. int i=0;
  2599. for(; i<Len; i++)
  2600. {
  2601. if( CmdStr[i] == '(' ) goto _Next;
  2602. }
  2603. goto _ERROR;
  2604. _Next:
  2605. for(j=i+1; j<Len; j++)
  2606. {
  2607. chr=CmdStr[j];
  2608. //变量数值参数
  2609. if( ParamNum==num && IsCompart(chr) )
  2610. {
  2611. for(int k=j+1; k<Len; k++)
  2612. {
  2613. Ret[n]=chr;
  2614. n++;
  2615. chr=CmdStr[k];
  2616. if( !IsCompart(chr) )
  2617. {
  2618. Ret[n] = '\0';
  2619. return Ret;
  2620. }
  2621. }
  2622. goto _ERROR;
  2623. }
  2624. //第几参数
  2625. if( chr == '\"' ) bInString=!bInString;
  2626. if( !bInString )
  2627. {
  2628. if( chr == '(' ) nBracket++;
  2629. else if( chr == ')' && nBracket>0 ) nBracket--;
  2630. else if( nBracket==0 && IsCompart(chr) )
  2631. {
  2632. while( !IsCompart(CmdStr[j]) ) { j++; }
  2633. chr=CmdStr[j];
  2634. ParamNum++;
  2635. }
  2636. }
  2637. }
  2638. _ERROR:
  2639. char str[10240];
  2640. _snprintf(str, 10240, "Command [%s]'s Operation %d not found!", CmdStr, num);
  2641. PutDebugString(str);
  2642. Ret[0] = '\0';
  2643. return Ret;
  2644. }
  2645. ////////////////////////////
  2646. // 某字符是否是分隔符
  2647. bool CScript::IsCompart(char chr)
  2648. {
  2649. if( chr == ',' )
  2650. return true;
  2651. return false;
  2652. }
  2653. ////////////////////////
  2654. // 获取实际的Npc ID
  2655. double CScript::GetTrueNpcID(double id)
  2656. {
  2657. return 0;
  2658. }
  2659. ////////////////////////
  2660. // 运行一步脚本
  2661. // soft 2006-12-26 改为一直把脚本执行完,除非遇到等待的函数
  2662. enum CScript::SCRIPTRETURN CScript::RunStep()
  2663. {
  2664. char CmdStr[MAX_VAR_LEN];
  2665. char *CmdName;
  2666. do{
  2667. //有等待函数正在执行
  2668. if( m_bHang )
  2669. {
  2670. return SR_HANG;
  2671. }
  2672. ReadCmd(CmdStr, MAX_VAR_LEN); //读一行指令
  2673. long lCmdNameLen = 0;
  2674. CmdName=GetFunctionName(CmdStr, lCmdNameLen); //获取第一个函数名称
  2675. //返回
  2676. if( stricmp( CmdStr, "" ) == 0 )
  2677. {
  2678. M_FREE(CmdName, lCmdNameLen);
  2679. return SR_END;
  2680. }
  2681. else if( stricmp( CmdStr, "return;" ) == 0 )
  2682. {
  2683. M_FREE(CmdName, lCmdNameLen);
  2684. return SR_RETURN;
  2685. }
  2686. //For返回
  2687. else if( stricmp( CmdStr, "break;" ) == 0 )
  2688. {
  2689. M_FREE(CmdName, lCmdNameLen);
  2690. return SR_FORBREAK;
  2691. }
  2692. //For返回
  2693. else if( stricmp( CmdStr, "continue;" ) == 0 )
  2694. {
  2695. M_FREE(CmdName, lCmdNameLen);
  2696. return SR_FORCONTINUE;
  2697. }
  2698. else if( stricmp( CmdName, "<begin>" ) == 0 )
  2699. {
  2700. M_FREE(CmdName, lCmdNameLen);
  2701. continue;
  2702. }
  2703. else if( stricmp( CmdName, "<end>" ) == 0 )
  2704. {
  2705. M_FREE(CmdName, lCmdNameLen);
  2706. continue;
  2707. }
  2708. //标记
  2709. else if( CmdStr[strlen(CmdStr)-2] == ':' )
  2710. {
  2711. M_FREE(CmdName, lCmdNameLen);
  2712. continue;
  2713. }
  2714. //调用其它脚本(递归调用)
  2715. else if( stricmp( CmdName, "call" ) == 0 )
  2716. {
  2717. SCRIPTRETURN ret = call(CmdStr);
  2718. M_FREE(CmdName, lCmdNameLen);
  2719. if(CScript::SR_END == ret || CScript::SR_RETURN == ret)
  2720. continue;
  2721. return ret;
  2722. }
  2723. //调用其它脚本(递归调用)
  2724. else if( stricmp( CmdName, "callex" ) == 0 )
  2725. {
  2726. SCRIPTRETURN ret = callEx(CmdStr);
  2727. M_FREE(CmdName, lCmdNameLen);
  2728. if(CScript::SR_END == ret || CScript::SR_RETURN == ret)
  2729. continue;
  2730. return ret;
  2731. }
  2732. // [070511 AHC]
  2733. // 定义局部变量
  2734. else if( stricmp( CmdName, "localvar" ) == 0 )
  2735. {
  2736. LocalVar(CmdStr);
  2737. M_FREE(CmdName, lCmdNameLen);
  2738. continue;
  2739. }
  2740. // for
  2741. else if( stricmp( CmdName, "for" ) == 0 )
  2742. {
  2743. SCRIPTRETURN ret = For(CmdStr);
  2744. M_FREE(CmdName, lCmdNameLen);
  2745. if(CScript::SR_END == ret)
  2746. continue;
  2747. return ret;
  2748. }
  2749. RunLine(CmdStr); //执行
  2750. M_FREE(CmdName, lCmdNameLen);
  2751. }while( 1 );
  2752. return SR_END;
  2753. }
  2754. //异步操作返回后继续执行
  2755. enum CScript::SCRIPTRETURN CScript::ContinueRun(CVariableList* stackVarList)
  2756. {
  2757. #ifdef _RUNSTACKINFO_
  2758. char pszStatckInfo[256]="";
  2759. _snprintf(pszStatckInfo,256,"CScript::ContinueRun(FileName:%s) Start",m_FileName);
  2760. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2761. #endif
  2762. #ifdef _SCRIPT_INFO_
  2763. DWORD BeginTime = timeGetTime();
  2764. m_RunTime = 0;
  2765. #endif
  2766. SCRIPTRETURN eRet = SR_END;
  2767. m_bHang = false;
  2768. if(m_pChildScriptInfo)
  2769. {
  2770. InitChildScriptData(m_pChildScriptInfo->pChildScript);
  2771. if(m_pChildScriptInfo->pChildScript)
  2772. {
  2773. switch(m_pChildScriptInfo->eType)
  2774. {
  2775. case CST_FOR:
  2776. {
  2777. eRet = ContinueRunFor(stackVarList);
  2778. }
  2779. break;
  2780. case CST_CALL:
  2781. {
  2782. eRet = ContinueRunCall(stackVarList);
  2783. }
  2784. break;
  2785. case CST_CALLEX:
  2786. {
  2787. eRet = ContinueRunCallEx(stackVarList);
  2788. }
  2789. break;
  2790. }
  2791. if(eRet == SR_HANG)
  2792. {
  2793. m_bHang = true;
  2794. SetHangFunc(m_pChildScriptInfo->pChildScript->GetHangFunc());
  2795. }
  2796. }
  2797. }
  2798. else
  2799. {
  2800. // 根据stackVarList设置返回值
  2801. if(stackVarList)
  2802. {
  2803. if(stackVarList->GetVarList())
  2804. {
  2805. CVariableList::VarList::iterator varItr = stackVarList->GetVarList()->begin();
  2806. for(; varItr != stackVarList->GetVarList()->end(); varItr++)
  2807. {
  2808. if(varItr->first[0] == '#')// 字符串
  2809. SetScriptVarValue((CMoveShape*)p_SrcShape, varItr->first.c_str(), varItr->second->strValue);
  2810. else if(varItr->first[0] == '$')
  2811. SetScriptVarValue((CMoveShape*)p_SrcShape, varItr->first.c_str(), varItr->second->Array, *varItr->second->Value);
  2812. }
  2813. // GUID 变量
  2814. CVariableList::GuidList::iterator guidItr = stackVarList->GetGuidList()->begin();
  2815. for(; guidItr != stackVarList->GetGuidList()->end(); guidItr++)
  2816. {
  2817. SetScriptGuidValue((CMoveShape*)p_SrcShape, guidItr->first.c_str(), *(guidItr->second));
  2818. }
  2819. }
  2820. }
  2821. }
  2822. #ifdef _SCRIPT_INFO_
  2823. if(eRet != SR_HANG)
  2824. {
  2825. m_RunTime += timeGetTime() - BeginTime;
  2826. GetGame()->AddScriptInfo(m_FileName, m_RunTime);
  2827. m_RunTime = 0;
  2828. }
  2829. else
  2830. {
  2831. m_RunTime += timeGetTime() - BeginTime;
  2832. }
  2833. #endif
  2834. if(eRet == SR_HANG || eRet == SR_RETURN || eRet == SR_ERROR)
  2835. {
  2836. #ifdef _RUNSTACKINFO_
  2837. _snprintf(pszStatckInfo,256,"CScript::ContinueRun() End.(ret1:%d)",eRet);
  2838. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2839. #endif
  2840. return eRet;
  2841. }
  2842. eRet = RunStep();
  2843. #ifdef _RUNSTACKINFO_
  2844. _snprintf(pszStatckInfo,256,"CScript::ContinueRun() End.(ret2:%d)",eRet);
  2845. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2846. #endif
  2847. return eRet;
  2848. }
  2849. //异步操作返回后继续执行call子句
  2850. enum CScript::SCRIPTRETURN CScript::ContinueRunCall(CVariableList* stackVarList)
  2851. {
  2852. #ifdef _RUNSTACKINFO_
  2853. char pszStatckInfo[1024]="";
  2854. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),"CScript::ContinueRunCall() Start");
  2855. #endif
  2856. SCRIPTRETURN eRet = SR_END;
  2857. eRet = m_pChildScriptInfo->pChildScript->ContinueRun(stackVarList);
  2858. if(eRet != SR_HANG)
  2859. {
  2860. //释放脚本资源
  2861. PushFreeScript(m_pChildScriptInfo->pChildScript);
  2862. LeaveChildScript(m_pChildScriptInfo->pChildScript);
  2863. }
  2864. if(eRet == SR_RETURN)
  2865. eRet = SR_END;
  2866. #ifdef _RUNSTACKINFO_
  2867. _snprintf(pszStatckInfo,1024,"CScript::ContinueRunCall() End(ret:%d)",eRet);
  2868. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2869. #endif
  2870. return eRet;
  2871. }
  2872. //异步操作返回后继续执行call子句
  2873. enum CScript::SCRIPTRETURN CScript::ContinueRunCallEx(CVariableList* stackVarList)
  2874. {
  2875. #ifdef _RUNSTACKINFO_
  2876. char pszStatckInfo[1024]="";
  2877. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),"CScript::ContinueRunCallEx() Start");
  2878. #endif
  2879. SCRIPTRETURN eRet = SR_END;
  2880. eRet = m_pChildScriptInfo->pChildScript->ContinueRun(stackVarList);
  2881. if(eRet != SR_HANG)
  2882. {
  2883. m_pChildScriptInfo->pChildScript->ResetVariableList();
  2884. //释放脚本资源
  2885. PushFreeScript(m_pChildScriptInfo->pChildScript);
  2886. LeaveChildScript(m_pChildScriptInfo->pChildScript);
  2887. }
  2888. if(eRet == SR_RETURN)
  2889. eRet = SR_END;
  2890. #ifdef _RUNSTACKINFO_
  2891. _snprintf(pszStatckInfo,1024,"CScript::ContinueRunCallEx() End(ret:%d)",eRet);
  2892. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2893. #endif
  2894. return eRet;
  2895. }
  2896. //异步操作返回后继续执行for子句
  2897. enum CScript::SCRIPTRETURN CScript::ContinueRunFor(CVariableList* stackVarList)
  2898. {
  2899. #ifdef _RUNSTACKINFO_
  2900. char pszStatckInfo[1024]="";
  2901. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),"CScript::ContinueRunFor() Start");
  2902. #endif
  2903. SCRIPTRETURN eRet = SR_END;
  2904. eRet = m_pChildScriptInfo->pChildScript->ContinueRun(stackVarList);
  2905. if(eRet == SR_HANG)
  2906. {
  2907. SetIsHang(true);
  2908. SetHangFunc(m_pChildScriptInfo->pChildScript->GetHangFunc());
  2909. #ifdef _RUNSTACKINFO_
  2910. _snprintf(pszStatckInfo,1024,"SCRIPTRETURN CScript::ContinueRunFor() End1(ret:%d)",eRet);
  2911. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2912. #endif
  2913. return eRet;
  2914. }
  2915. //离开子脚本
  2916. CScript *forScript = m_pChildScriptInfo->pChildScript;
  2917. char szCountCmd[MAX_STACK_CMD_LEN]="";
  2918. char szMaxCmd[MAX_STACK_CMD_LEN]="";
  2919. strncpy(szCountCmd,m_pChildScriptInfo->pszPreOp,MAX_STACK_CMD_LEN);
  2920. strncpy(szMaxCmd,m_pChildScriptInfo->pszCon,MAX_STACK_CMD_LEN);
  2921. LeaveChildScript(m_pChildScriptInfo->pChildScript);
  2922. if(eRet == SR_FORBREAK || eRet == SR_RETURN || eRet == SR_ERROR)
  2923. {
  2924. if(eRet == SR_FORBREAK)
  2925. eRet= SR_END;
  2926. PushFreeScript(forScript);
  2927. #ifdef _RUNSTACKINFO_
  2928. _snprintf(pszStatckInfo,1024,"SCRIPTRETURN CScript::ContinueRunFor() End2(ret:%d)",eRet);
  2929. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2930. #endif
  2931. return eRet;
  2932. }
  2933. //如果eRet==SR_END or SR_FORCONTINUE,继续执行该脚本
  2934. RunLine(szCountCmd);
  2935. RunLine(szMaxCmd);
  2936. while(1 == m_Value[0])
  2937. {
  2938. //重置当前指针
  2939. forScript->ResetDataPos();
  2940. //记录进入子脚本
  2941. EnterChildScript(CST_FOR,forScript,szCountCmd,szMaxCmd);
  2942. eRet = forScript->RunStep();
  2943. //只要该脚本不挂起,就记录离开子脚本
  2944. if(eRet != CScript::SR_HANG)
  2945. LeaveChildScript(forScript);
  2946. //脚本挂起
  2947. if(eRet == CScript::SR_HANG)
  2948. {
  2949. SetIsHang(true);
  2950. SetHangFunc(forScript->GetHangFunc());
  2951. #ifdef _RUNSTACKINFO_
  2952. _snprintf(pszStatckInfo,1024,"SCRIPTRETURN CScript::ContinueRunFor() End3(ret:%d)",eRet);
  2953. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2954. #endif
  2955. return eRet;
  2956. }
  2957. else if(eRet == CScript::SR_FORBREAK || eRet == CScript::SR_END)
  2958. {
  2959. break;
  2960. }
  2961. else if(eRet == CScript::SR_RETURN || eRet == CScript::SR_ERROR)
  2962. {
  2963. EndForScript(forScript);
  2964. #ifdef _RUNSTACKINFO_
  2965. _snprintf(pszStatckInfo,1024,"SCRIPTRETURN CScript::ContinueRunFor() End4(ret:%d)",eRet);
  2966. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2967. #endif
  2968. return eRet;
  2969. }
  2970. //在retFlag == CScript::SR_FORCONTINUE或者其他况下,继续执行
  2971. RunLine(szCountCmd);
  2972. RunLine(szMaxCmd);
  2973. }
  2974. EndForScript(forScript);
  2975. #ifdef _RUNSTACKINFO_
  2976. _snprintf(pszStatckInfo,1024,"SCRIPTRETURN CScript::ContinueRunFor() End5(ret:%d)",eRet);
  2977. CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo);
  2978. #endif
  2979. return eRet;
  2980. }
  2981. //初始化子脚本数据
  2982. void CScript::InitChildScriptData(CScript *pChildScript)
  2983. {
  2984. pChildScript->m_dwLastTime=0;
  2985. pChildScript->SetPlayerID(GetPlayerID());
  2986. pChildScript->SetRegion(GetRegion());
  2987. pChildScript->SetSrcShape(GetSrcShape());
  2988. pChildScript->SetDesShape(GetDesShape());
  2989. pChildScript->SetUsedItemID(GetUsedItemID());
  2990. pChildScript->SetDropGoodsPoint(GetDropGoodsPoint());
  2991. pChildScript->SetID(GetID());
  2992. }
  2993. //记录进入子脚本
  2994. //必须和LeaveChildScript函数成对的调用
  2995. void CScript::EnterChildScript(eCST eType,CScript* pChildScript,const char* pszPreOp,const char* pszCon)
  2996. {
  2997. if(m_pChildScriptInfo != NULL)
  2998. {
  2999. //output the error info
  3000. char strErrorInfo[1024]="";
  3001. _snprintf(strErrorInfo,256,"error(scriptname:%s),enter the child script,the variable is not null.",m_FileName);
  3002. PutDebugString(strErrorInfo);
  3003. MP_DELETE(m_pChildScriptInfo);
  3004. }
  3005. m_pChildScriptInfo = MP_NEW tagChilScriptInfo;
  3006. m_pChildScriptInfo->eType = eType;
  3007. m_pChildScriptInfo->pChildScript = pChildScript;
  3008. strncpy(m_pChildScriptInfo->pszPreOp,pszPreOp,MAX_STACK_CMD_LEN);
  3009. strncpy(m_pChildScriptInfo->pszCon,pszCon,MAX_STACK_CMD_LEN);
  3010. }
  3011. void CScript::LeaveChildScript(CScript* pChildScript)
  3012. {
  3013. if(m_pChildScriptInfo == NULL || m_pChildScriptInfo->pChildScript != pChildScript)
  3014. {
  3015. //output the error info
  3016. char strErrorInfo[1024]="";
  3017. _snprintf(strErrorInfo,256,"error(scriptname:%s),leave the child script,the variable is not equals.",m_FileName);
  3018. PutDebugString(strErrorInfo);
  3019. }
  3020. MP_DELETE(m_pChildScriptInfo);
  3021. }
  3022. void CScript:: ResetChildScriptInfo()
  3023. {
  3024. if(m_pChildScriptInfo != NULL)
  3025. {
  3026. //output the error info
  3027. char strErrorInfo[1024]="";
  3028. _snprintf(strErrorInfo,256,"error(scriptname:%s),reset the child script,the variable is not equals.",m_FileName);
  3029. PutDebugString(strErrorInfo);
  3030. m_pChildScriptInfo = NULL;
  3031. }
  3032. }
  3033. CScript* CScript::BeginForScript(char* pScriptData)
  3034. {
  3035. CScript* tempScript = PopFreeScript("for");
  3036. InitChildScriptData(tempScript);
  3037. // 加载脚本内容
  3038. if(tempScript)
  3039. {
  3040. tempScript->LoadScript(NULL, pScriptData);
  3041. tempScript->SetVariableList(GetVariableList());
  3042. }
  3043. return tempScript;
  3044. }
  3045. void CScript::EndForScript(CScript* forScript)//外部调用脚本
  3046. {
  3047. PushFreeScript(forScript);
  3048. }
  3049. void CScript::SetSrcShapeEx(CShape* pShape)
  3050. {
  3051. SetSrcShape(pShape);
  3052. //设置脚本变量名值
  3053. GetVariableList()->AddVar("$ParamA", (DWORD)p_SrcShape);
  3054. }
  3055. void CScript::SetRegion(CRegion* r)
  3056. {
  3057. m_pRegion = r;
  3058. if(m_pRegion)
  3059. m_guRegionID = m_pRegion->GetExID();
  3060. else
  3061. m_guRegionID = NULL_GUID;
  3062. }
  3063. void CScript::SetSrcShape(CShape* shape)
  3064. {
  3065. p_SrcShape = shape;
  3066. if(p_SrcShape)
  3067. {
  3068. m_lSrcType = p_SrcShape->GetType();
  3069. m_guSrcID = p_SrcShape->GetExID();
  3070. }
  3071. else
  3072. {
  3073. m_lSrcType = 0;
  3074. m_guSrcID = NULL_GUID;
  3075. }
  3076. }
  3077. void CScript::SetDesShape(CShape* shape)
  3078. {
  3079. p_DesShape = shape;
  3080. if(p_DesShape)
  3081. {
  3082. m_lDesType = p_DesShape->GetType();
  3083. m_guDesID = p_DesShape->GetExID();
  3084. }
  3085. else
  3086. {
  3087. m_lDesType = 0;
  3088. m_guDesID = NULL_GUID;
  3089. }
  3090. }
  3091. //重新设置
  3092. void CScript::ResetShape()
  3093. {
  3094. CServerRegion *pRegion = GetGame()->FindRegion(m_guRegionID);
  3095. if(pRegion)
  3096. {
  3097. m_pRegion = pRegion;
  3098. p_SrcShape = dynamic_cast<CShape*>(pRegion->FindChildObject(m_lSrcType,m_guSrcID));
  3099. p_DesShape = dynamic_cast<CShape*>(pRegion->FindChildObject(m_lDesType,m_guDesID));
  3100. }
  3101. else
  3102. {
  3103. m_pRegion = NULL;
  3104. p_SrcShape = NULL;
  3105. p_DesShape = NULL;
  3106. }
  3107. }
  3108. void CScript::SetSkillEx(CBaseModule *pSkill)
  3109. {
  3110. //设置脚本变量名值
  3111. GetVariableList()->AddVar("$ParamS",(DWORD)pSkill);
  3112. }
  3113. void CScript::SetFireShapeEx(CShape* shape)
  3114. {
  3115. //设置脚本变量名值
  3116. GetVariableList()->AddVar("$ParamF",(DWORD)shape);
  3117. }
  3118. //执行一段字符串
  3119. enum CScript::SCRIPTRETURN CScript::RunStr(CMoveShape* pDest,const char* pszContent)
  3120. {
  3121. SetDesShape(pDest);
  3122. if( LoadScript(NULL, (char*)pszContent) ) //打开文件
  3123. {
  3124. GetVariableList()->AddVar("$ParamB", (DWORD)pDest);
  3125. //返回值
  3126. GetVariableList()->AddVar("$Ret", 0.0f);
  3127. return RunStep();
  3128. }
  3129. return SR_ERROR;
  3130. }
  3131. int CScript::GetValueType(const char* pValue){
  3132. if (*pValue=='\"')
  3133. return VC_STRING;
  3134. else
  3135. return VC_VAR;
  3136. }
  3137. int CScript::DumpString(char* &pDest, long lDesLen, const char* pSrc)
  3138. {
  3139. if (pSrc==NULL)
  3140. return 0;
  3141. int len=lstrlen(pSrc);
  3142. if(pDest!=0)
  3143. M_FREE(pDest, lDesLen);
  3144. pDest=(char*)M_ALLOC(sizeof(char)*(len+1));
  3145. strcpy_s(pDest, len+1, pSrc);
  3146. // memcpy(pDest,pSrc,len+1);
  3147. return len;
  3148. }
  3149. // 更新到WorldServer
  3150. bool CScript::UpdateToWorldServer(const char* strVarName, int pos, double nValue)
  3151. {
  3152. if(!strVarName) return false;
  3153. CMessage msg(MSG_S2W_SERVER_CHANGE_SCRIPT_VARIABLE);
  3154. msg.Add((char*)strVarName);
  3155. msg.Add((BYTE)eVarNumber); // 0 数值
  3156. msg.Add((long)pos);
  3157. msg.Add((LONG64)(*(LONG64*)&nValue));
  3158. msg.Send();
  3159. return true;
  3160. }
  3161. bool CScript::UpdateToWorldServer(const char* strVarName, const char* szValue) // 更新到WorldServer
  3162. {
  3163. if(!strVarName || !szValue) return false;
  3164. CMessage msg(MSG_S2W_SERVER_CHANGE_SCRIPT_VARIABLE);
  3165. msg.Add(strVarName);
  3166. msg.Add((BYTE)eVarString); // 1 字符串
  3167. msg.Add(szValue);
  3168. msg.Send();
  3169. return true;
  3170. }
  3171. bool CScript::UpdateToWorldServer(const char* strVarName, const CGUID& guid) // 更新"@"到WorldServer
  3172. {
  3173. if(!strVarName) return false;
  3174. CMessage msg(MSG_S2W_SERVER_CHANGE_SCRIPT_VARIABLE);
  3175. msg.Add(strVarName);
  3176. msg.Add((BYTE)eVarGuid); // 2 guid
  3177. msg.Add(guid);
  3178. msg.Send();
  3179. return true;
  3180. }
  3181. // [070608 AHC]
  3182. bool CScript::SetAttr(OBJECT_TYPE type, const CGUID& entityID, std::string& attrName, double value)
  3183. {
  3184. CMoveShape* shape = GetGame()->FindShape(type, entityID);
  3185. if(shape)
  3186. return shape->SetAttribute(attrName, value);
  3187. return false;
  3188. }
  3189. double CScript::GetAttr(OBJECT_TYPE type, const CGUID& entityID, std::string& attrName)
  3190. {
  3191. CMoveShape* shape = GetGame()->FindShape(type, entityID);
  3192. if(shape)
  3193. return shape->GetAttribute(attrName);
  3194. return INVILID_VALUE;
  3195. }
  3196. bool CScript::ChangeAttr(OBJECT_TYPE type, const CGUID& entityID, std::string& attrName, double value)
  3197. {
  3198. CMoveShape* shape = GetGame()->FindShape(type, entityID);
  3199. if(shape)
  3200. {
  3201. shape->ChangeAttribute(attrName, value);
  3202. shape->UpdateAttribute();
  3203. return true;
  3204. }
  3205. return false;
  3206. }
  3207. bool CScript::SetMoveShapeAttrEx(DWORD entityPtr, std::string& attrName, double value)
  3208. {
  3209. CMoveShape* pMoveShape = ((CMoveShape*)entityPtr);
  3210. if(pMoveShape)
  3211. {
  3212. if(pMoveShape->GetType() == TYPE_PLAYER)
  3213. {
  3214. CPlayer *pPlayer = (CPlayer*)(pMoveShape);
  3215. char pszTempt[32]="";
  3216. if(attrName == "OccuLvl")
  3217. {
  3218. _snprintf(pszTempt,32,"OccuLvl%d",pPlayer->GetOccupation());
  3219. attrName = pszTempt;
  3220. }
  3221. else if(attrName == "OccuExp")
  3222. {
  3223. _snprintf(pszTempt,32,"OccuExp%d",pPlayer->GetOccupation());
  3224. attrName = pszTempt;
  3225. }
  3226. else if(attrName == "OccuSP")
  3227. {
  3228. _snprintf(pszTempt,32,"OccuSP%d",pPlayer->GetOccupation());
  3229. attrName = pszTempt;
  3230. }
  3231. }
  3232. bool ret = pMoveShape->SetAttribute(attrName, value);
  3233. pMoveShape->UpdateAttribute();
  3234. return ret;
  3235. }
  3236. return false;
  3237. }
  3238. double CScript::GetMoveShapeAttrEx(DWORD entityPtr, std::string& attrName)
  3239. {
  3240. CMoveShape *pMoveShape = (CMoveShape*)entityPtr;
  3241. if (pMoveShape)
  3242. {
  3243. if(pMoveShape->GetType() == TYPE_PLAYER)
  3244. {
  3245. CPlayer *pPlayer = (CPlayer*)(pMoveShape);
  3246. char pszTempt[32]="";
  3247. if(attrName == "OccuLvl")
  3248. {
  3249. _snprintf(pszTempt,32,"OccuLvl%d",pPlayer->GetOccupation());
  3250. attrName = pszTempt;
  3251. }
  3252. else if(attrName == "OccuExp")
  3253. {
  3254. _snprintf(pszTempt,32,"OccuExp%d",pPlayer->GetOccupation());
  3255. attrName = pszTempt;
  3256. }
  3257. else if(attrName == "OccuSP")
  3258. {
  3259. _snprintf(pszTempt,32,"OccuSP%d",pPlayer->GetOccupation());
  3260. attrName = pszTempt;
  3261. }
  3262. }
  3263. return pMoveShape->GetAttribute(attrName);
  3264. }
  3265. return INVILID_VALUE;
  3266. }
  3267. bool CScript::ChangeMoveShapeAttrEx(DWORD entityPtr, std::string& attrName, double value)
  3268. {
  3269. CMoveShape* pMoveShape = ((CMoveShape*)entityPtr);
  3270. if(pMoveShape)
  3271. {
  3272. if(pMoveShape->GetType() == TYPE_PLAYER)
  3273. {
  3274. CPlayer *pPlayer = (CPlayer*)(pMoveShape);
  3275. char pszTempt[32]="";
  3276. if(attrName == "OccuLvl")
  3277. {
  3278. _snprintf(pszTempt,32,"OccuLvl%d",pPlayer->GetOccupation());
  3279. attrName = pszTempt;
  3280. }
  3281. else if(attrName == "OccuExp")
  3282. {
  3283. _snprintf(pszTempt,32,"OccuExp%d",pPlayer->GetOccupation());
  3284. attrName = pszTempt;
  3285. }
  3286. else if(attrName == "OccuSP")
  3287. {
  3288. _snprintf(pszTempt,32,"OccuSP%d",pPlayer->GetOccupation());
  3289. attrName = pszTempt;
  3290. }
  3291. }
  3292. pMoveShape->ChangeAttribute(attrName, value);
  3293. pMoveShape->UpdateAttribute();
  3294. return true;
  3295. }
  3296. return false;
  3297. }
  3298. int CScript::GetVarValue(const char* str,int num)
  3299. {
  3300. int nRet = GetVariableList()->GetVarValue(str, 0);
  3301. if(nRet == CVariableList::VAR_NOT_FOUND)
  3302. return 0;
  3303. return nRet;
  3304. }
  3305. int CScript::SetScriptVarValue(CMoveShape* moveShapePtr, const char* varName, const char* value)
  3306. {
  3307. int retFlag = GetVariableList()->SetVarValue(varName, value);
  3308. if(retFlag == CVariableList::VAR_NOT_FOUND && moveShapePtr)
  3309. retFlag = moveShapePtr->GetVariableList()->SetVarValue(varName, value);
  3310. if(retFlag == CVariableList::VAR_NOT_FOUND)
  3311. {
  3312. if(CScript::GetGeneralVariableList())
  3313. retFlag = CScript::GetGeneralVariableList()->SetVarValue(varName, value);
  3314. if(1 == retFlag)
  3315. CScript::UpdateToWorldServer(varName, value);
  3316. }
  3317. return retFlag;
  3318. }
  3319. int CScript::SetScriptVarValue(CMoveShape* moveShapePtr, const char* varName, long lArray, double value)
  3320. {
  3321. int retFlag = GetVariableList()->SetVarValue(varName, lArray, value);
  3322. if(retFlag == CVariableList::VAR_NOT_FOUND && moveShapePtr)
  3323. retFlag = moveShapePtr->GetVariableList()->SetVarValue(varName, lArray, value);
  3324. if(retFlag == CVariableList::VAR_NOT_FOUND)
  3325. {
  3326. if(CScript::GetGeneralVariableList())
  3327. retFlag = CScript::GetGeneralVariableList()->SetVarValue(varName, lArray, value);
  3328. if(1 == retFlag)
  3329. CScript::UpdateToWorldServer(varName, lArray, value);
  3330. }
  3331. return retFlag;
  3332. }
  3333. const char* CScript::GetScriptVarValue(CMoveShape* moveShapePtr, const char* varName)
  3334. {
  3335. const char* retStr = GetVariableList()->GetVarValue(varName);
  3336. if(retStr == NULL && moveShapePtr)
  3337. retStr = moveShapePtr->GetVariableList()->GetVarValue(varName);
  3338. if(retStr == NULL)
  3339. {
  3340. if(CScript::GetGeneralVariableList())
  3341. retStr = CScript::GetGeneralVariableList()->GetVarValue(varName);
  3342. }
  3343. return retStr;
  3344. }
  3345. double CScript::GetScriptVarValue(CMoveShape* moveShapePtr, const char* varName, long lArray)
  3346. {
  3347. double retFlag = GetVariableList()->GetVarValue(varName, lArray);
  3348. if(retFlag == CVariableList::VAR_NOT_FOUND && moveShapePtr)
  3349. retFlag = moveShapePtr->GetVariableList()->GetVarValue(varName, lArray);
  3350. if(retFlag == CVariableList::VAR_NOT_FOUND)
  3351. {
  3352. if(CScript::GetGeneralVariableList())
  3353. retFlag = CScript::GetGeneralVariableList()->GetVarValue(varName, lArray);
  3354. }
  3355. return retFlag;
  3356. }
  3357. int CScript::SetScriptGuidValue(CMoveShape* moveShapePtr, const char* varName, const CGUID& guid)
  3358. {
  3359. int retFlag = GetVariableList()->SetGuidValue(varName, &guid);
  3360. if(retFlag == CVariableList::VAR_NOT_FOUND && moveShapePtr)
  3361. {
  3362. retFlag = moveShapePtr->GetVariableList()->SetGuidValue(varName, &guid);
  3363. if(moveShapePtr->GetType() == TYPE_PLAYER)
  3364. GetGame()->UpdateSavePlayer(moveShapePtr->GetExID(), SAVE_DETAIL_ATTRPROPERTY);
  3365. }
  3366. if(retFlag == CVariableList::VAR_NOT_FOUND)
  3367. {
  3368. if(CScript::GetGeneralVariableList())
  3369. retFlag = CScript::GetGeneralVariableList()->SetGuidValue(varName, &guid);
  3370. if(1 == retFlag)
  3371. CScript::UpdateToWorldServer(varName, guid);
  3372. }
  3373. return retFlag;
  3374. }
  3375. const CGUID& CScript::GetScriptGuidValue(CMoveShape* moveShapePtr, const char* varName)
  3376. {
  3377. const CGUID &localGUID = GetVariableList()->GetGuidValue(varName);
  3378. if( localGUID != NULL_GUID )
  3379. {
  3380. return localGUID;
  3381. }
  3382. if( moveShapePtr != NULL )
  3383. {
  3384. const CGUID &shapeGUID = moveShapePtr->GetVariableList()->GetGuidValue( varName );
  3385. if( shapeGUID != NULL_GUID )
  3386. {
  3387. return shapeGUID;
  3388. }
  3389. }
  3390. if(CScript::GetGeneralVariableList())
  3391. return CScript::GetGeneralVariableList()->GetGuidValue(varName);
  3392. return NULL_GUID;
  3393. }