bayuMIR/Mirserver/Mir200/Envir/Market_Def/QFunction-0.lua
2026-06-24 21:00:14 +08:00

383 lines
15 KiB
Lua

-- QF入口文件 当m2启动时候就会加载
math.randomseed(tostring(os.time()):reverse():sub(1, 7))
local _, errinfo = pcall(function()
require("Envir/3rd/log/Logger")
require("Envir/Extension/LuaLibrary/string")
require("Envir/Extension/LuaLibrary/table")
-- 三方库
json = cjson
-- 扩展
require("Envir/QuestDiary/util/GameEvent")
require("Envir/QuestDiary/config/EventCfg")
require("Envir/Extension/Function/Function")
require("Envir/Extension/Utilserver/Bag")
require("Envir/Extension/Utilserver/Player")
require("Envir/Extension/Utilserver/Item")
require("Envir/Extension/Utilserver/Npc")
require("Envir/Extension/Utilserver/Mon")
require("Envir/Extension/Utilserver/Date")
require("Envir/Extension/Utilserver/Sys")
require("Envir/Extension/Utilserver/Map")
RebotOBJ = {}
RebotOBJ.timeExCfg = {}
RebotOBJ.Scheduled = {}
-- 配置
require("Envir/QuestDiary/config/VarCfg")
require("Envir/QuestDiary/config/ConstCfg")
ssrAttscore = require("Envir/QuestDiary/game_config/cfg_att_score")
-- 网络
ssrNetMsgCfg = require("Envir/QuestDiary/net/NetMsgCfg")
require("Envir/QuestDiary/net/Message")
-- 通用模块
require("Envir/QuestDiary/util/util")
require("Envir/QuestDiary/util/提升基类")
Message.dispatch_handler["GmBoxOBJ"] = require("Envir/QuestDiary/util/GM操作台")
Message.dispatch_handler["NPCGotoMapOBJ"] = require("Envir/QuestDiary/util/挂机地图传送")
Message.dispatch_handler["AutoXunHangOBJ"] = require("Envir/QuestDiary/util/自动巡航下图")
-- 初始化游戏内容所有文件
for i, v in ipairs(GetFileList(string.format("QuestDiary/%s", "系统类")) or {}) do
local file = string.format("Envir/QuestDiary/%s/%s", "系统类", Func.splitString(v, ".")[1])
require(file)
end
for i, v in ipairs(GetFileList(string.format("QuestDiary/%s", "游戏功能")) or {}) do
local path = string.format("QuestDiary/%s/%s", "游戏功能", v)
for _, file in ipairs(GetFileList(path) or {}) do
local file_str = string.format("Envir/%s/%s", path, Func.splitString(file, ".")[1])
local ssr = require(file_str)
Message.dispatch_handler[ssr._name] = ssr
end
end
require("Envir/QuestDiary/util/系统任务")
end)
if errinfo then
release_print("初始化QFunction-0", errinfo)
end
-- 引擎启动
---@diagnostic disable-next-line: lowercase-global
function startup()
GameEvent.push(EventCfg.onStartUp)
end
---* 重载QF后触发
---@diagnostic disable-next-line: lowercase-global
function qfloadend(sys)
local player_list = getplayerlst(1)
for _, actor in ipairs(player_list) do
GameEvent.push(EventCfg.onqfloadend, actor)
end
end
-- 登录
function login(actor)
---*新人登陆
GameEvent.push(EventCfg.onNewHuman, actor)
GameEvent.push(EventCfg.onLogin, actor)
---* 登陆结束触发
GameEvent.push(EventCfg.onLoginEnd, actor)
end
---* 寻找路径起点函数
function findpathbegin(actor)
local _map = getbaseinfo(actor, ConstCfg.gbase.mapid)
local _x = getconst(actor, "<$ToPointX>")
local _y = getconst(actor, "<$ToPointY>")
local GMLevel = getgmlevel(actor) or 0
if GMLevel >= 10 then
MapCfg.gotomap(actor, _map, _x, _y)
else
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
if string.find(buffData, "上天入地", 1, true) ~= nil then
local _cd = Player.getint(actor, VarCfg.Player.int["寻路传送"]) or 0
if os.time() >= _cd then
Player.setint(actor, VarCfg.Player.int["寻路传送"], os.time() + 10)
MapCfg.gotomap(actor, _map, _x, _y)
end
else
Func.sendmsg9(actor, "暂未拥有传送权限,请修炼[九秘-上天入地]!")
end
end
end
---* 充值触发
function recharge(actor, gold, productId, moneyId, isReal, orderTime, rechargeAmount, giftAmount, refundAmount)
GameEvent.push(EventCfg.onRecharge, actor, gold, productId, moneyId, isReal, orderTime, rechargeAmount, giftAmount,
refundAmount)
end
--- 人物攻击前触发
--- * @param actor 玩家对象
--- * @param target 被攻击目标
--- * @param hitter 攻击者
--- * @param magicId 技能ID
--- * @param damage 伤害值
--- * @param model 攻击模型
function attackdamage(actor, target, hitter, magicId, damage, model)
local Info = {}
Info.isplayer = isplayer(target) -- 受击对象是否为人物
Info.timer = os.time() -- 攻击时间戳
Info.self_HP = getbaseinfo(actor, ConstCfg.gbase.curhp) -- 玩家对象当前血量
Info.self_MAXHP = getbaseinfo(actor, ConstCfg.gbase.maxhp) -- 玩家对象最大血量
Info.self_curhp_per = math.floor(Info.self_HP / Info.self_MAXHP * 100) -- 玩家对象当前血量百分比
Info.self_id = getbaseinfo(actor, ConstCfg.gbase.id) -- 玩家对象角色id
Info.self_map = getbaseinfo(actor, ConstCfg.gbase.mapid) -- 玩家对象角色地图id
Info.self_x = getbaseinfo(actor, ConstCfg.gbase.x) -- 玩家对象角色x坐标
Info.self_y = getbaseinfo(actor, ConstCfg.gbase.y) -- 玩家对象角色y坐标
Info.self_level = getbaseinfo(actor, ConstCfg.gbase.level) -- 玩家对象角色等级
Info.target_Name = getbaseinfo(target, ConstCfg.gbase.name) -- 受击对象名字
Info.target_HP = getbaseinfo(target, ConstCfg.gbase.curhp) -- 受击对象当前血量
Info.target_MAXHP = getbaseinfo(target, ConstCfg.gbase.maxhp) -- 受击对象最大血量
Info.target_curhp_per = math.floor(Info.target_HP / Info.target_MAXHP * 100) -- 受击对象当前血量百分比
Info.target_id = getbaseinfo(target, ConstCfg.gbase.id) -- 受击对象角色id
Info.target_level = getbaseinfo(target, ConstCfg.gbase.level) -- 受击对象角色等级
Info._damage = damage -- 本次攻击造成的伤害值
GameEvent.push(EventCfg.onAttackdamage, actor, target, hitter, magicId, damage, model, Info)
if Info.isplayer then
GameEvent.push(EventCfg.onAttackHumandamage, actor, target, hitter, magicId, damage, model, Info)
else
Info.target_Name = getbaseinfo(target, ConstCfg.gbase.name, 1)
GameEvent.push(EventCfg.onAttackMondamage, actor, target, hitter, magicId, damage, model, Info)
end
if Info._damage < 0 then
Info._damage = 0
end
return Info._damage
end
---* 玩家受击前触发
---* @param actor 玩家对象
---* @param hitter 攻击对象
---* @param target 受击对象
---* @param magicId 技能ID
---* @param damage 伤害值
---@param actor any
---@param hitter any
---@param target any
---@param magicId any
---@param damage any
function struckdamage(actor, hitter, target, magicId, damage)
-- printusetime(actor, 1)
local Info = {}
Info.isplayer = isplayer(hitter) -- 受击对象是否为人物
Info.timer = os.time() -- 攻击时间戳
Info.self_HP = getbaseinfo(actor, ConstCfg.gbase.curhp) -- 玩家对象当前血量
Info.self_MAXHP = getbaseinfo(actor, ConstCfg.gbase.maxhp) -- 玩家对象最大血量
Info.self_curhp_per = math.floor(Info.self_HP / Info.self_MAXHP * 100) -- 玩家对象当前血量百分比
Info.self_id = getbaseinfo(actor, ConstCfg.gbase.id) -- 玩家对象角色id
Info.self_map = getbaseinfo(actor, ConstCfg.gbase.mapid) -- 玩家对象角色地图id
Info.self_x = getbaseinfo(actor, ConstCfg.gbase.x) -- 玩家对象角色x坐标
Info.self_y = getbaseinfo(actor, ConstCfg.gbase.y) -- 玩家对象角色y坐标
Info.self_level = getbaseinfo(actor, ConstCfg.gbase.level) -- 玩家对象角色等级
Info.hitter_Name = getbaseinfo(hitter, ConstCfg.gbase.name) -- 受击对象名字
Info.hitter_HP = getbaseinfo(hitter, ConstCfg.gbase.curhp) -- 受击对象当前血量
Info.hitter_MAXHP = getbaseinfo(hitter, ConstCfg.gbase.maxhp) -- 受击对象最大血量
Info.hitter_curhp_per = math.floor(Info.hitter_HP / Info.hitter_MAXHP * 100) -- 受击对象当前血量百分比
Info.hitter_id = getbaseinfo(hitter, ConstCfg.gbase.id) -- 受击对象角色id
Info.hitter_level = getbaseinfo(hitter, ConstCfg.gbase.level) -- 受击对象角色等级
Info.damage = damage -- 本次攻击造成的伤害值
Info.Buff = true -- 受益BUFF,为true,增益buff生效,否则禁止
Info.DeBuff = true -- 减益BUFF,为true,免疫buff,否则生效
GameEvent.push(EventCfg.onstruckdamage, actor, hitter, target, magicId, damage, Info)
if Info.isplayer then
GameEvent.push(EventCfg.onstruckdamageHuman, actor, hitter, target, magicId, damage, Info)
else
GameEvent.push(EventCfg.onstruckdamageMon, actor, hitter, target, magicId, damage, Info)
end
-- printusetime(actor, 2)
return Info.damage
end
---* 攻击后触发
---* 玩家对象
---* 受击对象
---* 攻击对象
---* 技能id
---@param actor any
---@param target any
---@param hitter any
---@param magicId any
---@diagnostic disable-next-line: lowercase-global
function attack(actor, target, hitter, magicId)
-- printusetime(actor, 1)
local Info = {}
Info.isplayer = isplayer(target) -- 受击对象是否为人物
Info.timer = os.time() -- 攻击时间戳
Info.self_HP = getbaseinfo(actor, ConstCfg.gbase.curhp) -- 玩家对象当前血量
Info.self_MAXHP = getbaseinfo(actor, ConstCfg.gbase.maxhp) -- 玩家对象最大血量
Info.self_curhp_per = math.floor(Info.self_HP / Info.self_MAXHP * 100) -- 玩家对象当前血量百分比
Info.self_id = getbaseinfo(actor, ConstCfg.gbase.id) -- 玩家对象角色id
Info.self_map = getbaseinfo(actor, ConstCfg.gbase.mapid) -- 玩家对象角色地图id
Info.self_x = getbaseinfo(actor, ConstCfg.gbase.x) -- 玩家对象角色x坐标
Info.self_y = getbaseinfo(actor, ConstCfg.gbase.y) -- 玩家对象角色y坐标
Info.self_level = getbaseinfo(actor, ConstCfg.gbase.level) -- 玩家对象角色等级
Info.target_Name = getbaseinfo(target, ConstCfg.gbase.name) -- 受击对象名字
Info.target_HP = getbaseinfo(target, ConstCfg.gbase.curhp) -- 受击对象当前血量
Info.target_MAXHP = getbaseinfo(target, ConstCfg.gbase.maxhp) -- 受击对象最大血量
Info.target_curhp_per = math.floor(Info.target_HP / Info.target_MAXHP * 100) -- 受击对象当前血量百分比
Info.target_id = getbaseinfo(target, ConstCfg.gbase.id) -- 受击对象角色id
Info.target_level = getbaseinfo(target, ConstCfg.gbase.level) -- 受击对象角色等级
Info._damage = getconst(actor, "<$DAMAGEVALUE>") -- 本次攻击造成的伤害值
Info.Buff = true -- 受益BUFF,为true,增益buff生效,否则禁止
Info.DeBuff = true -- 减益BUFF,为true,免疫buff,否则生效
GameEvent.push(EventCfg.onAttack, actor, target, hitter, magicId, Info)
if Info.isplayer then
GameEvent.push(EventCfg.onAttackPlay, actor, target, hitter, magicId, Info)
else
GameEvent.push(EventCfg.onAttackMon, actor, target, hitter, magicId, Info)
end
-- printusetime(actor, 2)
end
---* 受击后触发
---* 玩家对象
---* 攻击对象
---* 受击对象
---* 技能id
function struck(actor, hitter, target, magicId)
local Info = {}
Info.isplayer = isplayer(hitter)
GameEvent.push(EventCfg.onStruckOut, actor, hitter, target, magicId, Info)
if Info.isplayer then
GameEvent.push(EventCfg.onStruckHumanOut, actor, hitter, target, magicId, Info)
else
GameEvent.push(EventCfg.onStruckMonOut, actor, hitter, target, magicId, Info)
end
end
---* 暴击触发
---* actor 玩家对象
---* attack 受击对象
---* damage 暴击后伤害值
---* magicId 技能id
function crittrigger(actor, attack, damage, magicId)
local _attr = getbaseinfo(actor, ConstCfg.gbase.custom_attr, 213) or 0
local Info = {}
Info.damage = damage + _attr
Info.timer = os.time()
GameEvent.push(EventCfg.onArittrigger, actor, attack, damage, magicId, Info)
return Info.damage
end
-- * 宝宝物理攻击后
function attackpet(actor, target, hitter, magicId)
if Player.getname(hitter) == "骷髅" then
makeposion(target, 0, 2, 3, 1)
end
end
---* 杀怪触发
function killmon(actor, mon, itype, kill, monName, mapID)
GameEvent.push(EventCfg.onKillMon, actor, mon, itype, kill, monName, mapID)
---* 鞭尸
local _att = getbaseinfo(actor, ConstCfg.gbase.custom_attr, 201) or 0
local _dan = Player.getint(actor, VarCfg.Player.int["鞭尸丹"]) or 0
if _dan > 0 then
monitems(actor, 1)
Player.setint(actor, VarCfg.Player.int["鞭尸丹"], _dan - 1)
Func.sendmsg(actor, string.format("[鞭尸丹]:#70|触发成功!使怪物再爆一次,剩余叠加次数:%d次.", _dan - 1))
else
if Func.random(_att) then
monitems(actor, 1)
Func.sendmsg(actor, "[鞭尸]:#70|触发成功!使怪物再爆一次.")
end
end
end
function addbagbefore(actor, itemMakeIndex, itemIndex)
---* 未开通月卡绑定; 王者特权不再附带掉落不绑定
local yueKaExpireTime = Player.getTLint(actor, VarCfg.Player.TL.int["月卡"]) or 0
if yueKaExpireTime <= os.time() then
Item.Setstate(actor, itemMakeIndex)
end
end
function addbag(actor, itemMakeIndex, itemIndex)
local Info = {}
Info.player = Player.getname(actor)
Info.name = getiteminfo(actor, itemMakeIndex, ConstCfg.iteminfo.name)
GameEvent.push(EventCfg.onAddBag, actor, itemMakeIndex, itemIndex, Info)
end
---* 拍卖行上架触发
---* 玩家对象
---* 物品索引
---* 物品唯一id
---* 货币类型
---* 竞拍价
---* 一口价
---@param actor any
---@param itemIdx any
---@param itemMakeIndex any
---@param moneyType any
---@param price1 any
---@param price2 any
function canpaimaiitem(actor, itemIdx, itemMakeIndex, moneyType, price1, price2)
if getflagstatus(actor, VarCfg.Falg_tequan) == 0 then
Func.sendmsg9(actor, "未开通王者特权,禁止上架拍卖行#249")
return false
end
end
function dealbefore(acceptActor, launchActor)
Func.sendmsg9(acceptActor,"禁止面对面交易#249")
return false
end
---* 大退/关闭客户端触发
function playoffline(actor)
GameEvent.push(EventCfg.onExitGame, actor)
end
---* 小退触发
function playreconnection(actor)
GameEvent.push(EventCfg.onExitGame, actor)
end
---* 击杀爆物触发(物品掉落前)
---* self: 死亡怪物/玩家对象
---* dropRole: 掉落者对象
function scatterbagitems(self, dropRole)
end