|
|
发表于 2024-6-12 17:44:51
|
显示全部楼层
对于获取经验的判定,我改进了下方法,供大家参考
local function IsNotInGroup(rangeplay, members)
for _, j in pairs(members) do
if j == rangeplay then
return false -- 如果找到了值,返回false
end
end
return true -- 如果没有找到值,返回true
end
local function OnAddXP(event, player, amount, victim, source)
if player:GetLevel() > 69 then return end --满级无效
local guid = player:GetGUIDLow()
if oneLifePlayers[guid] then
if oneLifePlayers[guid] == 3 then --乌龟模式只处理经验,不做其他限定
if source == 0 then
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/10)
return amount/10 --根据服务器经验设定倍率,在这里恢复默认
else
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/35)
return amount/35 --根据服务器经验设定倍率,在这里恢复默认
end
end
if player:GetGroup() then --先处理组队情况下经验减益
local PGroupMem = player:GetGroup():GetMembers()
if victim then --组队情况下,如果有经验源,且队伍外经验源45码内有非GM高等级玩家,则不得经验(可能存在队伍外辅助情况)
local PRangeList = victim:GetPlayersInRange(45)
for k, v in pairs(PRangeList) do
if IsNotInGroup(v, PGroupMem) and v:GetLevel() > player:GetLevel() and v:GetGMRank() == 0 then --有队伍外非GM高等级玩家在被杀怪45码内
player:SendBroadcastMessage("经验源周边有队伍外的高等级玩家,不能获取经验...")
return 0
end
end
end
for k, menber in pairs(PGroupMem) do
if player == menber then
--队员就是自己,啥也不干
elseif menber:GetLevel() > (player:GetLevel() + 5) or menber:GetLevel() == 70 then
player:SendBroadcastMessage("队伍存在超过五级或满级的队员,已自动退组并损失本次经验")
player:RemoveFromGroup()
return 0
elseif player:GetPlayerIP() == menber:GetPlayerIP() then
player:SendBroadcastMessage("队伍存在同IP的多个角色,获取的经验大幅度降低!")
local tmpamount = amount/70
if tmpamount < 1 then tmpamount = 1 end --避免1点经验都没有
return tmpamount
end
end
else -- 非组队情况下,如果有经验源,且经验源45码内有非GM高等级玩家,则不得经验(可能存在非组队辅助情况)
if victim then
local PRangeList = victim:GetPlayersInRange(45)
for k, v in pairs(PRangeList) do
if v ~= player and v:GetLevel() > player:GetLevel() and v:GetGMRank() == 0 then --有其他非GM高等级玩家在被杀怪45码内
player:SendBroadcastMessage("经验源周边有高等级玩家,不能获取经验...")
return 0
end
end
end
end
if oneLifePlayers[guid] == 0 then
if source == 0 then
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/10)
return amount/5 --根据服务器经验设定倍率,在这里恢复默认
else
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/35)
return amount/17.5 --根据服务器经验设定倍率,在这里恢复默认
end
elseif oneLifePlayers[guid] == 1 then
if source == 0 then
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/10)
return amount/10 --根据服务器经验设定倍率,在这里恢复默认
else
--player:SendBroadcastMessage("经验来源类型:"..source..",实际经验为:"..amount/35)
return amount/35 --根据服务器经验设定倍率,在这里恢复默认
end
end
else
local PHaveItem = player:GetItemByEntry(DoubleRequire)
if PHaveItem and PHaveItem:IsEquipped() then
return amount * 5 --非一命模式,且拥有变身法袍,则可获得5倍经验(匹配服务器变身法袍效果额外添加)
end
end
end
|
|