Get rid of trailing whitespace.
Commit generated by command: find -type f ! -path '*.git*' ! -path '*.png' ! -path '*.ico' ! -path \ '*.ogg' | xargs -I '{}' sed -i '{}' -e 's/\t*$//g' -e 's/ *$//g'
This commit is contained in:
parent
3750a85c5f
commit
e6c9e78935
|
@ -6,7 +6,7 @@ locale = {
|
|||
name = "es",
|
||||
charset = "cp1252",
|
||||
languageName = "Español",
|
||||
|
||||
|
||||
translation = {
|
||||
["1a) Offensive Name"] = "1a) Nombre ofensivo",
|
||||
["1b) Invalid Name Format"] = "1b) Formato invalido para nombre",
|
||||
|
@ -154,7 +154,7 @@ locale = {
|
|||
["Hide spells for higher exp. levels"] = "Ocultar hechizos para niveles mas altos que tu experiencia.",
|
||||
["Hide spells for other vocations"] = "Ocultar hechizos que sean para otra vocación",
|
||||
["Hit Points"] = "Puntos de vida",
|
||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga presionado el botón derecho del ratón para navegar\nDezplaze la rueda central del ratón para ampliar\nbotón derecho del mouse para crear marcas del mapa",
|
||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga presionado el botón derecho del ratón para navegar\nDezplaze la rueda central del ratón para ampliar\nbotón derecho del mouse para crear marcas del mapa",
|
||||
["Hotkeys"] = "Hotkeys",
|
||||
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Si se cierra el programa, tu personaje puede permanecer en el juego.\nHaga clic en 'Salir' para asegurarse de que personaje deja el juego correctamente.\nHaga click en 'Salir' si desea salir del programa sin tener que salir de tu personaje.",
|
||||
["Ignore"] = "Ignorar",
|
||||
|
@ -374,5 +374,5 @@ locale = {
|
|||
["Don't stretch or shrink Game Window"] = "No estirar o encoger Ventana de Juego"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
modules.client_locales.installLocale(locale)
|
|
@ -146,7 +146,7 @@ MinimapFlagWindow < MainWindow
|
|||
anchors.left: parent.left
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
margin-left: 0
|
||||
margin-left: 0
|
||||
|
||||
MinimapFlagCheckBox
|
||||
id: flag1
|
||||
|
@ -190,7 +190,7 @@ MinimapFlagWindow < MainWindow
|
|||
anchors.left: parent.left
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
margin-left: 0
|
||||
margin-left: 0
|
||||
|
||||
MinimapFlagCheckBox
|
||||
id: flag11
|
||||
|
|
|
@ -53,7 +53,7 @@ function startup()
|
|||
end
|
||||
|
||||
function init()
|
||||
connect(g_app, { onRun = startup,
|
||||
connect(g_app, { onRun = startup,
|
||||
onExit = exit })
|
||||
|
||||
g_window.setMinimumSize({ width = 600, height = 480 })
|
||||
|
@ -94,11 +94,11 @@ function init()
|
|||
if not g_crypt.setMachineUUID(g_configs.get('uuid')) then
|
||||
g_configs.set('uuid', g_crypt.getMachineUUID())
|
||||
g_configs.save()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function terminate()
|
||||
disconnect(g_app, { onRun = startup,
|
||||
disconnect(g_app, { onRun = startup,
|
||||
onExit = exit })
|
||||
-- save window configs
|
||||
g_settings.set('window-size', g_window.getUnmaximizedSize())
|
||||
|
|
|
@ -243,7 +243,7 @@ function CharacterList.create(characters, account, otui)
|
|||
else
|
||||
accountStatusLabel:setText(tr('Free Account'))
|
||||
end
|
||||
|
||||
|
||||
if account.premDays > 0 and account.premDays <= 7 then
|
||||
accountStatusLabel:setOn(true)
|
||||
else
|
||||
|
|
|
@ -81,7 +81,7 @@ MainWindow
|
|||
anchors.right: parent.right
|
||||
anchors.bottom: next.top
|
||||
margin-bottom: 1
|
||||
|
||||
|
||||
Label
|
||||
id: accountStatusLabel
|
||||
!text: tr('Free Account')
|
||||
|
|
|
@ -225,7 +225,7 @@ function EnterGame.doLogin()
|
|||
|
||||
g_settings.set('host', G.host)
|
||||
g_settings.set('port', G.port)
|
||||
g_settings.set('client-version', clientVersion)
|
||||
g_settings.set('client-version', clientVersion)
|
||||
|
||||
protocolLogin = ProtocolLogin.create()
|
||||
protocolLogin.onLoginError = onError
|
||||
|
|
|
@ -39,10 +39,10 @@ Panel
|
|||
id: fullscreen
|
||||
!text: tr('Fullscreen')
|
||||
tooltip: Ctrl+Shift+F
|
||||
|
||||
|
||||
OptionCheckBox
|
||||
id: dontStretchShrink
|
||||
!text: tr('Don\'t stretch/shrink Game Window')
|
||||
!text: tr('Don\'t stretch/shrink Game Window')
|
||||
|
||||
Label
|
||||
id: backgroundFrameRateLabel
|
||||
|
|
|
@ -50,7 +50,7 @@ function ServerList.add(host, port, protocol, load)
|
|||
end
|
||||
local widget = g_ui.createWidget('ServerWidget', serverTextList)
|
||||
widget:setId(host)
|
||||
|
||||
|
||||
if not load then
|
||||
servers[host] = {
|
||||
port = port,
|
||||
|
|
|
@ -131,11 +131,11 @@ function init()
|
|||
commandTextEdit = terminalWindow:getChildById('commandTextEdit')
|
||||
g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit)
|
||||
g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit)
|
||||
g_keyboard.bindKeyPress('Ctrl+C',
|
||||
function()
|
||||
g_keyboard.bindKeyPress('Ctrl+C',
|
||||
function()
|
||||
if commandTextEdit:hasSelection() or not terminalSelectText:hasSelection() then return false end
|
||||
g_window.setClipboardText(terminalSelectText:getSelection())
|
||||
return true
|
||||
return true
|
||||
end, commandTextEdit)
|
||||
g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit)
|
||||
g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit)
|
||||
|
|
|
@ -55,7 +55,7 @@ end
|
|||
|
||||
function table.find(t, value, lowercase)
|
||||
for k,v in pairs(t) do
|
||||
if lowercase and type(value) == 'string' and type(v) == 'string' then
|
||||
if lowercase and type(value) == 'string' and type(v) == 'string' then
|
||||
if v:lower() == value:lower() then return k end
|
||||
end
|
||||
if v == value then return k end
|
||||
|
@ -64,7 +64,7 @@ end
|
|||
|
||||
function table.findbykey(t, key, lowercase)
|
||||
for k,v in pairs(t) do
|
||||
if lowercase and type(key) == 'string' and type(k) == 'string' then
|
||||
if lowercase and type(key) == 'string' and type(k) == 'string' then
|
||||
if k:lower() == key:lower() then return v end
|
||||
end
|
||||
if k == key then return v end
|
||||
|
@ -149,7 +149,7 @@ function table.size(t)
|
|||
for i, n in pairs(t) do
|
||||
size = size + 1
|
||||
end
|
||||
|
||||
|
||||
return size
|
||||
end
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ function UIMiniWindow:setup()
|
|||
self:minimize()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
self:getChildById('miniwindowTopBar').onDoubleClick =
|
||||
function()
|
||||
if self:isOn() then
|
||||
|
|
|
@ -8,7 +8,7 @@ end
|
|||
|
||||
local function updateMargins(tabBar, ignored)
|
||||
if #tabBar.tabs == 0 then return end
|
||||
|
||||
|
||||
local currentMargin = 0
|
||||
for i = 1, #tabBar.tabs do
|
||||
tabBar.tabs[i]:setMarginLeft(currentMargin)
|
||||
|
@ -279,17 +279,17 @@ end
|
|||
function UIMoveableTabBar:moveTab(tab, units)
|
||||
local index = table.find(self.tabs, tab)
|
||||
if index == nil then return end
|
||||
|
||||
|
||||
local focus = false
|
||||
if self.currentTab == tab then
|
||||
self:selectPrevTab()
|
||||
focus = true
|
||||
end
|
||||
|
||||
|
||||
table.remove(self.tabs, index)
|
||||
|
||||
|
||||
local newIndex = math.min(#self.tabs+1, math.max(index + units, 1))
|
||||
table.insert(self.tabs, newIndex, tab)
|
||||
table.insert(self.tabs, newIndex, tab)
|
||||
if focus then self:selectTab(tab) end
|
||||
updateMargins(self)
|
||||
return newIndex
|
||||
|
|
|
@ -47,7 +47,7 @@ end
|
|||
|
||||
function UIRadioGroup:clearSelected()
|
||||
if not self.selectedWidget then return end
|
||||
|
||||
|
||||
local previousSelectedWidget = self.selectedWidget
|
||||
self.selectedWidget:setChecked(false)
|
||||
self.selectedWidget = nil
|
||||
|
|
|
@ -32,11 +32,11 @@ function init()
|
|||
|
||||
filterPanel = battleWindow:recursiveGetChildById('filterPanel')
|
||||
toggleFilterButton = battleWindow:recursiveGetChildById('toggleFilterButton')
|
||||
|
||||
|
||||
if isHidingFilters() then
|
||||
hideFilterPanel()
|
||||
end
|
||||
|
||||
|
||||
sortTypeBox = battleWindow:recursiveGetChildById('sortTypeBox')
|
||||
sortOrderBox = battleWindow:recursiveGetChildById('sortOrderBox')
|
||||
hidePlayersButton = battleWindow:recursiveGetChildById('hidePlayers')
|
||||
|
@ -63,7 +63,7 @@ function init()
|
|||
sortOrderBox:addOption('Desc.', 'desc')
|
||||
sortOrderBox:setCurrentOptionByData(getSortOrder())
|
||||
sortOrderBox.onOptionChange = onChangeSortOrder
|
||||
|
||||
|
||||
connect(Creature, {
|
||||
onSkullChange = updateCreatureSkull,
|
||||
onEmblemChange = updateCreatureEmblem,
|
||||
|
@ -73,7 +73,7 @@ function init()
|
|||
onAppear = onCreatureAppear,
|
||||
onDisappear = onCreatureDisappear
|
||||
})
|
||||
|
||||
|
||||
connect(LocalPlayer, {
|
||||
onPositionChange = onCreaturePositionChange
|
||||
})
|
||||
|
@ -95,7 +95,7 @@ function terminate()
|
|||
battleWindow:destroy()
|
||||
mouseWidget:destroy()
|
||||
|
||||
disconnect(Creature, {
|
||||
disconnect(Creature, {
|
||||
onSkullChange = updateCreatureSkull,
|
||||
onEmblemChange = updateCreatureEmblem,
|
||||
onOutfitChange = onCreatureOutfitChange,
|
||||
|
@ -108,7 +108,7 @@ function terminate()
|
|||
disconnect(LocalPlayer, {
|
||||
onPositionChange = onCreaturePositionChange
|
||||
})
|
||||
|
||||
|
||||
disconnect(g_game, {
|
||||
onAttackingCreatureChange = onAttack,
|
||||
onFollowingCreatureChange = onFollow,
|
||||
|
@ -296,17 +296,17 @@ function onCreaturePositionChange(creature, newPos, oldPos)
|
|||
for id, creatureButton in pairs(battleButtonsByCreaturesList) do
|
||||
table.insert(distanceList, {distance = getDistanceBetween(newPos, creatureButton.creature:getPosition()), widget = creatureButton})
|
||||
end
|
||||
|
||||
|
||||
if isSortAsc() then
|
||||
table.sort(distanceList, function(a, b) return a.distance < b.distance end)
|
||||
else
|
||||
table.sort(distanceList, function(a, b) return a.distance > b.distance end)
|
||||
table.sort(distanceList, function(a, b) return a.distance > b.distance end)
|
||||
end
|
||||
|
||||
|
||||
for i = 1, #distanceList do
|
||||
battlePanel:moveChildToIndex(distanceList[i].widget, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for id, creatureButton in pairs(battleButtonsByCreaturesList) do
|
||||
addCreature(creatureButton.creature)
|
||||
|
@ -356,7 +356,7 @@ function addCreature(creature)
|
|||
if not creatureAgeList[creatureId] then
|
||||
creatureAgeList[creatureId] = os.time()
|
||||
end
|
||||
|
||||
|
||||
if not battleButton then
|
||||
battleButton = g_ui.createWidget('BattleButton')
|
||||
battleButton:setup(creature)
|
||||
|
@ -373,14 +373,14 @@ function addCreature(creature)
|
|||
if creature == g_game.getFollowingCreature() then
|
||||
onFollow(creature)
|
||||
end
|
||||
|
||||
|
||||
local inserted = false
|
||||
local nameLower = creature:getName():lower()
|
||||
local healthPercent = creature:getHealthPercent()
|
||||
local playerPosition = g_game.getLocalPlayer():getPosition()
|
||||
local distance = getDistanceBetween(playerPosition, creature:getPosition())
|
||||
local age = creatureAgeList[creatureId]
|
||||
|
||||
|
||||
local childCount = battlePanel:getChildCount()
|
||||
for i = 1, childCount do
|
||||
local child = battlePanel:getChildByIndex(i)
|
||||
|
@ -412,9 +412,9 @@ function addCreature(creature)
|
|||
break
|
||||
elseif healthPercent == childHealth then
|
||||
equal = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- If any other sort type is selected and values are equal, sort it by name also
|
||||
if getSortType() == 'name' or equal then
|
||||
local length = math.min(childName:len(), nameLower:len())
|
||||
|
@ -425,7 +425,7 @@ function addCreature(creature)
|
|||
break
|
||||
elseif (nameLower:byte(j) > childName:byte(j) and isSortAsc()) or (nameLower:byte(j) < childName:byte(j) and isSortDesc()) then
|
||||
break
|
||||
elseif j == nameLower:len() and isSortAsc() then
|
||||
elseif j == nameLower:len() and isSortAsc() then
|
||||
battlePanel:insertChild(i, battleButton)
|
||||
inserted = true
|
||||
elseif j == childName:len() and isSortDesc() then
|
||||
|
@ -439,7 +439,7 @@ function addCreature(creature)
|
|||
break
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Insert at the end if no other place is found
|
||||
if not inserted then
|
||||
battlePanel:insertChild(childCount + 1, battleButton)
|
||||
|
@ -478,7 +478,7 @@ function onBattleButtonMouseRelease(self, mousePosition, mouseButton)
|
|||
mouseWidget.cancelNextRelease = false
|
||||
return false
|
||||
end
|
||||
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
or (g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
|
||||
mouseWidget.cancelNextRelease = true
|
||||
g_game.look(self.creature)
|
||||
|
|
|
@ -92,7 +92,7 @@ MiniWindow
|
|||
height: 20
|
||||
width: 128
|
||||
margin-top: 6
|
||||
|
||||
|
||||
ComboBox
|
||||
id: sortTypeBox
|
||||
width: 74
|
||||
|
@ -107,7 +107,7 @@ MiniWindow
|
|||
anchors.top: parent.top
|
||||
anchors.left: prev.right
|
||||
margin-left: 4
|
||||
|
||||
|
||||
Panel
|
||||
height: 18
|
||||
anchors.top: prev.bottom
|
||||
|
@ -132,7 +132,7 @@ MiniWindow
|
|||
anchors.right: miniwindowScrollBar.left
|
||||
margin-right: 1
|
||||
margin-top: 11
|
||||
|
||||
|
||||
MiniWindowContents
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
|
|
|
@ -23,15 +23,15 @@ function init()
|
|||
fightOffensiveBox = combatControlsWindow:recursiveGetChildById('fightOffensiveBox')
|
||||
fightBalancedBox = combatControlsWindow:recursiveGetChildById('fightBalancedBox')
|
||||
fightDefensiveBox = combatControlsWindow:recursiveGetChildById('fightDefensiveBox')
|
||||
|
||||
|
||||
chaseModeButton = combatControlsWindow:recursiveGetChildById('chaseModeBox')
|
||||
safeFightButton = combatControlsWindow:recursiveGetChildById('safeFightBox')
|
||||
|
||||
|
||||
mountButton = combatControlsWindow:recursiveGetChildById('mountButton')
|
||||
mountButton.onClick = onMountButtonClick
|
||||
|
||||
|
||||
pvpModesPanel = combatControlsWindow:recursiveGetChildById('pvpModesPanel')
|
||||
|
||||
|
||||
whiteDoveBox = combatControlsWindow:recursiveGetChildById('whiteDoveBox')
|
||||
whiteHandBox = combatControlsWindow:recursiveGetChildById('whiteHandBox')
|
||||
yellowHandBox = combatControlsWindow:recursiveGetChildById('yellowHandBox')
|
||||
|
@ -41,7 +41,7 @@ function init()
|
|||
fightModeRadioGroup:addWidget(fightOffensiveBox)
|
||||
fightModeRadioGroup:addWidget(fightBalancedBox)
|
||||
fightModeRadioGroup:addWidget(fightDefensiveBox)
|
||||
|
||||
|
||||
pvpModeRadioGroup = UIRadioGroup.create()
|
||||
pvpModeRadioGroup:addWidget(whiteDoveBox)
|
||||
pvpModeRadioGroup:addWidget(whiteHandBox)
|
||||
|
@ -62,7 +62,7 @@ function init()
|
|||
onWalk = check,
|
||||
onAutoWalk = check
|
||||
})
|
||||
|
||||
|
||||
connect(LocalPlayer, { onOutfitChange = onOutfitChange })
|
||||
|
||||
if g_game.isOnline() then
|
||||
|
@ -92,7 +92,7 @@ function terminate()
|
|||
onWalk = check,
|
||||
onAutoWalk = check
|
||||
})
|
||||
|
||||
|
||||
disconnect(LocalPlayer, { onOutfitChange = onOutfitChange })
|
||||
end
|
||||
|
||||
|
@ -111,7 +111,7 @@ function update()
|
|||
|
||||
local safeFight = g_game.isSafeFight()
|
||||
safeFightButton:setChecked(not safeFight)
|
||||
|
||||
|
||||
if g_game.getFeature(GamePVPMode) then
|
||||
local pvpMode = g_game.getPVPMode()
|
||||
local pvpWidget = getPVPBoxByMode(pvpMode)
|
||||
|
@ -153,7 +153,7 @@ function online()
|
|||
else
|
||||
mountButton:setVisible(false)
|
||||
end
|
||||
|
||||
|
||||
if g_game.getFeature(GamePVPMode) then
|
||||
pvpModesPanel:setVisible(true)
|
||||
combatControlsWindow:setHeight(combatControlsWindow.extendedControlsHeight)
|
||||
|
@ -232,7 +232,7 @@ function onSetPVPMode(self, selectedPVPButton)
|
|||
if selectedPVPButton == nil then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
local buttonId = selectedPVPButton:getId()
|
||||
local pvpMode = PVPWhiteDove
|
||||
if buttonId == 'whiteDoveBox' then
|
||||
|
@ -263,7 +263,7 @@ function onOutfitChange(localPlayer, outfit, oldOutfit)
|
|||
if outfit.mount == oldOutfit.mount then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
mountButton:setChecked(outfit.mount ~= nil and outfit.mount > 0)
|
||||
end
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ ChaseModeBox < CombatBox
|
|||
image-source: /images/game/combatmodes/chasemode
|
||||
SafeFightBox < CombatBox
|
||||
image-source: /images/game/combatmodes/safefight
|
||||
|
||||
|
||||
MountButton < CombatBox
|
||||
image-source: /images/game/combatmodes/mount
|
||||
|
||||
|
@ -73,7 +73,7 @@ MiniWindow
|
|||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 20
|
||||
|
||||
|
||||
WhiteDoveBox
|
||||
id: whiteDoveBox
|
||||
anchors.left: parent.left
|
||||
|
|
|
@ -33,13 +33,13 @@ MainWindow
|
|||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 180
|
||||
|
||||
|
||||
Label
|
||||
!text: tr('Ignored Players:')
|
||||
anchors.left: parent.left
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 10
|
||||
|
||||
|
||||
TextList
|
||||
id: ignoreList
|
||||
vertical-scrollbar: ignoreListScrollBar
|
||||
|
@ -51,14 +51,14 @@ MainWindow
|
|||
margin-top: 3
|
||||
padding: 1
|
||||
focusable: false
|
||||
|
||||
|
||||
TextEdit
|
||||
id: ignoreNameEdit
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: parent.left
|
||||
width: 110
|
||||
margin-top: 5
|
||||
|
||||
|
||||
Button
|
||||
id: buttonIgnoreAdd
|
||||
!text: tr('Add')
|
||||
|
@ -67,7 +67,7 @@ MainWindow
|
|||
margin-left: 5
|
||||
anchors.top: prev.top
|
||||
anchors.left: prev.right
|
||||
|
||||
|
||||
Button
|
||||
id: buttonIgnoreRemove
|
||||
!text: tr('Remove')
|
||||
|
@ -90,7 +90,7 @@ MainWindow
|
|||
anchors.top: prev.bottom
|
||||
width: 180
|
||||
margin-top: 5
|
||||
|
||||
|
||||
CheckBox
|
||||
id: checkboxIgnoreYelling
|
||||
!text: tr('Ignore Yelling')
|
||||
|
@ -98,7 +98,7 @@ MainWindow
|
|||
anchors.top: prev.bottom
|
||||
width: 180
|
||||
margin-top: 5
|
||||
|
||||
|
||||
CheckBox
|
||||
id: checkboxUseWhiteList
|
||||
!text: tr('Activate whitelist')
|
||||
|
@ -106,13 +106,13 @@ MainWindow
|
|||
anchors.left: ignoreList.right
|
||||
margin-left: 20
|
||||
width: 180
|
||||
|
||||
|
||||
Label
|
||||
!text: tr('Allowed Players:')
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: prev.left
|
||||
margin-top: 10
|
||||
|
||||
|
||||
TextList
|
||||
id: whiteList
|
||||
vertical-scrollbar: whiteListScrollBar
|
||||
|
@ -124,14 +124,14 @@ MainWindow
|
|||
margin-top: 3
|
||||
padding: 1
|
||||
focusable: false
|
||||
|
||||
|
||||
TextEdit
|
||||
id: whitelistNameEdit
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: prev.left
|
||||
width: 110
|
||||
margin-top: 5
|
||||
|
||||
|
||||
Button
|
||||
id: buttonWhitelistAdd
|
||||
!text: tr('Add')
|
||||
|
@ -140,7 +140,7 @@ MainWindow
|
|||
margin-left: 5
|
||||
anchors.top: prev.top
|
||||
anchors.left: prev.right
|
||||
|
||||
|
||||
Button
|
||||
id: buttonWhitelistRemove
|
||||
!text: tr('Remove')
|
||||
|
@ -149,7 +149,7 @@ MainWindow
|
|||
margin-left: 5
|
||||
anchors.top: prev.top
|
||||
anchors.left: prev.right
|
||||
|
||||
|
||||
Label
|
||||
!text: tr('Global whitelist settings')
|
||||
anchors.left: whiteList.left
|
||||
|
@ -163,17 +163,17 @@ MainWindow
|
|||
anchors.top: prev.bottom
|
||||
width: 180
|
||||
margin-top: 5
|
||||
|
||||
|
||||
Panel
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
|
||||
|
||||
Panel
|
||||
size: 160 30
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
|
||||
Button
|
||||
id: buttonSave
|
||||
!text: tr('Save')
|
||||
|
@ -196,7 +196,7 @@ MainWindow
|
|||
anchors.right: ignoreList.right
|
||||
step: 14
|
||||
pixels-scroll: true
|
||||
|
||||
|
||||
VerticalScrollBar
|
||||
id: whiteListScrollBar
|
||||
anchors.top: whiteList.top
|
||||
|
|
|
@ -175,7 +175,7 @@ end
|
|||
|
||||
function disableChat()
|
||||
local gameInterface = modules.game_interface
|
||||
|
||||
|
||||
consoleTextEdit:setVisible(false)
|
||||
consoleTextEdit:setText("")
|
||||
|
||||
|
@ -220,11 +220,11 @@ function terminate()
|
|||
g_keyboard.unbindKeyDown('Ctrl+H')
|
||||
|
||||
saveCommunicationSettings()
|
||||
|
||||
|
||||
if channelsWindow then
|
||||
channelsWindow:destroy()
|
||||
end
|
||||
|
||||
|
||||
if communicationWindow then
|
||||
communicationWindow:destroy()
|
||||
end
|
||||
|
@ -232,7 +232,7 @@ function terminate()
|
|||
if violationWindow then
|
||||
violationWindow:destroy()
|
||||
end
|
||||
|
||||
|
||||
consolePanel:destroy()
|
||||
ownPrivateName = nil
|
||||
|
||||
|
@ -363,7 +363,7 @@ function addTab(name, focus)
|
|||
end
|
||||
|
||||
function removeTab(tab)
|
||||
if type(tab) == 'string' then
|
||||
if type(tab) == 'string' then
|
||||
tab = consoleTabBar:getTab(tab)
|
||||
end
|
||||
|
||||
|
@ -824,7 +824,7 @@ function onTalk(name, level, mode, message, channelId, creaturePos)
|
|||
end
|
||||
|
||||
if ignoreNpcMessages and mode == MessageModes.NpcFrom then return end
|
||||
|
||||
|
||||
speaktype = SpeakTypes[mode]
|
||||
|
||||
if not speaktype then
|
||||
|
@ -833,10 +833,10 @@ function onTalk(name, level, mode, message, channelId, creaturePos)
|
|||
end
|
||||
|
||||
local localPlayer = g_game.getLocalPlayer()
|
||||
if name ~= g_game.getCharacterName()
|
||||
and isUsingIgnoreList()
|
||||
if name ~= g_game.getCharacterName()
|
||||
and isUsingIgnoreList()
|
||||
and not(isUsingWhiteList()) or (isUsingWhiteList() and not(isWhitelisted(name)) and not(isAllowingVIPs() and localPlayer:hasVip(name))) then
|
||||
|
||||
|
||||
if mode == MessageModes.Yell and isIgnoringYelling() then
|
||||
return
|
||||
elseif speaktype.private and isIgnoringPrivate() and mode ~= MessageModes.NpcFrom then
|
||||
|
@ -1042,16 +1042,16 @@ end
|
|||
function saveCommunicationSettings()
|
||||
local tmpIgnoreList = {}
|
||||
local ignoredPlayers = getIgnoredPlayers()
|
||||
for i = 1, #ignoredPlayers do
|
||||
for i = 1, #ignoredPlayers do
|
||||
table.insert(tmpIgnoreList, ignoredPlayers[i])
|
||||
end
|
||||
|
||||
local tmpWhiteList = {}
|
||||
local whitelistedPlayers = getWhitelistedPlayers()
|
||||
for i = 1, #whitelistedPlayers do
|
||||
for i = 1, #whitelistedPlayers do
|
||||
table.insert(tmpWhiteList, whitelistedPlayers[i])
|
||||
end
|
||||
|
||||
|
||||
g_settings.set('UseIgnoreList', communicationSettings.useIgnoreList)
|
||||
g_settings.set('UseWhiteList', communicationSettings.useWhiteList)
|
||||
g_settings.set('IgnorePrivateMessages', communicationSettings.privateMessages)
|
||||
|
@ -1119,7 +1119,7 @@ function onClickIgnoreButton()
|
|||
local ignoreListPanel = communicationWindow:getChildById('ignoreList')
|
||||
local whiteListPanel = communicationWindow:getChildById('whiteList')
|
||||
communicationWindow.onDestroy = function() communicationWindow = nil end
|
||||
|
||||
|
||||
local useIgnoreListBox = communicationWindow:getChildById('checkboxUseIgnoreList')
|
||||
useIgnoreListBox:setChecked(communicationSettings.useIgnoreList)
|
||||
local useWhiteListBox = communicationWindow:getChildById('checkboxUseWhiteList')
|
||||
|
@ -1128,8 +1128,8 @@ function onClickIgnoreButton()
|
|||
local removeIgnoreButton = communicationWindow:getChildById('buttonIgnoreRemove')
|
||||
removeIgnoreButton:disable()
|
||||
ignoreListPanel.onChildFocusChange = function() removeIgnoreButton:enable() end
|
||||
removeIgnoreButton.onClick = function()
|
||||
local selection = ignoreListPanel:getFocusedChild()
|
||||
removeIgnoreButton.onClick = function()
|
||||
local selection = ignoreListPanel:getFocusedChild()
|
||||
if selection then
|
||||
ignoreListPanel:removeChild(selection)
|
||||
selection:destroy()
|
||||
|
@ -1140,19 +1140,19 @@ function onClickIgnoreButton()
|
|||
local removeWhitelistButton = communicationWindow:getChildById('buttonWhitelistRemove')
|
||||
removeWhitelistButton:disable()
|
||||
whiteListPanel.onChildFocusChange = function() removeWhitelistButton:enable() end
|
||||
removeWhitelistButton.onClick = function()
|
||||
local selection = whiteListPanel:getFocusedChild()
|
||||
removeWhitelistButton.onClick = function()
|
||||
local selection = whiteListPanel:getFocusedChild()
|
||||
if selection then
|
||||
whiteListPanel:removeChild(selection)
|
||||
selection:destroy()
|
||||
end
|
||||
removeWhitelistButton:disable()
|
||||
end
|
||||
|
||||
|
||||
local newlyIgnoredPlayers = {}
|
||||
local addIgnoreName = communicationWindow:getChildById('ignoreNameEdit')
|
||||
local addIgnoreButton = communicationWindow:getChildById('buttonIgnoreAdd')
|
||||
local addIgnoreFunction = function()
|
||||
local addIgnoreFunction = function()
|
||||
local newEntry = addIgnoreName:getText()
|
||||
if newEntry == '' then return end
|
||||
if table.find(getIgnoredPlayers(), newEntry) then return end
|
||||
|
@ -1186,14 +1186,14 @@ function onClickIgnoreButton()
|
|||
addIgnoreFunction()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local ignorePrivateMessageBox = communicationWindow:getChildById('checkboxIgnorePrivateMessages')
|
||||
ignorePrivateMessageBox:setChecked(communicationSettings.privateMessages)
|
||||
local ignoreYellingBox = communicationWindow:getChildById('checkboxIgnoreYelling')
|
||||
ignoreYellingBox:setChecked(communicationSettings.yelling)
|
||||
local allowVIPsBox = communicationWindow:getChildById('checkboxAllowVIPs')
|
||||
allowVIPsBox:setChecked(communicationSettings.allowVIPs)
|
||||
|
||||
|
||||
local saveButton = communicationWindow:recursiveGetChildById('buttonSave')
|
||||
saveButton.onClick = function()
|
||||
communicationSettings.ignoredPlayers = {}
|
||||
|
@ -1205,7 +1205,7 @@ function onClickIgnoreButton()
|
|||
for i = 1, whiteListPanel:getChildCount() do
|
||||
addWhitelistedPlayer(whiteListPanel:getChildByIndex(i):getText())
|
||||
end
|
||||
|
||||
|
||||
communicationSettings.useIgnoreList = useIgnoreListBox:isChecked()
|
||||
communicationSettings.useWhiteList = useWhiteListBox:isChecked()
|
||||
communicationSettings.yelling = ignoreYellingBox:isChecked()
|
||||
|
@ -1213,18 +1213,18 @@ function onClickIgnoreButton()
|
|||
communicationSettings.allowVIPs = allowVIPsBox:isChecked()
|
||||
communicationWindow:destroy()
|
||||
end
|
||||
|
||||
|
||||
local cancelButton = communicationWindow:recursiveGetChildById('buttonCancel')
|
||||
cancelButton.onClick = function()
|
||||
communicationWindow:destroy()
|
||||
end
|
||||
|
||||
|
||||
local ignoredPlayers = getIgnoredPlayers()
|
||||
for i = 1, #ignoredPlayers do
|
||||
local label = g_ui.createWidget('IgnoreListLabel', ignoreListPanel)
|
||||
label:setText(ignoredPlayers[i])
|
||||
end
|
||||
|
||||
|
||||
local whitelistedPlayers = getWhitelistedPlayers()
|
||||
for i = 1, #whitelistedPlayers do
|
||||
local label = g_ui.createWidget('WhiteListLabel', whiteListPanel)
|
||||
|
|
|
@ -133,7 +133,7 @@ Panel
|
|||
margin-right: 5
|
||||
margin-top: 6
|
||||
@onClick: onClickIgnoreButton()
|
||||
|
||||
|
||||
Panel
|
||||
id: consoleContentPanel
|
||||
anchors.top: prev.bottom
|
||||
|
|
|
@ -20,8 +20,8 @@ function init()
|
|||
|
||||
cooldownWindow = g_ui.loadUI('cooldown', modules.game_interface.getRightPanel())
|
||||
cooldownWindow:disableResize()
|
||||
cooldownWindow:setup()
|
||||
|
||||
cooldownWindow:setup()
|
||||
|
||||
contentsPanel = cooldownWindow:getChildById('contentsPanel')
|
||||
cooldownPanel = contentsPanel:getChildById('cooldownPanel')
|
||||
|
||||
|
@ -47,10 +47,10 @@ end
|
|||
function loadIcon(iconId)
|
||||
local spell, profile, spellName = Spells.getSpellByIcon(iconId)
|
||||
if not spellName then return end
|
||||
|
||||
|
||||
clientIconId = Spells.getClientId(spellName)
|
||||
if not clientIconId then return end
|
||||
|
||||
|
||||
local icon = cooldownPanel:getChildById(iconId)
|
||||
if not icon then
|
||||
icon = g_ui.createWidget('SpellIcon')
|
||||
|
@ -109,7 +109,7 @@ function turnOffCooldown(progressRect)
|
|||
progressRect.icon:setOn(false)
|
||||
progressRect.icon = nil
|
||||
end
|
||||
|
||||
|
||||
-- create particles
|
||||
--[[local particle = g_ui.createWidget('GroupCooldownParticles', progressRect)
|
||||
particle:fill('parent')
|
||||
|
@ -130,7 +130,7 @@ end
|
|||
|
||||
function updateCooldown(progressRect, duration)
|
||||
progressRect:setPercent(progressRect:getPercent() + 10000/duration)
|
||||
|
||||
|
||||
if progressRect:getPercent() < 100 then
|
||||
removeEvent(progressRect.event)
|
||||
progressRect.event = scheduleEvent(function() progressRect.callback[ProgressCallback.update]() end, 100)
|
||||
|
|
|
@ -6,7 +6,7 @@ SpellGroupIcon < UIWidget
|
|||
margin-top: 3
|
||||
|
||||
SpellIcon < UIWidget
|
||||
size: 24 24
|
||||
size: 24 24
|
||||
image-size: 24 24
|
||||
focusable: false
|
||||
|
||||
|
@ -20,7 +20,7 @@ SpellProgressRect < UIProgressRect
|
|||
|
||||
GroupCooldownParticles < UIParticles
|
||||
effect: groupcooldown-effect
|
||||
|
||||
|
||||
MiniWindow
|
||||
id: cooldownWindow
|
||||
!text: tr('Spell Cooldowns')
|
||||
|
@ -28,7 +28,7 @@ MiniWindow
|
|||
icon: /images/topbuttons/cooldowns
|
||||
@onClose: modules.game_cooldown.onMiniWindowClose()
|
||||
&save: true
|
||||
|
||||
|
||||
MiniWindowContents
|
||||
SpellGroupIcon
|
||||
id: groupIconAttack
|
||||
|
@ -97,4 +97,4 @@ MiniWindow
|
|||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
background-color: #ffffff11
|
||||
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ ManaBar < ProgressBar
|
|||
anchors.right: parent.right
|
||||
margin: 1
|
||||
margin-top: 3
|
||||
|
||||
|
||||
ExperienceBar < ProgressBar
|
||||
id: experienceBar
|
||||
background-color: #B6E866
|
||||
|
|
|
@ -72,7 +72,7 @@ function init()
|
|||
g_keyboard.bindKeyPress('Down', function() currentHotkeys:focusNextChild(KeyboardFocusReason) end, hotkeysWindow)
|
||||
g_keyboard.bindKeyPress('Up', function() currentHotkeys:focusPreviousChild(KeyboardFocusReason) end, hotkeysWindow)
|
||||
|
||||
connect(g_game, {
|
||||
connect(g_game, {
|
||||
onGameStart = online,
|
||||
onGameEnd = offline
|
||||
})
|
||||
|
@ -386,7 +386,7 @@ function doKeyCombo(keyCombo)
|
|||
local item = g_game.findPlayerItem(hotKey.itemId, hotKey.subType or -1)
|
||||
if item then
|
||||
g_game.use(item)
|
||||
end
|
||||
end
|
||||
else
|
||||
g_game.useInventoryItem(hotKey.itemId)
|
||||
end
|
||||
|
@ -395,7 +395,7 @@ function doKeyCombo(keyCombo)
|
|||
local item = g_game.findPlayerItem(hotKey.itemId, hotKey.subType or -1)
|
||||
if item then
|
||||
g_game.useWith(item, g_game.getLocalPlayer())
|
||||
end
|
||||
end
|
||||
else
|
||||
g_game.useInventoryItemWith(hotKey.itemId, g_game.getLocalPlayer())
|
||||
end
|
||||
|
@ -418,7 +418,7 @@ function doKeyCombo(keyCombo)
|
|||
local item = g_game.findPlayerItem(hotKey.itemId, hotKey.subType or -1)
|
||||
if item then
|
||||
g_game.useWith(item, attackingCreature)
|
||||
end
|
||||
end
|
||||
else
|
||||
g_game.useInventoryItemWith(hotKey.itemId, attackingCreature)
|
||||
end
|
||||
|
@ -426,7 +426,7 @@ function doKeyCombo(keyCombo)
|
|||
local item = Item.create(hotKey.itemId)
|
||||
if g_game.getProtocolVersion() < 780 or hotKey.subType then
|
||||
local tmpItem = g_game.findPlayerItem(hotKey.itemId, hotKey.subType or -1)
|
||||
if not tmpItem then return true end
|
||||
if not tmpItem then return true end
|
||||
item = tmpItem
|
||||
end
|
||||
modules.game_interface.startUseWith(item)
|
||||
|
|
|
@ -42,7 +42,7 @@ function init()
|
|||
gameBottomPanel = gameRootPanel:getChildById('gameBottomPanel')
|
||||
connect(gameLeftPanel, { onVisibilityChange = onLeftPanelVisibilityChange })
|
||||
|
||||
logoutButton = modules.client_topmenu.addLeftButton('logoutButton', tr('Exit'),
|
||||
logoutButton = modules.client_topmenu.addLeftButton('logoutButton', tr('Exit'),
|
||||
'/images/topbuttons/logout', tryLogout, true)
|
||||
|
||||
setupViewMode(0)
|
||||
|
@ -158,7 +158,7 @@ end
|
|||
function hide()
|
||||
disconnect(g_app, { onClose = tryExit })
|
||||
logoutButton:setTooltip(tr('Exit'))
|
||||
|
||||
|
||||
if logoutWindow then
|
||||
logoutWindow:destroy()
|
||||
logoutWindow = nil
|
||||
|
@ -235,7 +235,7 @@ function tryLogout(prompt)
|
|||
if not g_game.isConnectionOk() then
|
||||
msg = 'Your connection is failing, if you logout now your character will be still online, do you want to force logout?'
|
||||
|
||||
yesCallback = function()
|
||||
yesCallback = function()
|
||||
g_game.forceLogout()
|
||||
if logoutWindow then
|
||||
logoutWindow:destroy()
|
||||
|
@ -486,7 +486,7 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing)
|
|||
else
|
||||
menu:addOption(tr('Stop Attack'), function() g_game.cancelAttack() end, shortcut)
|
||||
end
|
||||
|
||||
|
||||
if g_game.getFollowingCreature() ~= creatureThing then
|
||||
menu:addOption(tr('Follow'), function() g_game.follow(creatureThing) end)
|
||||
else
|
||||
|
|
|
@ -60,9 +60,9 @@ function UIGameMap:onMouseRelease(mousePosition, mouseButton)
|
|||
if not self.allowNextRelease then
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
local autoWalkPos = self:getPosition(mousePosition)
|
||||
|
||||
|
||||
-- happens when clicking outside of map boundaries
|
||||
if not autoWalkPos then return false end
|
||||
|
||||
|
@ -73,7 +73,7 @@ function UIGameMap:onMouseRelease(mousePosition, mouseButton)
|
|||
autoWalkPos.y = autoWalkPos.y + dz
|
||||
autoWalkPos.z = localPlayerPos.z
|
||||
end
|
||||
|
||||
|
||||
local lookThing
|
||||
local useThing
|
||||
local creatureThing
|
||||
|
@ -85,8 +85,8 @@ function UIGameMap:onMouseRelease(mousePosition, mouseButton)
|
|||
lookThing = tile:getTopLookThing()
|
||||
useThing = tile:getTopUseThing()
|
||||
creatureThing = tile:getTopCreature()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local autoWalkTile = g_map.getTile(autoWalkPos)
|
||||
if autoWalkTile then
|
||||
attackCreature = autoWalkTile:getTopCreature()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--[[
|
||||
Finalizing Market:
|
||||
Note: Feel free to work on any area and submit
|
||||
Note: Feel free to work on any area and submit
|
||||
it as a pull request from your git fork.
|
||||
|
||||
BeniS's Skype: benjiz69
|
||||
|
@ -11,7 +11,7 @@
|
|||
- Offer History
|
||||
|
||||
* Clean up the interface building
|
||||
- Add a new market interface file to handle building?
|
||||
- Add a new market interface file to handle building?
|
||||
|
||||
* Add offer table column ordering.
|
||||
- Player Name, Amount, Total Price, Peice Price and Ends At
|
||||
|
@ -251,7 +251,7 @@ local function updateOffers(offers)
|
|||
-- clear existing offer data
|
||||
buyOfferTable:clearData()
|
||||
sellOfferTable:clearData()
|
||||
|
||||
|
||||
sellButton:setEnabled(false)
|
||||
buyButton:setEnabled(false)
|
||||
|
||||
|
@ -431,7 +431,7 @@ local function openAmountWindow(callback, type, actionText)
|
|||
widget:setText(tostring(value*selectedOffer[type]:getPrice())..'gp')
|
||||
itembox:setText(tostring(value))
|
||||
end
|
||||
|
||||
|
||||
local okButton = amountWindow:getChildById('buttonOk')
|
||||
if actionText ~= '' then
|
||||
okButton:setText(actionText)
|
||||
|
@ -814,7 +814,7 @@ function Market.enableCreateOffer(enable)
|
|||
|
||||
local prevAmountButton = marketOffersPanel:recursiveGetChildById('prevAmountButton')
|
||||
local nextAmountButton = marketOffersPanel:recursiveGetChildById('nextAmountButton')
|
||||
|
||||
|
||||
prevAmountButton:setEnabled(enable)
|
||||
nextAmountButton:setEnabled(enable)
|
||||
end
|
||||
|
@ -1076,7 +1076,7 @@ function Market.onMarketEnter(depotItems, offers, balance, vocation)
|
|||
|
||||
Market.clearSelectedItem()
|
||||
updateBalance(balance)
|
||||
|
||||
|
||||
information.totalOffers = offers
|
||||
local player = g_game.getLocalPlayer()
|
||||
if player then
|
||||
|
@ -1101,7 +1101,7 @@ function Market.onMarketEnter(depotItems, offers, balance, vocation)
|
|||
else
|
||||
Market.refreshItemsWidget()
|
||||
end
|
||||
|
||||
|
||||
if table.empty(currentItems) then
|
||||
Market.loadMarketItems(MarketCategory.First)
|
||||
end
|
||||
|
|
|
@ -8,7 +8,7 @@ FlagButton < CheckBox
|
|||
icon-size: 11 11
|
||||
icon-clip: 0 0 11 11
|
||||
icon-offset: 2 4
|
||||
text:
|
||||
text:
|
||||
|
||||
$!checked:
|
||||
image-clip: 26 0 26 26
|
||||
|
@ -54,7 +54,7 @@ FlagWindow < MainWindow
|
|||
anchors.left: parent.left
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
margin-left: 0
|
||||
margin-left: 0
|
||||
|
||||
FlagButton
|
||||
id: flag2
|
||||
|
@ -116,7 +116,7 @@ FlagWindow < MainWindow
|
|||
anchors.left: parent.left
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
margin-left: 0
|
||||
margin-left: 0
|
||||
|
||||
FlagButton
|
||||
id: flag12
|
||||
|
|
|
@ -31,15 +31,15 @@ function onModalDialog(id, title, message, buttons, enterButton, escapeButton, c
|
|||
end
|
||||
|
||||
modalDialog = g_ui.createWidget('ModalDialog', rootWidget)
|
||||
|
||||
|
||||
local messageLabel = modalDialog:getChildById('messageLabel')
|
||||
local choiceList = modalDialog:getChildById('choiceList')
|
||||
local choiceScrollbar = modalDialog:getChildById('choiceScrollBar')
|
||||
local buttonList = modalDialog:getChildById('buttonList')
|
||||
|
||||
|
||||
modalDialog:setText(title)
|
||||
messageLabel:setText(message)
|
||||
|
||||
|
||||
local horizontalPadding = modalDialog:getPaddingLeft() + modalDialog:getPaddingRight()
|
||||
modalDialog:setWidth(math.min(modalDialog.maximumWidth, math.max(messageLabel:getWidth(), modalDialog.minimumWidth)))
|
||||
messageLabel:setWidth(math.min(modalDialog.maximumWidth, math.max(messageLabel:getWidth(), modalDialog.minimumWidth)) - horizontalPadding)
|
||||
|
@ -48,7 +48,7 @@ function onModalDialog(id, title, message, buttons, enterButton, escapeButton, c
|
|||
for i = 1, #choices do
|
||||
local choiceId = choices[i][1]
|
||||
local choiceName = choices[i][2]
|
||||
|
||||
|
||||
local label = g_ui.createWidget('ChoiceListLabel', choiceList)
|
||||
label.choiceId = choiceId
|
||||
label:setText(choiceName)
|
||||
|
@ -99,7 +99,7 @@ function onModalDialog(id, title, message, buttons, enterButton, escapeButton, c
|
|||
g_game.answerModalDialog(id, enterButton, choice)
|
||||
destroyDialog()
|
||||
end
|
||||
|
||||
|
||||
local escapeFunc = function()
|
||||
local focusedChoice = choiceList:getFocusedChild()
|
||||
local choice = 0xFF
|
||||
|
@ -111,7 +111,7 @@ function onModalDialog(id, title, message, buttons, enterButton, escapeButton, c
|
|||
end
|
||||
|
||||
choiceList.onDoubleClick = enterFunc
|
||||
|
||||
|
||||
modalDialog.onEnter = enterFunc
|
||||
modalDialog.onEscape = escapeFunc
|
||||
end
|
|
@ -180,7 +180,7 @@ function itemPopup(self, mousePosition, mouseButton)
|
|||
menu:addOption(tr('Look'), function() return g_game.inspectNpcTrade(self:getItem()) end)
|
||||
menu:display(mousePosition)
|
||||
return true
|
||||
elseif ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
elseif ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
or (g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
|
||||
cancelNextRelease = true
|
||||
g_game.inspectNpcTrade(self:getItem())
|
||||
|
@ -438,7 +438,7 @@ function onPlayerGoods(money, items)
|
|||
playerItems[id] = playerItems[id] + item[2]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
refreshPlayerGoods()
|
||||
end
|
||||
|
||||
|
@ -480,7 +480,7 @@ end
|
|||
function checkSellAllTooltip()
|
||||
sellAllButton:setEnabled(true)
|
||||
sellAllButton:removeTooltip()
|
||||
|
||||
|
||||
local total = 0
|
||||
local info = ''
|
||||
local first = true
|
||||
|
|
|
@ -50,7 +50,7 @@ function create(creatureOutfit, outfitList, creatureMount, mountList)
|
|||
if outfitWindow and not outfitWindow:isHidden() then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
outfitCreature = creatureOutfit
|
||||
mountCreature = creatureMount
|
||||
outfits = outfitList
|
||||
|
|
|
@ -233,7 +233,7 @@ end
|
|||
function checkExpSpeed()
|
||||
local player = g_game.getLocalPlayer()
|
||||
if not player then return end
|
||||
|
||||
|
||||
local currentExp = player:getExperience()
|
||||
local currentTime = g_clock.seconds()
|
||||
if player.lastExps ~= nil then
|
||||
|
|
|
@ -53,8 +53,8 @@ FILTER_GROUP_SUPPORT = 3
|
|||
local filters = {
|
||||
level = false,
|
||||
vocation = false,
|
||||
|
||||
vocationId = FILTER_VOCATION_ANY,
|
||||
|
||||
vocationId = FILTER_VOCATION_ANY,
|
||||
premium = FILTER_PREMIUM_ANY,
|
||||
groupId = FILTER_GROUP_ANY
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ end
|
|||
|
||||
function setSpelllistProfile(name)
|
||||
if SpelllistProfile == name then return end
|
||||
|
||||
|
||||
if SpelllistSettings[name] and SpellInfo[name] then
|
||||
local oldProfile = SpelllistProfile
|
||||
SpelllistProfile = name
|
||||
|
@ -95,13 +95,13 @@ end
|
|||
function init()
|
||||
connect(g_game, { onGameStart = online,
|
||||
onGameEnd = offline })
|
||||
|
||||
|
||||
spelllistWindow = g_ui.displayUI('spelllist', modules.game_interface.getRightPanel())
|
||||
spelllistWindow:hide()
|
||||
|
||||
|
||||
spelllistButton = modules.client_topmenu.addRightGameToggleButton('spelllistButton', tr('Spell List'), '/images/topbuttons/spelllist', toggle)
|
||||
spelllistButton:setOn(false)
|
||||
|
||||
|
||||
nameValueLabel = spelllistWindow:getChildById('labelNameValue')
|
||||
formulaValueLabel = spelllistWindow:getChildById('labelFormulaValue')
|
||||
vocationValueLabel = spelllistWindow:getChildById('labelVocationValue')
|
||||
|
@ -112,18 +112,18 @@ function init()
|
|||
manaValueLabel = spelllistWindow:getChildById('labelManaValue')
|
||||
premiumValueLabel = spelllistWindow:getChildById('labelPremiumValue')
|
||||
descriptionValueLabel = spelllistWindow:getChildById('labelDescriptionValue')
|
||||
|
||||
|
||||
vocationBoxAny = spelllistWindow:getChildById('vocationBoxAny')
|
||||
vocationBoxSorcerer = spelllistWindow:getChildById('vocationBoxSorcerer')
|
||||
vocationBoxDruid = spelllistWindow:getChildById('vocationBoxDruid')
|
||||
vocationBoxPaladin = spelllistWindow:getChildById('vocationBoxPaladin')
|
||||
vocationBoxKnight = spelllistWindow:getChildById('vocationBoxKnight')
|
||||
|
||||
|
||||
groupBoxAny = spelllistWindow:getChildById('groupBoxAny')
|
||||
groupBoxAttack = spelllistWindow:getChildById('groupBoxAttack')
|
||||
groupBoxHealing = spelllistWindow:getChildById('groupBoxHealing')
|
||||
groupBoxSupport = spelllistWindow:getChildById('groupBoxSupport')
|
||||
|
||||
|
||||
premiumBoxAny = spelllistWindow:getChildById('premiumBoxAny')
|
||||
premiumBoxYes = spelllistWindow:getChildById('premiumBoxYes')
|
||||
premiumBoxNo = spelllistWindow:getChildById('premiumBoxNo')
|
||||
|
@ -134,32 +134,32 @@ function init()
|
|||
vocationRadioGroup:addWidget(vocationBoxDruid)
|
||||
vocationRadioGroup:addWidget(vocationBoxPaladin)
|
||||
vocationRadioGroup:addWidget(vocationBoxKnight)
|
||||
|
||||
|
||||
groupRadioGroup = UIRadioGroup.create()
|
||||
groupRadioGroup:addWidget(groupBoxAny)
|
||||
groupRadioGroup:addWidget(groupBoxAttack)
|
||||
groupRadioGroup:addWidget(groupBoxHealing)
|
||||
groupRadioGroup:addWidget(groupBoxSupport)
|
||||
|
||||
|
||||
premiumRadioGroup = UIRadioGroup.create()
|
||||
premiumRadioGroup:addWidget(premiumBoxAny)
|
||||
premiumRadioGroup:addWidget(premiumBoxYes)
|
||||
premiumRadioGroup:addWidget(premiumBoxNo)
|
||||
|
||||
|
||||
premiumRadioGroup:selectWidget(premiumBoxAny)
|
||||
vocationRadioGroup:selectWidget(vocationBoxAny)
|
||||
groupRadioGroup:selectWidget(groupBoxAny)
|
||||
|
||||
|
||||
vocationRadioGroup.onSelectionChange = toggleFilter
|
||||
groupRadioGroup.onSelectionChange = toggleFilter
|
||||
premiumRadioGroup.onSelectionChange = toggleFilter
|
||||
|
||||
spellList = spelllistWindow:getChildById('spellList')
|
||||
|
||||
spellList = spelllistWindow:getChildById('spellList')
|
||||
|
||||
g_keyboard.bindKeyPress('Down', function() spellList:focusNextChild(KeyboardFocusReason) end, spelllistWindow)
|
||||
g_keyboard.bindKeyPress('Up', function() spellList:focusPreviousChild(KeyboardFocusReason) end, spelllistWindow)
|
||||
|
||||
initialiseSpelllist()
|
||||
|
||||
initialiseSpelllist()
|
||||
resizeWindow()
|
||||
|
||||
if g_game.isOnline() then
|
||||
|
@ -174,11 +174,11 @@ function terminate()
|
|||
disconnect(spellList, { onChildFocusChange = function(self, focusedChild)
|
||||
if focusedChild == nil then return end
|
||||
updateSpellInformation(focusedChild)
|
||||
end })
|
||||
end })
|
||||
|
||||
spelllistWindow:destroy()
|
||||
spelllistButton:destroy()
|
||||
|
||||
|
||||
vocationRadioGroup:destroy()
|
||||
groupRadioGroup:destroy()
|
||||
premiumRadioGroup:destroy()
|
||||
|
@ -188,21 +188,21 @@ function initialiseSpelllist()
|
|||
for i = 1, #SpelllistSettings[SpelllistProfile].spellOrder do
|
||||
local spell = SpelllistSettings[SpelllistProfile].spellOrder[i]
|
||||
local info = SpellInfo[SpelllistProfile][spell]
|
||||
|
||||
|
||||
local tmpLabel = g_ui.createWidget('SpellListLabel', spellList)
|
||||
tmpLabel:setId(spell)
|
||||
tmpLabel:setText(spell .. '\n\'' .. info.words .. '\'')
|
||||
tmpLabel:setPhantom(false)
|
||||
|
||||
|
||||
local iconId = tonumber(info.icon)
|
||||
if not iconId and SpellIcons[info.icon] then
|
||||
iconId = SpellIcons[info.icon][1]
|
||||
end
|
||||
|
||||
if not(iconId) then
|
||||
perror('Spell icon \'' .. info.icon .. '\' not found.')
|
||||
perror('Spell icon \'' .. info.icon .. '\' not found.')
|
||||
end
|
||||
|
||||
|
||||
tmpLabel:setHeight(SpelllistSettings[SpelllistProfile].iconSize.height + 4)
|
||||
tmpLabel:setTextOffset(topoint((SpelllistSettings[SpelllistProfile].iconSize.width + 10) .. ' ' .. (SpelllistSettings[SpelllistProfile].iconSize.height - 32)/2 + 3))
|
||||
tmpLabel:setImageSource(SpelllistSettings[SpelllistProfile].iconFile)
|
||||
|
@ -210,11 +210,11 @@ function initialiseSpelllist()
|
|||
tmpLabel:setImageSize(tosize(SpelllistSettings[SpelllistProfile].iconSize.width .. ' ' .. SpelllistSettings[SpelllistProfile].iconSize.height))
|
||||
tmpLabel.onClick = updateSpellInformation
|
||||
end
|
||||
|
||||
|
||||
connect(spellList, { onChildFocusChange = function(self, focusedChild)
|
||||
if focusedChild == nil then return end
|
||||
updateSpellInformation(focusedChild)
|
||||
end })
|
||||
end })
|
||||
end
|
||||
|
||||
function changeSpelllistProfile(oldProfile)
|
||||
|
@ -222,10 +222,10 @@ function changeSpelllistProfile(oldProfile)
|
|||
for i = 1, #SpelllistSettings[oldProfile].spellOrder do
|
||||
local spell = SpelllistSettings[oldProfile].spellOrder[i]
|
||||
local tmpLabel = spellList:getChildById(spell)
|
||||
|
||||
|
||||
tmpLabel:destroy()
|
||||
end
|
||||
|
||||
|
||||
-- Create new spelllist and ajust window
|
||||
initialiseSpelllist()
|
||||
setOptions()
|
||||
|
@ -238,7 +238,7 @@ function updateSpelllist()
|
|||
local spell = SpelllistSettings[SpelllistProfile].spellOrder[i]
|
||||
local info = SpellInfo[SpelllistProfile][spell]
|
||||
local tmpLabel = spellList:getChildById(spell)
|
||||
|
||||
|
||||
local localPlayer = g_game.getLocalPlayer()
|
||||
if (not(filters.level) or info.level <= localPlayer:getLevel()) and (not(filters.vocation) or table.find(info.vocations, localPlayer:getVocation())) and (filters.vocationId == FILTER_VOCATION_ANY or table.find(info.vocations, filters.vocationId) or table.find(info.vocations, filters.vocationId+4)) and (filters.groupId == FILTER_GROUP_ANY or info.group[filters.groupId]) and (filters.premium == FILTER_PREMIUM_ANY or (info.premium and filters.premium == FILTER_PREMIUM_YES) or (not(info.premium) and filters.premium == FILTER_PREMIUM_NO)) then
|
||||
tmpLabel:setVisible(true)
|
||||
|
@ -250,7 +250,7 @@ end
|
|||
|
||||
function updateSpellInformation(widget)
|
||||
local spell = widget:getId()
|
||||
|
||||
|
||||
local name = ''
|
||||
local formula = ''
|
||||
local vocation = ''
|
||||
|
@ -261,10 +261,10 @@ function updateSpellInformation(widget)
|
|||
local mana = ''
|
||||
local premium = ''
|
||||
local description = ''
|
||||
|
||||
|
||||
if SpellInfo[SpelllistProfile][spell] then
|
||||
local info = SpellInfo[SpelllistProfile][spell]
|
||||
|
||||
|
||||
name = spell
|
||||
formula = info.words
|
||||
|
||||
|
@ -274,7 +274,7 @@ function updateSpellInformation(widget)
|
|||
vocation = vocation .. (vocation:len() == 0 and '' or ', ') .. VocationNames[vocationId]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
cooldown = (info.exhaustion / 1000) .. 's'
|
||||
for groupId, groupName in ipairs(SpellGroups) do
|
||||
if info.group[groupId] then
|
||||
|
@ -282,14 +282,14 @@ function updateSpellInformation(widget)
|
|||
cooldown = cooldown .. ' / ' .. (info.group[groupId] / 1000) .. 's'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
type = info.type
|
||||
level = info.level
|
||||
mana = info.mana .. ' / ' .. info.soul
|
||||
premium = (info.premium and 'yes' or 'no')
|
||||
description = info.description or '-'
|
||||
end
|
||||
|
||||
|
||||
nameValueLabel:setText(name)
|
||||
formulaValueLabel:setText(formula)
|
||||
vocationValueLabel:setText(vocation)
|
||||
|
@ -356,7 +356,7 @@ function toggleFilter(widget, selectedWidget)
|
|||
widget:setOn(filters.vocation)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
updateSpelllist()
|
||||
end
|
||||
|
||||
|
@ -372,16 +372,16 @@ function resetWindow()
|
|||
-- Resetting filters
|
||||
filters.level = false
|
||||
filters.vocation = false
|
||||
|
||||
|
||||
local buttonFilterLevel = spelllistWindow:getChildById('buttonFilterLevel')
|
||||
buttonFilterLevel:setOn(filters.level)
|
||||
|
||||
|
||||
local buttonFilterVocation = spelllistWindow:getChildById('buttonFilterVocation')
|
||||
buttonFilterVocation:setOn(filters.vocation)
|
||||
|
||||
|
||||
vocationRadioGroup:selectWidget(vocationBoxAny)
|
||||
groupRadioGroup:selectWidget(groupBoxAny)
|
||||
premiumRadioGroup:selectWidget(premiumBoxAny)
|
||||
|
||||
|
||||
updateSpelllist()
|
||||
end
|
||||
|
|
|
@ -99,7 +99,7 @@ MainWindow
|
|||
IconButton
|
||||
id: icon6
|
||||
icon-clip: 72 0 12 12
|
||||
|
||||
|
||||
IconButton
|
||||
id: icon7
|
||||
icon-clip: 84 0 12 12
|
||||
|
|
|
@ -289,7 +289,7 @@ function onAddVip(id, name, state, description, iconId, notify)
|
|||
|
||||
local nameLower = name:lower()
|
||||
local childrenCount = vipList:getChildCount()
|
||||
|
||||
|
||||
for i=1,childrenCount do
|
||||
local child = vipList:getChildByIndex(i)
|
||||
if (state == VipState.Online and child.vipState ~= VipState.Online and getSortedBy() == 'status')
|
||||
|
@ -300,7 +300,7 @@ function onAddVip(id, name, state, description, iconId, notify)
|
|||
|
||||
if (((state ~= VipState.Online and child.vipState ~= VipState.Online) or (state == VipState.Online and child.vipState == VipState.Online)) and getSortedBy() == 'status')
|
||||
or (label.iconId == child.iconId and getSortedBy() == 'type') or getSortedBy() == 'name' then
|
||||
|
||||
|
||||
local childText = child:getText():lower()
|
||||
local length = math.min(childText:len(), nameLower:len())
|
||||
|
||||
|
@ -351,11 +351,11 @@ function onVipListMousePress(widget, mousePos, mouseButton)
|
|||
else
|
||||
menu:addOption(tr('Show Offline'), function() hideOffline(false) end)
|
||||
end
|
||||
|
||||
|
||||
if not(getSortedBy() == 'name') then
|
||||
menu:addOption(tr('Sort by name'), function() sortBy('name') end)
|
||||
end
|
||||
|
||||
|
||||
if not(getSortedBy() == 'status') then
|
||||
menu:addOption(tr('Sort by status'), function() sortBy('status') end)
|
||||
end
|
||||
|
@ -380,7 +380,7 @@ function onVipListLabelMousePress(widget, mousePos, mouseButton)
|
|||
menu:addOption(tr('Edit %s', widget:getText()), function() if widget then createEditWindow(widget) end end)
|
||||
menu:addOption(tr('Remove %s', widget:getText()), function() if widget then removeVip(widget) end end)
|
||||
menu:addSeparator()
|
||||
menu:addOption(tr('Copy Name'), function() g_window.setClipboardText(widget:getText()) end)
|
||||
menu:addOption(tr('Copy Name'), function() g_window.setClipboardText(widget:getText()) end)
|
||||
|
||||
if modules.game_console.getOwnPrivateTab() then
|
||||
menu:addSeparator()
|
||||
|
@ -393,15 +393,15 @@ function onVipListLabelMousePress(widget, mousePos, mouseButton)
|
|||
else
|
||||
menu:addOption(tr('Show Offline'), function() hideOffline(false) end)
|
||||
end
|
||||
|
||||
|
||||
if not(getSortedBy() == 'name') then
|
||||
menu:addOption(tr('Sort by name'), function() sortBy('name') end)
|
||||
end
|
||||
|
||||
|
||||
if not(getSortedBy() == 'status') then
|
||||
menu:addOption(tr('Sort by status'), function() sortBy('status') end)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
menu:display(mousePos)
|
||||
|
||||
return true
|
||||
|
|
|
@ -14,7 +14,7 @@ function g_game.findPlayerItem(itemId, subType)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return g_game.findItemInContainers(itemId, subType)
|
||||
end
|
||||
|
||||
|
|
|
@ -19,5 +19,5 @@ Module
|
|||
dofile 'market'
|
||||
dofile 'thing'
|
||||
dofile 'spells'
|
||||
|
||||
|
||||
dofiles 'ui'
|
||||
|
|
|
@ -154,7 +154,7 @@ function Player:hasState(_state, states)
|
|||
for i = 1, 32 do
|
||||
local pow = math.pow(2, i-1)
|
||||
if pow > states then break end
|
||||
|
||||
|
||||
local states = bit32.band(states, pow)
|
||||
if states == _state then
|
||||
return true
|
||||
|
|
|
@ -57,7 +57,7 @@ function ProtocolLogin:sendLoginPacket()
|
|||
msg:addU32(xteaKey[3])
|
||||
msg:addU32(xteaKey[4])
|
||||
end
|
||||
|
||||
|
||||
if g_game.getFeature(GameAccountNames) then
|
||||
msg:addString(self.accountName)
|
||||
else
|
||||
|
@ -77,7 +77,7 @@ function ProtocolLogin:sendLoginPacket()
|
|||
if g_game.getProtocolVersion() >= 770 then
|
||||
msg:encryptRsa()
|
||||
end
|
||||
|
||||
|
||||
if g_game.getFeature(GameProtocolChecksum) then
|
||||
self:enableChecksum()
|
||||
end
|
||||
|
@ -137,7 +137,7 @@ function ProtocolLogin:parseCharacterList(msg)
|
|||
local worldsCount = msg:getU8()
|
||||
for i=1, worldsCount do
|
||||
local world = {}
|
||||
local worldId = msg:getU8()
|
||||
local worldId = msg:getU8()
|
||||
world.worldName = msg:getString()
|
||||
world.worldIp = msg:getString()
|
||||
world.worldPort = msg:getU16()
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
SpelllistSettings = {
|
||||
['Default'] = {
|
||||
['Default'] = {
|
||||
iconFile = '/images/game/spells/defaultspells',
|
||||
iconSize = {width = 32, height = 32},
|
||||
spellListWidth = 210,
|
||||
spellWindowWidth = 550,
|
||||
spellOrder = {'Animate Dead', 'Annihilation', 'Avalanche', 'Berserk', 'Blood Rage', 'Brutal Strike', 'Cancel Invisibility', 'Challenge', 'Chameleon', 'Charge', 'Conjure Arrow', 'Conjure Bolt', 'Conjure Explosive Arrow', 'Conjure Piercing Bolt', 'Conjure Poisoned Arrow', 'Conjure Power Bolt', 'Conjure Sniper Arrow', 'Convince Creature', 'Creature Illusion', 'Cure Bleeding', 'Cure Burning', 'Cure Curse', 'Cure Electrification', 'Cure Poison', 'Cure Poison Rune', 'Curse', 'Death Strike', 'Desintegrate', 'Destroy Field', 'Divine Caldera', 'Divine Healing', 'Divine Missile', 'Electrify', 'Enchant Party', 'Enchant Spear', 'Enchant Staff', 'Energy Beam', 'Energy Field', 'Energy Strike', 'Energy Wall', 'Energy Wave', 'Energybomb', 'Envenom', 'Eternal Winter', 'Ethereal Spear', 'Explosion', 'Fierce Berserk', 'Find Person', 'Fire Field', 'Fire Wall', 'Fire Wave', 'Fireball', 'Firebomb', 'Flame Strike', 'Food', 'Front Sweep', 'Great Energy Beam', 'Great Fireball', 'Great Light', 'Groundshaker', 'Haste', 'Heal Friend', 'Heal Party', 'Heavy Magic Missile', 'Hells Core', 'Holy Flash', 'Holy Missile', 'Ice Strike', 'Ice Wave', 'Icicle', 'Ignite', 'Inflict Wound', 'Intense Healing', 'Intense Healing Rune', 'Intense Recovery', 'Intense Wound Cleansing', 'Invisibility', 'Levitate', 'Light', 'Light Healing', 'Light Magic Missile', 'Lightning', 'Magic Rope', 'Magic Shield', 'Magic Wall', 'Mass Healing', 'Paralyze', 'Physical Strike', 'Poison Bomb', 'Poison Field', 'Poison Wall', 'Protect Party', 'Protector', 'Rage of the Skies', 'Recovery', 'Salvation', 'Sharpshooter', 'Soulfire', 'Stalagmite', 'Stone Shower', 'Strong Energy Strike', 'Strong Ethereal Spear', 'Strong Flame Strike', 'Strong Haste', 'Strong Ice Strike', 'Strong Ice Wave', 'Strong Terra Strike', 'Sudden Death', 'Summon Creature', 'Swift Foot', 'Terra Strike', 'Terra Wave', 'Thunderstorm', 'Train Party', 'Ultimate Energy Strike', 'Ultimate Flame Strike', 'Ultimate Healing', 'Ultimate Healing Rune', 'Ultimate Ice Strike', 'Ultimate Light', 'Ultimate Terra Strike', 'Whirlwind Throw', 'Wild Growth', 'Wound Cleansing', 'Wrath of Nature'}
|
||||
}--[[,
|
||||
|
||||
['Sample'] = {
|
||||
iconFile = '/images/game/spells/sample',
|
||||
|
||||
['Sample'] = {
|
||||
iconFile = '/images/game/spells/sample',
|
||||
iconSize = {width = 64, height = 64},
|
||||
spellOrder = {'Critical Strike', 'Firefly', 'Fire Breath', 'Moonglaives', 'Wind Walk'}
|
||||
}]]
|
||||
|
@ -142,7 +142,7 @@ SpellInfo = {
|
|||
['Thunderstorm'] = {id = 117, words = 'adori mas vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'thunderstorm', mana = 430, level = 28, soul = 3, group = {[3] = 2000}, vocations = {1, 5}},
|
||||
['Holy Missile'] = {id = 130, words = 'adori san', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'holymissile', mana = 350, level = 27, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}
|
||||
},
|
||||
|
||||
|
||||
['Sample'] = {
|
||||
['Wind Walk'] = {id = 1, words = 'windwalk', description = 'Run at enormous speed.', exhaustion = 2000, premium = false, type = 'Instant', icon = 1, mana = 50, level = 10, soul = 0, group = {[3] = 2000}, vocations = {1, 2}},
|
||||
['Fire Breath'] = {id = 2, words = 'firebreath', description = 'A strong firewave.', exhaustion = 2000, premium = false, type = 'Instant', icon = 2, mana = 350, level = 27, soul = 0, group = {[1] = 2000}, vocations = {4, 8}},
|
||||
|
@ -209,89 +209,89 @@ SpellIcons = {
|
|||
['sniperarrow'] = {112, 108},
|
||||
['whirlwindthrow'] = {19, 107},
|
||||
['groundshaker'] = {25, 106},
|
||||
['fierceberserk'] = {22, 105},
|
||||
['fierceberserk'] = {22, 105},
|
||||
-- [[ 96 - 104 Unknown ]]
|
||||
['powerbolt'] = {108, 95},
|
||||
['wildgrowth'] = {61, 94},
|
||||
['challenge'] = {97, 93},
|
||||
['enchantstaff'] = {103, 92},
|
||||
['poisonbomb'] = {70, 91},
|
||||
['cancelinvisibility'] = {95, 90},
|
||||
['flamestrike'] = {26, 89},
|
||||
['energystrike'] = {29, 88},
|
||||
['deathstrike'] = {38, 87},
|
||||
['magicwall'] = {72, 86},
|
||||
['healfriend'] = {8, 84},
|
||||
['animatedead'] = {93, 83},
|
||||
['masshealing'] = {9, 82},
|
||||
['levitate'] = {125, 81},
|
||||
['berserk'] = {21, 80},
|
||||
['conjurebolt'] = {107, 79},
|
||||
['desintegrate'] = {88, 78},
|
||||
['stalagmite'] = {66, 77},
|
||||
['magicrope'] = {105, 76},
|
||||
['ultimatelight'] = {115, 75},
|
||||
['powerbolt'] = {108, 95},
|
||||
['wildgrowth'] = {61, 94},
|
||||
['challenge'] = {97, 93},
|
||||
['enchantstaff'] = {103, 92},
|
||||
['poisonbomb'] = {70, 91},
|
||||
['cancelinvisibility'] = {95, 90},
|
||||
['flamestrike'] = {26, 89},
|
||||
['energystrike'] = {29, 88},
|
||||
['deathstrike'] = {38, 87},
|
||||
['magicwall'] = {72, 86},
|
||||
['healfriend'] = {8, 84},
|
||||
['animatedead'] = {93, 83},
|
||||
['masshealing'] = {9, 82},
|
||||
['levitate'] = {125, 81},
|
||||
['berserk'] = {21, 80},
|
||||
['conjurebolt'] = {107, 79},
|
||||
['desintegrate'] = {88, 78},
|
||||
['stalagmite'] = {66, 77},
|
||||
['magicrope'] = {105, 76},
|
||||
['ultimatelight'] = {115, 75},
|
||||
-- [[ 71 - 64 TFS House Commands ]]
|
||||
-- [[ 63 - 70 Unknown ]]
|
||||
['annihilation'] = {24, 62},
|
||||
['brutalstrike'] = {23, 61},
|
||||
['annihilation'] = {24, 62},
|
||||
['brutalstrike'] = {23, 61},
|
||||
-- [[ 60 Unknown ]]
|
||||
['frontsweep'] = {20, 59},
|
||||
-- [[ 58 Unknown ]]
|
||||
['strongetherealspear'] = {59, 57},
|
||||
['wrathofnature'] = {48, 56},
|
||||
['energybomb'] = {86, 55},
|
||||
['paralyze'] = {71, 54},
|
||||
['strongetherealspear'] = {59, 57},
|
||||
['wrathofnature'] = {48, 56},
|
||||
['energybomb'] = {86, 55},
|
||||
['paralyze'] = {71, 54},
|
||||
-- [[ 53 Unknown ]]
|
||||
-- [[ 52 TFS Retrieve Friend ]]
|
||||
['conjurearrow'] = {106, 51},
|
||||
['soulfire'] = {67, 50},
|
||||
['explosivearrow'] = {109, 49},
|
||||
['poisonedarrow'] = {111, 48},
|
||||
['conjurearrow'] = {106, 51},
|
||||
['soulfire'] = {67, 50},
|
||||
['explosivearrow'] = {109, 49},
|
||||
['poisonedarrow'] = {111, 48},
|
||||
-- [[ 46 / 47 Unknown ]]
|
||||
['invisible'] = {94, 45},
|
||||
['magicshield'] = {124, 44},
|
||||
['strongicewave'] = {46, 43},
|
||||
['food'] = {99, 42},
|
||||
['invisible'] = {94, 45},
|
||||
['magicshield'] = {124, 44},
|
||||
['strongicewave'] = {46, 43},
|
||||
['food'] = {99, 42},
|
||||
-- [[ 40 / 41 Unknown ]]
|
||||
['stronghaste'] = {102, 39},
|
||||
['creatureillusion'] = {100, 38},
|
||||
['stronghaste'] = {102, 39},
|
||||
['creatureillusion'] = {100, 38},
|
||||
-- [[ 37 TFS Move ]]
|
||||
['salvation'] = {60, 36},
|
||||
-- [[ 34 / 35 Unknown ]]
|
||||
['energywall'] = {84, 33},
|
||||
['poisonwall'] = {68, 32},
|
||||
['antidote'] = {10, 31},
|
||||
['destroyfield'] = {87, 30},
|
||||
['curepoison'] = {10, 29},
|
||||
['firewall'] = {80, 28},
|
||||
['energyfield'] = {85, 27},
|
||||
['poisonfield'] = {69, 26},
|
||||
['firefield'] = {81, 25},
|
||||
['hellscore'] = {49, 24},
|
||||
['greatenergybeam'] = {42, 23},
|
||||
['energybeam'] = {41, 22},
|
||||
['suddendeath'] = {64, 21},
|
||||
['findperson'] = {114, 20},
|
||||
['firewave'] = {44, 19},
|
||||
['explosion'] = {83, 18},
|
||||
['firebomb'] = {82, 17},
|
||||
['greatfireball'] = {78, 16},
|
||||
['fireball'] = {79, 15},
|
||||
['chameleon'] = {91, 14},
|
||||
['energywave'] = {43, 13},
|
||||
['convincecreature'] = {90, 12},
|
||||
['greatlight'] = {116, 11},
|
||||
['light'] = {117, 10},
|
||||
['summoncreature'] = {118, 9},
|
||||
['heavymagicmissile'] = {77, 8},
|
||||
['lightmagicmissile'] = {73, 7},
|
||||
['haste'] = {101, 6},
|
||||
['ultimatehealingrune'] = {62, 5},
|
||||
['intensehealingrune'] = {74, 4},
|
||||
['ultimatehealing'] = {1, 3},
|
||||
['intensehealing'] = {7, 2},
|
||||
['lighthealing'] = {6, 1}
|
||||
['salvation'] = {60, 36},
|
||||
-- [[ 34 / 35 Unknown ]]
|
||||
['energywall'] = {84, 33},
|
||||
['poisonwall'] = {68, 32},
|
||||
['antidote'] = {10, 31},
|
||||
['destroyfield'] = {87, 30},
|
||||
['curepoison'] = {10, 29},
|
||||
['firewall'] = {80, 28},
|
||||
['energyfield'] = {85, 27},
|
||||
['poisonfield'] = {69, 26},
|
||||
['firefield'] = {81, 25},
|
||||
['hellscore'] = {49, 24},
|
||||
['greatenergybeam'] = {42, 23},
|
||||
['energybeam'] = {41, 22},
|
||||
['suddendeath'] = {64, 21},
|
||||
['findperson'] = {114, 20},
|
||||
['firewave'] = {44, 19},
|
||||
['explosion'] = {83, 18},
|
||||
['firebomb'] = {82, 17},
|
||||
['greatfireball'] = {78, 16},
|
||||
['fireball'] = {79, 15},
|
||||
['chameleon'] = {91, 14},
|
||||
['energywave'] = {43, 13},
|
||||
['convincecreature'] = {90, 12},
|
||||
['greatlight'] = {116, 11},
|
||||
['light'] = {117, 10},
|
||||
['summoncreature'] = {118, 9},
|
||||
['heavymagicmissile'] = {77, 8},
|
||||
['lightmagicmissile'] = {73, 7},
|
||||
['haste'] = {101, 6},
|
||||
['ultimatehealingrune'] = {62, 5},
|
||||
['intensehealingrune'] = {74, 4},
|
||||
['ultimatehealing'] = {1, 3},
|
||||
['intensehealing'] = {7, 2},
|
||||
['lighthealing'] = {6, 1}
|
||||
}
|
||||
|
||||
VocationNames = {
|
||||
|
|
|
@ -43,17 +43,17 @@ end
|
|||
|
||||
function UICreatureButton:setup(creature)
|
||||
self.creature = creature
|
||||
|
||||
|
||||
local creatureWidget = self:getChildById('creature')
|
||||
local labelWidget = self:getChildById('label')
|
||||
local lifeBarWidget = self:getChildById('lifeBar')
|
||||
|
||||
|
||||
labelWidget:setText(creature:getName())
|
||||
creatureWidget:setCreature(creature)
|
||||
|
||||
|
||||
self:setId('CreatureButton_' .. creature:getName():gsub('%s','_'))
|
||||
self:setLifeBarPercent(creature:getHealthPercent())
|
||||
|
||||
|
||||
self:updateSkull(creature:getSkull())
|
||||
self:updateEmblem(creature:getEmblem())
|
||||
end
|
||||
|
|
|
@ -273,18 +273,18 @@ function UIMinimap:createFlagWindow(pos)
|
|||
|
||||
flagRadioGroup:selectWidget(flagRadioGroup:getFirstWidget())
|
||||
|
||||
local successFunc = function()
|
||||
local successFunc = function()
|
||||
self:addFlag(pos, flagRadioGroup:getSelectedWidget().icon, description:getText())
|
||||
self:destroyFlagWindow()
|
||||
end
|
||||
|
||||
local cancelFunc = function()
|
||||
self:destroyFlagWindow()
|
||||
|
||||
local cancelFunc = function()
|
||||
self:destroyFlagWindow()
|
||||
end
|
||||
|
||||
|
||||
okButton.onClick = successFunc
|
||||
cancelButton.onClick = cancelFunc
|
||||
|
||||
|
||||
self.flagWindow.onEnter = successFunc
|
||||
self.flagWindow.onEscape = cancelFunc
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ public:
|
|||
HouseList getHouseList() { return m_houses; }
|
||||
HouseList filterHouses(uint32 townId);
|
||||
|
||||
private:
|
||||
private:
|
||||
HouseList m_houses;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -87,7 +87,7 @@ void MapView::draw(const Rect& rect)
|
|||
int drawFlags = 0;
|
||||
// First branch:
|
||||
// This is unlikely to be false because a lot of us
|
||||
// don't wanna hear their GPU fan while playing a
|
||||
// don't wanna hear their GPU fan while playing a
|
||||
// 2D game.
|
||||
//
|
||||
// Second & Third branch:
|
||||
|
|
|
@ -412,7 +412,7 @@ void Minimap::saveOtmm(const std::string& fileName)
|
|||
fin->write(compressBuffer.data(), len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// end of file
|
||||
Position invalidPos;
|
||||
fin->addU16(invalidPos.x);
|
||||
|
|
|
@ -161,7 +161,7 @@ void Tile::draw(const Point& dest, float scaleFactor, int drawFlags, LightView *
|
|||
if(drawFlags & Otc::DrawOnTop)
|
||||
for(const ThingPtr& thing : m_things)
|
||||
if(thing->isOnTop())
|
||||
thing->draw(dest, scaleFactor, animate, lightView);
|
||||
thing->draw(dest, scaleFactor, animate, lightView);
|
||||
|
||||
// draw translucent light (for tiles beneath holes)
|
||||
if(hasTranslucentLight() && lightView) {
|
||||
|
@ -482,7 +482,7 @@ ThingPtr Tile::getTopMultiUseThing()
|
|||
if(thing->isForceUse())
|
||||
return thing;
|
||||
}
|
||||
|
||||
|
||||
for(uint i = 0; i < m_things.size(); ++i) {
|
||||
ThingPtr thing = m_things[i];
|
||||
if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop()) {
|
||||
|
|
|
@ -65,7 +65,7 @@ bool UIMinimap::setZoom(int zoom)
|
|||
else
|
||||
m_scale = 1;
|
||||
m_layout->update();
|
||||
|
||||
|
||||
onZoomChange(zoom, oldZoom);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -237,7 +237,7 @@ set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS}
|
|||
${LUA_INCLUDE_DIR}
|
||||
${PHYSFS_INCLUDE_DIR}
|
||||
${OpenSSL_INCLUDE_DIR}
|
||||
${framework_INCLUDE_DIRS}
|
||||
${framework_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
if(WIN32) # The only platform it makes sense to check for DirectX SDK
|
||||
include(FindPkgMacros)
|
||||
findpkg_begin(DirectX)
|
||||
|
||||
|
||||
# Get path, convert backslashes as ${ENV_DXSDK_DIR}
|
||||
getenv_path(DXSDK_DIR)
|
||||
getenv_path(DIRECTX_HOME)
|
||||
getenv_path(DIRECTX_ROOT)
|
||||
getenv_path(DIRECTX_BASE)
|
||||
|
||||
|
||||
# construct search paths
|
||||
set(DirectX_PREFIX_PATH
|
||||
set(DirectX_PREFIX_PATH
|
||||
"${DXSDK_DIR}" "${ENV_DXSDK_DIR}"
|
||||
"${DIRECTX_HOME}" "${ENV_DIRECTX_HOME}"
|
||||
"${DIRECTX_ROOT}" "${ENV_DIRECTX_ROOT}"
|
||||
|
@ -43,7 +43,7 @@ if(WIN32) # The only platform it makes sense to check for DirectX SDK
|
|||
DirectX_LIBRARY
|
||||
DirectX_INCLUDE_DIR
|
||||
)
|
||||
|
||||
|
||||
find_path(DirectX_INCLUDE_DIR NAMES d3d9.h HINTS ${DirectX_INC_SEARCH_PATH})
|
||||
# dlls are in DirectX_ROOT_DIR/Developer Runtime/x64|x86
|
||||
# lib files are in DirectX_ROOT_DIR/Lib/x64|x86
|
||||
|
@ -61,7 +61,7 @@ if(WIN32) # The only platform it makes sense to check for DirectX SDK
|
|||
|
||||
# look for dxgi (needed by both 10 and 11)
|
||||
find_library(DirectX_DXGI_LIBRARY NAMES dxgi HINTS ${DirectX_LIB_SEARCH_PATH} PATH_SUFFIXES ${DirectX_LIBPATH_SUFFIX})
|
||||
|
||||
|
||||
# look for d3dcompiler (needed by 11)
|
||||
find_library(DirectX_D3DCOMPILER_LIBRARY NAMES d3dcompiler HINTS ${DirectX_LIB_SEARCH_PATH} PATH_SUFFIXES ${DirectX_LIBPATH_SUFFIX})
|
||||
|
||||
|
@ -83,7 +83,7 @@ if(WIN32) # The only platform it makes sense to check for DirectX SDK
|
|||
get_filename_component(DirectX_LIBRARY_DIR "${DirectX_LIBRARY}" PATH)
|
||||
message(STATUS "DX lib dir: ${DirectX_LIBRARY_DIR}")
|
||||
find_library(DirectX_D3D11_LIBRARY NAMES d3d11 HINTS ${DirectX_LIB_SEARCH_PATH} PATH_SUFFIXES ${DirectX_LIBPATH_SUFFIX})
|
||||
find_library(DirectX_D3DX11_LIBRARY NAMES d3dx11 HINTS ${DirectX_LIB_SEARCH_PATH} PATH_SUFFIXES ${DirectX_LIBPATH_SUFFIX})
|
||||
find_library(DirectX_D3DX11_LIBRARY NAMES d3dx11 HINTS ${DirectX_LIB_SEARCH_PATH} PATH_SUFFIXES ${DirectX_LIBPATH_SUFFIX})
|
||||
if (DirectX_D3D11_INCLUDE_DIR AND DirectX_D3D11_LIBRARY)
|
||||
set(DirectX_D3D11_FOUND TRUE)
|
||||
set(DirectX_D3D11_INCLUDE_DIR ${DirectX_D3D11_INCLUDE_DIR})
|
||||
|
@ -93,10 +93,10 @@ if(WIN32) # The only platform it makes sense to check for DirectX SDK
|
|||
${DirectX_DXGI_LIBRARY}
|
||||
${DirectX_DXERR_LIBRARY}
|
||||
${DirectX_DXGUID_LIBRARY}
|
||||
${DirectX_D3DCOMPILER_LIBRARY}
|
||||
)
|
||||
${DirectX_D3DCOMPILER_LIBRARY}
|
||||
)
|
||||
endif ()
|
||||
mark_as_advanced(DirectX_D3D11_INCLUDE_DIR DirectX_D3D11_LIBRARY DirectX_D3DX11_LIBRARY)
|
||||
endif ()
|
||||
|
||||
|
||||
endif(WIN32)
|
||||
|
|
|
@ -93,7 +93,7 @@ macro(get_debug_names PREFIX)
|
|||
endforeach(i)
|
||||
endmacro(get_debug_names)
|
||||
|
||||
# Add the parent dir from DIR to VAR
|
||||
# Add the parent dir from DIR to VAR
|
||||
macro(add_parent_dir VAR DIR)
|
||||
get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE)
|
||||
set(${VAR} ${${VAR}} ${${DIR}_TEMP})
|
||||
|
|
|
@ -275,7 +275,7 @@ std::string Platform::getOSName()
|
|||
else
|
||||
if(osvi.wProductType == VER_NT_WORKSTATION && osvi.dwMinorVersion == 2)
|
||||
ret += "Windows 8 ";
|
||||
else
|
||||
else
|
||||
ret += "Windows Server 2008 R2 ";
|
||||
}
|
||||
|
||||
|
|
|
@ -242,7 +242,7 @@ SoundSourcePtr SoundManager::createSoundSource(const std::string& filename)
|
|||
m_streamFiles[streamSource] = g_asyncDispatcher.schedule([=]() -> SoundFilePtr {
|
||||
stdext::timer a;
|
||||
try {
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
} catch(std::exception& e) {
|
||||
g_logger.error(e.what());
|
||||
return nullptr;
|
||||
|
@ -256,7 +256,7 @@ SoundSourcePtr SoundManager::createSoundSource(const std::string& filename)
|
|||
combinedSource->addSource(streamSource);
|
||||
m_streamFiles[streamSource] = g_asyncDispatcher.schedule([=]() -> SoundFilePtr {
|
||||
try {
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
} catch(std::exception& e) {
|
||||
g_logger.error(e.what());
|
||||
return nullptr;
|
||||
|
@ -268,7 +268,7 @@ SoundSourcePtr SoundManager::createSoundSource(const std::string& filename)
|
|||
StreamSoundSourcePtr streamSource(new StreamSoundSource);
|
||||
m_streamFiles[streamSource] = g_asyncDispatcher.schedule([=]() -> SoundFilePtr {
|
||||
try {
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
return SoundFile::loadSoundFile(filename);
|
||||
} catch(std::exception& e) {
|
||||
g_logger.error(e.what());
|
||||
return nullptr;
|
||||
|
|
|
@ -66,7 +66,7 @@ public:
|
|||
typedef T element_type;
|
||||
|
||||
shared_object_ptr(): px(nullptr) { }
|
||||
shared_object_ptr(T* p, bool add_ref = true) : px(p) {
|
||||
shared_object_ptr(T* p, bool add_ref = true) : px(p) {
|
||||
static_assert(std::is_base_of<shared_object, T>::value, "classes using shared_object_ptr must be a derived of stdext::shared_object");
|
||||
if(px != nullptr && add_ref)
|
||||
this->add_ref();
|
||||
|
|
|
@ -50,7 +50,7 @@ public:
|
|||
~shared_base() { }
|
||||
|
||||
void add_ref() { ++refs; }
|
||||
void dec_ref() {
|
||||
void dec_ref() {
|
||||
if(--refs == 0) {
|
||||
delete px;
|
||||
px = nullptr;
|
||||
|
@ -116,7 +116,7 @@ public:
|
|||
T& operator*() const { assert(base != nullptr); return *base->get(); }
|
||||
T* operator->() const { assert(base != nullptr); return base->get(); }
|
||||
|
||||
template<class U>
|
||||
template<class U>
|
||||
shared_ptr& operator=(shared_ptr<U> const& rhs) { shared_ptr(rhs).swap(*this); return *this; }
|
||||
shared_ptr& operator=(shared_ptr const& rhs) { shared_ptr(rhs).swap(*this); return *this; }
|
||||
shared_ptr& operator=(T* rhs) { shared_ptr(rhs).swap(*this); return *this; }
|
||||
|
|
|
@ -3,7 +3,7 @@ index cd479e4..8d46b23 100644
|
|||
--- a/const.h
|
||||
+++ b/const.h
|
||||
@@ -21,9 +21,12 @@
|
||||
|
||||
|
||||
enum OperatingSystem_t
|
||||
{
|
||||
- CLIENTOS_LINUX = 0x01,
|
||||
|
@ -16,7 +16,7 @@ index cd479e4..8d46b23 100644
|
|||
+ CLIENTOS_OTCLIENT_WINDOWS = 0x0B,
|
||||
+ CLIENTOS_OTCLIENT_MAC = 0x0C,
|
||||
};
|
||||
|
||||
|
||||
enum ChannelEvent_t
|
||||
diff --git a/creatureevent.cpp b/creatureevent.cpp
|
||||
index 842b237..e9b2200 100644
|
||||
|
@ -28,7 +28,7 @@ index 842b237..e9b2200 100644
|
|||
_type = CREATURE_EVENT_PREPAREDEATH;
|
||||
+ else if(type == "extendedopcode")
|
||||
+ _type = CREATURE_EVENT_EXTENDED_OPCODE;
|
||||
|
||||
|
||||
return _type;
|
||||
}
|
||||
@@ -330,6 +332,8 @@ std::string CreatureEvent::getScriptEventName() const
|
||||
|
@ -119,7 +119,7 @@ index f1ff4b2..cc5171c 100644
|
|||
+ CREATURE_EVENT_PREPAREDEATH,
|
||||
+ CREATURE_EVENT_EXTENDED_OPCODE // otclient additional network opcodes
|
||||
};
|
||||
|
||||
|
||||
enum StatsChange_t
|
||||
@@ -150,6 +151,7 @@ class CreatureEvent : public Event
|
||||
uint32_t executeKill(Creature* creature, Creature* target, const DeathEntry& entry);
|
||||
|
@ -127,14 +127,14 @@ index f1ff4b2..cc5171c 100644
|
|||
uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
|
||||
+ uint32_t executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer);
|
||||
//
|
||||
|
||||
|
||||
protected:
|
||||
diff --git a/data/creaturescripts/creaturescripts.xml b/data/creaturescripts/creaturescripts.xml
|
||||
index 363c62b..c706f10 100644
|
||||
--- a/data/creaturescripts/creaturescripts.xml
|
||||
+++ b/data/creaturescripts/creaturescripts.xml
|
||||
@@ -14,4 +14,6 @@
|
||||
|
||||
|
||||
<event type="think" name="Idle" event="script" value="idle.lua"/>
|
||||
<event type="think" name="SkullCheck" event="script" value="skullcheck.lua"/>
|
||||
+
|
||||
|
@ -164,7 +164,7 @@ index 2e4dc2c..7508591 100644
|
|||
--- a/game.cpp
|
||||
+++ b/game.cpp
|
||||
@@ -6951,3 +6951,12 @@ void Game::checkExpiredMarketOffers()
|
||||
|
||||
|
||||
Scheduler::getInstance().addEvent(createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, boost::bind(&Game::checkExpiredMarketOffers, this)));
|
||||
}
|
||||
+
|
||||
|
@ -185,7 +185,7 @@ index 51fa397..7192549 100644
|
|||
@@ -646,6 +646,8 @@ class Game
|
||||
std::map<Item*, int32_t> grounds;
|
||||
#endif
|
||||
|
||||
|
||||
+ void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer);
|
||||
+
|
||||
protected:
|
||||
|
@ -198,7 +198,7 @@ index 4cb8c8d..4ed9391 100644
|
|||
@@ -2476,6 +2476,12 @@ void LuaInterface::registerFunctions()
|
||||
//getConfigFile()
|
||||
lua_register(m_luaState, "getConfigFile", LuaInterface::luaGetConfigFile);
|
||||
|
||||
|
||||
+ //isPlayerUsingOtclient(cid)
|
||||
+ lua_register(m_luaState, "isPlayerUsingOtclient", LuaInterface::luaIsPlayerUsingOtclient);
|
||||
+
|
||||
|
@ -207,11 +207,11 @@ index 4cb8c8d..4ed9391 100644
|
|||
+
|
||||
//getConfigValue(key)
|
||||
lua_register(m_luaState, "getConfigValue", LuaInterface::luaGetConfigValue);
|
||||
|
||||
|
||||
@@ -9471,6 +9477,32 @@ int32_t LuaInterface::luaGetMountInfo(lua_State* L)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
+int32_t LuaInterface::luaIsPlayerUsingOtclient(lua_State* L)
|
||||
+{
|
||||
+ //isPlayerUsingOtclient(cid)
|
||||
|
@ -248,7 +248,7 @@ index 234091a..0a0046f 100644
|
|||
@@ -697,6 +697,9 @@ class LuaInterface
|
||||
static int32_t luaDoPlayerSetMounted(lua_State* L);
|
||||
static int32_t luaGetMountInfo(lua_State* L);
|
||||
|
||||
|
||||
+ static int32_t luaIsPlayerUsingOtclient(lua_State* L);
|
||||
+ static int32_t luaDoSendPlayerExtendedOpcode(lua_State* L);
|
||||
+
|
||||
|
@ -262,7 +262,7 @@ index 917e36a..3671750 100644
|
|||
@@ -171,16 +171,16 @@ Position NetworkMessage::getPosition()
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
-void NetworkMessage::putString(const char* value, bool addSize/* = true*/)
|
||||
+void NetworkMessage::putString(const char* value, int length, bool addSize/* = true*/)
|
||||
{
|
||||
|
@ -270,10 +270,10 @@ index 917e36a..3671750 100644
|
|||
+ uint32_t size = (uint32_t)length;
|
||||
if(!hasSpace(size + (addSize ? 2 : 0)) || size > 8192)
|
||||
return;
|
||||
|
||||
|
||||
if(addSize)
|
||||
put<uint16_t>(size);
|
||||
|
||||
|
||||
- strcpy((char*)(m_buffer + m_position), value);
|
||||
+ memcpy((char*)(m_buffer + m_position), value, length);
|
||||
m_position += size;
|
||||
|
@ -286,14 +286,14 @@ index 6cf8ee1..615f094 100644
|
|||
@@ -80,8 +80,8 @@ class NetworkMessage
|
||||
m_size += sizeof(T);
|
||||
}
|
||||
|
||||
|
||||
- void putString(const std::string& value, bool addSize = true) {putString(value.c_str(), addSize);}
|
||||
- void putString(const char* value, bool addSize = true);
|
||||
+ void putString(const std::string& value, bool addSize = true) {putString(value.c_str(), value.length(), addSize);}
|
||||
+ void putString(const char* value, int length, bool addSize = true);
|
||||
|
||||
|
||||
void putPadding(uint32_t amount);
|
||||
|
||||
|
||||
diff --git a/player.h b/player.h
|
||||
index 63e9183..7cb8313 100644
|
||||
--- a/player.h
|
||||
|
@ -301,7 +301,7 @@ index 63e9183..7cb8313 100644
|
|||
@@ -228,6 +228,7 @@ class Player : public Creature, public Cylinder
|
||||
bool hasPVPBlessing() const {return pvpBlessing;}
|
||||
uint16_t getBlessings() const;
|
||||
|
||||
|
||||
+ bool isUsingOtclient() const { return operatingSystem >= CLIENTOS_OTCLIENT_LINUX; }
|
||||
OperatingSystem_t getOperatingSystem() const {return operatingSystem;}
|
||||
void setOperatingSystem(OperatingSystem_t os) {operatingSystem = os;}
|
||||
|
@ -309,7 +309,7 @@ index 63e9183..7cb8313 100644
|
|||
@@ -580,6 +581,9 @@ class Player : public Creature, public Cylinder
|
||||
void sendSpellGroupCooldown(SpellGroup_t groupId, uint32_t cooldown)
|
||||
{if(client) client->sendSpellGroupCooldown(groupId, cooldown);}
|
||||
|
||||
|
||||
+ void sendExtendedOpcode(uint8_t opcode, const std::string& buffer)
|
||||
+ {if(client) client->sendExtendedOpcode(opcode, buffer);}
|
||||
+
|
||||
|
@ -323,7 +323,7 @@ index b980be0..7a84f61 100644
|
|||
@@ -263,6 +263,11 @@ bool ProtocolGame::login(const std::string& name, uint32_t id, const std::string
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+ if(player->isUsingOtclient())
|
||||
+ {
|
||||
+ player->registerCreatureEvent("ExtendedOpcode");
|
||||
|
@ -335,18 +335,18 @@ index b980be0..7a84f61 100644
|
|||
@@ -427,6 +432,10 @@ void ProtocolGame::onRecvFirstMessage(NetworkMessage& msg)
|
||||
enableXTEAEncryption();
|
||||
setXTEAKey(key);
|
||||
|
||||
|
||||
+ // notifies to otclient that this server can receive extended game protocol opcodes
|
||||
+ if(operatingSystem >= CLIENTOS_OTCLIENT_LINUX)
|
||||
+ sendExtendedOpcode(0x00, std::string());
|
||||
+
|
||||
bool gamemaster = (msg.get<char>() != (char)0);
|
||||
std::string name = msg.getString(), character = msg.getString(), password = msg.getString();
|
||||
|
||||
|
||||
@@ -578,6 +587,10 @@ void ProtocolGame::parsePacket(NetworkMessage &msg)
|
||||
parseReceivePing(msg);
|
||||
break;
|
||||
|
||||
|
||||
+ case 0x32: // otclient extended opcode
|
||||
+ parseExtendedOpcode(msg);
|
||||
+ break;
|
||||
|
@ -390,7 +390,7 @@ index 7691174..48b9bf1 100644
|
|||
@@ -326,6 +326,9 @@ class ProtocolGame : public Protocol
|
||||
//shop
|
||||
void AddShopItem(NetworkMessage_ptr msg, const ShopInfo& item);
|
||||
|
||||
|
||||
+ void parseExtendedOpcode(NetworkMessage& msg);
|
||||
+ void sendExtendedOpcode(uint8_t opcode, const std::string& buffer);
|
||||
+
|
||||
|
|
Loading…
Reference in New Issue