诛仙2时光之书客户端新手卡

《诛仙2·时光之书》5月29日启程公测
  梦幻诛仙2 CGWR 得分CGWR:170 位
  3D玄幻网游巨制《诛仙2·时光之书》5月29日启程公测,体验最美好的游戏时光!首创异次元时空系统首曝,天书之谜终极悬念解密在即,时光盛典超越想象的新一轮热潮即将到来,你准备好了吗?
媒体来源:新浪游戏
  【时光之书 带我们开启新的篇章】
  《诛仙前传》中经过修复而完整的“诛仙古卷”,用时光幻化的力量带我们流转光年,进入《诛仙2·时光之书》初见般美好的异次元时空,开启更多冒险与奇遇之旅。张小凡找到的第六卷天书,幻化成“诛仙古卷”用惊天的神力改变了玄幻世界的自然规律,打破了现实与虚拟的结界。进入《诛仙2·时光之书》,你就能和张小凡一起参悟生死轮回,掌握时光逆转的惊天秘密。5月29日,逆转乾坤,反悟天道的异次元时空打开闸门,我们一起启程吧!
《诛仙2·时光之书》LOGO
《诛仙2·时光之书》5月29日启程公测
  【时光梦境 游戏截图引发大猜想】
  “诛仙古卷”中隐藏的神秘景象初见端倪,时光幻化的力量指引我们寻找散落各处的神秘宝藏,这仅仅只是开始。天书之谜的终极悬念,将在5月29日揭晓,圆千年以来修真之人夙愿。《诛仙2·时光之书》首创异次元时空系统,这里打破了现实与虚拟的结界,多线平行时空同步并相互影响。只要你用心领悟,你就可以改写天命轮回,创造未来奇迹。“诛仙古卷”时光梦境游戏截图,今日抢先曝光。平行于现在玄幻世界的异次元河阳城中,一切都有无限可能,一起来猜想吧!
走进“时光之书”,开启崭新奇异世界
  【时光盛典 新一轮高潮即将开启】
  时光如水,倒影青春光影,我们用自己独有的方式将美好的事情定格在一本书,一张图,一个游戏之中……那么,时光教会了我们什么?《诛仙2·时光之书》主题宣传片——《那些年,我们一起玩过的诛仙》直击心灵,在5年美好记忆构成的时光之书中,体验最美好的游戏时光。8000万玩家,1800多个日日夜夜,《诛仙2·时光之书》与我们一起记录着成长的点滴、绽放的幸福,也渐渐融入了我们的生活中。在《那些年,我们一起玩过的诛仙》中,你可以看到了青春年华的印记,可以找回失落在岁月尘埃中的初心,更能感悟到“因为经历,所以懂得;因为懂得,所以珍惜”的时光深意。用时光雕刻青春印记,汇集爱的正能量温暖心灵,《诛仙2·时光之书》将与你携手前行,永远相知相伴……
那些年,我们一起玩过的诛仙
  在时光盛典序幕中,“我的书”活动邀请玩家当作家,征集到了数以万计的文章、图片和“时光之信”,雕刻出时光中感人至深的青春记忆。为了更好地与大家分享时光的经历与懂得,《我的书》正式更名为《时光之书》。实体版《诛仙2·时光之书》,将在5月29日公测之际全球出版发售。《时光之书》分为初见、成长、绽放、时光之信四个章节。“时光之信”活动现在正在火热进行,《诛仙2·时光之书》将打造专属的“时光邮局”为玩家慢递给未来的感人信件,你是不是也很期待呢?
  《诛仙2·时光之书》以最真实的方式记录了网游玩家时光中的经历与懂得,让每个人都可以从中找到自己青春年华的倒影。这是一本可以保存美好的记忆的书,这也是一本可以邮寄对未来期待的书。青春文学作家郭敬明为《诛仙2·时光之书》作序,对社会发出号召,记录下时光中的感悟与故事,用墨香铅字将美好回忆永久保存。在时光之书的影响力下,还会有哪些名人陆续加入?让我们拭目以待。
郭敬明首次跨界执笔《时光之书》
  在现实中,我们可以用诛小仙来创造属于自己的代言人,让生活充满奇思妙想,意料之外的简单乐趣。而在《诛仙2·时光之书》玄幻世界里,诛小仙会以什么形象出现呢?他又会给我们带来哪些超爽的玩法?
百变虚拟形象代言人诛小仙
  以“因为经历,所以懂得;因为懂得,所以珍惜”为主题的回转电影CG、时光微访谈、时光语录、时光主题曲等创意作品将在时光盛典中陆续呈现,绝对让你大饱眼福,一定不要错过!
