local TheHeroTowerSqlName = "thetowerhero"
local TheHeroTowerSqlCdkey = "cdkey"
local TheHeroTowerSqlReg = "Reg"
local TheHeroTowerSqlPlayerName = "PlayerName"
local TheHeroTowerSqlFloorStart = "FloorStart"
local TheHeroTowerSqlFloorNow = "FloorNow"
local TheHeroTowerSqlFloorMax = "FloorMax"
local TheHeroTowerSqlFloorMaxTime = "FloorMaxTime"
local TheHeroTowerSqlPoint = "FloorPoint"
local TheHeroTowerFieldHistory = "TheTowerPlayerHistory" --最近获胜层数
local TheHeroTowerName = "勇者试炼" --塔名
local TheHeroTowerMainMsg = "\n这里是勇者试炼的说明。限于篇幅,具体请看论坛-自制任务版块-勇者试炼相关攻略。" --无限塔说明
local TheHeroTowerenemyidgroup = {} --怪物模版
TheHeroTowerenemyidgroup[1] = {} --怪物模版 enemyidgroup1[i] = x i为序号 x为怪物id
TheHeroTowerenemyidgroup[2] = {} --怪物模版 enemyidgroup1[i] = x i为序号 x为怪物id
TheHeroTowerenemyidgroup[3] = {} --怪物模版 enemyidgroup1[i] = x i为序号 x为怪物id
for i = 777001,777294 do
TheHeroTowerenemyidgroup[1][i-777000] = i
end
for i = 777296,777385 do
TheHeroTowerenemyidgroup[1][i-777001] = i
end
for i = 777388,777405 do
TheHeroTowerenemyidgroup[1][i-777003] = i
end
for i = 777501,777590 do
TheHeroTowerenemyidgroup[2][i-777500] = i
end
for i = 777701,777752 do
TheHeroTowerenemyidgroup[3][i-777700] = i
end
local TheHeroTowerfragmentitemnum = {} --点数与关数倍率
TheHeroTowerfragmentitemnum[1] = 1 --1关前每关1点
TheHeroTowerfragmentitemnum[50] = 1 --130关前每关1点
TheHeroTowerfragmentitemnum[90] = 2 --130关前每关2点
TheHeroTowerfragmentitemnum[120] = 3 --130关前每关2点
TheHeroTowerfragmentitemnum[200] = 5 --130关前每关2点
local TheHeroTowerenemylvprefloor = {} --关数与怪物等级比例
--TheHeroTowerenemylvprefloor[1] = {1,1,1,1,1,1,1} --TheHeroTowerenemylvprefloor[关数] = {第一组怪物模版等级比例,第二组怪物模版等级比例,第三组怪物模版等级比例...}
--TheHeroTowerenemylvprefloor[90] = {1,1,1} --TheHeroTowerenemylvprefloor[关数] = {第一组怪物模版等级比例,第二组怪物模版等级比例,第三组怪物模版等级比例...}
--TheHeroTowerenemylvprefloor[110] = {1,1.5,2}
--TheHeroTowerenemylvprefloor[130] = {1.5,2,2.5}
--TheHeroTowerenemylvprefloor[200] = {1,1,1,1,1,1,1} --TheHeroTowerenemylvprefloor[关数] = {第一组怪物模版等级比例,第二组怪物模版等级比例,第三组怪物模版等级比例...}
for i = 1,50 do
TheHeroTowerenemylvprefloor[i] = {50/i,50/i,50/i,50/i,50/i,50/i}
end
TheHeroTowerenemylvprefloor[51] = {1,1,1,1,1,1,1}
local TheHeroTowerenemygroup = {} --怪物队形
TheHeroTowerenemygroup[1] = {2,0,0,0,0,1,1,1,1,1}
TheHeroTowerenemygroup[51] = {2,2,0,0,0,1,1,1,1,1}
TheHeroTowerenemygroup[101] = {3,2,0,0,0,1,1,1,1,1}
TheHeroTowerenemygroup[126] = {3,2,2,2,0,1,1,1,1,1}
TheHeroTowerenemygroup[151] = {3,3,2,2,0,1,1,1,1,1}
TheHeroTowerenemygroup[176] = {3,3,3,2,0,1,1,1,1,1}
TheHeroTowerenemygroup[201] = {3,3,3,2,2,1,1,1,1,1}
TheHeroTowerenemygroup[226] = {3,3,3,2,2,2,1,1,1,1}
TheHeroTowerenemygroup[251] = {3,3,3,2,2,2,2,1,1,1}
TheHeroTowerenemygroup[276] = {3,3,3,3,2,2,2,1,1,1}
TheHeroTowerenemygroup[301] = {3,3,3,3,2,2,2,2,1,1}
TheHeroTowerenemygroup[326] = {3,3,3,3,2,2,2,2,2,1}
TheHeroTowerenemygroup[351] = {3,3,3,3,2,2,2,2,2,2}
TheHeroTowerenemygroup[376] = {3,3,3,3,3,2,2,2,2,2}
local TheHeroTowerWinGive = 72226 --战斗胜利奖励
local TheHeroTowerilvitemnum = {} --最终奖励道具给予数量
TheHeroTowerilvitemnum[10] = 1
TheHeroTowerilvitemnum[30] = 2
TheHeroTowerilvitemnum[80] = 3
TheHeroTowerilvitemnum[101] = 1
local TheHeroTowerilvrate = {} --最终奖励道具id
TheHeroTowerilvrate[10] = {70107,"魔石"}
TheHeroTowerilvrate[50] = {70108,"魔石"}
TheHeroTowerilvrate[101] = {72225,"勇者试炼护符"}
--以上设置 可间隔设置 会自动按照最近的设置过的关数补齐没有设置的关数
local TheHerotowerfloormax = 1000 --预设最高塔关次
local TheHeroTowerfloorgrow = 1 --战斗胜利后关数增加值
local TheHeroTowerfloorcheck = 5 --领取大奖所需战斗关数
local TheHeroTowerfloordown = 10 --领取大奖所需消耗关数
local TheHeroTowerfloorfrist = 101 --领取大奖的最低关数
local TheHeroTowerpaygold = 1000 --战斗开启时需要支付的金币费用/每层
local TheHeroTowerisallpay = 0 --是否全部队员都需要支付 0为只有队长支付 否则为全队支付
local TheHeroToweritemnumplusitem = {50361,"勇者试炼金币"} --额外箱子所需道具
local TheHeroTowerbattlenpc = {} --战斗npc设置
TheHeroTowerbattlenpc[1] = {14064,63931,44,22,6,"勇者试炼挑战"}
TheHeroTowerbattlenpc[2] = {14064,63932,44,22,6,"勇者试炼挑战"}
local TheHeroTowergivenpc = {99098,63933,44,22,6,"勇者试炼通过"} --领奖npc设置
local TheHeroTowerItemChangeNpcInfo = {} --随机抽奖
TheHeroTowerItemChangeNpcInfo = {470103,"宏伟秘境宝箱",6,63931,44,20,1,999,0,"宏伟秘境宝箱",{}}
--TheHeroTowerItemChangeNpcInfo[11][1] = {解锁兑换层数,"额外说明",随机下限(如0.7 则为70%-100%能力随机),基础词缀数量,兑换使用道具id,兑换需要数量,兑换的道具id,是否绑定 0不绑}
TheHeroTowerItemChangeNpcInfo[11][1] = {101,"$4词缀数量1$0\n无法交易",0.5,1,72226,50,72225,1}
TheHeroTowerItemChangeNpcInfo[11][2] = {200,"$4词缀数量2$0\n无法交易",0.5,2,72226,75,72225,1}
TheHeroTowerItemChangeNpcInfo[11][3] = {200,"$4词缀数量2$0\n可以交易",0.5,2,72226,100,72225,0}
---------------------------------------------------------------
Global_Reg.RegLoginEvent("theherotowerloginout")
Global_Reg.RegLogoutEvent("theherotowerloginout")
Global_Reg.RegBattleOverEvent ("TheHeroTowerWinCallBack")
Global_Reg.RegLoginGateEvent ("theherotowerloginout");
Global_Reg.RegBattleStartEvent ("theherotowerbattlestart");
TheHeroTowerGetInfo = TheHeroTowerGetInfo or {}
TheHeroTowerBattleInFloor = TheHeroTowerBattleInFloor or {}
--TheHeroTowerBattleInFloor[player] = {battle,nextfloor,battlestarttime,battleovertime}
TheHeroTowerDamageList = TheHeroTowerDamageList or {}
for i = 1,TheHerotowerfloormax do
if TheHeroTowerfragmentitemnum[i] then
TheHeroTowerfragmentitemnum[0] = TheHeroTowerfragmentitemnum[i]
else
TheHeroTowerfragmentitemnum[i] = TheHeroTowerfragmentitemnum[0]
end
if TheHeroTowerenemygroup[i] then
TheHeroTowerenemygroup[0] = TheHeroTowerenemygroup[i]
else
TheHeroTowerenemygroup[i] = TheHeroTowerenemygroup[0]
end
if TheHeroTowerilvitemnum[i] then
TheHeroTowerilvitemnum[0] = TheHeroTowerilvitemnum[i]
else
TheHeroTowerilvitemnum[i] = TheHeroTowerilvitemnum[0]
end
if TheHeroTowerilvrate[i] then
TheHeroTowerilvrate[0] = TheHeroTowerilvrate[i]
else
TheHeroTowerilvrate[i] = TheHeroTowerilvrate[0]
end
if TheHeroTowerenemylvprefloor[i] then
TheHeroTowerenemylvprefloor[0] = TheHeroTowerenemylvprefloor[i]
else
TheHeroTowerenemylvprefloor[i] = TheHeroTowerenemylvprefloor[0]
end
end
function theherotowerbattlestart(battle)
if ExBossDamageDownList[battle] then
ExBossDamageDownList[battle] = nil
end
if ExBossDamageUpList[battle] then
ExBossDamageUpList[battle] = nil
end
if TheHeroTowerDamageList[battle] then
ExBossDamageDownList[battle] = TheHeroTowerDamageList[battle][1]
ExBossDamageUpList[battle] = TheHeroTowerDamageList[battle][2]
TheHeroTowerDamageList[battle] = nil
end
end
function getherotowerfloor(player)
local cdkey = Char.GetData(player,2002)--账号
local regnum = Char.GetData(player,48)--RegistNumber
local playername = Char.GetData(player,2000)--原名
if savestring(cdkey) then -- and savestring(playername) then
local query = "SELECT "..TheHeroTowerSqlFloorStart..","..TheHeroTowerSqlFloorNow..","..TheHeroTowerSqlFloorMax..","..TheHeroTowerSqlFloorMaxTime..","..TheHeroTowerSqlPoint.." FROM "..TheHeroTowerSqlName.." WHERE "..TheHeroTowerSqlCdkey.." = '"..cdkey.."' AND "..TheHeroTowerSqlReg.." = "..regnum
local resset = SQL.Run(query)
if type(resset) == "table" then
return tonumber(resset["0_0"]),tonumber(resset["0_1"]),tonumber(resset["0_2"]),tonumber(resset["0_3"]),tonumber(resset["0_4"])
elseif resset == nil then
query = "INSERT INTO "..TheHeroTowerSqlName.." ("..TheHeroTowerSqlCdkey.." , "..TheHeroTowerSqlReg.." , "..TheHeroTowerSqlPlayerName.." , "..TheHeroTowerSqlFloorStart.." , "..TheHeroTowerSqlFloorNow.." , "..TheHeroTowerSqlFloorMax.." , "..TheHeroTowerSqlFloorMaxTime.." , "..TheHeroTowerSqlPoint..") VALUES (".."'"..cdkey.."',"..regnum..",'"..playername.."',0,0,0,0,0)"
resset = SQL.Run(query)
return 0,0,0,0,0
end
else
NLG.SystemMessage(player,"非法的帐号。")
return nil
end
end
function setherotowerfloor(player,key,isrealset)
local tempint = {TheHeroTowerSqlFloorStart,TheHeroTowerSqlFloorNow,TheHeroTowerSqlFloorMax,TheHeroTowerSqlFloorMaxTime,TheHeroTowerSqlPoint}
local cdkey = Char.GetData(player,2002)
local regnum = Char.GetData(player,48)
local playername = Char.GetData(player,2000)
if isrealset and type(isrealset) == "number" then
local query = "UPDATE "..TheHeroTowerSqlName.." SET "..tempint[key].." = "..isrealset.." , "..TheHeroTowerSqlPlayerName.." = '"..playername.."' WHERE "..TheHeroTowerSqlCdkey.." = '"..cdkey.."' AND "..TheHeroTowerSqlReg.." = "..regnum
local resset = SQL.Run(query)
return true
else
if key == 1 then
local query = "UPDATE "..TheHeroTowerSqlName.." SET "..tempint[1].." = "..tempint[2].."-"..TheHeroTowerfloordown.." , "..tempint[2].." = "..tempint[2].."-"..TheHeroTowerfloordown.." , "..TheHeroTowerSqlPlayerName.." = '"..playername.."' WHERE "..TheHeroTowerSqlCdkey.." = '"..cdkey.."' AND "..TheHeroTowerSqlReg.." = "..regnum
local resset = SQL.Run(query)
return true
elseif key == 2 then
local query = "UPDATE "..TheHeroTowerSqlName.." SET "..tempint[2].." = "..tempint[2].."+"..TheHeroTowerfloorgrow.." , "..TheHeroTowerSqlPlayerName.." = '"..playername.."' WHERE "..TheHeroTowerSqlCdkey.." = '"..cdkey.."' AND "..TheHeroTowerSqlReg.." = "..regnum
local resset = SQL.Run(query)
return true
end
end
return false
end
function theherotowerloginout(player)
TheHeroTowerBattleInFloor[player] = nil
end
function TheHeroTowerWinCallBack(battle)
local win = 0
for Side=0,1 do
for Num = 0,9 do
local Charindex = Battle.GetPlayIndex(battleIndex,Side,Num)
if Charindex >= 0 then
if Char.GetData(Charindex,0) == 1 then
if Char.GetData(Charindex,9) > 1 then
win = 1
break
end
end
end
end
end
if win == 1 then
for Side=0,1 do
for Num = 0,9 do
local Charindex = Battle.GetPlayIndex(battleIndex,Side,Num)
if Charindex >= 0 then
if Char.GetData(Charindex,0) == 1 then
if TheHeroTowerBattleInFloor[Charindex] then
if battle == TheHeroTowerBattleInFloor[Charindex][1] and TheHeroTowerBattleInFloor[Charindex][4] == nil then
TheHeroTowerBattleInFloor[Charindex][4] = os.time()
NLG.Warp(Charindex,0,TheHeroTowergivenpc[2],(TheHeroTowergivenpc[3]-2),TheHeroTowergivenpc[4])
else
TheHeroTowerBattleInFloor[Charindex] = nil
end
end
end
end
end
end
else
for Charindex,info in pairs(TheHeroTowerBattleInFloor) do
if battle == info[1] then
TheHeroTowerBattleInFloor[Charindex] = nil
--NLG.SystemMessage(-1,"Charindex="..Charindex.." battle="..battle.." info clean")
end
end
end
end
function TheHeroTowerBattleTalkEvent(npc,player)
if NLG.CanTalk(npc,player) then
local msg = "3\n **********"..TheHeroTowerName.."**********\n请选择您需要的服务:\n\n1."..TheHeroTowerName.."副本详细介绍\n2.参与"..TheHeroTowerName.."关卡挑战\n3.查看挑战排行榜\n4.查看积分排行榜"
NLG.ShowWindowTalked(player,2,2,0,msg,npc)
end
end
function TheHeroTowerBattleWindowEvent(npc,player,Seqno,Select,Data)
--NLG.SystemMessage(player,"Seqno="..Seqno.." Select="..Select.." Data="..Data)
if NLG.CanTalk(npc,player) then
if Select ~= 2 then
if Seqno == 0 then
if tonumber(Data) == 1 then
NLG.ShowWindowTalked(player,0,2,9999,TheHeroTowerMainMsg,npc)
elseif tonumber(Data) == 2 then
local start,now,maxfloor,maxtime,point = getherotowerfloor(player)
local nextsel = 6
local msg = " **********"..TheHeroTowerName.."**********\n\n您从 "..start.." 关开始已成功挑战至 "..now.." 关。\n您的当前总积分有: "..point.." 分。"..NLG.c("\n--------------------").."\n点击【是】立即带队挑战第 "..(now+TheHeroTowerfloorgrow).." 关"..TheHeroTowerName.."。\n费用:"..(TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)).."G"
if TheHeroTowerisallpay == 0 then
msg = msg.." (队长支付)"
else
msg = msg.." (每人支付)"
end
if now - start >= TheHeroTowerfloorcheck and now >= TheHeroTowerfloorfrist and now >= TheHeroTowerfloordown then
msg = msg .."\n点击【确定】领取 "..TheHeroTowerilvitemnum[now].." 个『"..TheHeroTowerilvrate[now][2].."』。\n领取后,您将从第 "..(now-TheHeroTowerfloordown+TheHeroTowerfloorgrow).." 关开始重新挑战。"
nextsel = 7
end
NLG.ShowWindowTalked(player,0,nextsel,100,msg,npc)
elseif tonumber(Data) == 3 then
local cdkey = Char.GetData(player,2002)
local regnum = Char.GetData(player,48)
local start,now,maxfloor,maxtime = getherotowerfloor(player)
local query = "SELECT "..TheHeroTowerSqlCdkey..","..TheHeroTowerSqlReg..","..TheHeroTowerSqlPlayerName..","..TheHeroTowerSqlFloorMax..","..TheHeroTowerSqlFloorMaxTime.." FROM "..TheHeroTowerSqlName.." ORDER BY "..TheHeroTowerSqlFloorMax.." DESC , "..TheHeroTowerSqlFloorMaxTime.." ASC"
local resset = SQL.Run(query)
if type(resset) == "table" then
local msg = ""
local playernum = 0
for i = 0,500 do
if resset[i.."_0"] then
if i < 20 then
local tempmsg = string.format("\n第[%-2d]名:%0-16s最高记录%4d关 用时%4d秒",i+1,resset[i.."_2"],resset[i.."_3"],resset[i.."_4"])
msg = msg..tempmsg
end
if resset[i.."_0"] == cdkey and tonumber(resset[i.."_1"]) == regnum then
playernum = i+1
end
end
end
if playernum > 0 then
msg = NLG.c("你的最高记录"..maxfloor.."关,用时"..SecondTurnTimeStr(maxtime).."。位于服务器第"..playernum.."名\n")..msg
else
msg = NLG.c("你的最高记录"..maxfloor.."关,用时"..SecondTurnTimeStr(maxtime).."。 位于服务器500名外\n")..msg
end
NLG.ShowWindowTalked(player,10,2,9998,msg,npc)
end
elseif tonumber(Data) == 4 then
local cdkey = Char.GetData(player,2002)
local regnum = Char.GetData(player,48)
local start,now,maxfloor,maxtime,point = getherotowerfloor(player)
local query = "SELECT "..TheHeroTowerSqlCdkey..","..TheHeroTowerSqlReg..","..TheHeroTowerSqlPlayerName..","..TheHeroTowerSqlPoint..","..TheHeroTowerSqlFloorMax..","..TheHeroTowerSqlFloorMaxTime.." FROM "..TheHeroTowerSqlName.." ORDER BY "..TheHeroTowerSqlPoint.." DESC , "..TheHeroTowerSqlFloorMax.." DESC"
local resset = SQL.Run(query)
if type(resset) == "table" then
local msg = ""
local playernum = 0
for i = 0,500 do
if resset[i.."_0"] then
if i < 20 then
local tempmsg = string.format("\n第[%-2d]名:%0-16s积分:%8d 最高记录%4d关",i+1,resset[i.."_2"],resset[i.."_3"],resset[i.."_4"])
msg = msg..tempmsg
end
if resset[i.."_0"] == cdkey and tonumber(resset[i.."_1"]) == regnum then
playernum = i+1
end
end
end
if playernum > 0 then
msg = NLG.c("你的积分为"..point.." ,位于服务器第"..playernum.."名\n")..msg
else
msg = NLG.c("你的积分为"..point.." 。 位于服务器500名外\n")..msg
end
NLG.ShowWindowTalked(player,10,2,9999,msg,npc)
end
end
elseif Seqno == 100 then
local start,now,maxfloor,maxtime = getherotowerfloor(player)
if Select == 1 then
if now - start >= TheHeroTowerfloorcheck and now >= TheHeroTowerfloorfrist and now >= TheHeroTowerfloordown then
if 20 - Char.ItemSlot(player) >= TheHeroTowerilvitemnum[now] then
local cdkey = Char.GetData(player,2002)
local regnum = Char.GetData(player,48)
if TheHeroTowerGetInfo[cdkey.."/"..regnum] == nil or os.date("%x") ~= os.date("%x",TheHeroTowerGetInfo[cdkey.."/"..regnum]) then
setherotowerfloor(player,1)
TheHeroTowerGetInfo[cdkey.."/"..regnum] = os.time()
if Char.ItemNum(player,TheHeroToweritemnumplusitem[1]) > 0 then
Char.DelItem(player,TheHeroToweritemnumplusitem[1],1)
for i = 1,TheHeroTowerilvitemnum[now]+1 do
MakeILvItem(player,TheHeroTowerilvrate[now][1],21,now,math.floor(now/100))
end
--Char.GiveItem(player,TheHeroTowerilvrate[now][1],TheHeroTowerilvitemnum[now]+1)
else
for i = 1,TheHeroTowerilvitemnum[now] do
MakeILvItem(player,TheHeroTowerilvrate[now][1],21,now,math.floor(now/100))
end
--Char.GiveItem(player,TheHeroTowerilvrate[now][1],TheHeroTowerilvitemnum[now])
end
NLG.SystemMessage(player,"奖励领取成功!")
else
NLG.SystemMessage(player,"你今天已经领取过奖励了。")
end
else
NLG.SystemMessage(player,"您需要至少有"..TheHeroTowerilvitemnum[now].."个道具栏才能领取大奖。")
end
else
NLG.SystemMessage(player,"您需要至少达到"..TheHeroTowerfloorfrist.."关并且至少完成第"..(start+TheHeroTowerfloorcheck).."关才能领取大奖。")
end
elseif Select == 4 then
if Char.GetPartyMember(player,0) == player then
local partynum = Char.PartyNum(player)
local partyint = {}
local able = true
local errman = nil
local errgold = nil
local errdummy = nil
for i = 1,(partynum - 1) do
partyint[i] = Char.GetPartyMember(player,i)
if DummyFriendDummyIndex[partyint[i]] then
able = false
errdummy = partyint[i]
break
else
if able then
local _,partynow = getherotowerfloor(partyint[i])
if partynow < now then
able = false
errman = partyint[i]
break
end
if Char.ItemSlot(partyint[i]) < 20 then
else
able = false
errslot = partyint[i]
break
end
if TheHeroTowerisallpay ~= 0 then
if Char.GetData(partyint[i],53) < (TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)) then
able = false
errgold = partyint[i]
break
end
end
end
end
end
if Char.GetData(player,53) < (TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)) then
able = false
errgold = player
end
if able then
local floornum = now + TheHeroTowerfloorgrow
local enemyid = {}
local enemylv = {}
local temporder = 1
for i = 1,10 do
if TheHeroTowerenemygroup[floornum][i] > 0 then
local enemyingroup = TheHeroTowerenemygroup[floornum][i]
local enemyrealid = TheHeroTowerenemyidgroup[enemyingroup][math.random(1,#TheHeroTowerenemyidgroup[enemyingroup])]
local enemyreallv = math.floor(TheHeroTowerenemylvprefloor[floornum][enemyingroup]*floornum)
enemyid[temporder] = enemyrealid
enemylv[temporder] = enemyreallv
temporder = temporder + 1
end
end
AddGold(player,-(TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)))
if NLG.Get_Char_Date(player,145) > 0 then
for i = 1,10 do
if enemyid[i] then
NLG.SystemMessage(player,i..": enemyid="..enemyid[i].." lv="..enemylv[i])
end
end
end
local battleindex = NLG.CreateBattle(player,npc,nil,enemyid,enemylv,nil,nil)
if battleindex >= 0 then
TheHeroTowerDamageList[battleindex] = {0.5-floornum*0.01,{10,floornum-50}}
for k,v in pairs(partyint) do
TheHeroTowerBattleInFloor[v] = {battleindex,floornum,os.time()}
if TheHeroTowerisallpay ~= 0 then
AddGold(v,-(TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)))
end
end
TheHeroTowerBattleInFloor[player] = {battleindex,floornum,os.time()}
--local battleevent = Battle.SetWinEvent(nil,"TheHeroTowerWinCallBack",battleindex)
for i = 1,#TheHeroTowerbattlenpc do
NLG.SystemMessageToMap(0,TheHeroTowerbattlenpc[i][2],Char.GetData(player,2000).."和他的朋友们开始挑战"..TheHeroTowerName.."第 "..floornum.." 关。")
end
if floornum >= TheHeroTowerHighFloor[1] then
NLG.SystemMessage(-1,Char.GetData(player,2000).."和他的朋友们开始挑战"..TheHeroTowerName.."第 "..floornum.." 关!")
end
else
for k,v in pairs(partyint) do
NLG.SystemMessage(v,"战斗开启失败,请重试。")
end
end
else
for k,v in pairs(partyint) do
if errman then
NLG.SystemMessage(v,Char.GetData(errman,2000).."的当前关数低于队长。无法开始"..TheHeroTowerName.."第 "..(now+TheHeroTowerfloorgrow).." 关。")
end
if errgold then
NLG.SystemMessage(v,Char.GetData(errgold,2000).."的金币不足"..(TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)).."G。无法开始"..TheHeroTowerName.."第 "..(now+TheHeroTowerfloorgrow).." 关。")
end
if errdummy then
NLG.SystemMessage(v,Char.GetData(errdummy,2000).."是佣兵,不能参与战斗。")
end
if errslot then
NLG.SystemMessage(player,Char.GetData(errslot,2000).."的道具栏已经满了。")
end
end
if errman then
NLG.SystemMessage(player,Char.GetData(errman,2000).."的当前关数低于队长。无法开始"..TheHeroTowerName.."第 "..(now+TheHeroTowerfloorgrow).." 关。")
end
if errgold then
NLG.SystemMessage(player,Char.GetData(errgold,2000).."的金币不足"..(TheHeroTowerpaygold*(now+TheHeroTowerfloorgrow)).."G。无法开始"..TheHeroTowerName.."第 "..(now+TheHeroTowerfloorgrow).." 关。")
end
if errdummy then
NLG.SystemMessage(player,Char.GetData(errdummy,2000).."是佣兵,不能参与战斗。")
end
if errslot then
NLG.SystemMessage(player,Char.GetData(errslot,2000).."的道具栏已经满了。")
end
end
else
NLG.SystemMessage(player,"你不是队长。")
end
end
end
end
end
end
function TheHeroTowerGiveTalkEvent(npc,player)
if NLG.CanTalk(npc,player) then
for i = 0,4 do
local playerindex = Char.GetPartyMember(player,i)
if playerindex >= 0 then
if Char.GetData(playerindex, 51) == 540 then
NLG.DischargeParty(playerindex)
else
if TheHeroTowerBattleInFloor[playerindex] then
local start,now,maxfloor,maxtime,point = getherotowerfloor(playerindex)
local k2 = TheHeroTowerBattleInFloor[playerindex][2]
local k3 = tonumber(TheHeroTowerBattleInFloor[playerindex][3])
local k4 = tonumber(TheHeroTowerBattleInFloor[playerindex][4])
if k2 and k3 and k4 then
if k2 > TheHeroTowerHighFloor[1] or (k2 == TheHeroTowerHighFloor[1] and k4 - k3 < TheHeroTowerHighFloor[2]) then
TheHeroTowerHighFloor[1] = k2
TheHeroTowerHighFloor[2] = k4 - k3
NLG.SystemMessage(-1,Char.GetData(playerindex,2000).."(Lv"..Char.GetData(playerindex,8)..(JobName[Char.GetData(playerindex,51)] or "其他职业")..")".."和他的朋友们刚刚创造了新的服务器记录!")
NLG.SystemMessage(-1,TheHeroTowerName.."第 "..k2.." 关!用时 "..SecondTurnTimeStr(k4 - k3).." !")
end
if k2 > maxfloor or (k2 == maxfloor and k4 - k3 < maxtime) then
setherotowerfloor(playerindex,3,k2)
setherotowerfloor(playerindex,4,(k4 - k3))
NLG.SystemMessage(playerindex,"个人新记录:"..TheHeroTowerName.."第 "..k2.." 关!用时 "..SecondTurnTimeStr(k4 - k3).." !")
end
if k2 > now and k2 <= now + TheHeroTowerfloorgrow then
setherotowerfloor(playerindex,2,k2)
NLG.SystemMessage(playerindex,"保存了当前战绩:第 "..k2.." 关。")
end
local pointplus = TheHeroTowerfragmentitemnum[k2]*k2
setherotowerfloor(playerindex,5,point+pointplus)
NLG.SystemMessage(playerindex,"得到了 "..pointplus.." 点通关积分。")
if k2 > 100 then
Char.GiveItem(playerindex,TheHeroTowerWinGive,k2-50)
end
TheHeroTowerBattleInFloor[playerindex] = nil
Field.NewSet(playerindex,TheHeroTowerFieldHistory,k2)
else
NLG.SystemMessage(playerindex,"您的战斗记录不完整。")
end
else
NLG.SystemMessage(playerindex,"没有您的战斗记录。")
end
end
end
end
--NLG.DischargeParty(player)
local rdm = math.random(1,#TheHeroTowerbattlenpc)
NLG.Warp(player,0,TheHeroTowerbattlenpc[rdm][2],(TheHeroTowerbattlenpc[rdm][3]-2),TheHeroTowerbattlenpc[rdm][4])
end
end
function TheHeroTowerNpcInit(npc)
return true
end
if TheHeroTowerNpc == nil then
TheHeroTowerNpc = NL.CreateNpc(nil,"TheHeroTowerNpcInit")
Char.SetData(TheHeroTowerNpc,1,TheHeroTowerbattlenpc[1][1])
Char.SetData(TheHeroTowerNpc,2,TheHeroTowerbattlenpc[1][1])
Char.SetData(TheHeroTowerNpc,4,TheHeroTowerbattlenpc[1][2])
Char.SetData(TheHeroTowerNpc,5,TheHeroTowerbattlenpc[1][3])
Char.SetData(TheHeroTowerNpc,6,TheHeroTowerbattlenpc[1][4])
Char.SetData(TheHeroTowerNpc,7,TheHeroTowerbattlenpc[1][5])
Char.SetData(TheHeroTowerNpc,2000,TheHeroTowerbattlenpc[1][6])
Char.SetTalkedEvent(nil,"TheHeroTowerBattleTalkEvent",TheHeroTowerNpc)
Char.SetWindowTalkedEvent(nil,"TheHeroTowerBattleWindowEvent",TheHeroTowerNpc)
NLG.UpChar(TheHeroTowerNpc)
TheHeroTowerNpc1 = NL.CreateNpc(nil,"TheHeroTowerNpcInit")
Char.SetData(TheHeroTowerNpc1,1,TheHeroTowergivenpc[1])
Char.SetData(TheHeroTowerNpc1,2,TheHeroTowergivenpc[1])
Char.SetData(TheHeroTowerNpc1,4,TheHeroTowergivenpc[2])
Char.SetData(TheHeroTowerNpc1,5,TheHeroTowergivenpc[3])
Char.SetData(TheHeroTowerNpc1,6,TheHeroTowergivenpc[4])
Char.SetData(TheHeroTowerNpc1,7,TheHeroTowergivenpc[5])
Char.SetData(TheHeroTowerNpc1,2000,TheHeroTowergivenpc[6])
Char.SetTalkedEvent(nil,"TheHeroTowerGiveTalkEvent",TheHeroTowerNpc1)
NLG.UpChar(TheHeroTowerNpc1)
local query = "SELECT "..TheHeroTowerSqlFloorMax..","..TheHeroTowerSqlFloorMaxTime.." FROM "..TheHeroTowerSqlName.." ORDER BY "..TheHeroTowerSqlFloorMax.." DESC , "..TheHeroTowerSqlFloorMaxTime.." ASC"
local resset = SQL.Run(query)
if type(resset) == "table" then
TheHeroTowerHighFloor = {tonumber(resset["0_0"]),tonumber(resset["0_1"])}
else
TheHeroTowerHighFloor = {0,0}
end
end
if TheHeroTowerNpcOther == nil and #TheHeroTowerbattlenpc > 1 then
for i = 2,#TheHeroTowerbattlenpc do
TheHeroTowerNpcOther = NL.CreateNpc(nil,"TheHeroTowerNpcInit")
Char.SetData(TheHeroTowerNpcOther,1,TheHeroTowerbattlenpc[i][1])
Char.SetData(TheHeroTowerNpcOther,2,TheHeroTowerbattlenpc[i][1])
Char.SetData(TheHeroTowerNpcOther,4,TheHeroTowerbattlenpc[i][2])
Char.SetData(TheHeroTowerNpcOther,5,TheHeroTowerbattlenpc[i][3])
Char.SetData(TheHeroTowerNpcOther,6,TheHeroTowerbattlenpc[i][4])
Char.SetData(TheHeroTowerNpcOther,7,TheHeroTowerbattlenpc[i][5])
Char.SetData(TheHeroTowerNpcOther,2000,TheHeroTowerbattlenpc[i][6])
Char.SetTalkedEvent(nil,"TheHeroTowerBattleTalkEvent",TheHeroTowerNpcOther)
Char.SetWindowTalkedEvent(nil,"TheHeroTowerBattleWindowEvent",TheHeroTowerNpcOther)
NLG.UpChar(TheHeroTowerNpcOther)
end
end
function TheHeroTowerBuyItem(player,npc,pos,movenum)
if TheHeroTowerItemChangeNpcInfo[11][pos] then
if movenum < 0 then
movenum = 1
end
if movenum > 20 then
movenum = 20
end
for buy = 1,movenum do
if Char.ItemSlot(player) < 20 then
local start,now,maxfloor,maxtime = getherotowerfloor(player)
if maxfloor >= TheHeroTowerItemChangeNpcInfo[11][pos][1] then
if Char.ItemNum(player,TheHeroTowerItemChangeNpcInfo[11][pos][5]) >= TheHeroTowerItemChangeNpcInfo[11][pos][6] then
Char.DelItem(player,TheHeroTowerItemChangeNpcInfo[11][pos][5],TheHeroTowerItemChangeNpcInfo[11][pos][6])
local ilv = (math.random(TheHeroTowerItemChangeNpcInfo[11][pos][3]*100,100)/100)*maxfloor
--NLG.SystemMessage(player,"ilv="..ilv)
local itemtypelist = {17,18,21}
local itemindex = MakeILvItem(player,TheHeroTowerItemChangeNpcInfo[11][pos][7],itemtypelist[math.random(1,#itemtypelist)],ilv,TheHeroTowerItemChangeNpcInfo[11][pos][4])
if TheHeroTowerItemChangeNpcInfo[11][pos][8] ~= 0 then
Item.SetData(itemindex,52,0)
Item.SetData(itemindex,53,1)
-- Item.SetData(itemindex,%道具_宠邮%,0)
else
Item.SetData(itemindex,52,0)
Item.SetData(itemindex,53,0)
-- Item.SetData(itemindex,%道具_宠邮%,1)
end
else
NLG.SystemMessage(player,"兑换所需的道具不足。持有"..Char.ItemNum(player,TheHeroTowerItemChangeNpcInfo[11][pos][5]).."份,需要"..TheHeroTowerItemChangeNpcInfo[11][pos][6].."份。")
break
end
else
NLG.SystemMessage(player,"你尚未解锁该物品。")
break
end
else
NLG.SystemMessage(player,"你的东西太多了。")
break
end
end
Item.UpItem(player,-1)
end
return true
end
function TheHeroTowerMoveItem(player,npc,startpos,topos,movenum)
--NLG.SystemMessage(player,"startpos="..startpos.." topos="..topos.." movenum="..movenum)
if startpos >= 0 and startpos <= 27 then
NLG.SystemMessage(player,"本窗口只能拖拽道具至道具栏,不接受贩卖。")
elseif startpos >= 100 and startpos <= 139 then
if topos >= 0 and topos <= 27 then
if Char.ItemSlot(player) < 40 then
TheHeroTowerBuyItem(player,npc,startpos-99,movenum)
return true
else
NLG.SystemMessage(player,"你的东西太多了。")
return false
end
elseif topos >= 100 and topos <= 139 then
NLG.SystemMessage(player,"本窗口只能拖拽道具至道具栏,不接受位置变更。")
return false
end
end
return false
end
function TheHeroTowerLoadItem(player,npc)
local intreturn = {}
if TheHeroTowerItemChangeNpcInfo then
for i = 1,20 do
if TheHeroTowerItemChangeNpcInfo[11][i] then
--local start,now,maxfloor,maxtime = getherotowerfloor(player)
--if maxfloor >= TheHeroTowerItemChangeNpcInfo[11][i][1] then
intreturn[i+99] = {}
intreturn[i+99][1] = Item.GetData(Get_Itemindex(player,TheHeroTowerItemChangeNpcInfo[11][i][7]),1)
intreturn[i+99][2] = TheHeroTowerItemChangeNpcInfo[11][i][1]
intreturn[i+99][3] = Item.GetData(Get_Itemindex(player,TheHeroTowerItemChangeNpcInfo[11][i][7]),2001)
-- intreturn[i+99][4] = "①:兑换需要"..TheHeroTowerItemChangeNpcInfo[11][i][6].."份"..Item.GetData(Get_Itemindex(player,TheHeroTowerItemChangeNpcInfo[11][i][5]),2001).."\n②:道具堆叠数为解锁兑换需要达到的层数\n③:点击选取本物品拖动到个人物品栏,输入想要的件数进行兑换\n"..TheHeroTowerItemChangeNpcInfo[11][i][2]
intreturn[i+99][4] = "①:兑换需要"..TheHeroTowerItemChangeNpcInfo[11][i][6].."份"..Item.GetData(Get_Itemindex(player,TheHeroTowerItemChangeNpcInfo[11][i][5]),2001).."\n②:道具堆叠数为解锁兑换需要达到的层数\n③:点击选取本物品拖动到个人物品栏,输入想要的件数进行兑换\n"..TheHeroTowerItemChangeNpcInfo[11][i][2]
--end
end
end
end
return intreturn
end
function TheHeroTowerItemChangeNpcInit(npc)
return true
end
function TheHeroTowerItemChangeNpcTalkEventCallBack(npc,player)
if NLG.CanTalk(npc,player) then
local BDBankTempInt = TheHeroTowerLoadItem(player,npc)
local msg = "A|"
for i = 100,119 do
--id,num,metamo,name
if BDBankTempInt[i] then
msg = msg..BDBankTempInt[i][1].."|"..BDBankTempInt[i][2].."|0|"..BDBankTempInt[i][3].."||"..BDBankTempInt[i][4].."|"
else
msg = msg.."||||||"
end
end
msg = msg.."|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||0"
NLG.ShowWindowTalked(player,23,0,100,msg,npc)
end
end
function TheHeroTowerItemChangeNpcWindowEventCallBack(npc,player,Seqno,Select,Data)
if Select ~= 2 then
if Seqno == 100 then
if string.len(Data) >= 7 and string.sub(Data,1,2) == "I|" then
local inttemp = splitplus(Data,"|")
local mbdbreturn = TheHeroTowerMoveItem(player,npc,tonumber(inttemp[2]),tonumber(inttemp[3]),tonumber(inttemp[4]))
if mbdbreturn then
local BDBankTempInt = TheHeroTowerLoadItem(player,npc)
local msg = "A|"
for i = 100,119 do
--id,num,metamo,name
if BDBankTempInt[i] then
msg = msg..BDBankTempInt[i][1].."|"..BDBankTempInt[i][2].."|0|"..BDBankTempInt[i][3].."||"..BDBankTempInt[i][4].."|"
else
msg = msg.."||||||"
end
end
msg = msg.."|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||0"
NLG.ShowWindowTalked(player,23,0,100,msg,npc)
end
end
end
end
end
if TheHeroTowerItemChangeNpcIndex == nil then
TheHeroTowerItemChangeNpcIndex = NL.CreateNpc(nil,"TheHeroTowerItemChangeNpcInit")
Char.SetData(TheHeroTowerItemChangeNpcIndex,1,TheHeroTowerItemChangeNpcInfo[1])
Char.SetData(TheHeroTowerItemChangeNpcIndex,2,TheHeroTowerItemChangeNpcInfo[1])
Char.SetData(TheHeroTowerItemChangeNpcIndex,4,TheHeroTowerItemChangeNpcInfo[4])
Char.SetData(TheHeroTowerItemChangeNpcIndex,5,TheHeroTowerItemChangeNpcInfo[5])
Char.SetData(TheHeroTowerItemChangeNpcIndex,6,TheHeroTowerItemChangeNpcInfo[6])
Char.SetData(TheHeroTowerItemChangeNpcIndex,7,TheHeroTowerItemChangeNpcInfo[3])
Char.SetData(TheHeroTowerItemChangeNpcIndex,2000,TheHeroTowerItemChangeNpcInfo[2])
Char.SetTalkedEvent(nil,"TheHeroTowerItemChangeNpcTalkEventCallBack",TheHeroTowerItemChangeNpcIndex)
Char.SetWindowTalkedEvent(nil,"TheHeroTowerItemChangeNpcWindowEventCallBack",TheHeroTowerItemChangeNpcIndex)
if TheHeroTowerItemChangeNpcInfo[7] == 1 then
Char.SetData(TheHeroTowerItemChangeNpcIndex,8,TheHeroTowerItemChangeNpcInfo[8])
Char.SetData(TheHeroTowerItemChangeNpcIndex,44,TheHeroTowerItemChangeNpcInfo[9])
Char.SetData(TheHeroTowerItemChangeNpcIndex,2001,TheHeroTowerItemChangeNpcInfo[10])
-- NLG.SetShowName(TheHeroTowerItemChangeNpcIndex,TheHeroTowerItemChangeNpcInfo[7])
end
NLG.UpChar(TheHeroTowerItemChangeNpcIndex)
end
function MakeILvItem(player,itemid,itype,ilv,iplusnum,bfpsd) --return 1 成功 -1 失败
if Char.ItemSlot(player) < 40 then
local itemindex = Char.GiveItem(player,itemid,1)
if itemindex >= 0 then
if itype >= 0 then
Item.SetData(itemindex,3,itype)
end
local itemname = ""
local statelist = {}
local itemtype = Item.GetData(itemindex,3)
local itembasetype = ItemBaseTypeList[itemtype]
local itemlv = ilv
local itemplusnum = iplusnum
local itemplusstr = 0
local bfable = 0
if BattleFireExLv > 0 then
for i = 1,MaxBattleFireNum do
local rdm = math.random(1,1000)
if rdm > 1000 - (bfpsd or BattleFirePsd) then
itemlv = ilv + BattleFireExLv
itemplusnum = itemplusnum + BattleFirePlus
itemname = BattleFireName
bfable = bfable + 1
else
break
end
end
end
statelist[18] = BaseType[itembasetype][1]*itemlv
--statelist[19] = BaseType[itembasetype][2]*itemlv
statelist[27] = BaseType[itembasetype][3]*itemlv
if itemplusnum >= 1 then
for i = 1,itemplusnum do
local iplustype = math.random(1,#PlusList)
if type(PlusList[iplustype]) == "table" then
if statelist[PlusList[iplustype][1]] == nil then
statelist[PlusList[iplustype][1]] = PlusType[itembasetype][PlusList[iplustype][3]]*itemlv
else
statelist[PlusList[iplustype][1]] = statelist[PlusList[iplustype][1]] + PlusType[itembasetype][PlusList[iplustype][3]]*itemlv
end
itemname = itemname..PlusList[iplustype][2]
itemplusstr = itemplusstr + iplustype*(32^(i-1))
end
end
end
if string.len(itemname) > 10 then
if bfable > 0 then
itemname = BattleFireName..TooLongName
else
itemname = TooLongName
end
end
Item.SetData(itemindex,2001,itemname..ItemTypeName[Item.GetData(itemindex,3)])
for k,v in pairs(statelist) do
Item.SetData(itemindex,k,Item.GetData(itemindex,k)+math.floor(v))
end
if ItemTypeMetamo[itemtype] then
local rdm = math.random(1,#ItemTypeMetamo[itemtype])
Item.SetData(itemindex,1,ItemTypeMetamo[itemtype][rdm])
end
if ilvrecourd > 0 then
Item.SetData(itemindex,ilvrecourd,itemlv) --ilv记录
end
if iplusrecourd > 0 then
Item.SetData(itemindex,iplusrecourd,itemplusstr) --iplus记录
end
Item.UpItem(player,-1)
return itemindex
else
return -1
end
else
return -1
end
end
|
|