-- 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/提升基类") ModuleLoader = require("Envir/QuestDiary/util/ModuleLoader") ModuleLoader.reset() ModuleLoader.loadModule("Envir/QuestDiary/util/GM操作台", "system", { register = true }) ModuleLoader.loadModule("Envir/QuestDiary/util/挂机地图传送", "system", { register = true }) ModuleLoader.loadModule("Envir/QuestDiary/util/自动巡航下图", "system", { register = true }) -- 初始化游戏内容所有文件 ModuleLoader.loadSystemDir("QuestDiary/系统类", "Envir/QuestDiary/系统类", "system") ModuleLoader.loadGameDirs("QuestDiary/游戏功能", "Envir/QuestDiary/游戏功能", "game") ModuleLoader.resolvePending() ModuleLoader.loadModule("Envir/QuestDiary/util/系统任务", "postStart", { register = true }) ModuleLoader.report() 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