诛仙2.诛仙时光之书书接的诛仙任务放弃了怎么...

这段时间真够累的,不想沦落为程序员,纪念下。
通过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);
阅读(...) 评论()诛仙3_百度百科
应《中华人民共和国网络安全法》要求,日起,使用互联网服务需要进行帐号实名认证。为保障百度帐号的正常使用,请您尽快完成手机号验证,感谢您的理解和支持。
《诛仙3》是北京完美时空网络技术有限公司研发的一款3D角色扮演电脑客户端游戏,是《诛仙》系列第10版作品,该游戏于日正式公测。《诛仙3》在《诛仙》原有五大门派的基础上,增加了人族、神裔与天脉三个种族概念,并在其基础上衍生12个职业。采用全新引擎Destroyer VI。[1]
日获得最佳原创网络游戏宝鼎奖;[2]
日荣获玩家最喜爱的网络游戏金翎奖。[3]
诛仙3游戏背景
失势,位于平行空间的神裔和逆世界的天脉也发生了剧变,三大空间碰
撞合体,无辜生灵面临绝迹之灾。三大种族人族、神裔、天脉重建家园,四大主城全新亮相,故事却刚刚开始。[4]
在这场灾变中,裹挟无边戾气,令妖物摧残万物生灵,各脉奋起对抗妖兽,拯救苍生。三大种族分别于龙塬、娲皇殿、鲸溪谷出发,最后于河阳城聚集。[4]
妖兽横行百姓人心惶惶,三大种族日夜除妖却不见好转,周一仙道破天机:草庙村戾气助涨妖兽,非遗孤不能破解,于是众人赶赴青云山找寻当年遗孤张小凡与林惊羽。[4]
青云山将妖兽一事交予林惊羽,却对张小凡闭口不提,唯有小竹峰一脉仍挂念小凡,从而得知他已改入别派,更名鬼厉。曾经的红颜知己吐出心结,决定一起寻回小凡。却道出,才是寻回小凡本性的关键所在。[4]
诛仙3角色设定
诛仙3职业设定
整体而言,三类种族形象和使用武器上存在极大差异。在游戏的不断更新中,从单一的中式风格转变为中西合璧分格:
种族形象武器技能人族比较传统,中规中矩都是传统武器传统技能神裔体形或高大或飘逸灵动,面容俊美武器相对奇特部分职业可召唤天脉身材迷你,人形麒麟武器奇特部分职业可幻化在后来的诛仙2和诛仙3中陆续增加了其他两个种族和12个职业。具体如下:
职业形象种族名称描述
人族焚香焚香是与世无争的虔诚信徒,善用火攻,精通各种阵法,生存能力极强。善于使用剑。职业定位:远程、阵法和控制[5]
鬼道拥有苗疆蛊术的秘法和葬魂幻身的阴阳奇书,无比诡异,一旦招惹鬼道,等同于在无尽的噩梦中挣扎。善于使用刺。职业定位:远程、蛊毒和变身[5]
鬼王宗鬼王拥有强大的防御力,是团战的灵魂,特有的怪物牵制技能,让他们成为最称职的肉盾。擅长武器:刀。职业定位:肉盾、近战和控制。[5]
合欢“极速”是合欢的最大优势,拥有瞬间高输出技能和强力的暴击能力,对于玩家的操控要求高。擅长武器:环。职业定位:刺客、近战和高暴击。[5]
青云单体远程攻击稳定,群攻能力突出,是伤害输出的首选。擅长武器:剑。职业定位:法师、远程和灵活天音在团战中是不可或缺的职业,帮助队友恢复气血。擅长武器:杖。职业定位:辅助、保命和控制。[5]
神族辰皇有优秀的远程及群攻技能,并且拥有光暗两种形态。擅长武器:仪职业定位:远程/法师/双姿态[5]
怀光暗杀能力极强,同时拥有诡异的影子技能。擅长武器:双镰。职业定位:刺客/隐身/近战[5]
九黎攻防实力超群绝伦,可以抵挡敌人发动的恐怖袭击。擅长武器:巨斧。职业定位:肉盾/近战[5]
烈山可以召唤出各种自然生物为自己战斗,具有超远程的输出伤害。擅长武器:神弓。职业定位:远程DPS/高暴伤[5]
太昊本性狠毒,善用嗜血和高速攻击令对手瞬间毙命。擅长武器:拳套。职业定位:高速攻/战士/近战[5]
天华适合团队作战,是不可缺少的辅助类职业。擅长武器:琴。职业定位:辅助/伤害反弹/领域[5]
天脉破军破军职业是一个单体战斗为主,战斗手法快捷,多武器连续攻击技能能使得近身远程能力兼顾,同时具有多种灵活动作如冲锋、闪避、瞬移、挣扎等技能。擅长武器:铩。职业定位:刺客、连续攻击、远近兼顾和团队核心[6]
牵机身材迷你,善于控制他人灵魂,能召唤巨大为其作战,对陷阱机关颇为精通,可爱纯真的外表在无形中卸下了敌人的警惕性。擅长武器:毛笔。职业定位:远程/召唤/隐身/陷阱/群攻[5]
英招与上古血脉融合的后代,可幻化***形或麒麟,只拥有血量值,体魄强大,威猛无比,是独立作战和团体作战的全才高手。擅长武器:长***。职业定位:中远程/怒气伤害/肉盾/群攻[5]
青罗丰富的组合技能让这灵巧的种族绽放异样光彩。擅长武器:扇子。职业定位:控制、辅助和输出。[7-8]
游戏中有很多NPC,但是整个剧情的贯穿主要是张小凡(鬼厉)、陆雪琪、碧瑶和周一仙等。在任务过程中,有时候会遇到任务断章,在这种情况下,这几个NPC往往会有一些任务需要我们完成。
张小凡(鬼厉)
张小凡:性格倔强坚定,被天音寺四大神僧之一的普智在临危之际看重,私传“大梵般若”。十六岁时,在青云门的七脉会武上,邂逅小竹峰陆雪琪。七脉会武之后,与陆雪琪等前往空桑山阻止魔教妖人倒行逆施。在此期间,结识了魔教鬼王宗宗主之女碧瑶。其后魔教攻山,草庙村惨案水落石出,碧瑶因诛仙剑阵而魂飞魄散,只余一魂留在合欢铃中。
堕入魔教,更名鬼厉,成为副宗主,并四处寻访挽救碧瑶之法。十年之后,再次与陆雪琪相遇,苦于正邪对立,不得不多次兵刃相向,但在最后总变成执手相依。两人相爱越来越深,并携手铲除兽神。正魔二次大战后碧瑶失踪,张小凡在陆雪琪的温柔照顾和小白的开导下,最终战胜了心魔,回到青云,并通过诛仙剑阵击退魔教。与陆雪琪失散后,回到草庙村,最终又与陆雪琪重逢。
陆雪琪:自幼拜入青云门小竹峰门下,是最宠爱的弟子,容颜绝世、冷艳无双,资质极佳、冰雪聪明。一袭白衣若雪,手持天琊神剑。在七脉会武时邂逅张小凡,与之结下不解之缘。在空桑山,她与小凡身陷绝境之时彼此互相扶持、互相维护。其后,张小凡不幸堕入魔教,虽正魔殊途,她却早已情根深种,为他抛却十载年华。十年后,与化名为鬼厉的张小凡在多番生死患难中更是深深相爱。她拒绝李洵的求婚时,千里之外的鬼厉心有灵犀而来到小竹峰,得知雪琪拒婚倍受师门责罚,情急之下,欲带雪琪远走天涯。陆雪琪执着地守护着自己的师门与信仰,在师门与爱人之间苦苦挣扎。小凡、雪琪两人,终得田不易与水月的同意和谅解。故事最后帮助张小凡摆脱心魔,做回自我。正魔大战时与张小凡失散,结局时终又与其重逢。
碧瑶:魔教鬼王宗宗主之女。一身绿衣活泼灵动。在河阳城与小凡有过一面之缘,之后与小凡一起被困在滴血洞里,偶得合欢派至宝合欢铃,绝境之中与张小凡共生死,向他吐露了身世,并倾心于他。道玄发动诛仙剑阵欲斩杀小凡,碧瑶推开张小凡念出“痴情咒”逼出了三魂七魄以及自身精血化作血壁,为小凡挡下了诛仙主剑,舍命救下了张小凡。幸因一魂被合欢铃扣下得以肉身不灭。但十年来一直未醒,后来在四灵血阵大功告成引发的狐歧山崩塌时失踪,生死未卜,只留下一角绿色衣裳。
周一仙:浪迹人间的江湖相士,会青云门久已失传的青云子行走江湖时的法术,身世相当神秘,为诛仙小说十大谜团之首。外表鹤骨仙风却酷爱钱财,整日行骗,但见识却非同小可。  
诛仙3物品道具
诛仙3基础设定
金币是这个世界中主要的交易物品,无论是购买商品,地图间传送等都需要使用金币。金币在游戏中不会占用玩家角色的物品栏。金币被小队中任何一个玩家拾取后,都会被分配给小队中的各个玩家。
有些东西可以重叠放置,包括气血类药品和真气类药品以及一些其他物品。  玩家可以用同样的物品充实玩家的物品堆,只要拣起另一堆东西然后把它放到原来那一堆上。两堆的数量会加在一起。如果最后形成的一堆的数量超过最大限度,多出来的东西将新形成一堆。一旦放在一起,玩家无法将它们分开。只有同样的物品可以放在一起。
诛仙3武器装备
装备:在修真的过程中,装备是必不可缺的物品。装备一般分为头部、
上衣及鞋子三部分。有普通装备、真仙装备、散仙装备和神魔装备四类。玩家装备真仙、散仙后,能够直观地看到装备强化后激活的属性,在前期就能体验和神魔装相同的强化乐趣。击败炼狱神兽Boss后,会掉落各职业爆七武器,精炼附加属性强大,炼器后还可获得更多的额外属性收益。真仙装备、散仙装备是玩家在飞升前也能拥有的强力套装。只要穿齐真仙两件或三件,就能轻松获得套装属性,助你大幅提升角色的能力。[9]
法宝:法宝是修真之人必备的物品之一,法宝伴随着人物历练而不断成长。法宝具有很多种类,可能出自恩师赠送,抑或巨贾商旅,也可能在冒险和奇遇中获得。法宝可增强人物的基本属性,提升人物技能的等级,更可提供额外的法宝技能供主人驱使,使你的修真历练更上一层楼。
法宝在游戏当中以装备的形式出现,其中包含一件法宝主件和2件以及2件以上的法宝辅件,分别装备在法宝主件栏和法宝辅件栏中(如果多于两件辅件,可能占用饰品栏)。[10]
获取方式法宝主件的获取方式可以由门派任务、NPC售卖、彩票等形式发放。值得一提的是,玩家通过NPC购买到的法宝属性是随机性的,也就是说,不同的玩家通过NPC所购买到法宝属性都是不相同的。并且法宝的成长也是不同的。玩家可以在各城中的NPC“仙工”处购买到法宝的主件。而法宝辅件由Boss掉落,少量可能通过任务、生产途径获得。法宝主件和法宝辅件归属于同一套套装。[10]
法宝使用玩家要想使用法宝,首先需要进行法宝的“认主”,也就是对法宝进行绑定,绑定成功后就可以使用法宝了,同时法宝的属性栏中法宝的主人也就成为玩家的游戏名称。同时游戏界面中出会出现法宝操作界面。玩家可以根据界面提示进行法宝技能的使用以及装配。[10]
法宝功能法宝主件提供法宝的主要功能,其中包括提升人物属性、提供法宝技能、提供天人合一功能。
增加并提升人物属性:此项功能主要包括可以增加人物的基础属性和增加人物的技能等级。增加人物基础属性包括增加人物附加伤害、防御、气血、真气、各项抗性(眩晕、魅惑、昏睡、定身、虚弱),这些属性的数值会随着法宝升级而提升;增加人物技能等级为增加人物某些技能等级,这种属性只有在法宝升级到一定阶段才会生效并可见。
提供法宝技能: 每个法宝可提供1-2个法宝技能,人物可以自由使用法宝技能,法宝技能消耗同人物技能。法宝技能等级可通过装备法宝辅件或特殊道具提升。
提供天人合一功能:法宝具有精力属性,玩家装备法宝后,除在决斗状态下,法宝的精力将持续增长,当法宝精力&50%时,玩家可以激活法宝的天人合一功能,玩家将脱离对角色的控制权,改成在当前所在区域自动打怪,每1秒发动一次人物普攻,每5秒发动一次法宝技能攻击。天人合一状态开启后,法宝的精力将以一定速度下降,当法宝精力为零后,天人合一状态中止。在状态持续期间,玩家不能操作角色,无法自主选定目标。 但可进行聊天、更换装备、吃药、加点等操作。玩家还可以在法宝辅助中放置生命药和魔法药,法宝每间隔5秒会自动进行补充。[10]
诛仙3消耗品
传送符:一共有十个地图的传送符,写有神秘咒文的灵符,使用后可以
立即将玩家传往相应地图。[11]
药品:用于提升血量和真气的游戏道具。大多数药品都可以直接从npc贩卖药品商处买到,还有活动馈赠的药品,天帝宝库特贡药品,新手特赠药品,礼盒特贡?宠物药品等[11]
任务物品:完成相应任务时需要的物品。有任务特殊物品、原始货币、战场报名道具、沼泽红字英雄帖、支线、任务特殊奖励等六类。
配方:记载着符文和各职业装备生产方法的神秘卷轴。有护符、帽子、宠物装备、鞋、衣服、秘宝、烹饪、任务特殊、法宝、锦囊、饰品、武器、元魂、杂物、宠物丹药、城战等十六类。
烟花:点击右键使用,可以在天空中出现绚丽图案。[11-12]
诛仙3道具强化
强化道具:用于强化装备属性的游戏道具。总共有十四类不同作用的道具:
暴伤符、暴击符等强化道具符。[11]
宝石镶嵌:游戏***有十二种宝石插槽,对应的宝石有一级普通和一级完美宝石,二级普通和二级完美宝石,三级普通和三级完美宝石,四级普通和四级完美宝石,五级普通和五级完美宝石。宝石镶嵌需要三步:1、插槽鉴定,2、选择宝石,3、宝石镶嵌。[13]
诛仙3场景地图
在游戏界面,M键可以打开地图,可以随时查看目前所处的位置,标记点列表的搜索一栏里可以快速定位想找的NPC。[14]
飞天仙子是进行不同地图间传送的NPC,在每个地图的位置
都是不一样的。点击飞天仙子,可以进行全世界地图传送,但是传送是要钱的,一般是1银或者1金。世界地图分为10个区域,按照玩家等级的高低适合练级的区域分别是河阳城、青云、天音、流波、死泽。蛮荒、焚香、南疆、昆仑、修罗。每到一个等级阶段,玩家就会自动接取该阶段的任务,点击自动寻路功能就会自动跑去相对应的地图。
副本按照玩法的不同大致可分为3类。
副本副本详情家族副本家族族长持有(聚英令)可在任意线路前往河阳时空幻境管理员傅崇刚(172,169)处开启家族副本。选择幻月洞府,如果此线路状态显示未激活,点击激活战场按钮即可开启报名。如果状态显示战斗中,请换条线路进行开启。族长开启副本后有5分钟的报名时间,在时间内家族成员在时空幻境管理员傅崇刚处申请加入。家族成员所在线路必须与族长开启副本线路一致。当报名人数大于5人,族长点击进入副本按钮,各报名成员会收到进入副本的提示框,确认后即可进入。如果加入人数少于5人,该副本无法开启。[15]
战场副本可与其他服务器的玩家对战。活动时间:每天晚上19:00---21:00。活动条件:飞升135级以上的角色(含135级)。报名NPC:星辰?斗魂殿 斗转星移天王(-398,150)。活动人数: 150人(玄天界与万龙界两方阵营各75人)。参与次数:每日一次。[15]
BOSS副本这类副本主要是以刷BOSS和小怪获得装备、制作材料、经验等宝物产出。[15]
诛仙3游戏系统
诛仙3团队系统
团队系统主要是以至少两个玩家组队合作的游戏模式。有四类:分别是结婚(必须是男女两种职业的玩家组队)、战场、仙裔和副本。
  婚姻制度一夫一妻制。结婚条件1、必须是一男一女两个角色,并且两个角色都处于未婚状态;2、双方都至少在30级以上;3、双方的情缘值都需要达到系统要求,与河阳月老对话后可以完成永结连理;4、男女双方必须以组队方式出现在月老前,队伍中不能有其他人与月老对话完成永结连理任务。婚后任务1、红红火火任务流程:新人组队(做队长,新娘为队员),接任务后获得任务物品-火盆,到指定地点使用物品,召唤出“火盆”,两人相依相偎,从火盆上空跳过即可,完成任务后火盆消失。2、步步高升任务流程:新人组队(新郎做队长,新娘为队员),两人,跳到指定的高处,任务完成。3、大吉大利任务流程:新人组队(新郎做队长,新娘为队员),领取任务,得到任务物品——新人的祝福,两人组队来到相思木下,打开祝福礼袋会出现一个宝箱,打碎宝箱后会得到大量喜糖。玩家拾取后使用喜糖即可得到金钱,物品等奖励。[16]