赵奕欢演绎感人大片“时光之恋”
时光电影CG即将精感人献映
  五色年华闪耀璀璨光芒,《诛仙2·时光之书》5月29日公测,与你一同书写崭新的辉煌篇章!掌握天书之谜中时光幻化的力量,我们一起进入崭新的异次元时空!精彩纷呈的时光盛典新一波惊喜即将到来,数不尽的免费大礼,数不尽超爽玩法、数不尽的奇妙时刻等你体验,每个人的代言人诛小仙,也会在游戏中以奇妙的形象出场,为你带来意想不到的惊喜。
  第一时间了解《诛仙2·时光之书》最新动向,
  《诛仙2·时光之书》5月29日启程公测&&
  因为经历,所以懂得;因为懂得,所以珍惜。声明:新浪网游戏频道登载此文出于传递信息之目的,绝不意味着新浪公司赞同其观点或证实其描述。
& 15:41:27
& 10:34:41
& 09:58:19
& 09:59:04
& 10:05:19
& 10:01:56
  中国网络游戏排行榜(China Game Weight Rank)是由新浪游戏推出的目前国内最全面、最专业、最公正的最新网络游戏评测排行榜,涵盖内所有新游戏,力图为中国游戏玩家打造最值得信赖的新网游推荐平台。
  新浪中国网络游戏排行榜是以由新浪游戏专业评测员组成的评测团队为核心,以游戏的画质、类型、风格、题材等游戏特性为依据,对中国(大陆港澳台)、欧美、日韩等地区正在进行测试或正式运营的新网游产品进行评测并打分后产生的权威游戏排行榜。新浪中国网络游戏排行榜将网络游戏从六大项、二十八个小分项与同类游戏进行横向比较,再将该游戏与自身的不同版本进行纵向对比后,由评测中心根据加权平均数得出最后的游戏分数,并以游戏测试及上线时间点为分组,根据每款游戏的CGWS分数在每个季度发布排行榜榜单,实现了排行榜的透明化和实时化,帮助玩家准确、迅速地找到心目中的理想游戏。
  评天下游戏、测产品深浅—新浪中国网络游戏排行榜CGWR! 
