- 精华
- 阅读权限
- 80
- 贡献
- 人
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2023-12-8
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
发表于 2026-3-22 17:33:05
|
显示全部楼层
把下面代码 替换 服务端的 data\script\scene\special_script\mojiawuguan\wuguan_cmn_trans.lua 里面的内容,看行不行吧,不行不用追问,我只是个抄作业的
-------------------------------------------------------
wuguan_table = sys.load_table("$mb/wuguan_trans/wuguan_trans.xml")
wuguan_for_invite_table = {}
function check_wuguan_same_invite(player, inviter)
local t = wuguan_for_invite_table[player.only_id]
if t == nil then
return true
end
local may = true
for i, v in pairs(t) do
may = cmn_invite.on_check_the_same_invite(v, inviter, player)
if may == false then
return false
end
end
return may
end
function find_and_remove_wuguan_invite(invite_id, playerid)
local t = wuguan_for_invite_table[playerid]
if t == nil then
return
end
for i, v in pairs(t) do
if v == invite_id then
t[i] = nil
break
end
end
if #t == 0 then
t = nil
wuguan_for_invite_table[playerid] = nil
end
end
function get_level_state(player, line)
local level = line.level
local size = level.size
if size == 0 then
return true
elseif size ~= 2 then
print("wuguan_trans|level|error!")
return false
else
local minlevel = level[0]
local maxlevel = level[1]
local mylevel = player:GetAtb(bo2.eAtb_Level)
if minlevel == 0 and maxlevel >= mylevel then
return true
elseif maxlevel == 0 and minlevel <= mylevel then
return true
else
if minlevel <= mylevel and maxlevel >= mylevel then
return true
end
return false
end
end
end
function get_quest_state(player, line)
local quest = line.quest
local size = quest.size
if size == 0 then
return true
end
if size % 3 ~= 0 then
print("wuguan_trans|quest|error!")
return
end
local quest_state = false
for i = 0, size - 1, 3 do
local questID = quest[i]
local msID = quest[i + 1]
local state = quest[i + 2]
local mystate = player:GetQuestState(questID, msID)
if mystate == state and not quest_state then
quest_state = true
end
end
return quest_state
end
function get_payitem_state(player, line)
local payid = line.pay_id
if payid == 0 then
return true
end
local payline = bo2.gv_payment_in_scn:find(payid)
if payline == nil then
return
end
local pay_item = payline.pay_item
if pay_item == 1 then
local item_ids = payline.item_type
local item_nums = payline.item_num
local idsize = item_ids.size
local canpay = true
local itemtext = ""
if idsize == item_nums.size and idsize > 0 then
for i = 0, idsize - 1 do
local item_id = item_ids[i]
local item_num = item_nums[i]
if item_id > 0 then
local mycount = player:GetItemCount(item_id, nil, true)
if item_num <= mycount then
if i < idsize - 1 then
itemtext = itemtext .. item_id .. "*" .. item_num .. "*"
else
itemtext = itemtext .. item_id .. "*" .. item_num
end
else
canpay = false
local v = sys.variant()
v:set(L("item"), item_id)
v:set(L("num"), item_num)
player:ShowUIText(bo2.eSendModeFlag_Self, 86526, v)
break
end
end
return canpay, itemtext
end
end
end
end
function judge_team_num(player, num)
local allnum = player:GetAllMember()
local state = false
if num == 1 then
if allnum == 0 or allnum == num then
state = true
else
player:ShowUIText(bo2.eSendModeFlag_Self, 80273)
end
elseif num == 2 then
local cur_Teammate = player:GetTeammateAmount(-1)
if allnum >= 1 then
state = true
else
player:ShowUIText(bo2.eSendModeFlag_Self, 80348)
end
end
return state
end
function judge_live_state(player, num, member)
if player ~= nil then
local state = player:IsDead()
if state == true then
player:ShowUIText(bo2.eSendMode_Self, 83028)
return false
end
end
if member ~= nil then
local state = member:IsDead()
if state == true then
player:ShowUIText(bo2.eSendMode_Self, 83029)
member:ShowUIText(bo2.eSendMode_Self, 83028)
return false
end
end
return true
end
function judge_CD(player, num, member, scn_excel_id)
if player ~= nil and player:IsEnterMaxCD(scn_excel_id) ~= true then
return false
end
if member ~= nil and member:IsEnterMaxCD(scn_excel_id) ~= true then
player:ShowUIText(bo2.eSendModeFlag_Self, 81112)
return false
end
return true
end
function judge_level_match(player, num, member, scn_excel_id)
local flag = true
local scn_line = bo2.gv_scn_list:find(scn_excel_id)
if scn_line == nil then
return false
end
local my_level = player:GetAtb(bo2.eAtb_Level)
local member_level
if member ~= nil then
member_level = member:GetAtb(bo2.eAtb_Level)
end
local level_min = scn_line.min_level
local level_max = scn_line.max_level
local v = sys.variant()
if level_min > 0 then
v:set(L("min_level"), level_min)
if my_level < level_min then
flag = false
player:ShowUIText(bo2.eSendMode_Self, 83013, v)
if member ~= nil then
member:ShowUIText(bo2.eSendMode_Self, 83014, v)
end
elseif member_level ~= nil and member_level < level_min then
flag = false
member:ShowUIText(bo2.eSendMode_Self, 83013, v)
player:ShowUIText(bo2.eSendMode_Self, 83014, v)
end
if flag ~= true then
return flag
end
end
if level_max > 0 then
v:set(L("max_level"), level_max)
if my_level > level_max then
flag = false
player:ShowUIText(bo2.eSendMode_Self, 83015, v)
if member ~= nil then
member:ShowUIText(bo2.eSendMode_Self, 83016, v)
end
elseif member_level ~= nil and member_level > level_max then
flag = false
member:ShowUIText(bo2.eSendMode_Self, 83015, v)
player:ShowUIText(bo2.eSendMode_Self, 83016, v)
end
if flag ~= true then
return flag
end
end
return flag
end
function wuguan_need_log(scn, player, npc, line, num, event_id, npc_info)
local log_flag = line.wuguan_log
if log_flag ~= 1 then
return
end
local wuguan_name = line.wuguan_name
if wuguan_name == L("") then
print("wuguan name is nil!")
return
end
local scn_id
if num == 1 then
scn_id = line.Event1_scn
elseif num == 2 then
scn_id = line.Event2_scn
end
if scn_id == nil then
print("scn_id is nil!")
return
end
local scn_line = bo2.gv_scn_list:find(scn_id)
local min_level = scn_line.min_level
local max_level = scn_line.max_level
local wuguan_info = "," .. 5000 + scn_id .. "," .. tostring(wuguan_name)
local extend = "," .. min_level .. "," .. max_level
wuguan_log.WuguanLogStart(player, wuguan_info, npc_info, transMoney, strGetItem, strLostItem, extend, event_id)
end
local fn_tb = {
judge_team_num,
judge_live_state,
judge_CD,
judge_level_match
}
function on_select_1(player, npc, line)
local event_stream = line.Event1
local event_func = line.Event1_Func
if event_stream ~= 0 and event_stream ~= nil then
local scn = player.scn_unit
quest_cmn.start(scn, player, npc, still, event_stream)
elseif event_func ~= L("") and event_func ~= nil then
local scn = player.scn_unit
bo2.RunScript(event_func, scn, player, npc, still)
else
local trans_premise = line.Event1_pre
local scn_id = line.Event1_scn
local pre_state = true
for i = 0, trans_premise.size - 1 do
local ifvalue = trans_premise[i]
if ifvalue == 1 then
local fn = fn_tb[i + 1]
if fn then
pre_state = pre_state and fn(player, 1, nil, scn_id)
if pre_state == false then
return
end
end
end
end
local cd_id = line.scn1_cd
if cd_id ~= 0 and get_share_cd_state(player, nil, cd_id) ~= true then
return
end
if line.pay_id ~= 0 then
local paystate, itemtext = get_payitem_state(player, line)
if paystate == true then
local v = sys.variant()
v:set(packet.key.multi_item, itemtext)
player:SafeAward(v, nil, nil, 2151)
else
return
end
end
player:ChgScn(2, scn_id, "playerbegin", 0, 0, true)
if cd_id ~= 0 then
local line = bo2.gv_define:find(cd_id)
if line ~= nil and line.value.v_int ~= 0 then
local id = line.value.v_int
player:AddCooldown(id)
end
end
local event_id, npc_info
if line.wuguan_log == 1 then
event_id = bo2.CreateGlobalOnlyID()
npc_info = "," .. npc.excel_id .. "," .. npc.alias
end
wuguan_need_log(scn, player, npc, line, 1, event_id, npc_info)
end
end
function get_share_cd_state(player, member, cd_id)
local line = bo2.gv_define:find(cd_id)
if line ~= nil and line.value.v_int == 0 then
return true
end
local id = line.value.v_int
if player ~= nil and player:MayAddCooldown(id) ~= true then
local cdline = bo2.gv_cooldown_list:find(id)
if cdline == nil then
return
end
local cd_max = cdline.token
local v = sys.variant()
v:set(L("max"), cd_max)
player:ShowUIText(bo2.eSendModeFlag_Self, 73166, v)
return false
end
if member ~= nil and member:MayAddCooldown(id) ~= true then
local cdline = bo2.gv_cooldown_list:find(id)
if cdline == nil then
return
end
local cd_max = cdline.token
local v1 = sys.variant()
v1:set(L("max"), cd_max)
member:ShowUIText(bo2.eSendModeFlag_Self, 73166, v1)
player:ShowUIText(bo2.eSendModeFlag_Self, 73167, v1)
return false
end
return true
end
function check_cmn_all_state(player, excelID, isPayNow, isCheckInviteid)
local line = wuguan_table:find(excelID)
if line == nil then
return false
end
local trans_premise = line.Event2_pre
local scn_id = line.Event2_scn
local pre_state = true
if trans_premise[0] == 1 then
local fn = fn_tb[1]
pre_state = pre_state and fn(player, 2)
if pre_state == false then
return false
end
end
local member
local function get_mem(mem)
if player.scn_unit == mem.scn_unit then
member = mem
end
end
player:ForEachTeammate(get_mem)
local cur_num = player:GetAllMember()
if member == nil then
if cur_num > 1 then
return false
end
member = player
end
if isCheckInviteid == true then
local may1 = check_wuguan_same_invite(player, member)
if may1 == false then
player:ShowUIText(bo2.eSendModeFlag_Self, 73151)
return false
end
local may2 = check_wuguan_same_invite(member, player)
if may2 == false then
player:ShowUIText(bo2.eSendModeFlag_Self, 73150)
return false
end
end
for i = 1, trans_premise.size - 1 do
local ifvalue = trans_premise[i]
if ifvalue == 1 then
local fn = fn_tb[i + 1]
if fn then
pre_state = pre_state and fn(player, 1, member, scn_id)
if pre_state == false then
return false
end
end
end
end
if line.scn2_cd ~= 0 and get_share_cd_state(player, member, line.scn2_cd) == false then
return false
end
if line.quest_2 ~= 1 then
local quest_state = get_quest_state(member, line)
if quest_state == false then
player:ShowUIText(bo2.eSendMode_Self, 85119)
member:ShowUIText(bo2.eSendMode_Self, 85120)
return false
end
end
if line.level_2 ~= 1 then
local levelstate = get_level_state(member, line)
if levelstate == false then
local v = sys.variant()
v:set(L("name"), member.name)
player:ShowUIText(bo2.eSendMode_Self, 86525, v)
member:ShowUIText(bo2.eSendMode_Self, 86525)
return false
end
end
if line.pay_id ~= 0 then
local paystate, itemtext = get_payitem_state(player, line)
if paystate == true then
if isPayNow == true then
local v = sys.variant()
v:set(packet.key.multi_item, itemtext)
player:SafeAward(v, nil, nil, 2151)
end
else
return false
end
end
return true, member
end
function on_ack(player, m, datatable, ack_index)
local jiaoben_popo_data = datatable.add_data
if jiaoben_popo_data == nil then
return
end
local invitor_name = jiaoben_popo_data:get(packet.key.cha_name).v_string
local member = bo2.FindPlayer_n(invitor_name)
find_and_remove_wuguan_invite(datatable.invite_id, datatable.targetid)
if ack_index == 0 then
if member ~= nil then
local v = sys.variant()
v:set(L("cha_name"), player.name)
member:ShowUIText(bo2.eSendModeFlag_Self, 80653, v)
end
return
elseif ack_index == 1 then
if member == nil then
player:ShowUIText(bo2.eSendModeFlag_Self, 80348)
return
end
local cur_num = player:GetAllMember()
if cur_num == 2 then
do
local issame = true
local function get_mem(mem)
if mem.name ~= invitor_name then
player:ShowUIText(bo2.eSendModeFlag_Self, 73126)
issame = false
end
end
player:ForEachTeammate(get_mem)
if issame == false then
return
end
end
--else
--player:ShowUIText(bo2.eSendModeFlag_Self, 73126)
--return
end
local excelID = jiaoben_popo_data:get(packet.key.scn_excel_id).v_int
local state_now = wuguan_cmn_trans.check_cmn_all_state(member, excelID, true, false)
if state_now ~= false then
local wuguan_table = wuguan_cmn_trans.wuguan_table
local wuguan_line = wuguan_table:find(excelID)
local scn_id = datatable.target_scn_id
member:GroupChgScn(2, wuguan_line.Event2_scn, "playerbegin", 0)
local cd_id = wuguan_line.scn2_cd
if cd_id ~= 0 then
local line = bo2.gv_define:find(cd_id)
if line ~= nil and line.value.v_int ~= 0 then
local id = line.value.v_int
if member == player then
member:AddCooldown(id)
member:GM_AddActivation(5)
else
player:AddCooldown(id)
member:AddCooldown(id)
player:GM_AddActivation(5)
member:GM_AddActivation(5)
end
end
end
if wuguan_line.wuguan_log == 1 then
local event_id = jiaoben_popo_data:get(packet.key.wuguan_log_onlyid).v_string
local npc_info = jiaoben_popo_data:get(packet.key.cmn_name).v_string
wuguan_cmn_trans.wuguan_need_log(scn, member, npc, wuguan_line, 2, event_id, npc_info)
wuguan_cmn_trans.wuguan_need_log(scn, player, npc, wuguan_line, 2, event_id, npc_info)
end
end
end
end
function on_invite_timeout(target, inviter, data_table)
find_and_remove_wuguan_invite(data_table.invite_id, data_table.targetid)
if sys.check(target) and sys.check(inviter) then
local v = sys.variant()
v:set("cha_name", target.name)
inviter:ShowUIText(bo2.eSendMode_Self, 73138, v)
end
end
function on_select_2(player, npc, line)
local event_stream = line.Event2
local event_func = line.Event2_Func
if event_stream ~= 0 and event_stream ~= nil then
local scn = player.scn_unit
quest_cmn.start(scn, player, npc, still, event_stream)
elseif event_func ~= L("") and event_func ~= nil then
local scn = player.scn_unit
bo2.RunScript(event_func, scn, player, npc, still)
else
local state, member = check_cmn_all_state(player, line.id, false, true)
if state == false then
return
end
local function send_popo(member, event_id, npc_info)
local popo_param = sys.variant()
popo_param:set("cha_name", player.name)
local popo_fmt = bo2.gv_text:find(81076).text
local popo_str = sys.mtf_merge(popo_param, popo_fmt)
local v_data = sys.variant()
v_data:set(packet.key.scn_excel_id, line.id)
v_data:set(packet.key.cha_name, player.name)
if event_id ~= nil then
v_data:set(packet.key.wuguan_log_onlyid, event_id)
v_data:set(packet.key.cmn_name, npc_info)
end
local flag_id = line.wuguan_flag
local data = {
on_ask = on_ack,
ui_text = popo_str,
add_data = v_data,
on_timeout = on_invite_timeout,
targetid = member.only_id
}
local invite_id = cmn_invite.create_invite(player, member, data)
if wuguan_for_invite_table[member.only_id] == nil then
wuguan_for_invite_table[member.only_id] = {}
end
table.insert(wuguan_for_invite_table[member.only_id], invite_id)
cmn_invite.exec_invite(invite_id)
end
local event_id, npc_info
if line.wuguan_log == 1 then
event_id = bo2.CreateGlobalOnlyID()
npc_info = "," .. npc.excel_id .. "," .. npc.alias
end
send_popo(member, event_id, npc_info)
end
end
function wuguan_trans_show(player, npc, line)
local DlgID = line.DlgID
if DlgID ~= 0 then
player:ClearDlgTalkUI(npc)
player:SetDlgContent(DlgID)
end
local function on_begin_item1()
on_select_1(player, npc, line)
end
local function on_begin_item2()
on_select_2(player, npc, line)
end
local DlgItemID1 = line.DlgItemID1
if DlgItemID1 ~= 0 then
player:AddDlgItem(DlgItemID1, on_begin_item1)
end
local DlgItemID2 = line.DlgItemID2
if DlgItemID2 ~= 0 then
player:AddDlgItem(DlgItemID2, on_begin_item2)
end
player:ShowDlgTalkUI(npc)
end
local trans_line_tb = {}
function wuguan_show(player, npc, line, lastID)
local state = get_quest_state(player, line)
if state == false or get_level_state(player, line) == false then
local lastid = lastID
if lastid == 0 then
return
end
local lastline = wuguan_table:find(lastid)
wuguan_show(player, npc, lastline, trans_line_tb[lastid].lastpre)
else
wuguan_trans_show(player, npc, line)
for i, v in pairs(trans_line_tb) do
trans_line_tb[i] = nil
end
end
end
function wuguan_trans(player, npc, excelID, lastID)
trans_line_tb[excelID] = {}
local line = wuguan_table:find(excelID)
if line == nil then
return
end
local premise = line.premise
trans_line_tb[excelID].lastpre = lastID
if premise ~= 0 then
wuguan_trans(player, npc, premise, excelID)
else
wuguan_show(player, npc, line, trans_line_tb[excelID].lastpre)
end
end
|
|