khanat-opennel-code/code/ryzom/client/data/gamedev/syui_v3/syui/syui.lua

433 lines
No EOL
12 KiB
Lua

-- written by Syphox
local M = {}
function M.exist()
return true
end
local bit32 = {}
local logic_and = {
[0] = { [0] = 0, 0, 0, 0},
[1] = { [0] = 0, 1, 0, 1},
[2] = { [0] = 0, 0, 2, 2},
[3] = { [0] = 0, 1, 2, 3},
}
local function checkint32( name, argidx, x, level )
local n = tonumber( x )
if not n then
error( string.format(
"bad argument #%d to '%s' (number expected, got %s)",
argidx, name, type( x )
), level + 1 )
end
return math.floor( n ) % 0x100000000
end
local function comb( name, args, nargs, s, t )
for i = 1, nargs do
args[i] = checkint32( name, i, args[i], 3 )
end
local pow = 1
local ret = 0
for b = 0, 31, 2 do
local c = s
for i = 1, nargs do
c = t[c][args[i] % 4]
args[i] = math.floor( args[i] / 4 )
end
ret = ret + c * pow
pow = pow * 4
end
return ret
end
function bit32.btest( ... )
return comb( 'btest', { ... }, select( '#', ... ), 3, logic_and ) ~= 0
end
local function targetIsInSameTeam()
if(getDbProp('UI:VARIABLES:IS_TEAM_PRESENT')~=0)then
for i=0,7 do
local groupEntityUID = getDbProp('SERVER:GROUP:' .. tostring(i) ..':UID')
if(groupEntityUID == getDbProp('UI:VARIABLES:TARGET:UID'))then
return true
end
end
return false
end
end
local function targetIsInSameGuild()
if(getDbProp('SERVER:GUILD:NAME')~=0)then
local nbMember = getNbGuildMembers();
for i=0,(nbMember-1) do
if(getGuildMemberName(i) == getTargetName())then
return true
end
end
return false
end
end
local function targetIsInSameLeague()
local targetLeague = getDbProp('SERVER:Entities:E' .. getTargetSlot() .. ':P25')
local playerLeague = getDbProp('SERVER:Entities:E0:P25')
if(targetLeague == playerLeague and playerLeague ~= 0)then
return true
end
return false
end
-- no way found yet
local function targetIsInSameOpFight()
end
-- 1=duel, 2=unk, 3=arena, 4=unk, 5=gvg (pr), 6=unk, 7=tagged(mara), 8=unk, 9=tp safezone, 10=safe zone related
function M.checkPvPMode()
local targetProp = getDbProp('SERVER:Entities:E' .. getTargetSlot() .. ':P23')
local playerProp = getDbProp('SERVER:Entities:E0:P23')
local pvp_mode = {1,3,5,7}
for i=1,8 do
if(bit32.btest(targetProp, 2^(i-1)) and bit32.btest(playerProp, 2^(i-1)))then
return true
end
end
return false
end
function M.PvPLogo()
local targetProp = getDbProp('SERVER:Entities:E' .. getTargetSlot() .. ':P23')
for i=1,8 do
if(bit32.btest(targetProp, 2^(i-1)))then
return true
end
end
return false
end
function M.isEnemy()
if(isTargetPlayer() and M.checkPvPMode())then
if(targetIsInSameGuild())then
return false
end
if(targetIsInSameTeam())then
return false
end
if(targetIsInSameLeague())then
return false
end
return true
end
return false
end
local function TJauge(val)
local jvalue = getDbProp("UI:VARIABLES:BARS:TARGET:" .. val) / 1.27
if(jvalue < 0)then
jvalue = 0
end
setDbProp("UI:VARIABLES:BARS:TARGET:" .. val .. "_PERCENT", math.floor(jvalue))
end
function M.UpdateJauge()
local bars = {"HP", "SAP", "STA"}
for k,v in pairs(bars) do
TJauge(v)
end
end
function M.teamInvite(uiID)
runAH(nil, 'talk', 'mode=0|text=/invite '.. getUI('ui:interface:' .. uiID).title)
end
function M.updateFLinvB(uiID)
if(uiID==nil)then
return
end
local tUI = getUI('ui:interface:' .. uiID .. ':header_closed:invite_button')
if(getUI('ui:interface:' .. uiID .. ':header_closed:online').texture ~= 'w_online.tga')then
if(tUI.texture == 'invt.tga')then
tUI.texture = ''
end
else
if(tUI.texture == '')then
tUI.texture = 'invt.tga'
tUI.x = -52
tUI.y = 0
end
end
end
function M.invToGuild(ply)
ply = getUI('ui:interface:add_guild'):find('edit_text').hardtext:split(">")[2]
if(ply ~= '')then
runAH(nil, 'talk', 'mode=0|text=/guildinvite ' .. ply)
end
runAH(nil, 'leave_modal', '')
end
function M.teamInviteFromGuild(uiID)
runAH(nil, 'talk', 'mode=0|text=/invite ' .. getGuildMemberName(tonumber(uiID:split(":m")[2])))
end
local tGuild = 'ui:interface:guild:content:tab_guild:list_member:guild_members'
function M.updateGLinvB()
if(getUI('ui:interface:guild').active)then
-- if get #id from member template, it creates too many instances and game will crash. bad coded from ryzom dev
for v = 0, (getNbGuildMembers()-1) do
local uiTexture = getUI(tGuild .. ":" .. tGuild .. ":m" .. v .. ':online')
local tUI = getUI(tGuild .. ":" .. tGuild .. ":m" .. v .. ':invite_button')
if(getUI("ui:interface:player").title ~= getUI(tGuild .. ":" .. tGuild .. ":m" .. v .. ":name").hardtext)then
if(uiTexture.texture ~= 'w_online.tga')then
if(tUI.texture == 'invt.tga')then
tUI.texture = ''
end
else
if(tUI.texture == '')then
tUI.texture = 'invt.tga'
tUI.x = -22
tUI.y = 0
end
end
else
-- fix the invite button in guild tab, because it sometimes disappear
-- the button appear for the player with higher grade than member
local invB = getUI('ui:interface:guild:content:tab_guild_i:invite')
if(getGuildMemberGrade(v) ~= 'Member')then
if(invB.active == false)then
invB.active = true
end
else
invB.active = false
end
end
end
end
end
function M.updateMemberCount()
-- fix the new guild tab
local mcount = getUI('ui:interface:guild:content:tab_guild_i:member_count')
if(getUI('ui:interface:guild').active)then
if(tonumber(mcount.hardtext) ~= getNbGuildMembers())then
mcount.hardtext = getNbGuildMembers()
end
end
end
function M.updateFPS()
local fpsUI = getUI('ui:interface:compass:frame:fps')
if(fpsUI==nil)then return end;
local fps = getDbProp('UI:VARIABLES:FPS')
fpsUI.hardtext = fps;
local colRGB = '255 81 81 255'
if(fps >= 30)then
colRGB = '155 255 81 255'
elseif(fps >= 20)then
colRGB = '249 255 81 255'
end
fpsUI.color = colRGB
end
function string:split(Pattern)
local Results = {}
local Start = 1
local SplitStart, SplitEnd = string.find(self, Pattern, Start)
while(SplitStart)do
table.insert(Results, string.sub(self, Start, SplitStart-1))
Start = SplitEnd+1
SplitStart, SplitEnd = string.find(self, Pattern, Start)
end
table.insert(Results, string.sub(self, Start))
return Results
end
function M.sysinfo(txt, mtd)
if(mtd==nil)then mtd='SYS' end;
displaySystemInfo(ucstring(tostring(txt)), mtd);
end
function M.showTargetPercent()
local targetUI = getUI('ui:interface:target')
local playerUI = getUI('ui:interface:player')
local contentUI = targetUI:find("content")
local clawImg = targetUI:find("slot_claw")
local targetTitle = targetUI:find("target_title")
local playerTitle = playerUI:find("player_title")
local wgTargetConside = targetUI:find("conside")
local wgTargetLevel = targetUI:find("target_level")
targetTitle.color = "255 255 255 255"
playerTitle.color = targetTitle.color
if (isTargetUser() or
(isTargetPlayer() and
not M.isEnemy()))then
wgTargetConside.active = false
contentUI.h = 55
contentUI.y = -24
clawImg.active = false
else
if(not isTargetPlayer() and
not M.checkPvPMode() and
getTargetLevel() > 0)then
if(clawImg.texture ~= "claw.tga")then
clawImg.texture = "claw.tga"
clawImg.x = 7
clawImg.y = -6
end
end
if(targetUI.title == "")then
wgTargetConside.active = false
clawImg.active = false
end
contentUI.h = 18
contentUI.y = -26
end
if(getTargetLevelForce() > 0 and
not isTargetPlayer())then
if(getTargetLevel() > 0)then
--fix campfire, do not show claw
if(tostring(getTargetSheet())~="object_campfire_28_b.creature")then
wgTargetConside.active = true
clawImg.active = true
end
end
end
if(getTargetLevel() <= 0 or isTargetNPC())then
wgTargetConside.active = false
wgTargetLevel.active = false
wgTargetLevel.hardtext = ""
clawImg.active = false
wgTargetConside.texture = "blank_n.tga"
end
if((isTargetUser() or isTargetPlayer()) and M.PvPLogo())then
if(clawImg.texture ~= "pvp.tga")then
clawImg.texture = "pvp.tga"
clawImg.x = 0
clawImg.y = 5
end
clawImg.active = true
wgTargetConside.active = false
end
end
function M.newConsider()
local targetWindow = getUI("ui:interface:target")
local clawImg = targetWindow:find("slot_claw")
local targetTitle = targetWindow:find("target_title")
local wgTargetLevel = targetWindow:find("target_level")
local wgTargetConside = targetWindow:find("conside")
local wgImpossible = targetWindow:find("impossible")
local wgSlotRing = targetWindow:find("slot_ring")
local wgToolTip = targetWindow:find("target_tooltip")
local pvpMode = false
local maxDiffLevel = 10
if not pvpMode then
for gm = 0, 7 do
if getDbProp("SERVER:GROUP:" .. tostring(gm) .. ":PRESENT") ~= 0 then
maxDiffLevel = maxDiffLevel + 10
end
end
end
local impossible = (getTargetLevel() - getPlayerLevel() > maxDiffLevel)
wgSlotRing.active = false
wgTargetConside.active = false
wgImpossible.active = false
wgTargetConside.texture = "blank_n.tga"
if impossible then
-- targeted object is too hard too beat, display a skull
wgTargetLevel.active = false
wgTargetConside.active = false
wgImpossible.texture = "skull_imp.tga"
clawImg.active = false
wgImpossible.active = true
wgImpossible.color = "255 255 255 255"
--wgImpossible.color = "255 50 50 255"
wgTargetLevel.hardtext = ""
else
--fix campfire, do not show, claw, lvl and consider
if(tostring(getTargetSheet())=="object_campfire_28_b.creature")then
wgTargetConside.active = false
wgTargetLevel.active = false
wgTargetLevel.hardtext = ""
clawImg.active = false
wgTargetConside.texture = "blank_n.tga"
return
end
-- player can see the level of the targeted creature, but not from NPC's
if(not isTargetNPC())then
wgTargetLevel.active = true
wgTargetConside.active = true
wgImpossible.active = false
wgImpossible.texture = "blank_n.tga"
wgTargetLevel.hardtext = tostring(getTargetLevel())
wgTargetLevel.color = "255 255 255 255"
wgImpossible.color = "255 255 255 255"
end
local image={ 'b1', 'b2', 'b3', 'b4', 'b5', 'g1', 'g2', 'g3', 'g4', 'g5', 'ge1', 'ge2', 'ge3', 'ge4', 'ge5', 'r1', 'r2', 'r3', 'r4', 'r5', 'l1', 'l2', 'l3', 'l4', 'l5', 'l5', 'l5' }
if(getTargetLevel()<10)then
wgTargetConside.texture = 'consider_gr.tga'
end
for k,v in pairs(image) do
if(getTargetLevel()>=tonumber(k .. 0))then
wgTargetConside.texture = 'consider_' .. v .. '.tga'
end
end
end
-- based on the 'level force', set a colored ring around the level
local levelForce = getTargetLevelForce()
wgImpossible.active = true
if levelForce < 6 then
wgToolTip.tooltip = i18n.get("uittConsiderTargetLevel")
elseif levelForce == 6 then
-- Named creature
wgImpossible.color = "255 255 255 255"
--wgImpossible.color = "191 225 254 255"
wgImpossible.texture = "skull_imp.tga"
wgImpossible.active = true
wgToolTip.tooltip = i18n.get("uittConsiderNamedOrMiniBoss")
wgTargetLevel.hardtext = ""
elseif levelForce == 7 then
-- Boss
wgImpossible.color = "255 255 255 255"
--wgImpossible.color = "222 191 254 255"
wgImpossible.texture = "skull_imp.tga"
wgImpossible.active = true
wgToolTip.tooltip = i18n.get("uittConsiderNamedOrMiniBoss")
wgTargetLevel.hardtext = ""
elseif levelForce == 8 then
-- Mini-Boss
wgImpossible.color = "255 255 255 255"
--wgImpossible.color = "254 191 191 255"
wgImpossible.texture = "skull_imp.tga"
wgImpossible.active = true
wgTargetLevel.hardtext = ""
wgTargetConside.active = false
if isTargetNPC() then
wgToolTip.tooltip = i18n.get("uittConsiderBossNpc")
else
wgToolTip.tooltip = i18n.get("uittConsiderBoss")
end
end
if impossible then
wgToolTip.tooltip = concatUCString(wgToolTip.tooltip, ucstring("\n"), i18n.get("uittConsiderUnknownLevel"))
end
end
return M