|
|
发表于 2006-7-13 17:29:00
|
显示全部楼层
Re:转: MMORPG任务系统设计
function doAction(bTalk,nSelectID,nSelectItemID) --nSelectID为用户点击按钮的ID,nSelectItemID为用户选择奖励
local lMissionflag=200; --npc任务标记变量
TaskObject:setLvL(45);
TaskObject:setID(lMissionflag);
local nSelectitem={22,33,435}; --给玩家选择的任务奖励物品(22.33.435这些是对应的任务奖励物品ID)
bAlreadHave = false;
--循环获得任务是否有这个任务
for i=0,19 do
if DestObject:GetUpdataFlag(UNIT_FIELD_TASK +i*8) != lMissionFalg then
bAlreadHave = true;
break;
end
end
if bAlreadHave then
-- 如果是获取物品的任务检查所需要条件(例如需要20件3143的物品)如果是直接对话完成任务的
lNumsItem = DestObject:GetNumsItem(3143);
if lNumsItem < 20 then
Send(DestObject, ?, 2);
if bTalk then
Send("Open Finish Mission Windows",lMissionflag);--打开任务结束对话窗口显示对应任务
end
return false;
end
if bTalk then
Send("Open Finish Mission Windows",lMissionflag); --打开任务结束对话窗口显示对应任务
Send("Enable Over Button"); --将完成任务那个按钮设置为可点击的默认为不可以
if nSelectID=0 then --当用户点击了完成任务按钮
--如果任务奖励有要给东西则这边要进行以下判断这边是相应任务奖励处理
if (DestObject:getUpdateFlag(CONTAINER_FIELD_NUM_SLOTS)<3) then --背包的空格数不够奖励道具的数量
MessageShow("背包满");
end
--如果是有选择奖励道具任务的
if nSelectItemID >0 then
DestObject:addItem(NewItemObject,nSelectitem[nSelectItemID]);
end
else
MessageShow(“请选择道具”);
end
--没有选择的
DestObject:addItem(NewItemObject, I_SLOT_DEFALUT);--将对应的奖励放入背包
--其他奖励
DestObject:addItem(NewItemObject, I_SLOT_DEFALUT); --将默认的奖励物品放入背包
DestObject:setUpdateIntValue(PLAYER_FIELD_COINAGE,+1000); --增加玩家金钱
DestObject:setUpdateIntValue(PLAYER_FIELD_XP,+10000); --增加玩家经验
DestObject eleteTask(lMissionflag);
send(.....) --更新客户端信息
CloseWindow(); --关闭窗口
return false;
end
return false;
end
Send(SrcObject,?,1);
retrun true;
else
-- 做过这个任务了
if DestObject:GetHistroyTaskFlag(lMissionflag) then
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<39 then --当等级超过限制任务不存在(这边假设任务等级为45)
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<42 then
Send(DestObject, !, 2);
return false;
end
if bTalk then
Send("Open Open Mission Windows",lMissionflag);--打开任务接受对话窗口显示对应任务
if
if nSelectID=0 then --当用户点击了接受任务按钮
--这边是接受响应任务相应任务处理
--如果接受任务有给东西则要加下面判断
if (DestObject:getUpdateFlag(CONTAINER_FIELD_NUM_SLOTS)<2) then --背包如果满
MessageShow("背包满");
return false;
end
if DestObject:GetCurrentNumsOfTask()==20 then --当任务已经20条
MessageShow("任务已经满");
return false;
end
--增加玩家任务
DestObject:CreateNewTask();
DestObject:AddTask(lMissionflag);
--往玩家背包加相应任务道具
DestObject:addItem(NewItemObject, I_SLOT_DEFALUT);
CloseWindow(); --关闭窗口
return false;
end
return false;
end
Send(DestObject, !, 1);
return true;
end
end
-- 单条任务npc,只有接任务
function doAction(bTalk,nSelectID,nSelectItemID)
local lMissionflag=200 --npc任务标记变量
TaskObject:setID(lMissionflag);
-- 做过这个任务了
if DestObject:GetHistroyTaskFlag(lMission) then
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL) >55 then --当等级超过限制任务不存在(这边假设任务等级为45)
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<40 then
Send(DestObject, !, 2);
return false;
end
if bTalk then
Send("Open Open Mission Windows",lMissionflag);--打开任务接受对话窗口显示对应任务
if nSelectID=0 then --当用户点击了接受任务按钮
--这边是接受响应任务相应任务处理
--如果接受任务有给东西则要加下面判断
if (DestObject:GetUpdataFlag(背包当前使用格数)+1)<DestObject:GetUpdataFlag(背包总格数) then --背包如果满
MessageShow("背包满");
end
if DestObject:getMissions()=20 then --当任务已经20条
MessageShow("任务已经满");
return false;
end
--增加玩家任务
DestObject:CreateNewTask();
DestObject:AddTask(lMissionflag);
--往玩家背包加相应任务道具
DestObject:addItem(NewItemObject, I_SLOT_BOOT);
CloseWindow(); --关闭窗口
return false;
end
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<51 then
Send(DestObject, !, 1);
end
return true;
end
end
-- 单条任务npc,只有交任务
function doAction(bTalk,nSelectID,nSelectItemID)
local lMissionflag=200 --npc任务标记变量
bAlreadHave = false;
--循环获得任务是否有这个任务
for i=0,19 do
if DestObject:GetUpdataFlag(PLAYER_FIELD_QUEST_LOG_1_1+i*3) != lMissionFalg then
bAlreadHave = true;
break;
end
end
if bAlreadHave then
-- 如果是获取物品的任务检查所需要条件(例如需要20件3143的物品)如果是直接对话完成任务的
lNumsItem = DestObject:GetNumsItem(3143);
if lNumsItem < 20 then
Send(DestObject, ?, 2);
if bTalk then
Send("Open Finish Mission Windows",lMissionflag);--打开任务结束对话窗口显示对应任务
end
return false;
end
Send(DestObject,?,1);
if bTalk then
Send("Open Finish Mission Windows",lMissionflag);--打开任务结束对话窗口显示对应任务
Send("Enable Over Button");--将完成任务那个按钮设置为可点击的默认为不可以
if nSelectID=0 then --当用户点击了完成任务按钮
--如果任务奖励有要给东西则这边要进行以下判断这边是相应任务奖励处理
if (DestObject:getUpdateFlag(CONTAINER_FIELD_NUM_SLOTS)<3) then --背包的空格数不够奖励道具的数量
MessageShow("背包满");
end
DestObject:addItem(NewItemObject, I_SLOT_DEFALUT);--将对应的奖励放入背包
--其他奖励
DestObject:addItem(NewItemObject, I_SLOT_DEFALUT); --将默认的奖励物品放入背包
DestObject:setUpdateIntValue(PLAYER_FIELD_COINAGE,+1000); --增加玩家金钱
DestObject:setUpdateIntValue(PLAYER_FIELD_XP,+10000); --增加玩家经验
DestObject:DeleteTask(lMissionflag);
send(.....) --更新客户端信息
CloseWindow(); --关闭窗口
return false;
end
return false;
end
retrun true;
end
end
--多条任务npc (例如该npc有两条任务)并且尽量让玩家可能先做的任务写到前面
function doTalk(bTalk)
local lMissionflag1=200 ;--npc任务标记1变量
TaskObject1:setID(lMissionflag1);
local lMissionflag2=201 ;--npc任务标记2变量
TaskObject2:setID(lMissionflag2);
bAlreadHave1 = false;
bAlreadHave2 = false;
--循环获得任务是否有这个任务
for i=0,19 do
if DestObject:GetUpdataFlag(PLAYER_FIELD_QUEST_LOG_1_1+i*3) != lMissionFalg1 then
bAlreadHave1 = true;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_QUEST_LOG_1_1+i*3) != lMissionFalg2 then
bAlreadHave2 = true;
end
end
if bAlreadHave1 then
-- 如果是获取物品的任务检查所需要条件(例如需要20件3143的物品)如果是直接对话完成任务的
lNumsItem = DestObject:GetNumsItem(3143);
if lNumsItem < 20 then
Send(DestObject, ?, 2);
if bTalk then
AddMissionItem(DestObject, ?, 2); --往任务列表里面加入灰色问号这个未完成任务
end
return false;
end
Send(DestObject,?,1);
if bTalk then
AddMissionItem(DestObject,?,1); --往任务列表里面加入黄色问号这个已完成任务
if
else
return true; --如果不是对话的则直接显示?,不用再对下面2的进行判断了
end
else
-- 做过这个任务了
if DestObject:GetHistroyTaskFlag(lMissionflag1) == true then
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL) >55 then --当等级超过限制任务不存在(这边假设任务等级为45)
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<40 then
Send(DestObject, !, 2);
return false;
end
Send(DestObject, !, 1);
if bTalk then
AddMissionItem(DestObject, !, 1); --往任务列表里面加入黄色问号这个已完成任务
end
end
if bAlreadHave2 then
-- 如果是获取物品的任务检查所需要条件(例如需要20件3143的物品)如果是直接对话完成任务的
lNumsItem = DestObject:GetNumsItem(3143);
if lNumsItem < 20 then
Send(DestObject, ?, 2);
if bTalk then
AddMissionItem(DestObject, ?, 2); --往任务列表里面加入灰色问号这个未完成任务
end
return false;
end
Send(DestObject,?,1);
if bTalk then
AddMissionItem(DestObject,?,1); --往任务列表里面加入黄色问号这个已完成任务
else
return true; --如果不是对话的则直接显示?,不用再对下面的进行判断了
end
else
-- 做过这个任务了
if DestObject:GetHistroyTaskFlag(lMissionflag2) == true then
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL) >55 then --当等级超过限制任务不存在(这边假设任务等级为45)
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<40 then
Send(DestObject, !, 2);
return false;
end
Send(DestObject, !, 1);
if bTalk then
AddMissionItem(DestObject, !, 1); --往任务列表里面加入黄色问号这个已完成任务
end
end
Send("Open Selection Dialog");
end
--可重复做任务的npc (例如捐布npc)
function doTalk(bTalk )
local lMissionflag=1000;
Send(DestObject, ?, 3);
if bTalk then
Send("Open Mission Window",lMissionflag);
end
end
--限时杀指定怪物任务
function doAction(bTalk,nSelectID,nSelectItemID) --nSelectID为用户点击按钮的ID,nSelectItemID为用户选择奖励
local lMissionflag=200; --npc任务标记变量
TaskObject:setID(lMissionflag);
local nSelectitem={22,33,435}; --给玩家选择的任务奖励物品(22.33.435这些是对应的任务奖励物品ID)
bAlreadHave = false;
--循环获得任务是否有这个任务
for i=0,19 do
if DestObject:GetUpdataFlag(UNIT_FIELD_TASK +i*8) != lMissionFalg then
bAlreadHave = true;
break;
end
end
if bAlreadHave then
-- 判断任务
local ltime = DestObject:getTimerLimit();
local lNum1=TaskObject:getCurrnetNumsOfMonst(狼,疯狂的狼);
local lNum2=TaskObject:getCurrnetNumsOfMonst(狼,饥饿的狼);
if (ltime ==0 and lNum1<20 ) and lNum2<20 then
Send(DestObject, ?, 2);
if bTalk then
Send("Open Finish Mission Windows",lMissionflag);--打开任务结束对话窗口显示对应任务
end
return false;
end
if bTalk then
Send("Open Finish Mission Windows",lMissionflag); --打开任务结束对话窗口显示对应任务
Send("Enable Over Button"); --将完成任务那个按钮设置为可点击的默认为不可以
if nSelectID=0 then --当用户点击了完成任务按钮
--如果任务奖励有要给东西则这边要进行以下判断这边是相应任务奖励处理
if (DestObject:getUpdateFlag(CONTAINER_FIELD_NUM_SLOTS)<3) then --背包的空格数不够奖励道具的数量
MessageShow("背包满");
end
DestObject:addItem(NewItemObject, nSelectItemID);--将对应的奖励放入背包
--其他奖励
DestObject:addItem(NewItemObject, I_SLOT_BOOT); --将默认的奖励物品放入背包
DestObject:setUpdateIntValue(PLAYER_FIELD_COINAGE,+1000); --增加玩家金钱
DestObject:setUpdateIntValue(PLAYER_FIELD_XP,+10000); --增加玩家经验
DestObject:DeleteTask(lMissionflag);
send(.....) --更新客户端信息
CloseWindow(); --关闭窗口
return false;
end
return false;
end
Send(SrcObject,?,1);
retrun true;
else
-- 做过这个任务了
if DestObject:GetHistroyTaskFlag(lMissionflag) then
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<39 then --当等级超过限制任务不存在(这边假设任务等级为45)
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<42 then
Send(DestObject, !, 2);
return false;
end
if bTalk then
Send("Open Open Mission Windows",lMissionflag);--打开任务接受对话窗口显示对应任务
if nSelectID=0 then --当用户点击了接受任务按钮
--这边是接受响应任务相应任务处理
--如果接受任务有给东西则要加下面判断
if (DestObject:getUpdateFlag(CONTAINER_FIELD_NUM_SLOTS)<2) then --背包如果满
MessageShow("背包满");
return false;
end
if DestObject:GetCurrentNumsOfTask()==20 then --当任务已经20条
MessageShow("任务已经满");
return false;
end
--增加玩家任务
DestObject:CreateNewTask();
DestObject:AddTask(lMissionflag);
TaskObject:setTimerLimit(300);
TaskObject:setMonstQueryInfo(1,狼,疯狂的狼,20); --该任务要杀两种狼,参数(在该任务的位置,主类型,具体品种,数量)
TaskObject:setMonstQueryInfo(2,狼,饥饿的狼,20);
--往玩家背包加相应任务道具
DestObject:addItem(NewItemObject, I_SLOT_BOOT);
CloseWindow(); --关闭窗口
return false;
end
return false;
end
if DestObject:GetUpdataFlag(PLAYER_FIELD_EXT_LEVEL)<51 then
Send(DestObject, !, 1);
end
return true;
end
end
|
|