PK擂台lua脚本(zjlua版本)

  • 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


  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

您必须才能发表评论!