300 lines
8.2 KiB
Plaintext
Executable File
300 lines
8.2 KiB
Plaintext
Executable File
--lua script
|
|
|
|
--#include "data\config\combat\combatConfig.txt" once
|
|
--#include "data\config\combat\combatRank.txt" once --基本设置
|
|
|
|
function CombatRankInit()
|
|
local config = CombatRankConfig
|
|
for _, value in ipairs(config.RankInfo) do
|
|
Rank.Init(value.RankName, value.RankFile, config.RankColumn, config.MaxRankNum, 0)
|
|
|
|
local ranking = Ranking.getRanking(value.RankName)
|
|
if not ranking then
|
|
return
|
|
end
|
|
|
|
local nCount = Ranking.getRankItemCount(ranking)
|
|
if nCount == 0 then
|
|
for _, v in ipairs(value.RankDefaultItem) do
|
|
local item = Ranking.addItem(ranking, v[1], v[2], false)
|
|
if item then
|
|
for i = 1, #config.RankColumn do
|
|
Ranking.setSub(item, i-1, tostring(v[i+2]))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function CombatRankFinal()
|
|
local config = CombatRankConfig
|
|
for _, value in ipairs(config.RankInfo) do
|
|
local ranking = Ranking.getRanking(value.RankName)
|
|
if ranking then
|
|
Ranking.save(ranking, value.RankFile, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
table.insert(InitFnTable, CombatRankInit)
|
|
table.insert(FinaFnTable, CombatRankFinal)
|
|
|
|
--职业宗师pk流程
|
|
function CombatPkCommon(sysarg, nActorId)
|
|
local config = CombatConfig
|
|
local mJop = Actor.getIntProperty(sysarg, PROP_ACTOR_VOCATION)
|
|
local skills = config.skills[mJop]
|
|
if not skills then
|
|
return
|
|
end
|
|
local RankInfo = CombatRankConfig.RankInfo[mJop]
|
|
if not RankInfo then
|
|
return
|
|
end
|
|
|
|
local ranking = Ranking.getRanking(RankInfo.RankName)
|
|
if not ranking then return end
|
|
|
|
-- 对方的排名项
|
|
local tItem = Ranking.getItemPtrFromId(ranking,nActorId)
|
|
if not tItem then
|
|
return
|
|
end
|
|
|
|
local myId = Actor.getIntProperty(sysarg,PROP_ENTITY_ID)
|
|
--local myItem = Ranking.getItemPtrFromId(ranking,myId)
|
|
local mRanking = Ranking.getItemIndexFromId(ranking, myId) + 1
|
|
local tRanking = Ranking.getItemIndexFromId(ranking, nActorId) + 1
|
|
local Awards
|
|
local Swap = 0
|
|
|
|
local Me = {
|
|
num = 0,
|
|
sex = Actor.getIntProperty(sysarg, PROP_ACTOR_SEX),
|
|
name = Actor.getName(sysarg),
|
|
level = Actor.getIntProperty(sysarg, PROP_CREATURE_LEVEL),
|
|
icon = Actor.getIntProperty(sysarg, PROP_ENTITY_ICON),
|
|
model = Actor.getIntProperty(sysarg, PROP_ENTITY_MODELID),
|
|
weapon = Actor.getIntProperty(sysarg, PROP_ACTOR_WEAPONAPPEARANCE),
|
|
swing = Actor.getIntProperty(sysarg, PROP_ACTOR_SWINGAPPEARANCE),
|
|
hp = Actor.getIntProperty(sysarg, PROP_CREATURE_MAXHP),
|
|
attack = Actor.getMaxAttack(sysarg),
|
|
defence = Actor.getMaxDefence(sysarg),
|
|
hit = Actor.getIntProperty(sysarg, PROP_CREATURE_HITVALUE),
|
|
crit = Actor.getIntProperty(sysarg, PROP_ACTOR_CRIT_RATE),
|
|
dodge = Actor.getIntProperty(sysarg, PROP_CREATURE_DODVALUE),
|
|
battlePower = Actor.getIntProperty(sysarg, PROP_ACTOR_BATTLE_POWER),
|
|
isreal = 1,
|
|
}
|
|
Me.curHp = Me.hp
|
|
local Target = {
|
|
num = 1,
|
|
sex = tonumber(Ranking.getSub(tItem, 3)),
|
|
name = Ranking.getSub(tItem, 0),
|
|
level = tonumber(Ranking.getSub(tItem, 2)),
|
|
icon = tonumber(Ranking.getSub(tItem, 4)),
|
|
model = tonumber(Ranking.getSub(tItem, 5)),
|
|
weapon = tonumber(Ranking.getSub(tItem, 6)),
|
|
swing = tonumber(Ranking.getSub(tItem, 7)),
|
|
hp = tonumber(Ranking.getSub(tItem, 8)),
|
|
attack = tonumber(Ranking.getSub(tItem, 9)),
|
|
defence = tonumber(Ranking.getSub(tItem, 10)),
|
|
hit = tonumber(Ranking.getSub(tItem, 11)),
|
|
crit = tonumber(Ranking.getSub(tItem, 12)),
|
|
dodge = tonumber(Ranking.getSub(tItem, 13)) or 0,
|
|
isreal = tonumber(Ranking.getSub(tItem, 14)) or 0,
|
|
battlePower = tonumber(Ranking.getPoint(tItem)),
|
|
}
|
|
Target.curHp = Target.hp
|
|
|
|
local actions = {}
|
|
local OneHit = function(attacker, defencer, order)
|
|
|
|
local action = {
|
|
num = attacker.num,
|
|
skill = skills[order],
|
|
hp = 0,
|
|
isHit = 0,
|
|
isCrit = 0,
|
|
isDead = 0,
|
|
}
|
|
|
|
-- 1 是否命中
|
|
if attacker.hit > defencer.dodge then
|
|
action.isHit = 1
|
|
elseif attacker.hit >= math.random(defencer.dodge) then
|
|
action.isHit = 1
|
|
else
|
|
action.isHit = 0
|
|
end
|
|
|
|
if action.isHit == 0 then
|
|
action.hp = defencer.curHp
|
|
actions[#actions + 1] = action
|
|
return false
|
|
end
|
|
|
|
-- 2 计算伤害
|
|
local attackMin = math.floor(attacker.attack * 325 / 100)
|
|
local attackMax = math.floor(attacker.attack * 375 / 100)
|
|
local attackValue = math.random(attackMin, attackMax)
|
|
local damage = attackValue - defencer.defence
|
|
if damage < 0 then
|
|
damage = 0
|
|
end
|
|
|
|
-- 3 是否暴击
|
|
if attacker.crit >= math.random(10000) then
|
|
action.isCrit = 1
|
|
damage = math.floor(damage + damage * 20 / 100)
|
|
end
|
|
|
|
defencer.curHp = defencer.curHp - damage
|
|
action.hp = defencer.curHp
|
|
-- 记录战斗
|
|
if defencer.curHp <= 0 then
|
|
action.isDead = 1
|
|
actions[#actions + 1] = action
|
|
return true
|
|
else
|
|
actions[#actions + 1] = action
|
|
return false
|
|
end
|
|
end
|
|
|
|
local winNum = 0
|
|
local order = 0
|
|
local skillCount = #skills
|
|
while(1) do
|
|
local result = OneHit(Me, Target, order + 1)
|
|
if result then
|
|
winNum = Me.num
|
|
break
|
|
end
|
|
|
|
result = OneHit(Target, Me, order + 1)
|
|
if result then
|
|
winNum = Target.num
|
|
break
|
|
end
|
|
order = (order + 1) % skillCount
|
|
end
|
|
|
|
-- 发送协议和奖励处理
|
|
local pack = DataPack.allocPacket(sysarg, 57, 3)
|
|
if (pack) then
|
|
-- 基本信息
|
|
DataPack.writeByte(pack,2)
|
|
for i =1,2 do
|
|
if i == 1 then -- 自己
|
|
DataPack.writeByte(pack, Me.num)
|
|
DataPack.writeByte(pack, Me.sex)
|
|
DataPack.writeString(pack, Me.name)
|
|
DataPack.writeInt(pack, Me.level)
|
|
DataPack.writeInt(pack, Me.icon)
|
|
DataPack.writeInt(pack, Me.model)
|
|
DataPack.writeInt(pack, Me.weapon)
|
|
DataPack.writeInt(pack, Me.swing)
|
|
DataPack.writeInt(pack, Me.hp)
|
|
DataPack.writeInt(pack, Me.battlePower)
|
|
|
|
elseif i == 2 then -- 对方
|
|
DataPack.writeByte(pack, Target.num)
|
|
DataPack.writeByte(pack, Target.sex)
|
|
DataPack.writeString(pack, Target.name)
|
|
DataPack.writeInt(pack, Target.level)
|
|
DataPack.writeInt(pack, Target.icon)
|
|
DataPack.writeInt(pack, Target.model)
|
|
DataPack.writeInt(pack, Target.weapon)
|
|
DataPack.writeInt(pack, Target.swing)
|
|
DataPack.writeInt(pack, Target.hp)
|
|
DataPack.writeInt(pack, Target.battlePower)
|
|
end
|
|
end
|
|
|
|
-- 动作序列
|
|
DataPack.writeInt(pack, #actions) -- 动作数量
|
|
for _, v in ipairs(actions) do
|
|
DataPack.writeByte(pack, v.num)
|
|
DataPack.writeInt(pack, v.skill)
|
|
DataPack.writeInt(pack, v.hp)
|
|
DataPack.writeByte(pack, v.isCrit)
|
|
DataPack.writeByte(pack, v.isDead)
|
|
end
|
|
|
|
--战胜
|
|
if winNum == 0 then
|
|
if mRanking > tRanking or mRanking <= 0 then
|
|
Swap = tRanking
|
|
end
|
|
|
|
Awards= config.combatResultAward[1]
|
|
--失败
|
|
else
|
|
Awards = config.combatResultAward[2]
|
|
end
|
|
|
|
-- 胜出方
|
|
DataPack.writeByte(pack, winNum)
|
|
DataPack.writeInt(pack, Swap)
|
|
|
|
--奖励的消息
|
|
DataPack.writeInt(pack, #Awards)
|
|
for _, v in ipairs(Awards) do
|
|
DataPack.writeInt(pack, v.type)
|
|
DataPack.writeInt(pack, v.count)
|
|
end
|
|
DataPack.flush(pack)
|
|
end
|
|
|
|
GiveCommonAward(sysarg, Awards, 311, "CombatChallengeAward")
|
|
if winNum == 0 then --胜利
|
|
if mRanking > tRanking or mRanking <= 0 then
|
|
Actor.swapCombatRank(sysarg, myId, nActorId)
|
|
if tRanking > 0 and tRanking < 11 then
|
|
str = string.format(OldLang.Script.CombatRank001, tRanking, Target.name, Me.name)
|
|
System.broadcastTipmsgLimitLev(str, ttScreenCenter + ttChatWindow, CombatRankConfig.LevLimit)
|
|
end
|
|
Actor.ChallegeOverOp(sysarg, 2, nActorId, Target.name, Target.isreal)
|
|
else
|
|
Actor.ChallegeOverOp(sysarg, 1, nActorId, Target.name, Target.isreal)
|
|
end
|
|
else
|
|
Actor.ChallegeOverOp(sysarg, -1, nActorId, Target.name, Target.isreal)
|
|
end
|
|
end
|
|
|
|
--职业宗师定时排名奖励发放
|
|
function CombatRankAwardTimeing()
|
|
local config = CombatConfig
|
|
local title = OldLang.Script.CombatRank003
|
|
|
|
for _, value in ipairs(CombatRankConfig.RankInfo) do
|
|
local ranking = Ranking.getRanking(value.RankName)
|
|
if not ranking then
|
|
return
|
|
end
|
|
|
|
local nCount = Ranking.getRankItemCount(ranking)
|
|
for idx=1, nCount do
|
|
for _, v in ipairs(config.combatRankAward) do
|
|
if idx >= v.rankRange[1] and idx <= v.rankRange[2] then
|
|
local rankItem = Ranking.getItemFromIndex(ranking, idx-1)
|
|
if rankItem then
|
|
isreal = tonumber(Ranking.getSub(rankItem, 14)) or 0
|
|
if isreal > 0 then
|
|
local actorId = Ranking.getId(rankItem)
|
|
local content = string.format(OldLang.Script.CombatRank004, idx)
|
|
SendMail(actorId, title, content, v.awards)
|
|
end
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|