This commit is contained in:
aixianling
2024-12-13 13:41:02 +08:00
commit 06658f112f
3887 changed files with 2687822 additions and 0 deletions

View File

@@ -0,0 +1,299 @@
--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