玩家可自行上线找特定战场NPC进行报名。每个战场排队的人数限制为2×12(分两个阵营,一个阵营限制在12人),排队人数满员,取消报名服务;排队人数不满时,开启报名服务。战场开始,
本次排队人员进战场,开启排队。
在战场排队NPC(诛仙战神)开放报名服务时,任何玩家去找其对话,选择需要参加的战场进行报名。玩家距离上次进入战场30分钟后才能再次报名参加战场,如果时间不足30分钟则会给予提示不允许此次报名。每个玩家每天加入战场的次数不得超过10次,超过10次会提示不允许报名
玩家只能报名参加本线的战场。每个战场都有自己特定的等级限制,在玩家报名时需要对玩家等级进行判断。如果玩家不满足选定战场的等级需求,则系统不予报名。
如果满足战场的报名条件,则判断是否两阵营都有空位:如果两阵营排队队列都有空位,则弹出阵营的选择项,玩家选定后加入该线的此战场排队列。如果只有一方还有空位,则提问玩家是否原意参加。
两个个互为配偶并已飞升且有职业的角色,组队完成任务&且行且珍惜&获
得道具&莲子&后,前往&凤凰楼&使用道具&莲子&可分别获得属于自己的&仙裔&。每个角色最初可以获得两个仙裔守护神位置,可以消耗&生肖守护牌&增加仙裔位守护神位置,最多可以有六个仙裔守护神位置。当角色仙裔守护神满了,并希望获得新的仙裔守护神时,玩家可通过选择仙裔界面的&上山学艺&功能,释放仙裔。[17]
诛仙3任务系统
任务系统有游历任务、金丹任务、转职任务、尊号任务、寻宝任务、奇遇任务、挑战任务、经典任务、试炼任务、师门任务、帮派任务、情缘任务、传功任务、家族任务、侠义任务、地图任务、平妖任务这十七类组成,可以说是组成整个游戏剧情的主要部分。[15]
任务奖励接取任务推荐
备注剧情主线金丹8975(死泽955蛮荒南疆1650昆仑1820修罗2000) 四星 飞升主线金丹20700+胜石370 +造化12400+龙筋68+斗玉370+元神11200飞升后自动接到的数字系列任务五星 阵营主线金丹34800+胜石580+造化24700+龙筋175+斗玉780+元神2630+4晶+5晶+6晶飞升90级选择阵营后自动接取五星可以通过转阵营做3次,奖励乘以3元神主线大量元神奖励飞升120级封神后自动接取三星 中州主线金丹5200+浑天宝鉴103+2晶10+3晶1660级自动接取的任务三星后续任务需要飞升135级砂原主线金丹49300+龙筋60+4晶9+5晶9+6晶1+浑天宝鉴55+神石190飞升150级自动接取任务五星 龙原主线金丹+6晶7+浑天宝鉴50+神石200飞升155级自动接取任务五星任务中间会附赠一个蘑菇汤,随机奖励几百金丹+几个宝鉴和神石(以上信息来源:[18-19]
诛仙3PVP系统
30级以前玩家之间不可以PK。PK值只能为大于等于0的数。PK下分别有三大种名字颜色,分别是 基本的“白名”、“橙名”、“红名”。当玩家的PK值为正
万剑朝宗诛天剑
数的时候名字颜色为红,PK值越大名字越红。当玩家的PK值为0且没有主动攻击白名或橙名玩家的时候名字颜色为白色。橙色名字是白名玩家主动先攻击了白名或橙名的玩家后名称颜色一段时间内变为橙色。白名杀死橙名不获得PK值。橙名掉落概率同白名。白名是玩家名字的基本颜色,在没有进行PK行为和30级以前,玩家都是白名。
PK值概念:初始PK值为0。过一段时间后会适量减少。
PK方法:当玩家30级后,选择了玩家之后,按CTRL做出攻击行为后,就进入了PK状态。按CTRL+目标的方法,对自己队伍之外的玩家和怪物有效。同时如果设置PK保护后,可以直接攻击。
PK状态说明
和平状态玩家在30级以前都不能PK其他玩家。30级以后玩家可以才可以PK。
30级以前的人物不可以给有PK状态的玩家使用任何的增益法术。也不可以攻击其他玩家。
在和平模式下不能攻击任何玩家。除非强制PK(按CTRL)(本文中攻击均包括施放负面魔法),但是可以被玩家攻击。
PK状态30级以后玩家可以通过攻击其他的玩家进入PK状态。每次进入PK状态,至少最后一次攻击后,短时间内处于PK模式下。短时间后就自动退出PK状态。在PK状态中的人物头上会有在PK状态的标志。给有PK状态的玩家(包括自己)使用任何的增益法术。或者攻击其他玩家。都会进入PK状态。
死亡惩罚被玩家杀死是有物品掉落的,玩家被怪物杀死,是不掉落物品的。玩家被PK死不掉经验。
防误伤选项开关:游戏里有一个防误伤选择,玩家可以选择在和平状态下的
神剑御雷真诀
可以攻击有效的目标。游戏默认是(攻击只对怪物有效)。玩家可以点击此开关弹出一个“攻击模式选择界面”,玩家在下面4个选项前打勾来。队友在任何情况下均不可攻击。默认所有选项都为选中状态。当PK保护选择项都被勾选上的时候,PK保护按键颜色为绿色。当有任何PK保护选择项未被勾选上的时候,PK保护按键颜色为红色。防误伤选项不论名字是什么颜色都可以使用。此外,ctrl+的攻击方式对自己队伍之外的玩家和怪物有效。
区域规则:安全区不能攻击任何玩家(包括安全区外的玩家),也不能被任何玩家攻击。在安全区内的玩家,可以给无PK状态的玩家使用增益魔法,但不能给有PK状态的玩家(自身除外)使用有益魔法。发起决斗不受安全区影响。[20]
诛仙3交易系统
玩家可以使用交易功能来和给与其他玩家东西或者交换东西,首先选择对方玩家,然后从右键点击头像而出现的菜单中选择“交易”。之后会出现交易框。交易双方可以在本栏中放入物品或者金钱,
双方放置完毕,决定交易后点击“锁定”,然后再点击“交易”就可以完成交易。
如果玩家希望通过摆摊来售卖或收购物品,可以使用摆摊功能。首先使用快捷键“E”打开表情栏。点击“摆摊”动作后,会出现一个表情动作界面,点击摆摊动作表情,即可出现出售商品框。玩家可以将要出售的物品拖到“出售商品”栏中,或者将要收购的物品拖入“收购物品”栏中。然后大家需要为出售或者收购的商品制订单价和出售、收购数量。最后在左边“摊位名称”中写清自己摊位的描述后点击“确定”就可以开始摆摊了。[21]
诛仙3原创音乐
主题曲名演唱者所在游戏版本诛仙恋《诛仙》主题曲诛仙,我回来任贤齐《诛仙》主题曲情醉董贞《新诛仙》主题曲相思引董贞《诛仙?王者归来》主题曲爱恨恢恢《诛仙2》主题曲英雄诀小旭音乐国际跨服PK赛主题曲为爱成神-鬼厉之歌小旭音乐《诛仙2》主角主题曲沉默的等待-雪琪之歌小旭音乐《诛仙2》主角主题曲爱的时间-碧瑶之歌小旭音乐《诛仙2》主角主题曲肆水年华小旭音乐《诛仙2?荣耀之路》主题曲出发吧小旭音乐《诛仙前传》主题曲时光之书小旭音乐《诛仙2?时光之书》主题曲三生七世小旭音乐《诛仙2?末日与曙光》主题曲三生七世伴奏小旭音乐《诛仙2?末日与曙光》诛仙系列之主题音乐[22]
诛仙3游戏配置
硬件名称最低配置推荐配置CPU主频2.4GHz以上主频3.2GHz以上内存1G以上4G以上硬盘8G剩余空间8G剩余空间显卡NvidiaGeForce9500GT/ATIRadeonHD3850NvidiaGeforce8800GTX/ATIRedeon HD4850以上显存256M以上1024M以上网络ADSL或专线接入ADSL或专线接入(以上信息来自:[23]
诛仙3游戏评价
《诛仙3》由北京网络技术有限公司根据萧鼎所著同名仙侠小说改编开发,继续《》的剧情。这次采用了自主开发的全新引擎Destroyer VI,表现力还是不错的,视野做得非常辽阔,很多场景也是实时演算的。整个游戏贴图的问题导致场景锯齿很多,材质纹理做得不是很好。而远处的天空和大山之类的背景,由于无需什么纹理,反而表现得比近景要好很多。相反在完美其他游戏上,由于贴图质量比较高,反而显得画面更加精细。另外法术特效还是一如既往的好,完美一直是被打上绚丽多彩的标签的。(网易游戏评论)[24]
作为一款早已经出现在玩家面前的网游,游戏经过多次版本更新和后续开发,游戏早已慢慢成熟起来,再加上官方在玩家互动和产品拓展上倾注大力吸引新的用户,以及早已经积累的忠实玩家群体,使得游戏历经6年之久仍然如当年一样火爆。不过,毕竟现在游戏更新换代的速度太快了,很多游戏刚出没多久可能就被玩家抛弃淡忘,所以《诛仙3》要保证游戏的质量以及新意,使得玩家对其的热衷度不会下降才行。(新浪游戏评论)[25]
《诛仙3》所搭载的全新引擎Destroyer VI由完美世界百人研发团队打造,利用多项尖端技术及应用,从空间构架、光感特效、细节贴图及操作触感等多方面革新,打造出3D电影双镜头立体画面效果,逼真生动,仿佛触手可及。场景设置更是颠覆传统标杆,或前卫贲张,或烟波浩渺,视效之震撼惊世骇俗。(腾讯游戏评论)[26]
.17173[引用日期]
.178[引用日期]
.多玩游戏[引用日期]
.诛仙3[引用日期]
.太平洋游戏网[引用日期]
.太平洋游戏[引用日期]
.太平洋游戏网[引用日期]
.腾讯游戏[引用日期]
.网易游戏[引用日期]
.诛仙3官网[引用日期]
.诛仙官网[引用日期]
.诛仙3官网[引用日期]
.多玩游戏[引用日期]
.诛仙3官网[引用日期]
.诛仙3官网[引用日期]
.诛仙3官网[引用日期]
.17173[引用日期]
.多玩[引用日期]
.多玩[引用日期]
.诛仙3官网[引用日期]
.诛仙3官网[引用日期]
.诛仙3官网[引用日期]
.17173[引用日期]
.网易游戏[引用日期]
.新浪游戏[引用日期]
.腾讯游戏[引用日期]

参考资料

 

随机推荐