380 lines
15 KiB
Lua
380 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/挂机地图传送")
|
|
|
|
-- 初始化游戏内容所有文件
|
|
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)
|
|
---* 未开通特权绑定
|
|
if getflagstatus(actor, VarCfg.Falg_tequan) == 0 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
|
|
|