Copyright &
SINA Corporation, All Rights Reserved诛仙:时光之书 荣耀5周年
那些年我们一起拍的视频
因为经历,所以懂得;因为懂得,所以珍惜
壹、那些视频背后的故事
活动简介:玩家提交《诛仙》相关视频内容,并且分享视频所表达的故事/视频背后的相关故事,同时寻找参与该部视频创作的其他成员一起参与,证明补充你们一起的故事。分享一起创作的视频,纪念那珍贵的游戏时光。活动时间:5月15日----6月15日
参与步骤:
点击“我要参与活动”按钮,输入视频链接,分享视频背后的故事,提交参与;
邀请至少1位参与过该部视频创作的玩家继续补充故事,证明你们一同创作。(提交后的作品可点击“游戏经典故事”查看)。
评奖规则:
1、所描述故事与视频的匹配程度、故事的完整性及真实性是评奖的主要指标。
2、参赛玩家必须邀请一名队友一起补充故事才具有评奖资格。
3、所提交的视频不必是参赛者本人发布,但一定要征得作者许可方可提交参赛,否则后果自负。
4、参与了视频的策划、拍摄、配音、编辑等相关环节的玩家均可提交视频参与活动。
游戏经典故事
视频背后的故事:
视频背后的故事:
贰、那些年我们一起拍的视频
活动简介:一部视频、一段故事,提交一部值得纪念、希望与大家一起分享的视频,接受广大玩家的投票评选,视投票评选结果评选出对应名次的获奖玩家,同时,我们将抽选参与投票的玩家,发予游戏周边奖励。
提交作品参与活动:
参与步骤:
复制参赛视频链接,于上作品提交框提交参赛作品;
提交完成刷新页面即可在下方显示该参赛作品;
复制拉票链接,广泛传播给自己的游戏好友拉票。
投票评奖规则:
1、新老作品均可参赛,但必须为游戏相关视频。
2、任何玩家均可提交作品参与活动,但获奖者为作者本人。
3、每天每人每部作品仅可投票一次。
4、如发现恶意刷票行为我们将取消其活动评奖资格。
票数:7856
票数:8955
票数:8965
票数:9181
票数:9181
票数:14621
票数:9479
票数:9483
票数:9786
票数:9789
票数:9788
票数:9784
曾经一起游戏的好友是否已天各四方?你是否仍是一个人在游戏里孤军奋战?寻找老战友回归、招募新战友,领取特权礼包享特殊待遇!
《诛仙》精品视频
粤网文[8号
版权所有 广州爱拍网络科技有限公司
视频表达的故事/视频背后难忘的故事描述:(至少100字)帮派赛(20v20)
参赛资格: 日前开启的所有服务器的玩家
每组参赛服务器共选出3支参赛队伍,采用2种选拔方式:
第1名----社稷之战晋级方式
选拔时间:日24:00前
活动规则:社稷之战中占领领土获得积分最高的帮派自动获得出征跨服PK争霸赛的资格。具体领土积分如下:
初级领土----10积分
中级领土----25积分
高级领土----50积分
注意事项:
如出现社稷之战领土积分相等的情况,将根据7月15日16:00&神魔异志录&的帮派等级排行榜甄选,&排名&位置靠前的帮派胜出。
第2、3名----抢票晋级方式
选拔时间:
第一阶段7月6日----7月8日21:00~22:00
第二阶段7月13日----7月16日21:00~22:00
活动NPC:河阳城14线
活动地点:无双城14线
进入方式:活动期间,与14线河阳城NPC 无双使者对话,缴纳入场费1金,进入无双城。
活动规则:活动时间内,击杀城中BOSS怪将掉落跨服PK争霸赛门票-【堕天神符】。(玩家可留意每晚21点的系统喊话。)具体BOSS信息如下:
无双城BOSS
堕天神符令牌掉落数量
7月6日21:00
7月7日21:00
7月8日21:00
7月13日21:00
7月14日21:00
雷神?万霆、泽神?川壅
7月15日21:00
雷神?万霆、泽神?川壅
7月16日21:00
雷神?万霆、泽神?川壅、月神?望舒
注:1、进入无双城后,角色即处于非安全区域,请红名玩家注意保护自身装备武器。
  2、角色将随机出生在2区域之一,区内也会有小怪出现。
  3、NPC狼啸能够将玩家传出无双城地图。
  4、当日活动结束后,地图内怪物消失。
选拔方式:
1、获得【堕天神符】后,由帮主前往14线河阳 交付给无双使者。(注意:请于7月16日23:59前缴纳,官方将按角色统计缴纳数量,请勿中途更换缴纳的角色,以免影响成绩)
2、活动结束后,官方统计各参赛服【堕天神符】的缴纳数量。排名前2的帮派拥有入驻跨服PK争霸赛资格。
3、如遇社稷之战排名第一帮派争夺令牌,其缴纳的【堕天神符】不参与评选,自动顺延缴纳令牌的后两名帮派胜出。如遇帮派交付的【堕天神符】数量相同,则根据7月15日16:00“神魔异志录”的帮派等级排行榜作为辅助判断条件。
4、如遇交付的【堕天神符】数量相同,则根据7月15日16:00神魔异志录中,帮派等级排行榜高低作为辅助判断条件。
5、预选赛结束后,官网公布入驻跨服PK争霸赛资格的帮派名单,具体发布日期请随时留意官网新闻、公告。
活动奖励:
● 参与【堕天神符】争夺,能够获得入驻跨服PK争霸赛第2、3名的资格。
● 帮主每上交一个【堕天神符】,可获得相应特殊尊号。尊号共有11阶,最高为&无双斗魂&。
● 击杀无双城中的小怪,能够获得千华龙筋、元神修为珠、造化珠、金叶子、金条、金砖、钻石、银票(5000金)等丰厚奖励。
注意事项:
● 预选赛期间,其他线路也可进入无双城,但选拔赛只在14线进行。
● 【堕天神符】可以交易。
● 未在指定时间内缴纳的令牌不纳入统计范围。
● 如出现拥有令牌数量相等的情况,将根据查看7月15日16:00&神魔异志录&的帮派等级排行榜。&排名&位置靠前的帮派胜出。
● 如遇服务器没有社稷之战参与的情况,以参与【堕天神符】方式选出出线资格。
● 如遇服务器仅有一人缴纳令牌或未缴纳令牌的情况,以7月15日16:00&神魔异志录&的帮派等级排行榜排名甄选出线资格。
● 每个出线帮派可选择25名成员出战。(报名页面将于7月18日推出)
● 以服务器第一身份出线的帮派,在首轮对阵中占有优势。
● 比赛期间因非服务器原因(如账号被盗、玩家纠纷等)导致的任何信息变化,由玩家自行负责。官方原则上不予理会。
● 如遇服务器原因导致的信息变化,官方将出台相应措施解决并在官网给予新闻公告。
● 比赛期间如官方发现利用非法辅助程序或游戏BUG影响结果的,立即取消其参赛资格。并顺延候补名额晋级。
● 资格赛期间,将每周定期公布统计结果。如玩家有任何异议,应及时通过邮件、***等方式与官方沟通,否则将以公告公布信息为准。这段时间真够累的,不想沦落为程序员,纪念下。
通过hook键盘,将dll注入到游戏主程序。游戏中,F12呼出辅助工具界面。
主要功能:通过加载、读取任务脚本,实现:指定NPC对话、跑路到指定坐标、自动杀指定数量的指定名称怪、自动拾取打怪掉落的指定物品、自动加血加蓝。
文件分类:配置文件加载函数、对话框程序主程序、基础功能函数、主要功能函数、任务脚本解析函数、线程处理调用类函数
#include &IniFile.h&
//加载配置文件,各类基础数据的获取
call_attack,call_choose,call_findway,call_usegoods,call_pickup,call_selectmonster,call_
BaseAddr,BaseO
ps_base,ps_x,ps_y,ps_z,ps_level,ps_life,ps_magic,ps_max_life,ps_max_magic,ps_
mt_base1,mt_base2,mt_base3,mt_base4,mt_max,mt_id,mt_distance,mt_name1,mt_name2,mt_status,mt_
//Backpack
bp_base1,bp_base2,bp_base3,bp_max_size,bp_type,bp_id,bp_num,bp_name1,bp_name2;
gd_base1,gd_base2,gd_base3,gd_max,gd_object,gd_sysid,gd_id,gd_distance,gd_name1,gd_name2;
Map_Target,map_
st_lifepoint,st_magicpoint,st_pickup_distance,st_select_
st_lifegoods[1024]={0},st_magicgoods[1024]={0},st_pickup[1024]={0};
BOOL LoadConfig()
INIFILE config("D:\\game\\诛仙2&时光之书\\element\\Config.ini");
BaseAddr=config.GetInteger("BASE","BaseAddr");
BaseOffset=config.GetInteger("BASE","BaseOffset");
ps_base=config.GetInteger("PERSON","base");
ps_x=config.GetInteger("PERSON","x");
ps_y=config.GetInteger("PERSON","y");
ps_z=config.GetInteger("PERSON","z");
ps_level=config.GetInteger("PERSON","level");
ps_life=config.GetInteger("PERSON","life");
ps_magic=config.GetInteger("PERSON","magic");
ps_max_life=config.GetInteger("PERSON","max_life");
ps_max_magic=config.GetInteger("PERSON","max_magic");
ps_npc=config.GetInteger("PERSON","npc");
mt_base1=config.GetInteger("MONSTER","base1");
mt_base2=config.GetInteger("MONSTER","base2");
mt_base3=config.GetInteger("MONSTER","base3");
mt_base4=config.GetInteger("MONSTER","base4");
mt_max=config.GetInteger("MONSTER","max");
mt_id=config.GetInteger("MONSTER","id");
mt_distance=config.GetInteger("MONSTER","distance");
mt_name1=config.GetInteger("MONSTER","name1");
mt_name2=config.GetInteger("MONSTER","name2");
mt_status=config.GetInteger("MONSTER","status");
mt_select=config.GetInteger("MONSTER","select");
//Backpack
bp_base1=config.GetInteger("BACKPACK","base1");
bp_base2=config.GetInteger("BACKPACK","base2");
bp_base3=config.GetInteger("BACKPACK","base3");
bp_max_size=config.GetInteger("BACKPACK","max_size");
bp_type=config.GetInteger("BACKPACK","type");
bp_id=config.GetInteger("BACKPACK","id");
bp_num=config.GetInteger("BACKPACK","num");
bp_name1=config.GetInteger("BACKPACK","name1");
bp_name2=config.GetInteger("BACKPACK","name2");
gd_base1=config.GetInteger("GROUND","base1");
gd_base2=config.GetInteger("GROUND","base2");
gd_base3=config.GetInteger("GROUND","base3");
gd_max=config.GetInteger("GROUND","max");
gd_object=config.GetInteger("GROUND","object");
gd_sysid=config.GetInteger("GROUND","sysid");
gd_id=config.GetInteger("GROUND","id");
gd_distance=config.GetInteger("GROUND","distance");
gd_name1=config.GetInteger("GROUND","name1");
gd_name2=config.GetInteger("GROUND","name2");
Map_Target=config.GetInteger("MAP","Target");
map_offset=config.GetInteger("MAP","offset");
call_attack=config.GetInteger("CALL","attack");
call_choose=config.GetInteger("CALL","choose");
call_findway=config.GetInteger("CALL","findway");
call_usegoods=config.GetInteger("CALL","usegoods");
call_pickup=config.GetInteger("CALL","pickup");
call_selectmonster=config.GetInteger("CALL","selectmonster");
call_talknpc=config.GetInteger("CALL","talknpc");
config.GetString("SETTING","GameName",GameName,260);
st_lifepoint=config.GetFloat("SETTING","lifepoint");
st_magicpoint=config.GetFloat("SETTING","magicpoint");
st_pickup_distance=config.GetFloat("SETTING","pickup_distance");
st_select_distance=config.GetFloat("SETTING","select_distance");
config.GetString("SETTING","lifegoods",st_lifegoods,1024);
config.GetString("SETTING","magicgoods",st_magicgoods,1024);
config.GetString("SETTING","pickup",st_pickup,1024);
st_Time_Interval=config.GetInteger("SETTING","interval");
if (BaseAddr==0||BaseOffset==0)
return FALSE;
return TRUE;
//基本函数char
GameName[260],ScriptPath[260]={0};;
thMain,thLifeMagic,thK
*pMonsterStatus,*pIfS
ListLife,ListMagic,ListPickUp;
BTEXEC,BTSELECT;
struct KillMonster
MonsterName[255];
DWORD *GetAddress(DWORD *BaseAddr,DWORD offset1=-1,DWORD offset2=-1,DWORD offset3=-1,DWORD offset4=-1,DWORD offset5=-1,DWORD offset6=-1,DWORD offset7=-1)
DWORD *ret=BaseA
if (offset1!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset1);
return NULL;
if (offset2!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset2);
return NULL;
if (offset3!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset3);
return NULL;
if (offset4!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset4);
return NULL;
if (offset5!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset5);
return NULL;
if (offset6!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset6);
return NULL;
if (offset7!=-1)
if (*ret!=NULL)
ret=(DWORD *)(*ret+offset7);
return NULL;
catch (...)
//各主函数文件//基本数据
*PersonBase,*BackPakcBase,*GroundBase,*MonsterB
//获取基本地址
GetBaseAddr()
PersonBase=GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base);
BackPakcBase=GetAddress((DWORD*)BaseAddr,BaseOffset,bp_base1,bp_base2);
GroundBase=GetAddress((DWORD*)BaseAddr,BaseOffset,gd_base1,gd_base2);
MonsterBase=GetAddress((DWORD*)BaseAddr,BaseOffset,mt_base1,mt_base2);
pIfSelected=GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,0x12E0);
//普通攻击()
DWORD *PersonInfo=GetAddress(PersonBase,0);
ecx,PersonInfo
call_attack
//使用物品(物品名)
BOOL UseGoods(char *GoodsName)
DWORD *pBase,*pName,*pMaxSize,*pGoodsType,GoodsID;
WCHAR Name[255]={0};
MultiByteToWideChar(CP_ACP,0,GoodsName,strlen(GoodsName),Name,255);
pMaxSize=GetAddress(BackPakcBase,bp_max_size);
pBase=GetAddress(BackPakcBase,bp_base3);
for (UINT i=0;i&*pMaxSi++)
pGoodsType=GetAddress(pBase,i*4,4);
if (pGoodsType!=NULL && *pGoodsType==2)
pName=GetAddress(pBase,i*4,bp_name1,bp_name2);
if (wcscmp((WCHAR*)pName,Name)==0)
GoodsID=*GetAddress(pBase,i*4,bp_id);
push GoodsID
mov eax,0x
add esp,0x10
return TRUE;
return FALSE;
//拾取物品(物品名)
BOOL PickUp(char *GoodsName)
DWORD *pMaxGoods,*pGoodsBase,GoodsSysID,GoodsID;
WCHAR *pGoodsN
WCHAR Name[255]={0};
MultiByteToWideChar(CP_ACP,0,GoodsName,strlen(GoodsName),Name,255);
pMaxGoods=GetAddress(GroundBase,gd_max);
pGoodsBase=GetAddress(GroundBase,gd_base3);
for (UINT i=0;i&*pMaxGi++)
pGoodsName=(WCHAR *)GetAddress(pGoodsBase,i*4,gd_object,gd_name1,gd_name2);
if (pGoodsName!=NULL && *pGoodsName!=NULL)
if (wcscmp(pGoodsName,Name)==0)
pDistance=(float *)GetAddress(pGoodsBase,i*4,gd_object,gd_distance);
if (*pDistance&=st_pickup_distance)
GoodsID=*GetAddress(pGoodsBase,i*4,gd_object,gd_id);
GoodsSysID=*GetAddress(pGoodsBase,i*4,gd_object,gd_sysid);
GoodsSysID
call_pickup
Sleep(500);
return TRUE;
return FALSE;
//去指定坐标(地图ID,X,Y)
void GoTo(UINT mapid,float x,float y)
DWORD *pCurPos,*pDesP
pCurPos=GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_x);
pDesPos=(DWORD *)Map_T
eax,Map_Target
add eax,map_offset
mov ebx,mapid
mov [eax],ebx
add eax,0x4
mov [eax],ebx
add eax,0x4
mov [eax],0
add eax,0x4
mov [eax],ebx
push pCurPos
mov ecx,pDesPos
call call_findway
//根据怪ID选中怪(怪ID)
SelectById(DWORD ID)
DWORD *pSelectA
pSelectAddr=GetAddress(PersonBase,mt_select);
eax,pSelectAddr
call_selectmonster
//选中指定范围内选中指定名称怪(怪名称)
SelectMonster(char *MonsterName)
*pMaxSize,*pMonBase,*pMonsterId;
*pMonDistance,MinDistance=st_select_
Name[255]={0},*pMonsterN
MultiByteToWideChar(CP_ACP,0,MonsterName,strlen(MonsterName),Name,255);
pMaxSize=GetAddress(MonsterBase,mt_max);
for (UINT i=0;i&*pMaxSi++)
pMonBase=GetAddress(MonsterBase,mt_base3,i*4,mt_base4);
if (pMonBase!=NULL && *pMonBase!=NULL)
pMonDistance=(FLOAT*)GetAddress(pMonBase,mt_distance);
if (*pMonDistance&st_select_distance)
pMonsterName=(WCHAR*)GetAddress(pMonBase,mt_name1,mt_name2);
if (wcscmp(Name,pMonsterName)==0)
pMonsterStatus=GetAddress((DWORD*)BaseAddr,BaseOffset,mt_base1,mt_base2,mt_base3,i*4,mt_base4,mt_status);
if (*pMonsterStatus!=4)
if (*pMonDistance&MinDistance)
MinDistance=*pMonD
pMonsterId=GetAddress(pMonBase,mt_id);
if (MinDistance==st_select_distance){
return FALSE;
SelectById(*pMonsterId);
return TRUE;
//打开指定npc对话框
TalkWithNPC(char *NPCName)
*pMaxSize,*pNpcBase,NpcId;
Name[255]={0},*pNpcN
MultiByteToWideChar(CP_ACP,0,NPCName,strlen(NPCName),Name,255);
pMaxSize=GetAddress(MonsterBase,mt_max);
for (UINT i=0;i&*pMaxSi++)
pNpcBase=GetAddress(MonsterBase,mt_base3,i*4,mt_base4);
if (pNpcBase!=NULL && *pNpcBase!=NULL)
pNpcName=(WCHAR*)GetAddress(pNpcBase,mt_name1,mt_name2);
if (wcscmp(Name,pNpcName)==0)
pNpcDistance=(FLOAT*)GetAddress(pNpcBase,mt_distance);
if (*pNpcDistance&6)
NpcId=*GetAddress(pNpcBase,mt_id);
push NpcId
mov ecx,BaseAddr
mov ecx,[ecx]
mov ecx,dword ptr [ecx+0x20]
add ecx,0x0d4
call call_talknpc
return TRUE;
return FALSE;
//主线程函数#include &FSTREAM.h&
//函数定义
GaveOver();
KillThread();
Goto(UINT mapid,FLOAT x,FLOAT y);
LifeMagicThread();
Talk(char *TalkStr);
//变量定义
KillMonster
MonsterTask[255];
szRichEdit[255];
MonsterLen=0;
void DispathCmd(char *pCmd)
pCmd[4]=0x00;
if (strcmp(pCmd,"KILL")==0)
char Tmp[255];
while(strtok(pCmd,";"))
strcpy(Tmp,pCmd);
strtok(Tmp,",");
strcpy(MonsterTask[MonsterLen].MonsterName,Tmp);
MonsterTask[MonsterLen].Num=0;
MonsterTask[MonsterLen].MaxNum=atoi((char *)&Tmp[strlen(Tmp)+1]);
sprintf(szRichEdit,"\t杀怪:%s(%d)\r\n",MonsterTask[MonsterLen].MonsterName,MonsterTask[MonsterLen].MaxNum);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
MonsterLen++;
pCmd+=strlen(pCmd)+1;
else if (strcmp(pCmd,"GOTO")==0)
strtok(pCmd,",");
UINT mapid=atoi(pCmd);
pCmd+=strlen(pCmd)+1;
strtok(pCmd,",");
FLOAT x=(FLOAT)atof(pCmd);
pCmd+=strlen(pCmd)+1;
FLOAT y=(FLOAT)atof(pCmd);
sprintf(szRichEdit,"\t开始跑路:%d,&%0.2f,%0.2f&\r\n",mapid,x,y);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
Goto(mapid,x,y);
else if (strcmp(pCmd,"TALK")==0)
sprintf(szRichEdit,"\t开始对话:%s\r\n",pCmd);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
strtok(pCmd,";");
TalkWithNPC(pCmd);
pCmd+=strlen(pCmd)+1;
Sleep(1000);
Talk(pCmd);
else if (strcmp(pCmd,"NAME")==0)
sprintf(szRichEdit,"新任务:%s\r\n",pCmd);
RichLog.AppendColorString(szRichEdit,RGB(0xff,0,0),TRUE,TRUE);
sprintf(szRichEdit,"当前任务:%s",pCmd);
SendMessage(hMainSbr,SB_SETTEXT,1,(LPARAM)szRichEdit);
void MainThread()
fstream taskfile(ScriptPath,ios::in);
char szLine[4096]={0},szTmp[255]={0};
memset(MonsterTask,0x00,sizeof(KillMonster)*255);
thLifeMagic.Create(LifeMagicThread);
while (!taskfile.eof())
taskfile.getline(szLine,4096);
char *pLine=szL
while (strtok(pLine,"|"))
strcpy(szTmp,pLine);
DispathCmd(szTmp);
pLine+=strlen(pLine)+1;
SendMessage(hMainSbr,SB_SETTEXT,0,(LPARAM)"脚本执行完毕!");
SendMessage(hMainSbr,SB_SETTEXT,1,(LPARAM)"等待新任务!");
BTEXEC.SetEnable(TRUE);
BTSELECT.SetEnable(TRUE);
taskfile.close();
void Goto(UINT mapid,FLOAT x,FLOAT y)
FLOAT *pCurX,*pCurY;
GoTo(mapid,x,y);
pCurX=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_x);
pCurY=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_y);
if ((*pCurX&=x-2 && *pCurX&=x+2) && (*pCurY&=y-2 && *pCurY&=y+2)){
sprintf(szRichEdit,"\t已达到目的地:%d,&%0.2f,%0.2f&\r\n",mapid,x,y);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
Sleep(1000);
void LifeMagicThread()
FLOAT *pCurLife,*pCurMagic,*pMaxLife,*pMaxM
char szTmp[255];
UINT count1=ListLife.GetItemCount();
UINT count2=ListMagic.GetItemCount();
pMaxLife=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_max_life);
pMaxMagic=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_max_magic);
pCurLife=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_life);
pCurMagic=(FLOAT*)GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,ps_magic);
if ((*pCurLife / *pMaxLife)&st_lifepoint)
for (UINT i=0;i&count1;i++)
ListLife.GetItemText(i,0,szTmp,255);
if (UseGoods(szTmp))
sprintf(szRichEdit,"\t使用红药:%s\r\n",szTmp);
RichLog.AppendColorString(szRichEdit,RGB(0xff,0,0));
memset(szTmp,0x00,255);
if ((*pCurMagic / *pMaxMagic)&st_magicpoint)
for (UINT i=0;i&count2;i++)
ListMagic.GetItemText(i,0,szTmp,255);
if (UseGoods(szTmp))
sprintf(szRichEdit,"\t使用蓝药:%s\r\n",szTmp);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
memset(szTmp,0x00,255);
Sleep(st_Time_Interval);
void Pickup()
char szTmp[255]={0};
UINT count=ListPickUp.GetItemCount();
for (UINT i=0;i&i++)
ListPickUp.GetItemText(i,0,szTmp,255);
if (PickUp(szTmp))
sprintf(szRichEdit,"\t拾取物品:%s\r\n",szTmp);
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
void KillThread()
for (UINT i=0;i&MonsterLi++)
while (MonsterTask[i].Num&MonsterTask[i].MaxNum)
if (SelectMonster(MonsterTask[i].MonsterName))
if (*pIfSelected==0)
MonsterTask[i].Num++;
sprintf(szRichEdit,"\t已杀怪:%s (%d/%d)\r\n",MonsterTask[i].MonsterName,MonsterTask[i].Num,MonsterTask[i].MaxNum);
RichLog.AppendString(szRichEdit);
Sleep(1000);
void Kill()
thKill.Create(KillThread);
thKill.WaitForEnd();
memset(&MonsterTask,0x00,sizeof(KillMonster)*255);
MonsterLen=0;
void Talk(char *TalkStr)
DWORD *pCanMove=GetAddress((DWORD*)BaseAddr,BaseOffset,ps_base,0x12fd);
mov eax,pCanMove
mov [eax],0
while (strtok(TalkStr,","))
win.SendLBClick(30,180+12.5*(atoi(TalkStr)-1));
TalkStr+=strlen(TalkStr)+1;
sprintf(szRichEdit,"\t对话完毕!\r\n");
RichLog.AppendColorString(szRichEdit,RGB(0,0,0xff));
void GameOver()
thLifeMagic.Terminate();
thKill.Terminate();
thMain.Terminate();
//对话框函数#include "header.h"
ID_MAINSBR
//初始化状态栏
void InitStatusBar()
int aWidths[2]={100,-1};
SendMessage(hMainSbr,SB_SETPARTS,2,(LPARAM)aWidths);
SendMessage(hMainSbr,SB_SETTEXT,0,(LPARAM)"等待加载脚本!");
SendMessage(hMainSbr,SB_SETTEXT,1,(LPARAM)"当前任务:无");
//加载设置
void LoadSetting(HWND hDlg)
char *pLifeGoods=st_lifegoods,*pMagicGoods=st_magicgoods,*pPickUp=st_pickup,tmp[255]={0};
while (*pLifeGoods)
strtok(pLifeGoods,"|");
ListLife.InsertItemText(i,pLifeGoods);
pLifeGoods+=strlen(pLifeGoods)+1;
while (*pMagicGoods)
strtok(pMagicGoods,"|");
ListMagic.InsertItemText(i,pMagicGoods);
pMagicGoods+=strlen(pMagicGoods)+1;
while (*pPickUp)
strtok(pPickUp,"|");
ListPickUp.InsertItemText(i,pPickUp);
pPickUp+=strlen(pPickUp)+1;
sprintf(tmp,"%.0f",st_lifepoint*100);
SetWindowText(GetDlgItem(hDlg,IDC_EDITLIFE),tmp);
sprintf(tmp,"%.0f",st_magicpoint*100);
SetWindowText(GetDlgItem(hDlg,IDC_EDITMAGIC),tmp);
sprintf(tmp,"%d",st_Time_Interval);
SetWindowText(GetDlgItem(hDlg,IDC_EDITTIME),tmp);
int CALLBACK DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
switch(uMsg)
case WM_INITDIALOG:
if (LoadConfig()==FALSE)
MessageBox(hDlg,"加载配置文件失败!","错误",MB_OK|MB_ICONERROR);
EndDialog(hDlg,0);
GetBaseAddr();
win.FindWindow(GameName);
hMainSbr=CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP,NULL,hDlg,ID_MAINSBR);
InitStatusBar();
RichLog.Associate(hDlg,IDC_RICHLOG);
ListLife.Associate(hDlg,IDC_LISTLIFE);
ListMagic.Associate(hDlg,IDC_LISTMAGIC);
ListPickUp.Associate(hDlg,IDC_LISTPICKUP);
BTEXEC.Associate(hDlg,IDB_EXEC);
BTSELECT.Associate(hDlg,IDB_GETSCRIPT);
LoadSetting(hDlg);
case WM_CLOSE:
GameOver();
EndDialog(hDlg,0);
case WM_COMMAND:
switch (LOWORD(wParam))
case IDB_EXEC:
thMain.Create(MainThread);
BTEXEC.SetEnable(FALSE);
BTSELECT.SetEnable(FALSE);
case IDB_GETSCRIPT:
OPENFILENAME
memset(&ofn,0x00,sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hD
ofn.lpstrFile=ScriptP
ofn.nMaxFile=260;
ofn.lpstrFilter="Text File(*.txt)\0*.txt\0任意文件(*.*)\0*.*\0\0";
if (GetOpenFileName(&ofn)){
BTEXEC.SetEnable(TRUE);
SetWindowText(GetDlgItem(hDlg,IDC_PATH),ScriptPath);
SendMessage(hMainSbr,SB_SETTEXT,0,(LPARAM)"加载脚本成功!");
SendMessage(hMainSbr,SB_SETTEXT,0,(LPARAM)"加载脚本失败!");
LRESULT CALLBACK KeyboardProc(
// hook code
WPARAM wParam,
// virtual-key code
LPARAM lParam
// keystroke-message information
if (code&0)
return CallNextHookEx(hkGame,code,wParam,lParam);
if (wParam==VK_F12 && lParam&0x)
DialogBox(GetModuleHandle("GameDll.dll"),MAKEI***ESOURCE(IDD_DIALOG1),NULL,DlgProc); //第一个参数也可以写作:(HMODULE)LoadLibrar("GameDll.dll")
extern "C" __declspec(dllexport) void StartHook(char *gamename)
strcpy(GameName,gamename);
DWORD TID=GetWindowThreadProcessId(FindWindow(NULL,GameName),NULL);
if (!TID){
MessageBox(0,"请先打开游戏!","提示",MB_OK|MB_ICONINFORMATION);
hkGame=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("GameDll.dll"),TID);
if (!hkGame){
MessageBox(0,"尝试注入到游戏进程失败!","错误",MB_OK|MB_ICONERROR);
阅读(...) 评论()

参考资料

 

随机推荐