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
This commit is contained in:
Llapp 2016-05-22 23:04:30 +02:00
parent 6072a75a07
commit d3ec4213d4
12 changed files with 25701 additions and 0 deletions

View 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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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

File diff suppressed because it is too large Load diff

View 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

File diff suppressed because it is too large Load diff