- A+
所属分类:LUA脚本
function FreePkNpc_Init( _MeIndex )
Char.SetData(_MeIndex, %对象_形象%, 100277);
Char.SetData(_MeIndex, %对象_原形%, 100277);
--设置NPC所在地图
Char.SetData(_MeIndex, %对象_地图%, 2000);
--设置X坐标
Char.SetData(_MeIndex, %对象_X%,54);
--设置Y坐标
Char.SetData(_MeIndex, %对象_Y%,82);
--设置NPC方向
Char.SetData(_MeIndex, %对象_方向%, %下%);
--设置NPC名称
Char.SetData(_MeIndex, %对象_原名%, "PK擂台");
FreePk_Timmer = 0;
FreePk_TimeOut=0;
-- 输入内容NPC
Char.SetTalkedEvent(nil, "FreePkNpc_Talked", _MeIndex)
DarePlayer={};--摆擂台玩家信息
DarePlayer2={};--接受挑战的人
DarePkType=1;--摆擂PK类型
Char.SetWindowTalkedEvent(nil,"FreePkNpc_WinAction",_MeIndex);
DareBattleIndex ={};--战斗索引
DareBattleNum=0;--战斗序号
Char.SetLoopEvent(nil, "FreePkCheck_Battle", _MeIndex,2000)--设置回圈事件
return true;--最后要返回操作结果
end
function FreePkNpc_Talked( _MeIndex, _PlayerIndex, _Msg, _Color, _Channel)
if(NLG.CheckInFront(_PlayerIndex, _MeIndex, 1) == false) then
return ;
end
local msg = "";
if(DarePlayer["UserAcc"]==nil) then
msg = "2"..
"\n 通过摆下PK擂台,邀请玩家对战:"..
"\n"..
"\n [1] 单P擂台赛"..
"\n [2] 群P擂台赛"..
"\n [3] 擂台赛说明";
NLG.ShowWindowTalked(_PlayerIndex, 2, 1, 0,msg,_MeIndex);
else
if(DarePlayer["UserAcc"]==Char.GetData(_PlayerIndex,%对象_帐号%)) then
msg = "2"..
"\n 您已摆下擂台,你现在想:"..
"\n"..
"\n [1] 取消擂台赛"..
"\n [2] 掉线后恢复";
NLG.ShowWindowTalked(_PlayerIndex, 2, 1, 4,msg,_MeIndex);
else
if(checkOnline(DarePlayer["UserIndex"],_MeIndex)) then
if(DarePlayer["DP"]==nil) then
NLG.ShowWindowTalked(_PlayerIndex, 0, 1, 3,
"\n 你决定挑战["..DarePlayer["UserName"].."]玩家的擂台?"..
"\n 擂台类型:["..GetPkType(DarePkType).."]"..
"\n 本次悬赏金币:["..DarePlayer["Gold"].."]"..
"\n 按确定后开始战斗!"
,_MeIndex);
else
NLG.ShowWindowTalked(_PlayerIndex, 0, 1, 9,"擂主正在接受挑战中,请稍后!!!",_MeIndex);
end
end
end
end
return ;
end
function FreePkNpc_WinAction( _MeIndex, _TalkIndex, _Seqno, _Select, _Data)
local msg = "";
local TeamFlag = Char.GetData(_TalkIndex,%对象_队模式%);
if(_Seqno==0) then
if(_Select==1) then
return;
end
if(_Data=="1") then --单P擂台赛
DarePkType=1;
if(DarePkType==1) then --如果是单挑模式
if(TeamFlag~=0) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"单P模式不能组队!",_MeIndex);
return;
end
end
NLG.ShowWindowTalked(_TalkIndex, 1, 3, 1,"\n请输入你需要悬赏的金币数:\n",_MeIndex);
end
if(_Data=="2") then --群P擂台赛
DarePkType=2;
if(DarePkType==2) then --如果是团p模式
if(TeamFlag==0) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"团P模式只能组队报名!",_MeIndex);
return;
end
end
NLG.ShowWindowTalked(_TalkIndex, 1, 3, 1,"\n请输入你需要悬赏的金币数:\n",_MeIndex);
end
if(_Data=="3") then --擂台赛说明
msg = "\n 玩家可以自己设置擂台、悬赏金币"..
"\n 那一方赢了可以获得悬赏奖励"..
"\n "..
"\n\n 制作人:SACG工作室--石器CG"..
"\n 2010-04-26 版权所有";
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,msg,_MeIndex);
end
end
if(_Seqno==1) then --单P擂台设定
if(_Select~=2) then
local TMP_Point = Char.GetData(_TalkIndex,%对象_SVIP%);--目前金币数
if(tonumber(_Data)<0) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"你的悬赏金币数错误!!",_MeIndex);
return;
end
if(TMP_Point<tonumber(_Data)) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"你的悬赏金币超过你拥有的金币数!",_MeIndex);
return;
end
if(DarePlayer["UserAcc"]==nil) then --同步问题
DarePlayer["Gold"]=tonumber(_Data);--悬赏金额
DarePlayer["UserAcc"]=Char.GetData(_TalkIndex,%对象_帐号%)--摆擂人的账号
DarePlayer["UserIndex"]=_TalkIndex--摆擂人索引
DarePlayer["UserName"]=Char.GetData(_TalkIndex,%对象_原名%)--摆擂玩家名称
NLG.TalkToCli(-1,"玩家【"..DarePlayer["UserName"].."】已摆下PK擂台,悬赏金额:["..DarePlayer["Gold"].."]",%青色%, 0, _MeIndex);
else
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"你手慢了,已经有人摆下擂台了!",_MeIndex);
end
end
end
if(_Seqno==3) then --接受挑战,开始战斗
if(table.getn(DareBattleIndex)>0 or DarePlayer["DP"]~=nil) then --如果已开战
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"你手慢了,已经有人在挑战了!",_MeIndex);
return;
end
if(_Select~=2) then
if(checkOnline(DarePlayer["UserIndex"],_MeIndex)) then
local TeamFlag = Char.GetData(_TalkIndex,%对象_队模式%);
if(DarePkType==1) then --如果是单挑模式
if(TeamFlag~=0) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"本次擂台是单挑,不允许组队挑战!",_MeIndex);
return;
end
elseif(DarePkType==2) then --如果是团p模式
if(TeamFlag==0) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"本次擂台是团P,只接受组队挑战!",_MeIndex);
return;
end
end
local TMP_Point = Char.GetData(_TalkIndex,%对象_SVIP%);--目前金币数
if(TMP_Point<DarePlayer["Gold"]) then
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"你拥有的金币数少于悬赏金币数!!",_MeIndex);
return;
end
DarePlayer2["UserAcc"]=Char.GetData(_TalkIndex,%对象_帐号%)--摆擂人的账号
DarePlayer2["UserIndex"]=_TalkIndex--摆擂人索引
DarePlayer2["UserName"]=Char.GetData(_TalkIndex,%对象_原名%)--摆擂玩家名称
if(CreatePVsP(_MeIndex)) then --如果创建战斗成功
DarePlayer2["DP"]=Char.GetData(DarePlayer2["UserIndex"],%对象_DP%)--摆擂玩家dp
DarePlayer["DP"]=Char.GetData(DarePlayer["UserIndex"],%对象_DP%)--摆擂玩家dp
end
else
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"擂主已不在线或者已经原登过,本次摆擂取消!",_MeIndex);
end
end
end
if(_Seqno==4) then --擂台人选项
if(_Select~=2) then
if(_Data=="1") then --取消擂台
DarePlayer={0};
end
if(_Data=="2") then --恢复
local TMP_UserAcc = Char.GetData(_TalkIndex,%对象_帐号%)
if(TMP_UserAcc==DarePlayer["UserAcc"]) then
DarePlayer["UserIndex"] = _TalkIndex;
NLG.ShowWindowTalked(_TalkIndex, 0, 1, 9,"恢复成功,你现在成为原来的擂主!",_MeIndex);
end
end
end
end
end
--检查擂主是否在线
function checkOnline(UserIndex,_MeIndex)
local Flag = true;
local TMP_UserAcc = Char.GetData(UserIndex,%对象_帐号%)--摆擂人的账号
if(TMP_UserAcc==nil or TMP_UserAcc=="") then
Flag=false;
NLG.TalkToCli(-1,"由于擂主不在线有玩家挑战,所设的擂台赛取消,大家可以重新设定擂台赛",%青色%, 0, _MeIndex);
end
--组队状态检查
local TeamFlag = Char.GetData(UserIndex,%对象_队模式%);
if(DarePkType==1) then --如果是单挑模式
if(TeamFlag~=0) then
Flag=false;
NLG.ShowWindowTalked(UserIndex, 0, 1, 9,"擂主设置单P模式,目前是组队模式,擂台自动取消",_MeIndex);
end
elseif(DarePkType==2) then --如果是团p模式
if(TeamFlag==0) then
NLG.ShowWindowTalked(UserIndex, 0, 1, 9,"擂主设定团P模式,目前是单人模式,擂台自动取消",_MeIndex);
end
end
if(not Flag) then --如果非正常模式清空擂台信息
DarePlayer["Gold"]=nil;
DarePlayer["UserAcc"]=nil;
DarePlayer["UserIndex"]=nil;
DarePlayer["UserName"]=nil;
end
return Flag;
end
--创建对战
function CreatePVsP(_MeIndex)
if(DarePlayer["UserIndex"]==nil or DarePlayer2["UserIndex"]==nil) then
return false;
end
DareBattleNum = DareBattleNum+1;
--NLG.CreateBattle( _PlayerIndex, _MeIndex, nil,iBossList,iLevelList);
DareBattleIndex[DareBattleNum] = NLG.CreateBattlePvP(DarePlayer["UserIndex"],DarePlayer2["UserIndex"]);--创建玩家对战
local setFlag = Battle.SetWinEvent(nil,"BattlePvsP_Over",DareBattleIndex[DareBattleNum]);--设置战斗胜利事件
NLG.UpChar(_MeIndex);--更新
return true
end
--循环检查战斗是否结束
function FreePkCheck_Battle( _MeIndex)
local Pindex,Bindex;
FreePk_Timmer = FreePk_Timmer +1;
if(FreePk_Timmer>30) then
if(DarePlayer["UserAcc"]~=nil and DarePlayer["UserName"]~=nil and DarePlayer["DP"]==nil) then
NLG.TalkToCli(-1,DarePlayer["UserName"].."已摆下擂台,擂台类型:["..GetPkType(DarePkType).."] 悬赏本次金额:["..DarePlayer["Gold"].."]金币,欢迎大家来挑战!",%青色%, 0, _MeIndex);
FreePk_Timmer=0;
end
end
for Pindex,Bindex in ipairs(DareBattleIndex) do --循环检查每一场战斗
-- print("战斗索引:"..Bindex)
if(CheckBattleOver(Bindex)) then --战斗结束返回ture
print("战斗已结束!!!")
DoBattleOver(_MeIndex);
DareBattleIndex[Pindex]=nil;
DareBattleNum = DareBattleNum-1;
else
print("战斗尚未结束!!!")
end
end
if(DarePlayer["UserAcc"]~=nil) then
CheckPkTimeOut(_MeIndex) --检查规定时间内是否有人挑战
end
end
--检查规定时间内是否有人挑战
function CheckPkTimeOut(_MeIndex)
--print("擂台战斗场数:"..table.getn(DareBattleIndex).." 超时计时:"..FreePk_TimeOut);
if(table.getn(DareBattleIndex)==0) then --无挑战状态
FreePk_TimeOut=FreePk_TimeOut+1;
else
FreePk_TimeOut=0;
end
if(FreePk_TimeOut==300) then --规定时间内无人挑战自动取消擂台
NLG.TalkToCli(-1,DarePlayer["UserName"].."已摆下擂台,由于长时间无人挑战,系统自动取消!!!",%青色%, 0, _MeIndex);
DarePlayer["Gold"]=nil;
DarePlayer["UserAcc"]=nil;
DarePlayer["UserIndex"]=nil;
DarePlayer["UserName"]=nil;
DarePlayer["DP"]=nil;
FreePk_TimeOut=0;
end
end
--战斗结束后处理
function DoBattleOver(_MeIndex)
print("玩家1原有DP:"..DarePlayer["DP"].." 目前DP:"..Char.GetData(DarePlayer["UserIndex"],%对象_DP%));
print("玩家2原有DP:"..DarePlayer2["DP"].." 目前DP:"..Char.GetData(DarePlayer2["UserIndex"],%对象_DP%));
local _WinPlayer,_LostPlayer,Prise_Gold;
Prise_Gold = DarePlayer["Gold"];
local WinNo = 0;
--如果双方DP值不变,逃跑 或卡机
if(DarePlayer["DP"]==Char.GetData(DarePlayer["UserIndex"],%对象_DP%) and DarePlayer2["DP"]==Char.GetData(DarePlayer2["UserIndex"],%对象_DP%)) then
NLG.TalkToCli(-1,"擂台赛双方中途弃权或原登,双方玩家无损失,本次擂台赛结束!",%青色%, 0, _MeIndex);
DarePlayer["Gold"]=nil;
DarePlayer["UserAcc"]=nil;
DarePlayer["UserIndex"]=nil;
DarePlayer["UserName"]=nil;
DarePlayer["DP"]=nil;
DarePlayer2["Gold"]=nil;
DarePlayer2["UserAcc"]=nil;
DarePlayer2["UserIndex"]=nil;
DarePlayer2["UserName"]=nil;
DarePlayer2["DP"]=nil;
return;
end
local TMP_dp=Char.GetData(DarePlayer["UserIndex"],%对象_DP%);
if(TMP_dp>DarePlayer["DP"]) then
print("玩家1赢了:"..DarePlayer["UserName"])
_WinPlayer=DarePlayer["UserIndex"];
_LostPlayer=DarePlayer2["UserIndex"];
WinNo=1;
NLG.TalkToCli(-1,"玩家【"..DarePlayer["UserName"].."】在PK擂台中打败了挑战者【"..DarePlayer2["UserName"].."】 获得悬赏金币:["..Prise_Gold.."] 欢迎其他玩家继续挑战!",%青色%, 0, _MeIndex);
else
print("玩家2赢了:"..DarePlayer2["UserName"])
_WinPlayer=DarePlayer2["UserIndex"];
_LostPlayer=DarePlayer["UserIndex"];
WinNo=2;
NLG.TalkToCli(-1,"玩家【"..DarePlayer2["UserName"].."】在PK擂台中打败了擂主【"..DarePlayer["UserName"].."】 获得悬赏金币:["..Prise_Gold.."] 本次擂台赛结束!",%青色%, 0, _MeIndex);
end
BattlePrise(_MeIndex,_WinPlayer,_LostPlayer,Prise_Gold);
if(WinNo==1) then --如果擂主赢了继续
--取消玩家DP统计
DarePlayer["DP"]=nil;
--取消玩家2
DarePlayer2["Gold"]=nil;
DarePlayer2["UserAcc"]=nil;
DarePlayer2["UserIndex"]=nil;
DarePlayer2["UserName"]=nil;
DarePlayer2["DP"]=nil;
else --如果擂主输了本次擂台取消
DarePlayer["Gold"]=nil;
DarePlayer["UserAcc"]=nil;
DarePlayer["UserIndex"]=nil;
DarePlayer["UserName"]=nil;
DarePlayer["DP"]=nil;
DarePlayer2["Gold"]=nil;
DarePlayer2["UserAcc"]=nil;
DarePlayer2["UserIndex"]=nil;
DarePlayer2["UserName"]=nil;
DarePlayer2["DP"]=nil;
end
end
--赛后处理
function BattlePrise(_MeIndex,_WinPlayer,_LostPlayer,Prise_Gold)
--赢家处理
local TMP_WinPoint = Char.GetData(_WinPlayer,%对象_SVIP%);--目前金币数
Char.SetData(_WinPlayer,%对象_SVIP%,TMP_WinPoint+Prise_Gold);
NLG.TalkToCli(_WinPlayer,"您赢了比赛,获得奖励["..Prise_Gold.."]金币,你目前的金币数是:"..Char.GetData(_WinPlayer,%对象_SVIP%),%红色%, 0, _MeIndex);
--输家处理
local TMP_LostPoint = Char.GetData(_LostPlayer,%对象_SVIP%);--目前金币数
Char.SetData(_LostPlayer,%对象_SVIP%,TMP_LostPoint-Prise_Gold);
NLG.TalkToCli(_LostPlayer,"您输了比赛,获得失去["..Prise_Gold.."]金币,你目前的金币数是:"..Char.GetData(_LostPlayer,%对象_SVIP%),%红色%, 0, _MeIndex);
return
end
--检查战斗是否结束
function CheckBattleOver(Bindex)
local OverFalg = true;
local PlayerIndex=-1;
local count = 0;
while (count < 5) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(Bindex,0,count);
if(PlayerIndex>=0) then
OverFalg = false;
return false;
end
count = count + 1 ;
end
count = 0;
while (count < 5) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(Bindex,1,count);
if(PlayerIndex>=0) then
OverFalg = false;
return false;
end
count = count + 1 ;
end
return OverFalg;
end
--[[
--战斗结束
function BattlePvsP_Over( _BattleIndex, _CreateIndex)
print("战斗已结束!!");
print("_BattleIndex:".._BattleIndex);
print("_CreateIndex:".._CreateIndex);
local PlayerIndex=-1;
local count = 0;
local WinFlag_Uplayer=false; --上方胜利标志
local WinFlag_Downplayer=false;--下方胜利标志
local Win_Player={};--胜利玩家
local Lost_Player={};--失败玩家
while (count < 2) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(_BattleIndex,0,count);
if(PlayerIndex>0) then
Win_Player=DarePlayer;
Lost_Player=DarePlayer2;
end
print("上方玩家:PlayerIndex["..count.."]:"..PlayerIndex)
count = count + 1 ;
end
local count = 0;
while (count < 2) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(_BattleIndex,1,count);
if(PlayerIndex>0) then
Win_Player=DarePlayer2;
Lost_Player=DarePlayer;
end
print("下方玩家:PlayerIndex["..count.."]:"..PlayerIndex)
count = count + 1 ;
end
DareBattleIndex[DareBattleNum]=nil;
NLG.TalkToCli(-1,"玩家【"..Win_Player["UserName"].."】在PK擂台中战胜了【"..Lost_Player["UserName"].."】 获得悬赏金币:["..Win_Player["Gold"].."]",%青色%, 0, _MeIndex);
return;
end
function FreePkCheck_Battle( _MeIndex)
local Pindex,Bindex;
for Pindex,Bindex in ipairs(DareBattleIndex) do --循环检查每一场战斗
local P1=0;
local P2=0;
--print("战斗索引"..DareBattleIndex[Pindex])
local TMP_PlayIndex =nil;--战斗中玩家的索引
local count = 0;
while (count < 2) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(Bindex,0,count);
if(PlayerIndex>0) then
P1=P1+1;
end
--print("上方玩家:PlayerIndex["..count.."]:"..PlayerIndex)
count = count + 1 ;
end
local count = 0;
while (count < 2) do --获得战斗中上方的玩家索引
PlayerIndex = Battle.GetPlayIndex(Bindex,1,count);
--print("下方玩家:PlayerIndex["..count.."]:"..PlayerIndex)
if(PlayerIndex>0) then
P2=P2+1;
end
count = count + 1 ;
end
if(P1>P2)then
print(DarePlayer["UserName"].."胜出比赛 P1:"..P1.." P2:"..P2)
Char.SetLoopEvent(nil,nil, _MeIndex,500)
print("NPC索引:".._MeIndex)
print("玩家1原有DP:"..DarePlayer["DP"].." 目前DP:"..Char.GetData(DarePlayer["UserIndex"],%对象_DP%));
print("玩家2原有DP:"..DarePlayer2["DP"].." 目前DP:"..Char.GetData(DarePlayer2["UserIndex"],%对象_DP%));
NLG.TalkToCli(-1,"玩家【"..DarePlayer["UserName"].."】在PK擂台中战胜了【"..DarePlayer2["UserName"].."】 获得悬赏金币:["..DarePlayer["Gold"].."]",%青色%, 0, _MeIndex);
end
if(P1<P2)then
print(DarePlayer2["UserName"].."胜出比赛 P1:"..P1.." P2:"..P2)
Char.SetLoopEvent(nil,nil, _MeIndex,500)
print("NPC索引:".._MeIndex)
print("玩家1原有DP:"..DarePlayer["DP"].." 目前DP:"..Char.GetData(DarePlayer["UserIndex"],%对象_DP%));
print("玩家2原有DP:"..DarePlayer2["DP"].." 目前DP:"..Char.GetData(DarePlayer2["UserIndex"],%对象_DP%));
NLG.TalkToCli(-1,"玩家【"..DarePlayer2["UserName"].."】在PK擂台中战胜了【"..DarePlayer["UserName"].."】 获得悬赏金币:["..DarePlayer["Gold"].."]",%青色%, 0, _MeIndex);
end
end
end
--]]
--擂台类型
function GetPkType(Type)
local TMP_Type="";
if(Type==1) then
TMP_Type="单P";
elseif(Type==2) then
TMP_Type="团P";
end
return TMP_Type
end
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-