UI modification:
*added some new textures *added code *changed guild window *added team invite buttons to tell window, friendlist and guildlist *added percent view for target HP *added target sap and stam in target window with percent view *added pvp icon for target window *added fps view into radar *added openable option for guild and friendlist *added guild invite button --HG-- branch : dev-syui
This commit is contained in:
parent
48f8cb534b
commit
3c6a7f4daf
12 changed files with 25701 additions and 0 deletions
633
code/ryzom/client/data/gamedev/syui_v3/interaction.lua
Normal file
633
code/ryzom/client/data/gamedev/syui_v3/interaction.lua
Normal file
|
@ -0,0 +1,633 @@
|
|||
-- In this file we define functions that serves for interaction windows
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- create the game namespace without reseting if already created in an other file.
|
||||
if (game==nil) then
|
||||
game= {};
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called when server send an invitaion we receive a text id containing the string to display (invitor name)
|
||||
function game:onTeamInvation(textID)
|
||||
|
||||
local ui = getUI('ui:interface:join_team_proposal');
|
||||
ui.content.inside.invitor_name.textid = textID;
|
||||
ui.active = true;
|
||||
setTopWindow(ui);
|
||||
ui:center();
|
||||
ui:blink(2);
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:teamInvitationAccept()
|
||||
|
||||
local ui = getUI('ui:interface:join_team_proposal');
|
||||
ui.active = false;
|
||||
sendMsgToServer('TEAM:JOIN');
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:teamInvitationRefuse()
|
||||
|
||||
local ui = getUI('ui:interface:join_team_proposal');
|
||||
ui.active = false;
|
||||
sendMsgToServer('TEAM:JOIN_PROPOSAL_DECLINE');
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:switchChatTab(dbEntry)
|
||||
local db= 'UI:SAVE:ISENABLED:' .. dbEntry;
|
||||
local val= getDbProp(db);
|
||||
-- switch value
|
||||
if(val==0) then
|
||||
setDbProp(db, 1);
|
||||
else
|
||||
setDbProp(db, 0);
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:updateEmoteMenu(prop, tooltip, tooltip_pushed, name, param)
|
||||
for i=0,9 do
|
||||
-- Get key shortcut
|
||||
local text = i18n.get('uiTalkMemMsg0' .. i);
|
||||
local key = runExpr( "getKey('talk_message','0" .. i .. "',1)" );
|
||||
|
||||
if (key ~= nil and key ~= '') then
|
||||
key = ' @{T25}@{2F2F}(' .. key .. ')';
|
||||
text = concatUCString(text, key);
|
||||
end
|
||||
|
||||
-- if we don't do the full getUI, it doesn't work (don't understand why)
|
||||
local uiQC= getUI("ui:interface:user_chat_emote_menu:quick_chat:" .. "qc" .. i);
|
||||
uiQC.uc_hardtext_format= text;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
if (ui_free_chat_h == nil) then
|
||||
ui_free_chat_h = {}
|
||||
end
|
||||
|
||||
if (ui_free_chat_w == nil) then
|
||||
ui_free_chat_w = {}
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:closeTellHeader(uiID)
|
||||
local ui = getUI('ui:interface:' .. uiID);
|
||||
|
||||
-- save size
|
||||
ui_free_chat_h[uiID] = ui.h;
|
||||
ui_free_chat_w[uiID] = ui.w;
|
||||
|
||||
-- reduce window size
|
||||
ui.pop_min_h = 32;
|
||||
ui.h = 0;
|
||||
ui.w = 216;
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:openTellHeader(uiID)
|
||||
local ui = getUI('ui:interface:' .. uiID);
|
||||
ui.pop_min_h = 96;
|
||||
|
||||
-- set size from saved values
|
||||
if (ui_free_chat_h[uiID] ~= nil) then
|
||||
ui.h = ui_free_chat_h[uiID];
|
||||
end
|
||||
|
||||
if (ui_free_chat_w[uiID] ~= nil) then
|
||||
ui.w = ui_free_chat_w[uiID];
|
||||
end
|
||||
|
||||
-- set Header Color to normal values (when a tell is closed and the telled player say someone, header change to "UI:SAVE:WIN:COLORS:INFOS")
|
||||
ui:setHeaderColor('UI:SAVE:WIN:COLORS:COM');
|
||||
end
|
||||
|
||||
|
||||
--/////////////////////////
|
||||
--// TARGET WINDOW SETUP //
|
||||
--/////////////////////////
|
||||
|
||||
-- local functions for tests
|
||||
local function levelToForceRegion(level)
|
||||
if level < 20 then
|
||||
return 1
|
||||
elseif level >= 250 then
|
||||
return 6
|
||||
else
|
||||
return math.floor(level / 50) + 2
|
||||
end
|
||||
end
|
||||
|
||||
local function levelToLevelForce(level)
|
||||
return math.floor(math.fmod(level, 50) * 5 / 50) + 1
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- tmp var for tests in local mode
|
||||
local twPlayerLevel = 10
|
||||
local twTargetLevel = 19
|
||||
local twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
local twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
local twTargetPlayer = false
|
||||
local twPlayerInPVPMode = false
|
||||
local twTargetInPVPMode = false
|
||||
|
||||
|
||||
-----------------------------------
|
||||
local function twGetPlayerLevel()
|
||||
if config.Local == 1 then
|
||||
return twPlayerLevel
|
||||
else
|
||||
return getPlayerLevel()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twGetTargetLevel()
|
||||
if config.Local == 1 then
|
||||
return twTargetLevel
|
||||
else
|
||||
return getTargetLevel()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twGetTargetForceRegion()
|
||||
if config.Local == 1 then
|
||||
return twTargetForceRegion
|
||||
else
|
||||
return getTargetForceRegion()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twGetTargetLevelForce()
|
||||
if config.Local == 1 then
|
||||
return twTargetLevelForce
|
||||
else
|
||||
return getTargetLevelForce()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twIsTargetPlayer()
|
||||
if config.Local == 1 then
|
||||
return twTargetPlayer
|
||||
else
|
||||
return isTargetPlayer()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twIsPlayerInPVPMode()
|
||||
if config.Local == 1 then
|
||||
return twPlayerInPVPMode
|
||||
else
|
||||
return isPlayerInPVPMode()
|
||||
end
|
||||
end
|
||||
|
||||
-----------------------------------
|
||||
local function twIsTargetInPVPMode()
|
||||
if config.Local == 1 then
|
||||
return twTargetInPVPMode
|
||||
else
|
||||
return isTargetInPVPMode()
|
||||
end
|
||||
end
|
||||
|
||||
----------------------
|
||||
-- MISC local tests function
|
||||
-- no selection
|
||||
function twTest0()
|
||||
twTargetLevel = -1
|
||||
twTargetPlayer = false
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, not impossible
|
||||
function twTest1()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, not impossible (limit)
|
||||
function twTest2()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 20
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, impossible
|
||||
function twTest3()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 21
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
------ NAMED
|
||||
------
|
||||
-- selection, not impossible, named
|
||||
function twTest4()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 6
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, not impossible (limit), named
|
||||
function twTest5()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 20
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 6
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, impossible, named
|
||||
function twTest6()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 21
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 6
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
------ BOSS
|
||||
------
|
||||
-- selection, not impossible, boss
|
||||
function twTest7()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 7
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, not impossible (limit), boss
|
||||
function twTest8()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 20
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 7
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, impossible, boss
|
||||
function twTest9()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 21
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 7
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
------ MINI-BOSS
|
||||
------
|
||||
-- selection, not impossible, boss
|
||||
function twTest10()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 8
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, not impossible (limit), boss
|
||||
function twTest11()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 20
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 8
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
-- selection, impossible, boss
|
||||
function twTest12()
|
||||
twTargetPlayer = false
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 21
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = 8
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
|
||||
------ PLAYER SELECTION
|
||||
------ 2 players, no pvp
|
||||
function twTest13()
|
||||
twTargetPlayer = true
|
||||
twPlayerInPVPMode = false
|
||||
twTargetInPVPMode = false
|
||||
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
|
||||
function twTest14()
|
||||
twTargetPlayer = true
|
||||
twPlayerInPVPMode = true
|
||||
twTargetInPVPMode = true
|
||||
|
||||
twPlayerLevel = 10
|
||||
twTargetLevel = 15
|
||||
twTargetForceRegion = levelToForceRegion(twTargetLevel)
|
||||
twTargetLevelForce = levelToLevelForce(twTargetLevel)
|
||||
game:updateTargetConsiderUI()
|
||||
end
|
||||
|
||||
|
||||
------ 2 players, pvp
|
||||
|
||||
-- groups
|
||||
function twGroup(groupSize)
|
||||
for gm = 0, 7 do
|
||||
if gm < groupSize then
|
||||
setDbProp("SERVER:GROUP:" .. tostring(gm) .. ":PRESENT", 1)
|
||||
else
|
||||
setDbProp("SERVER:GROUP:" .. tostring(gm) .. ":PRESENT", 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:closeWebIGBrowserHeader()
|
||||
local ui = getUI('ui:interface:webig');
|
||||
|
||||
-- save size
|
||||
ui_webig_browser_h = ui.h;
|
||||
ui_webig_browser_w = ui.w;
|
||||
|
||||
-- reduce window size
|
||||
ui.pop_min_h = 32;
|
||||
ui.h = 0;
|
||||
ui.w = 150;
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:openWebIGBrowserHeader()
|
||||
local ui = getUI('ui:interface:webig');
|
||||
ui.pop_min_h = 96;
|
||||
|
||||
-- set size from saved values
|
||||
if (ui_webig_browser_h ~= nil) then
|
||||
ui.h = ui_webig_browser_h;
|
||||
end
|
||||
|
||||
if (ui_webig_browser_w ~= nil) then
|
||||
ui.w = ui_webig_browser_w;
|
||||
end
|
||||
end
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--#############################
|
||||
--###### Syphox's modlib ######
|
||||
--#############################
|
||||
if (package_path_native == nil) then
|
||||
package_path_native = package.path;
|
||||
|
||||
package.path = package.path .. ';./user/syui/?.lua';
|
||||
end
|
||||
|
||||
function isModuleAvailable(name)
|
||||
if(package.loaded[name])then
|
||||
return true
|
||||
else
|
||||
for _, searcher in ipairs(package.searchers or package.loaders) do
|
||||
local loader = searcher(name)
|
||||
if(type(loader) == 'function')then
|
||||
package.preload[name] = loader
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
if(isModuleAvailable("syui"))then
|
||||
sy_ui = require("syui")
|
||||
end
|
||||
|
||||
function game:showTargetPercent()
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.UpdateJauge()
|
||||
sy_ui.showTargetPercent()
|
||||
end
|
||||
|
||||
function game:newConsider()
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.newConsider()
|
||||
end
|
||||
|
||||
function game:updateFPS()
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.updateFPS()
|
||||
end
|
||||
|
||||
function game:sysinfo(txt, mtd)
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.sysinfo(txt, mtd)
|
||||
end
|
||||
|
||||
function game:updateMemberCount()
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.updateMemberCount()
|
||||
end
|
||||
|
||||
function game:updateGLinvB()
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.updateGLinvB()
|
||||
end
|
||||
|
||||
function game:teamInviteFromGuild(uiID)
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.teamInviteFromGuild(uiID)
|
||||
end
|
||||
|
||||
function game:invToGuild(ply)
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.invToGuild(ply)
|
||||
end
|
||||
|
||||
function game:updateFLinvB(uiID)
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.updateFLinvB(uiID)
|
||||
end
|
||||
|
||||
function game:teamInvite(uiID)
|
||||
if(not sy_ui.exist())then return end
|
||||
sy_ui.teamInvite(uiID)
|
||||
end
|
||||
|
||||
--#############################
|
||||
--######## modlib end #########
|
||||
--#############################
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- This function is called when a new target is selected, it should update the 'consider' widget
|
||||
-- Level of the creature
|
||||
-- Is its level known (not too high ...)
|
||||
-- Boss/Mini-bosses/Names colored ring
|
||||
function game:updateTargetConsiderUI()
|
||||
--debugInfo("Updating consider widget")
|
||||
|
||||
|
||||
local targetWindow = getUI("ui:interface:target")
|
||||
--
|
||||
local wgTargetSlotForce = targetWindow:find("slot_force")
|
||||
local wgTargetLevel = targetWindow:find("target_level")
|
||||
local wgImpossible = targetWindow:find("impossible")
|
||||
local wgSlotRing = targetWindow:find("slot_ring")
|
||||
local wgToolTip = targetWindow:find("target_tooltip")
|
||||
local wgPvPTag = targetWindow:find("pvp_tags")
|
||||
local wgHeader = targetWindow:find("header_opened")
|
||||
|
||||
wgTargetSlotForce.active = true
|
||||
wgImpossible.active = true
|
||||
|
||||
-- no selection ?
|
||||
if twGetTargetLevel() == -1 then
|
||||
wgTargetSlotForce.active = false
|
||||
wgTargetLevel.active = false
|
||||
wgImpossible.active = false
|
||||
wgSlotRing.active = false
|
||||
if (isTargetUser() and twIsPlayerInPVPMode()) then
|
||||
wgToolTip.tooltip = ""
|
||||
wgPvPTag.active = true
|
||||
wgHeader.h = 56;
|
||||
else
|
||||
wgPvPTag.active = false
|
||||
wgHeader.h = 34;
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderTargetNoSelection")
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local pvpMode = false
|
||||
wgPvPTag.active = false
|
||||
wgHeader.h = 34;
|
||||
|
||||
-- if the selection is a player, then both the local & targeted player must be in PVP mode for the level to be displayed
|
||||
if (twIsTargetPlayer()) then
|
||||
-- don't display anything ...
|
||||
wgTargetSlotForce.active = false
|
||||
wgTargetLevel.active = false
|
||||
wgImpossible.active = false
|
||||
wgSlotRing.active = false
|
||||
wgToolTip.tooltip = ""
|
||||
if twIsTargetInPVPMode() then
|
||||
debugInfo("target in pvp")
|
||||
wgPvPTag.active = true
|
||||
wgHeader.h = 34; -- 56
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- load default code if syphox.lua is not available
|
||||
if(not sy_ui.exist())then
|
||||
-- depending on the number of people in the group, set the max diff for visibility between player level
|
||||
-- & creature level (x 10 per member)
|
||||
local maxDiffLevel = 10
|
||||
if not pvpMode then
|
||||
-- exception there : when "pvping", don't relate the levelof the target to the level of the group, but to thelocal
|
||||
-- player only
|
||||
for gm = 0, 7 do
|
||||
if getDbProp("SERVER:GROUP:" .. tostring(gm) .. ":PRESENT") ~= 0 then
|
||||
maxDiffLevel = maxDiffLevel + 10
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
debugInfo("Max diff level= " .. tostring(maxDiffLevel))
|
||||
|
||||
local impossible = (twGetTargetLevel() - twGetPlayerLevel() > maxDiffLevel)
|
||||
|
||||
wgSlotRing.active = false
|
||||
|
||||
if impossible then
|
||||
-- targeted object is too hard too beat, display a skull
|
||||
wgTargetLevel.active = false
|
||||
wgTargetLevelText.active = wgTargetLevel.active
|
||||
wgTargetLevelText.hardtext = ""
|
||||
wgImpossible.y = -5
|
||||
wgImpossible.color = "255 50 50 255"
|
||||
else
|
||||
-- player can see the level of the targeted creature
|
||||
wgTargetLevel.active = true
|
||||
wgTargetLevelText.active = wgTargetLevel.active
|
||||
wgImpossible.y = 6
|
||||
wgTargetLevel.hardtext = tostring(twGetTargetLevel())
|
||||
wgImpossible.color = "255 255 255 255"
|
||||
wgTargetLevel.color = getDefine("region_force_" .. tostring(levelToForceRegion(twGetTargetLevel())))
|
||||
wgTargetLevelText.color = wgTargetLevel.color
|
||||
wgTargetLevelText.hardtext = "LVL"
|
||||
end
|
||||
|
||||
-- based on the 'level force', set a colored ring around the level
|
||||
local levelForce = twGetTargetLevelForce()
|
||||
wgTargetSlotForce.color = getDefine("region_force_" .. tostring(levelToForceRegion(twGetTargetLevel())))
|
||||
|
||||
wgImpossible.texture = getDefine("force_level_" .. tostring(levelForce))
|
||||
wgImpossible.active = true
|
||||
if levelForce < 6 then
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderTargetLevel")
|
||||
elseif levelForce == 6 then
|
||||
-- Named creature
|
||||
wgImpossible.color = "117 132 126 255"
|
||||
wgSlotRing.color = "117 132 126 255"
|
||||
wgTargetSlotForce.color = "117 132 126 255"
|
||||
wgSlotRing.texture = "consider_ring.tga"
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderNamedOrMiniBoss")
|
||||
elseif levelForce == 7 then
|
||||
-- Boss
|
||||
wgImpossible.color = "156 98 65 255"
|
||||
wgSlotRing.color = "156 98 65 255"
|
||||
wgTargetSlotForce.color = "156 98 65 255"
|
||||
wgSlotRing.texture = "consider_ring.tga"
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderNamedOrMiniBoss")
|
||||
elseif levelForce == 8 then
|
||||
-- Mini-Boss
|
||||
wgImpossible.color = "213 212 9 255"
|
||||
wgSlotRing.texture = "consider_ring.tga"
|
||||
wgSlotRing.color = "213 212 9 255"
|
||||
if isTargetNPC() then
|
||||
wgTargetSlotForce.color = "255 255 255 255"
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderBossNpc")
|
||||
else
|
||||
wgTargetSlotForce.color = "213 212 9 255"
|
||||
wgToolTip.tooltip = i18n.get("uittConsiderBoss")
|
||||
end
|
||||
end
|
||||
|
||||
if impossible then
|
||||
wgToolTip.tooltip = concatUCString(wgToolTip.tooltip, ucstring("\n"), i18n.get("uittConsiderUnknownLevel"))
|
||||
end
|
||||
else
|
||||
game:newConsider()
|
||||
end
|
||||
end
|
1131
code/ryzom/client/data/gamedev/syui_v3/syui/compass.xml
Normal file
1131
code/ryzom/client/data/gamedev/syui_v3/syui/compass.xml
Normal file
File diff suppressed because it is too large
Load diff
3891
code/ryzom/client/data/gamedev/syui_v3/syui/config.xml
Normal file
3891
code/ryzom/client/data/gamedev/syui_v3/syui/config.xml
Normal file
File diff suppressed because it is too large
Load diff
4077
code/ryzom/client/data/gamedev/syui_v3/syui/game_config.xml
Normal file
4077
code/ryzom/client/data/gamedev/syui_v3/syui/game_config.xml
Normal file
File diff suppressed because it is too large
Load diff
1420
code/ryzom/client/data/gamedev/syui_v3/syui/guild.xml
Normal file
1420
code/ryzom/client/data/gamedev/syui_v3/syui/guild.xml
Normal file
File diff suppressed because it is too large
Load diff
3311
code/ryzom/client/data/gamedev/syui_v3/syui/interaction.xml
Normal file
3311
code/ryzom/client/data/gamedev/syui_v3/syui/interaction.xml
Normal file
File diff suppressed because it is too large
Load diff
957
code/ryzom/client/data/gamedev/syui_v3/syui/player.lua
Normal file
957
code/ryzom/client/data/gamedev/syui_v3/syui/player.lua
Normal file
|
@ -0,0 +1,957 @@
|
|||
-- In this file we define functions that serves for player windows
|
||||
|
||||
function getDbPropU(dbEntry)
|
||||
value = getDbProp(dbEntry)
|
||||
if (value < 0) then
|
||||
value = 4294967296+value
|
||||
end
|
||||
return value
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- create the game namespace without reseting if already created in an other file.
|
||||
if (game==nil) then
|
||||
game= {};
|
||||
end
|
||||
|
||||
if (game.PVP == nil) then
|
||||
game.PVP = {};
|
||||
game.PVP.tagStartTimer = 0;
|
||||
game.PVP.flagStartTimer = 0;
|
||||
game.PVP.tagTimerStarted = false;
|
||||
game.PVP.flagTimerStarted = false;
|
||||
end
|
||||
|
||||
if (game.BonusMalus == nil) then
|
||||
game.BonusMalus = {};
|
||||
game.BonusMalus.DeathPenaltyBefore = -1;
|
||||
game.BonusMalus.DeathPenaltyAfter = -1;
|
||||
game.BonusMalus.XPCatSlotBefore = -1;
|
||||
game.BonusMalus.XPCatSlotAfter = -1;
|
||||
game.BonusMalus.RingXPCatSlotBefore = -1;
|
||||
game.BonusMalus.RingXPCatSlotAfter = -1;
|
||||
game.BonusMalus.OutpostSlotBefore = -1;
|
||||
game.BonusMalus.OutpostSlotAfter = -1;
|
||||
game.BonusMalus.BonusAHList= {};
|
||||
game.BonusMalus.MalusAHList= {};
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- Update player bars in function of what we wants to display (we can hide each one of the 3 bars : sap,stamina and focus)
|
||||
function game:updatePlayerBars()
|
||||
|
||||
local dispSap = getDbProp('UI:SAVE:PLAYER:DISP_SAP');
|
||||
local dispSta = getDbProp('UI:SAVE:PLAYER:DISP_STA');
|
||||
local dispFoc = getDbProp('UI:SAVE:PLAYER:DISP_FOC');
|
||||
|
||||
local ui = getUI('ui:interface:player:content');
|
||||
|
||||
-- active ui in function of what is displayed
|
||||
|
||||
ui.b_sap.active = (dispSap == 1);
|
||||
ui.jsap.active = (dispSap == 1);
|
||||
|
||||
ui.b_sta.active = (dispSta == 1);
|
||||
ui.jsta.active = (dispSta == 1);
|
||||
|
||||
ui.b_foc.active = (dispFoc == 1);
|
||||
ui.jfoc.active = (dispFoc == 1);
|
||||
|
||||
-- choose good y-position
|
||||
|
||||
local totalBarDisp = dispSap + dispSta + dispFoc;
|
||||
if (totalBarDisp == 3) then
|
||||
|
||||
ui.b_sap.y = -18;
|
||||
ui.b_sta.y = -36;
|
||||
ui.b_foc.y = -54;
|
||||
ui.current_action.y = -65;
|
||||
|
||||
elseif (totalBarDisp == 2) then
|
||||
|
||||
if (dispSap == 0) then
|
||||
ui.b_sta.y = -18;
|
||||
ui.b_foc.y = -36;
|
||||
end
|
||||
|
||||
if (dispSta == 0) then
|
||||
ui.b_sap.y = -18;
|
||||
ui.b_foc.y = -36;
|
||||
end
|
||||
|
||||
if (dispFoc == 0) then
|
||||
ui.b_sap.y = -18;
|
||||
ui.b_sta.y = -36;
|
||||
end
|
||||
|
||||
ui.current_action.y = -50;
|
||||
|
||||
elseif (totalBarDisp == 1) then
|
||||
|
||||
ui.b_sta.y = -18;
|
||||
ui.b_foc.y = -18;
|
||||
ui.b_sta.y = -18;
|
||||
|
||||
ui.current_action.y = -35;
|
||||
|
||||
else
|
||||
ui.current_action.y = -18;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- convert a boolean to a number 0 or 1
|
||||
function booleanToNumber(thebool)
|
||||
if(thebool) then
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- Update player pvp tag
|
||||
function game:pvpTagUpdateDisplay()
|
||||
local currentServerTick = getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local pvpServerTagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:ACTIVATION_TIME');
|
||||
local pvpServerFlagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:FLAG_PVP_TIME_LEFT');
|
||||
local uiPlayer= getUI('ui:interface:player:header_opened');
|
||||
|
||||
-- get the current state
|
||||
local pvpServerFlag= pvpServerFlagTimer > currentServerTick;
|
||||
local pvpLocalTag= (getDbProp('UI:TEMP:PVP_FACTION:TAG_PVP') == 1);
|
||||
local pvpServerTag= (getDbProp('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:TAG_PVP') == 1);
|
||||
local pvpServerActivateTimerOn= pvpServerTagTimer > currentServerTick;
|
||||
|
||||
-- deduce the display state according to the current state
|
||||
local GREEN= 0;
|
||||
local ORANGE= 1;
|
||||
local RED= 2;
|
||||
local buttonMode= GREEN;
|
||||
local buttonPushed= false;
|
||||
local buttonTimer= false;
|
||||
-- if the flag is activated, then must display PVP flag button and timer
|
||||
if (pvpServerFlag) then
|
||||
-- ** RED MODE
|
||||
buttonMode= RED;
|
||||
buttonPushed= false;
|
||||
buttonTimer= true;
|
||||
-- else must display correct mode according to the TAG state
|
||||
else
|
||||
-- There are 8 possibilities according to the combination of the 3 flags
|
||||
-- Here: TL= pvpLocalTag, TS= pvpServerTag, AS= pvpServerActivateTimerOn)
|
||||
-- TL TS AS
|
||||
-- ** GREEN MODE **
|
||||
-- 0 0 0 -> Standard disabled PVP
|
||||
-- 1 0 0 -> The user pressed the button but still no response from server
|
||||
-- 1 1 1 -> The user pressed the button and got response from server. => GREEN icon with timer
|
||||
-- 0 1 1 -> The user canceled the activation (server not acked yet the cancel). => default display
|
||||
-- ** ORANGE MODE **
|
||||
-- 1 1 0 -> Standard enabled PVP
|
||||
-- 0 1 0 -> The user pressed the button but still no response from server
|
||||
-- 0 0 1 -> The user pressed the button and got response from server. => ORANGE icon with timer
|
||||
-- 1 0 1 -> The user canceled the activation (server not acked yet the cancel). => default display
|
||||
|
||||
-- From this table, we can deduce the following rules
|
||||
|
||||
-- buttonMode is GREEN when TS==AS
|
||||
if( pvpServerTag == pvpServerActivateTimerOn ) then
|
||||
buttonMode= GREEN;
|
||||
else
|
||||
buttonMode= ORANGE;
|
||||
end
|
||||
|
||||
-- the button is pushed if (there is a timer and TL==TS), or (no timer and TL!=TS)
|
||||
if( pvpServerActivateTimerOn == (pvpLocalTag == pvpServerTag) ) then
|
||||
buttonPushed= true;
|
||||
else
|
||||
buttonPushed= false;
|
||||
end
|
||||
|
||||
-- display a timer only if the timer is activated and server and local tag are equals
|
||||
if( pvpServerActivateTimerOn and pvpLocalTag == pvpServerTag ) then
|
||||
buttonTimer= true;
|
||||
else
|
||||
buttonTimer= false;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- setup the local display
|
||||
setDbProp("UI:TEMP:PVP_FACTION:DSP_MODE", buttonMode);
|
||||
setDbProp("UI:TEMP:PVP_FACTION:DSP_PUSHED", booleanToNumber(buttonPushed));
|
||||
setDbProp("UI:TEMP:PVP_FACTION:DSP_TIMER", booleanToNumber(buttonTimer));
|
||||
|
||||
-- setup the timer bar
|
||||
if(buttonTimer) then
|
||||
local uiBar = uiPlayer.pvp_timer;
|
||||
local uiBarBg = uiPlayer.pvp_timer_bg;
|
||||
-- Flag Bar?
|
||||
if(buttonMode==RED) then
|
||||
-- display a reverse timer
|
||||
uiBar.w = uiBarBg.w * (pvpServerFlagTimer - currentServerTick) / (pvpServerFlagTimer - game.PVP.flagStartTimer);
|
||||
else
|
||||
-- display a forward timer
|
||||
uiBar.w = uiBarBg.w * (currentServerTick - game.PVP.tagStartTimer) / (pvpServerTagTimer - game.PVP.tagStartTimer);
|
||||
end
|
||||
end
|
||||
|
||||
-- force update of the tooltip for any button (by disabling then reenabling)
|
||||
disableContextHelpForControl(uiPlayer.pvp_tag_button_0);
|
||||
disableContextHelpForControl(uiPlayer.pvp_tag_button_1);
|
||||
disableContextHelpForControl(uiPlayer.pvp_tag_button_2);
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- Update player pvp tag
|
||||
function game:pvpTag()
|
||||
local buttonStat = getDbProp('UI:TEMP:PVP_FACTION:TAG_PVP');
|
||||
if (buttonStat == 0) then
|
||||
setDbProp('UI:TEMP:PVP_FACTION:TAG_PVP',1);
|
||||
else
|
||||
setDbProp('UI:TEMP:PVP_FACTION:TAG_PVP',0);
|
||||
end
|
||||
sendMsgToServerPvpTag(buttonStat == 0);
|
||||
|
||||
-- update display
|
||||
self:pvpTagUpdateDisplay();
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- Update button due to server validation
|
||||
function game:updatePvpTag()
|
||||
-- force copy to temp of Server tag
|
||||
local pvpServerTag= (getDbProp('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:TAG_PVP') == 1);
|
||||
setDbProp('UI:TEMP:PVP_FACTION:TAG_PVP', booleanToNumber(pvpServerTag));
|
||||
|
||||
-- launch timer DB if necessary
|
||||
local currentServerTick = getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local pvpServerTagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:ACTIVATION_TIME');
|
||||
local pvpServerFlagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:FLAG_PVP_TIME_LEFT');
|
||||
|
||||
if(pvpServerTagTimer > currentServerTick) or (pvpServerFlagTimer > currentServerTick) then
|
||||
local ui = getUI('ui:interface:player');
|
||||
addOnDbChange(ui,'@UI:VARIABLES:CURRENT_SERVER_TICK', 'game:updatePvpTimer()');
|
||||
|
||||
if(pvpServerTagTimer > currentServerTick and game.PVP.tagTimerStarted == false) then
|
||||
game.PVP.tagStartTimer = currentServerTick;
|
||||
game.PVP.tagTimerStarted = true;
|
||||
end
|
||||
if(pvpServerFlagTimer > currentServerTick and game.PVP.flagTimerStarted == false) then
|
||||
game.PVP.flagStartTimer = currentServerTick;
|
||||
game.PVP.flagTimerStarted = true;
|
||||
end
|
||||
end
|
||||
|
||||
-- update display (after start timer reseted)
|
||||
self:pvpTagUpdateDisplay();
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:updatePvpTimer()
|
||||
|
||||
-- update display
|
||||
self:pvpTagUpdateDisplay();
|
||||
|
||||
-- try to stop
|
||||
local currentServerTick = getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local pvpServerTagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:ACTIVATION_TIME');
|
||||
local pvpServerFlagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:FLAG_PVP_TIME_LEFT');
|
||||
|
||||
-- Manage Tag Timer display
|
||||
if(pvpServerTagTimer <= currentServerTick) then
|
||||
game.PVP.tagTimerStarted = false;
|
||||
end
|
||||
|
||||
-- Manage Flag Timer display
|
||||
if(pvpServerFlagTimer <= currentServerTick) then
|
||||
game.PVP.flagTimerStarted = false;
|
||||
end
|
||||
|
||||
-- if both off, stop the db update
|
||||
if(game.PVP.tagTimerStarted == false) and (game.PVP.flagTimerStarted == false) then
|
||||
removeOnDbChange(getUI('ui:interface:player'),'@UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:formatTime(temps)
|
||||
|
||||
local hours = math.floor(temps/(10*60*60));
|
||||
local minutes = math.floor((temps - (hours*10*60*60)) / (10*60));
|
||||
local seconds = math.floor((temps - (hours*10*60*60) - (minutes*10*60)) / 10);
|
||||
|
||||
local fmt = i18n.get('uittPvPTime');
|
||||
fmt = findReplaceAll(fmt, '%h', tostring(hours));
|
||||
fmt = findReplaceAll(fmt, '%m', tostring(minutes));
|
||||
fmt = findReplaceAll(fmt, '%s', tostring(seconds));
|
||||
return fmt;
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
function game:playerTTPvp()
|
||||
|
||||
-- The tooltip to display depends on the current display state
|
||||
local buttonMode= getDbProp("UI:TEMP:PVP_FACTION:DSP_MODE");
|
||||
local buttonPushed= (getDbProp("UI:TEMP:PVP_FACTION:DSP_PUSHED")==1);
|
||||
local buttonTimer= (getDbProp("UI:TEMP:PVP_FACTION:DSP_TIMER")==1);
|
||||
local text;
|
||||
|
||||
-- Flag mode?
|
||||
if(buttonMode==2) then
|
||||
local pvpServerFlagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:FLAG_PVP_TIME_LEFT');
|
||||
local currentServerTick = getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local tempsString = game:formatTime( pvpServerFlagTimer - currentServerTick );
|
||||
text = i18n.get('uittPvPModeFlag');
|
||||
text = findReplaceAll(text, '%temps', tempsString);
|
||||
-- Tag mode
|
||||
else
|
||||
-- base text
|
||||
if(buttonMode==0 and not(buttonPushed)) then
|
||||
text = i18n.get('uittPvPModeTagOff');
|
||||
elseif(buttonMode==0 and buttonPushed) then
|
||||
text = i18n.get('uittPvPModeTagOffChange');
|
||||
elseif(buttonMode==1 and not(buttonPushed)) then
|
||||
text = i18n.get('uittPvPModeTagOn');
|
||||
elseif(buttonMode==1 and buttonPushed) then
|
||||
text = i18n.get('uittPvPModeTagOnChange');
|
||||
else
|
||||
text = ucstring();
|
||||
end
|
||||
-- timer
|
||||
if(buttonTimer) then
|
||||
local pvpServerTagTimer = getDbPropU('SERVER:CHARACTER_INFO:PVP_FACTION_TAG:ACTIVATION_TIME');
|
||||
local currentServerTick = getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local tempsString = game:formatTime( pvpServerTagTimer - currentServerTick );
|
||||
local timeFmt= i18n.get('uittPvPTagTimer');
|
||||
timeFmt= findReplaceAll(timeFmt, '%temps', tempsString);
|
||||
text= concatUCString(text, timeFmt);
|
||||
end
|
||||
end
|
||||
|
||||
-- set the text
|
||||
setContextHelpText(text);
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
-- BONUS MALUS
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function game:bonusMalusActiveText(ui, slot, state)
|
||||
local uiTextGroup= ui["text" .. tostring(slot) ];
|
||||
if(uiTextGroup) then
|
||||
uiTextGroup.active= state;
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function game:bonusMalusSetText(ui, slot, fmt)
|
||||
local uiTextGroup= ui["text" .. tostring(slot) ];
|
||||
if(uiTextGroup) then
|
||||
uiTextGroup.shade0.uc_hardtext_format= fmt;
|
||||
uiTextGroup.shade1.uc_hardtext_format= fmt;
|
||||
uiTextGroup.shade2.uc_hardtext_format= fmt;
|
||||
uiTextGroup.shade3.uc_hardtext_format= fmt;
|
||||
uiTextGroup.text.uc_hardtext_format= fmt;
|
||||
uiTextGroup.text2.uc_hardtext_format= fmt;
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- From given DB vals, compute the 'Xp Bonus' text info
|
||||
function game:updateXpCatQuantity(textSlot, ui)
|
||||
-- get the ui text to fill
|
||||
if(ui==nil) then
|
||||
ui= getUICaller();
|
||||
end
|
||||
|
||||
-- format the text
|
||||
local fmt= "x@{FF6F}" .. tostring( getDbProp("SERVER:CHARACTER_INFO:XP_CATALYSER:Count") );
|
||||
|
||||
self:bonusMalusSetText(ui, textSlot, fmt);
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- From given DB vals, compute the 'Ring Xp Bonus' text info
|
||||
function game:updateRingXpCatQuantity(textSlot, ui)
|
||||
-- get the ui text to fill
|
||||
if(ui==nil) then
|
||||
ui= getUICaller();
|
||||
end
|
||||
|
||||
-- format the text
|
||||
local fmt= "x@{FF6F}" .. tostring( getDbProp("SERVER:CHARACTER_INFO:RING_XP_CATALYSER:Count") );
|
||||
|
||||
self:bonusMalusSetText(ui, textSlot, fmt);
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function game:outpostUpdatePVPTimer(textSlot, ui)
|
||||
-- get the ui text to fill
|
||||
if(ui==nil) then
|
||||
ui= getUICaller();
|
||||
end
|
||||
|
||||
-- Get the timer of interest (priority to player leaving the zone)
|
||||
local endTimer= 0;
|
||||
local endOfPvpTimer= getDbPropU('SERVER:CHARACTER_INFO:PVP_OUTPOST:FLAG_PVP_TIME_END');
|
||||
if( endOfPvpTimer>0 ) then
|
||||
endTimer= endOfPvpTimer;
|
||||
else
|
||||
local endOfRound= getDbProp('SERVER:CHARACTER_INFO:PVP_OUTPOST:ROUND_END_DATE');
|
||||
if( endOfRound>0 ) then
|
||||
endTimer= endOfRound;
|
||||
end
|
||||
end
|
||||
|
||||
-- Use a text with a timer?
|
||||
if( endTimer>0 ) then
|
||||
-- compute the time that lefts in sec (suppose a smooth server tick is 1 ms)
|
||||
local curTick= getDbPropU('UI:VARIABLES:CURRENT_SERVER_TICK');
|
||||
local timeSec= (endTimer- curTick)/10;
|
||||
-- replace in str
|
||||
local text= "@{FF6F}" .. runFct('secondsToTimeStringShort', timeSec);
|
||||
self:bonusMalusSetText(ui, textSlot, text);
|
||||
-- else Default display
|
||||
else
|
||||
self:bonusMalusSetText(ui, textSlot, "@{FF6F}on");
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function game:deathPenaltyUpdateXPMalus()
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called when someone click on a bonus malus icon. redirect to correct action handler if any
|
||||
function game:onLeftClickBonus()
|
||||
local ui= getUICaller();
|
||||
local id= getIndexInDB(ui);
|
||||
local ah= self.BonusMalus.BonusAHList[id];
|
||||
if(ui and ah) then
|
||||
runAH(ui, ah, "");
|
||||
end
|
||||
end
|
||||
|
||||
function game:onLeftClickMalus()
|
||||
local ui= getUICaller();
|
||||
local id= getIndexInDB(ui);
|
||||
local ah= self.BonusMalus.MalusAHList[id];
|
||||
if(ui and ah) then
|
||||
runAH(ui, ah, "");
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- update if needed the ActionHandler and text update from DB
|
||||
function game:updateBonusMalusTextSetup()
|
||||
local numLocalBonusMalus= getDefine("num_local_bonus_malus");
|
||||
local uiBonus= getUI('ui:interface:bonus_malus:header_opened:bonus');
|
||||
local uiMalus= getUI('ui:interface:bonus_malus:header_opened:malus');
|
||||
local dbXpCat= "@SERVER:CHARACTER_INFO:XP_CATALYSER:Count";
|
||||
local dbRingXpCat= "@SERVER:CHARACTER_INFO:RING_XP_CATALYSER:Count";
|
||||
local dbOutpost= "@SERVER:CHARACTER_INFO:PVP_OUTPOST, @UI:VARIABLES:CURRENT_SERVER_TICK";
|
||||
local dbDeathPenalty= "@SERVER:USER:DEATH_XP_MALUS";
|
||||
|
||||
|
||||
-- reset cache
|
||||
self.BonusMalus.DeathPenaltyBefore= self.BonusMalus.DeathPenaltyAfter;
|
||||
self.BonusMalus.XPCatSlotBefore= self.BonusMalus.XPCatSlotAfter;
|
||||
self.BonusMalus.RingXPCatSlotBefore= self.BonusMalus.RingXPCatSlotAfter;
|
||||
self.BonusMalus.OutpostSlotBefore= self.BonusMalus.OutpostSlotAfter;
|
||||
|
||||
|
||||
-- *** remove and hide any preceding
|
||||
for i= 0,numLocalBonusMalus-1 do
|
||||
-- reset AH
|
||||
self.BonusMalus.BonusAHList[i]= nil;
|
||||
self.BonusMalus.MalusAHList[i]= nil;
|
||||
-- hide text view
|
||||
self:bonusMalusActiveText(uiBonus, i, false);
|
||||
-- reset special tooltip
|
||||
setDbProp( formatUI('UI:VARIABLES:BONUS:#1:SPECIAL_TOOLTIP', i), game.TBonusMalusSpecialTT.None);
|
||||
end
|
||||
removeOnDbChange(uiBonus, dbXpCat);
|
||||
removeOnDbChange(uiBonus, dbRingXpCat);
|
||||
removeOnDbChange(uiBonus, dbOutpost);
|
||||
|
||||
|
||||
-- *** set new XPCat setup
|
||||
local slot= self.BonusMalus.XPCatSlotAfter;
|
||||
if(slot~=-1) then
|
||||
-- set AH to use for this slot
|
||||
self.BonusMalus.BonusAHList[slot]= "xp_catalyser_stop_use";
|
||||
-- add DB change, and call now! else not updated
|
||||
addOnDbChange(uiBonus, dbXpCat, formatUI("game:updateXpCatQuantity(#1, nil)", slot) );
|
||||
self:updateXpCatQuantity(slot, uiBonus);
|
||||
-- show text
|
||||
self:bonusMalusActiveText(uiBonus, slot, true);
|
||||
-- set special tooltip (id==1 for xpcat)
|
||||
setDbProp( formatUI('UI:VARIABLES:BONUS:#1:SPECIAL_TOOLTIP', slot), game.TBonusMalusSpecialTT.XpCatalyser);
|
||||
end
|
||||
|
||||
-- *** set new RingXPCat setup
|
||||
local slot= self.BonusMalus.RingXPCatSlotAfter;
|
||||
if(slot~=-1) then
|
||||
-- set AH to use for this slot
|
||||
self.BonusMalus.BonusAHList[slot]= "ring_xp_catalyser_stop_use";
|
||||
-- add DB change, and call now! else not updated
|
||||
addOnDbChange(uiBonus, dbRingXpCat, formatUI("game:updateRingXpCatQuantity(#1, nil)", slot) );
|
||||
self:updateRingXpCatQuantity(slot, uiBonus);
|
||||
-- show text
|
||||
self:bonusMalusActiveText(uiBonus, slot, true);
|
||||
-- set special tooltip (id==1 for ringxpcat)
|
||||
setDbProp( formatUI('UI:VARIABLES:BONUS:#1:SPECIAL_TOOLTIP', slot), game.TBonusMalusSpecialTT.XpCatalyser);
|
||||
end
|
||||
|
||||
|
||||
-- *** set new Outpost setup
|
||||
local slot= self.BonusMalus.OutpostSlotAfter;
|
||||
if(slot~=-1) then
|
||||
-- no AH
|
||||
-- add DB change, and call now! else not updated
|
||||
addOnDbChange(uiBonus, dbOutpost, formatUI("game:outpostUpdatePVPTimer(#1, nil)", slot) );
|
||||
self:outpostUpdatePVPTimer(slot, uiBonus);
|
||||
-- show text
|
||||
self:bonusMalusActiveText(uiBonus, slot, true);
|
||||
-- don't set the tooltip here, because redone after return
|
||||
end
|
||||
|
||||
|
||||
-- *** set new DeathPenalty setup
|
||||
local slot= self.BonusMalus.DeathPenaltyAfter;
|
||||
if(slot~=-1) then
|
||||
-- no AH
|
||||
-- add DB change, and call now! else not updated
|
||||
addOnDbChange(uiMalus, dbDeathPenalty, formatUI("game:deathPenaltyUpdateXPMalus(#1, nil)", slot) );
|
||||
self:deathPenaltyUpdateXPMalus(slot, uiMalus);
|
||||
-- show text
|
||||
self:bonusMalusActiveText(uiMalus, slot, true);
|
||||
-- set special tooltip (id==1 for death penalty)
|
||||
setDbProp( formatUI('UI:VARIABLES:MALUS:#1:SPECIAL_TOOLTIP', slot), game.TBonusMalusSpecialTT.DeathPenalty);
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- Update Bonus malus local DB according to server DB
|
||||
function game:updatePlayerBonusMalus()
|
||||
local numServerBonusMalus= tonumber(getDefine("num_server_bonus_malus"));
|
||||
local numLocalBonusMalus= tonumber(getDefine("num_local_bonus_malus"));
|
||||
local dbServerBonusBase= getDefine("bonus") .. ":" ;
|
||||
local dbServerMalusBase= getDefine("malus") .. ":" ;
|
||||
local dbLocalBonusBase= "UI:VARIABLES:BONUS:";
|
||||
local dbLocalMalusBase= "UI:VARIABLES:MALUS:";
|
||||
|
||||
local i;
|
||||
local mustUpdateTextSetup= false;
|
||||
|
||||
|
||||
-- ***********************
|
||||
-- *** Insert Bonus
|
||||
-- ***********************
|
||||
local destIndex= 0;
|
||||
local mustShowBonus= false;
|
||||
|
||||
-- *** Insert XPCatalyzer first
|
||||
local xpcatCount= getDbProp("SERVER:CHARACTER_INFO:XP_CATALYSER:Count");
|
||||
if(xpcatCount~=0) then
|
||||
local xpcatLevel= getDbProp("SERVER:CHARACTER_INFO:XP_CATALYSER:Level");
|
||||
-- Get the most appropriate icon
|
||||
local iconLevel= 50;
|
||||
for i= 50,250,50 do
|
||||
if(i<=xpcatLevel) then
|
||||
iconLevel= i;
|
||||
end
|
||||
end
|
||||
-- Set the DB for this brick
|
||||
mustShowBonus= true;
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":SHEET", getSheetId('big_xpcat_' .. tostring(iconLevel) .. '.sbrick' ) );
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":DISABLED", 0 );
|
||||
self.BonusMalus.XPCatSlotAfter = destIndex;
|
||||
destIndex= destIndex+1;
|
||||
else
|
||||
self.BonusMalus.XPCatSlotAfter = -1;
|
||||
end
|
||||
if(self.BonusMalus.XPCatSlotAfter ~= self.BonusMalus.XPCatSlotBefore) then
|
||||
mustUpdateTextSetup= true;
|
||||
end
|
||||
|
||||
-- *** Then insert RingXPCatalyzer
|
||||
local ringxpcatCount= getDbProp("SERVER:CHARACTER_INFO:RING_XP_CATALYSER:Count");
|
||||
if(ringxpcatCount~=0) then
|
||||
local ringxpcatLevel= getDbProp("SERVER:CHARACTER_INFO:RING_XP_CATALYSER:Level");
|
||||
-- Get the most appropriate icon
|
||||
local iconLevel= 50;
|
||||
for i= 50,250,50 do
|
||||
if(i<=ringxpcatLevel) then
|
||||
iconLevel= i;
|
||||
end
|
||||
end
|
||||
-- Set the DB for this brick
|
||||
mustShowBonus= true;
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":SHEET", getSheetId('big_ring_xpcat_' .. tostring(iconLevel) .. '.sbrick' ) );
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":DISABLED", 0 );
|
||||
self.BonusMalus.RingXPCatSlotAfter = destIndex;
|
||||
destIndex= destIndex+1;
|
||||
else
|
||||
self.BonusMalus.RingXPCatSlotAfter = -1;
|
||||
end
|
||||
if(self.BonusMalus.RingXPCatSlotAfter ~= self.BonusMalus.RingXPCatSlotBefore) then
|
||||
mustUpdateTextSetup= true;
|
||||
end
|
||||
|
||||
|
||||
-- *** Insert PVPOutpost
|
||||
local pvpOutpostPresent= getDbProp("SERVER:CHARACTER_INFO:PVP_OUTPOST:FLAG_PVP");
|
||||
local pvpOutpostEndOfPVPFlag= 0;
|
||||
local pvpOutpostEndOfRound= 0;
|
||||
if(pvpOutpostPresent~=0) then
|
||||
local pvpOutpostLevel= 0;
|
||||
pvpOutpostEndOfPVPFlag= getDbPropU('SERVER:CHARACTER_INFO:PVP_OUTPOST:FLAG_PVP_TIME_END');
|
||||
pvpOutpostEndOfRound= getDbPropU('SERVER:CHARACTER_INFO:PVP_OUTPOST:ROUND_END_DATE');
|
||||
-- set a level only if we have some round, and if the out timer is not set
|
||||
if(pvpOutpostEndOfRound~=0 and pvpOutpostEndOfPVPFlag==0) then
|
||||
pvpOutpostLevel= 1 + getDbProp('SERVER:CHARACTER_INFO:PVP_OUTPOST:ROUND_LVL_CUR');
|
||||
end
|
||||
|
||||
-- Set the DB for this brick
|
||||
mustShowBonus= true;
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":SHEET", getSheetId('big_outpost_pvp_' .. tostring(pvpOutpostLevel) .. '.sbrick' ) );
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":DISABLED", 0 );
|
||||
self.BonusMalus.OutpostSlotAfter = destIndex;
|
||||
destIndex= destIndex+1;
|
||||
else
|
||||
self.BonusMalus.OutpostSlotAfter = -1;
|
||||
end
|
||||
if(self.BonusMalus.OutpostSlotAfter ~= self.BonusMalus.OutpostSlotBefore) then
|
||||
mustUpdateTextSetup= true;
|
||||
end
|
||||
|
||||
|
||||
-- *** Insert standard Bonus
|
||||
for i=0,numServerBonusMalus-1 do
|
||||
-- get
|
||||
local sheet= getDbProp(dbServerBonusBase .. tostring(i) .. ":SHEET" );
|
||||
local disabled= getDbProp(dbServerBonusBase .. tostring(i) .. ":DISABLED" );
|
||||
if(sheet~=0) then
|
||||
mustShowBonus= true;
|
||||
end
|
||||
-- copy (to index shifted if needed)
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":SHEET", sheet );
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":DISABLED", disabled );
|
||||
destIndex= destIndex+1;
|
||||
end
|
||||
if(mustShowBonus) then
|
||||
setDbProp("UI:VARIABLES:SHOW_BONUS", 1);
|
||||
else
|
||||
setDbProp("UI:VARIABLES:SHOW_BONUS", 0);
|
||||
end
|
||||
|
||||
|
||||
-- *** erase any remaining bonus
|
||||
while destIndex<numLocalBonusMalus do
|
||||
setDbProp(dbLocalBonusBase .. tostring(destIndex) .. ":SHEET", 0 );
|
||||
destIndex= destIndex + 1;
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ***********************
|
||||
-- *** Insert Malus
|
||||
-- ***********************
|
||||
local mustShowMalus= false;
|
||||
destIndex= 0;
|
||||
|
||||
-- *** Insert Death Penalty first
|
||||
local deathPenalty= getDbProp("SERVER:USER:DEATH_XP_MALUS");
|
||||
if(deathPenalty~=255 and deathPenalty~=0) then
|
||||
-- Set the DB for this brick
|
||||
mustShowMalus= true;
|
||||
setDbProp(dbLocalMalusBase .. tostring(destIndex) .. ":SHEET", getSheetId('death_penalty.sbrick' ) );
|
||||
setDbProp(dbLocalMalusBase .. tostring(destIndex) .. ":DISABLED", 0 );
|
||||
self.BonusMalus.DeathPenaltyAfter = destIndex;
|
||||
destIndex= destIndex+1;
|
||||
else
|
||||
self.BonusMalus.DeathPenaltyAfter = -1;
|
||||
end
|
||||
if(self.BonusMalus.DeathPenaltyAfter ~= self.BonusMalus.DeathPenaltyBefore) then
|
||||
mustUpdateTextSetup= true;
|
||||
end
|
||||
|
||||
-- *** insert standard malus
|
||||
for i=0,numServerBonusMalus-1 do
|
||||
-- get
|
||||
local sheet= getDbProp(dbServerMalusBase .. tostring(i) .. ":SHEET" );
|
||||
local disabled= getDbProp(dbServerMalusBase .. tostring(i) .. ":DISABLED" );
|
||||
if(sheet~=0) then
|
||||
mustShowMalus= true;
|
||||
end
|
||||
-- copy
|
||||
setDbProp(dbLocalMalusBase .. tostring(destIndex) .. ":SHEET", sheet );
|
||||
setDbProp(dbLocalMalusBase .. tostring(destIndex) .. ":DISABLED", disabled );
|
||||
destIndex= destIndex+1;
|
||||
end
|
||||
if(mustShowMalus) then
|
||||
setDbProp("UI:VARIABLES:SHOW_MALUS", 1);
|
||||
else
|
||||
setDbProp("UI:VARIABLES:SHOW_MALUS", 0);
|
||||
end
|
||||
|
||||
|
||||
-- *** erase any remaining malus
|
||||
while destIndex<numLocalBonusMalus do
|
||||
setDbProp(dbLocalMalusBase .. tostring(destIndex) .. ":SHEET", 0 );
|
||||
destIndex= destIndex + 1;
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ***********************
|
||||
-- *** update Text setup
|
||||
-- ***********************
|
||||
if(mustUpdateTextSetup) then
|
||||
game:updateBonusMalusTextSetup();
|
||||
end
|
||||
|
||||
-- set special tooltip for outpost (id==2,3,4 for outpost)
|
||||
if(self.BonusMalus.OutpostSlotAfter ~= -1) then
|
||||
local dbFmt= formatUI('UI:VARIABLES:BONUS:#1:SPECIAL_TOOLTIP', self.BonusMalus.OutpostSlotAfter);
|
||||
if(pvpOutpostEndOfPVPFlag ~= 0) then
|
||||
setDbProp(dbFmt, game.TBonusMalusSpecialTT.OutpostPVPOutOfZone);
|
||||
elseif(pvpOutpostEndOfRound ~= 0) then
|
||||
setDbProp(dbFmt, game.TBonusMalusSpecialTT.OutpostPVPInRound);
|
||||
else
|
||||
setDbProp(dbFmt, game.TBonusMalusSpecialTT.OutpostPVPOn);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
-- CURRENT ACTION
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function game:updateCurrentActionPosition()
|
||||
local uiMemory= getUI("ui:interface:gestionsets");
|
||||
local uiAction= getUI("ui:interface:current_action");
|
||||
local uiMain= getUI("ui:interface");
|
||||
if(uiAction and uiMain and uiMemory and uiMemory.active) then
|
||||
|
||||
-- NB: must use harcoded 182 and 40 size for the window, because may not be active at this time
|
||||
|
||||
-- refresh the x position
|
||||
uiAction.x= uiMemory.x_real + uiMemory.w_real/2 - 182/2;
|
||||
|
||||
-- setup the y position according to position of the memory bar
|
||||
local distBelow= uiMemory.y_real;
|
||||
local distAbove= uiMain.h - (uiMemory.y_real + uiMemory.h_real);
|
||||
if(distBelow < distAbove) then
|
||||
uiAction.y= uiMemory.y_real + uiMemory.h_real + 40;
|
||||
else
|
||||
uiAction.y= uiMemory.y_real;
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
LastTooltipPhrase = nil
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- tool function used by game:updatePhraseTooltip
|
||||
function game:setPhraseTooltipCarac(ttWin, name, value, textValue)
|
||||
local icon = ttWin:find(name)
|
||||
local text = ttWin:find(name .. "_text")
|
||||
if value == 0 then
|
||||
icon.active = false
|
||||
text.active = false
|
||||
else
|
||||
icon.active = true
|
||||
text.active = true
|
||||
if textValue ~= nil then
|
||||
text.uc_hardtext = textValue
|
||||
else
|
||||
text.hardtext = tostring(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function game:timeInSecondsToReadableTime(regenTime)
|
||||
local seconds = math.mod(regenTime, 60)
|
||||
local minutes = math.mod(math.floor(regenTime / 60), 60)
|
||||
local hours = math.floor(regenTime / 3600)
|
||||
local result = ""
|
||||
if seconds > 0 then result = concatUCString(tostring(seconds), i18n.get("uittSecondsShort")) end
|
||||
if minutes > 0 then result = concatUCString(tostring(minutes), i18n.get("uittMinutesShort"), result) end
|
||||
if hours > 0 then result = concatUCString(tostring(hours), i18n.get("uittHoursShort"), result) end
|
||||
return result
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- display the time left for a power / auras in its tooltip
|
||||
function game:setPhraseTooltipPowerRegenTime(ttWin, regenTimeInTicks)
|
||||
local text = ttWin:find("regen_time")
|
||||
if regenTimeInTicks == 0 then
|
||||
text.active = false
|
||||
else
|
||||
text.active = true
|
||||
text.uc_hardtext_single_line_format = concatUCString(i18n.get("uittRegenTime"), game:timeInSecondsToReadableTime(math.floor((regenTimeInTicks + 9) * 0.1)))
|
||||
text:invalidateCoords()
|
||||
ttWin:invalidateCoords()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local EmptyUCString = ucstring()
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called by C++ code when the tooltip of a phrase is about to be displayed
|
||||
function game:updatePhraseTooltip(phrase)
|
||||
LastTooltipPhrase = phrase
|
||||
local ttWin = getUI("ui:interface:action_context_help")
|
||||
local text = phrase:getName()
|
||||
|
||||
if not text or text == EmptyUCString then
|
||||
text = ucstring("")
|
||||
end
|
||||
|
||||
local desc = phrase:getDesc()
|
||||
if desc and desc ~= EmptyUCString then
|
||||
local str = tostring(desc)
|
||||
local charFound = false
|
||||
for k = 1, string.len(str) do
|
||||
if string.byte(str, k) ~= 32 then
|
||||
charFound = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if charFound then
|
||||
text = concatUCString(text, "\n@{CCCF}", desc)
|
||||
end
|
||||
else
|
||||
text = concatUCString(text, "@{CCCF}")
|
||||
end
|
||||
-- IMPORTANT : the following getters on 'phrase' take in account the 'total action malus' for the timebeing
|
||||
self:setPhraseTooltipCarac(ttWin, "hp_cost", phrase:getHpCost())
|
||||
self:setPhraseTooltipCarac(ttWin, "sta_cost", phrase:getStaCost())
|
||||
self:setPhraseTooltipCarac(ttWin, "sap_cost", phrase:getSapCost())
|
||||
self:setPhraseTooltipCarac(ttWin, "focus_cost", phrase:getFocusCost())
|
||||
self:setPhraseTooltipCarac(ttWin, "cast_time", phrase:getCastTime(), concatUCString(string.format("%.1f", phrase:getCastTime()), i18n.get("uittSeconds")))
|
||||
local castRange = phrase:getCastRange()
|
||||
if not phrase:isMagicPhrase() then
|
||||
castRange = 0
|
||||
end
|
||||
self:setPhraseTooltipCarac(ttWin, "cast_range", castRange, concatUCString(tostring(castRange), i18n.get("uittMeters")))
|
||||
-- if the phrase is a power / aura, then we may want to display its regen time in the tooltip
|
||||
if phrase:isPowerPhrase() then
|
||||
setOnDraw(ttWin, "game:updatePowerPhraseTooltip()")
|
||||
else
|
||||
setOnDraw(ttWin, "")
|
||||
end
|
||||
--
|
||||
local successRateText = ttWin:find("success_rate")
|
||||
local successRate = phrase:getSuccessRate()
|
||||
if successRate == 0 then
|
||||
successRateText.active = false
|
||||
else
|
||||
successRateText.active = true
|
||||
successRateText.uc_hardtext_single_line_format = concatUCString(i18n.get("uittSuccessRate"), tostring(successRate), " %")
|
||||
end
|
||||
|
||||
local disableTimeText = ttWin:find("disable_time")
|
||||
if phrase:isPowerPhrase() then
|
||||
local disableTime = phrase:getPowerDisableTime()
|
||||
if disableTime == 0 then
|
||||
disableTimeText.active = false
|
||||
else
|
||||
disableTimeText.active = true
|
||||
disableTimeText.uc_hardtext_single_line_format = concatUCString(i18n.get("uittDisableTime"), game:timeInSecondsToReadableTime(disableTime / 10))
|
||||
end
|
||||
else
|
||||
disableTimeText.active = false
|
||||
end
|
||||
game:updatePowerPhraseTooltip()
|
||||
updateTooltipCoords()
|
||||
return text
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called at each frame when a power/aura tooltip is displayed,in order to update the regen countdown
|
||||
function game:updatePowerPhraseTooltip()
|
||||
local ttWin = getUI("ui:interface:action_context_help")
|
||||
local leftRegenTime = 0
|
||||
if LastTooltipPhrase:isPowerPhrase() then
|
||||
leftRegenTime = LastTooltipPhrase:getTotalRegenTime() - LastTooltipPhrase:getRegenTime()
|
||||
end
|
||||
if leftRegenTime < 0 then
|
||||
leftRegenTime = 0
|
||||
end
|
||||
self:setPhraseTooltipPowerRegenTime(ttWin, leftRegenTime)
|
||||
updateTooltipCoords()
|
||||
end
|
||||
|
||||
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
-- CURRENT BUFF ITEM
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called by C++ code when the tooltip of a buff item is about to be displayed
|
||||
function game:updateBuffItemTooltip(buffItem)
|
||||
local ttWin = getUI("ui:interface:buff_item_context_help")
|
||||
local text = buffItem:getName()
|
||||
|
||||
self:setPhraseTooltipCarac(ttWin, "hp_buff", buffItem:getHpBuff())
|
||||
self:setPhraseTooltipCarac(ttWin, "sta_buff", buffItem:getStaBuff())
|
||||
self:setPhraseTooltipCarac(ttWin, "sap_buff", buffItem:getSapBuff())
|
||||
self:setPhraseTooltipCarac(ttWin, "focus_buff", buffItem:getFocusBuff())
|
||||
|
||||
updateTooltipCoords()
|
||||
return text
|
||||
end
|
||||
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
-- CURRENT CRYSTALLIZED SPELL
|
||||
-- ***************************************************************************
|
||||
-- ***************************************************************************
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
-- called by C++ code when the tooltip of a cristallized spell is about to be displayed
|
||||
function game:updateCrystallizedSpellTooltip(crystallizedSpell)
|
||||
local ttWin = getUI("ui:interface:crystallized_spell_context_help")
|
||||
local text = crystallizedSpell:getName()
|
||||
|
||||
crystallizedSpell:buildCrystallizedSpellListBrick()
|
||||
|
||||
updateTooltipCoords()
|
||||
return text
|
||||
end
|
1483
code/ryzom/client/data/gamedev/syui_v3/syui/player.xml
Normal file
1483
code/ryzom/client/data/gamedev/syui_v3/syui/player.xml
Normal file
File diff suppressed because it is too large
Load diff
433
code/ryzom/client/data/gamedev/syui_v3/syui/syui.lua
Normal file
433
code/ryzom/client/data/gamedev/syui_v3/syui/syui.lua
Normal file
|
@ -0,0 +1,433 @@
|
|||
-- 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
|
Binary file not shown.
After Width: | Height: | Size: 4 MiB |
File diff suppressed because it is too large
Load diff
7183
code/ryzom/client/data/gamedev/syui_v3/syui/widgets.xml
Normal file
7183
code/ryzom/client/data/gamedev/syui_v3/syui/widgets.xml
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue