Vip functionality, closes #83
This commit is contained in:
parent
e4ba805e00
commit
20b68c6a42
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 349 B |
|
@ -0,0 +1,138 @@
|
||||||
|
IconButton < CheckBox
|
||||||
|
size: 20 20
|
||||||
|
image-source: /images/game/viplist/vipcheckbox
|
||||||
|
image-size: 20 20
|
||||||
|
image-border: 3
|
||||||
|
margin: 2
|
||||||
|
icon-source: /images/game/viplist/icons
|
||||||
|
icon-size: 12 12
|
||||||
|
icon-rect: 0 0 12 12
|
||||||
|
icon-clip: 0 0 12 12
|
||||||
|
icon-offset: 4 6
|
||||||
|
|
||||||
|
$first:
|
||||||
|
margin-left: 0
|
||||||
|
|
||||||
|
$!checked:
|
||||||
|
image-clip: 26 0 26 26
|
||||||
|
|
||||||
|
$hover !checked:
|
||||||
|
image-clip: 78 0 26 26
|
||||||
|
|
||||||
|
$checked:
|
||||||
|
image-clip: 0 0 26 26
|
||||||
|
|
||||||
|
$hover checked:
|
||||||
|
image-clip: 52 0 26 26
|
||||||
|
|
||||||
|
MainWindow
|
||||||
|
size: 272 170
|
||||||
|
!text: tr('Edit VIP list entry')
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: nameLabel
|
||||||
|
text: Name
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
color: green
|
||||||
|
width: 180
|
||||||
|
|
||||||
|
Label
|
||||||
|
!text: tr('Description') .. ':'
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-offset: 0 3
|
||||||
|
height: 20
|
||||||
|
margin-top: 5
|
||||||
|
|
||||||
|
TextEdit
|
||||||
|
id: descriptionText
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin: 0 5
|
||||||
|
|
||||||
|
Label
|
||||||
|
!text: tr('Notify-Login') .. ':'
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-offset: 0 3
|
||||||
|
height: 20
|
||||||
|
margin-top: 5
|
||||||
|
|
||||||
|
CheckBox
|
||||||
|
id: checkBoxNotify
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
margin: 2 6
|
||||||
|
|
||||||
|
UIWidget
|
||||||
|
layout: horizontalBox
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: 24
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon0
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon1
|
||||||
|
icon-clip: 12 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon2
|
||||||
|
icon-clip: 24 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon3
|
||||||
|
icon-clip: 36 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon4
|
||||||
|
icon-clip: 48 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon5
|
||||||
|
icon-clip: 60 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon6
|
||||||
|
icon-clip: 72 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon7
|
||||||
|
icon-clip: 84 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon8
|
||||||
|
icon-clip: 96 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon9
|
||||||
|
icon-clip: 108 0 12 12
|
||||||
|
|
||||||
|
IconButton
|
||||||
|
id: icon10
|
||||||
|
icon-clip: 120 0 12 12
|
||||||
|
|
||||||
|
HorizontalSeparator
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: next.top
|
||||||
|
margin-bottom: 10
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonOK
|
||||||
|
!text: tr('Ok')
|
||||||
|
width: 64
|
||||||
|
anchors.right: next.left
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-right: 10
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonCancel
|
||||||
|
!text: tr('Cancel')
|
||||||
|
width: 64
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
|
@ -1,6 +1,8 @@
|
||||||
vipWindow = nil
|
vipWindow = nil
|
||||||
vipButton = nil
|
vipButton = nil
|
||||||
addVipWindow = nil
|
addVipWindow = nil
|
||||||
|
editVipWindow = nil
|
||||||
|
vipInfo = {}
|
||||||
|
|
||||||
function init()
|
function init()
|
||||||
connect(g_game, { onGameStart = refresh,
|
connect(g_game, { onGameStart = refresh,
|
||||||
|
@ -15,6 +17,9 @@ function init()
|
||||||
vipButton:setOn(true)
|
vipButton:setOn(true)
|
||||||
vipWindow = g_ui.loadUI('viplist', modules.game_interface.getRightPanel())
|
vipWindow = g_ui.loadUI('viplist', modules.game_interface.getRightPanel())
|
||||||
|
|
||||||
|
if not g_game.getFeature(GameAdditionalVipInfo) then
|
||||||
|
loadVipInfo()
|
||||||
|
end
|
||||||
refresh()
|
refresh()
|
||||||
vipWindow:setup()
|
vipWindow:setup()
|
||||||
end
|
end
|
||||||
|
@ -26,10 +31,38 @@ function terminate()
|
||||||
onAddVip = onAddVip,
|
onAddVip = onAddVip,
|
||||||
onVipStateChange = onVipStateChange })
|
onVipStateChange = onVipStateChange })
|
||||||
|
|
||||||
|
if not g_game.getFeature(GameAdditionalVipInfo) then
|
||||||
|
saveVipInfo()
|
||||||
|
end
|
||||||
|
|
||||||
|
if addVipWindow then
|
||||||
|
addVipWindow:destroy()
|
||||||
|
end
|
||||||
|
|
||||||
|
if editVipWindow then
|
||||||
|
editVipWindow:destroy()
|
||||||
|
end
|
||||||
|
|
||||||
vipWindow:destroy()
|
vipWindow:destroy()
|
||||||
vipButton:destroy()
|
vipButton:destroy()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function loadVipInfo()
|
||||||
|
local settings = g_settings.getNode('VipList')
|
||||||
|
if not settings then
|
||||||
|
vipInfo = {}
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vipInfo = settings['VipInfo'] or {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function saveVipInfo()
|
||||||
|
settings = {}
|
||||||
|
settings['VipInfo'] = vipInfo
|
||||||
|
g_settings.mergeNode('VipList', settings)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function refresh()
|
function refresh()
|
||||||
clear()
|
clear()
|
||||||
for id,vip in pairs(g_game.getVips()) do
|
for id,vip in pairs(g_game.getVips()) do
|
||||||
|
@ -62,6 +95,78 @@ function createAddWindow()
|
||||||
addVipWindow = g_ui.displayUI('addvip')
|
addVipWindow = g_ui.displayUI('addvip')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function createEditWindow(widget)
|
||||||
|
if editVipWindow then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
editVipWindow = g_ui.displayUI('editvip')
|
||||||
|
|
||||||
|
local name = widget:getText()
|
||||||
|
local id = widget:getId():sub(4)
|
||||||
|
|
||||||
|
local okButton = editVipWindow:getChildById('buttonOK')
|
||||||
|
local cancelButton = editVipWindow:getChildById('buttonCancel')
|
||||||
|
|
||||||
|
local nameLabel = editVipWindow:getChildById('nameLabel')
|
||||||
|
nameLabel:setText(name)
|
||||||
|
|
||||||
|
local descriptionText = editVipWindow:getChildById('descriptionText')
|
||||||
|
descriptionText:appendText(widget:getTooltip())
|
||||||
|
|
||||||
|
local notifyCheckBox = editVipWindow:getChildById('checkBoxNotify')
|
||||||
|
notifyCheckBox:setChecked(widget.notifyLogin)
|
||||||
|
|
||||||
|
local iconRadioGroup = UIRadioGroup.create()
|
||||||
|
for i = VipIconFirst, VipIconLast do
|
||||||
|
iconRadioGroup:addWidget(editVipWindow:recursiveGetChildById('icon' .. i))
|
||||||
|
end
|
||||||
|
iconRadioGroup:selectWidget(editVipWindow:recursiveGetChildById('icon' .. widget.iconId))
|
||||||
|
|
||||||
|
local cancelFunction = function()
|
||||||
|
editVipWindow:destroy()
|
||||||
|
iconRadioGroup:destroy()
|
||||||
|
editVipWindow = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local saveFunction = function()
|
||||||
|
local vipList = vipWindow:getChildById('contentsPanel')
|
||||||
|
if not widget or not vipList:hasChild(widget) then
|
||||||
|
cancelFunction()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local name = widget:getText()
|
||||||
|
local state = widget.vipState
|
||||||
|
local description = descriptionText:getText()
|
||||||
|
local iconId = tonumber(iconRadioGroup:getSelectedWidget():getId():sub(5))
|
||||||
|
local notify = notifyCheckBox:isChecked()
|
||||||
|
|
||||||
|
if g_game.getFeature(GameAdditionalVipInfo) then
|
||||||
|
g_game.editVip(id, description, iconId, notify)
|
||||||
|
else
|
||||||
|
if notify ~= false or #description > 0 or iconId > 0 then
|
||||||
|
vipInfo[id] = {description = description, iconId = iconId, notifyLogin = notify}
|
||||||
|
else
|
||||||
|
vipInfo[id] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
widget:destroy()
|
||||||
|
onAddVip(id, name, state, description, iconId, notify)
|
||||||
|
|
||||||
|
editVipWindow:destroy()
|
||||||
|
iconRadioGroup:destroy()
|
||||||
|
editVipWindow = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
cancelButton.onClick = cancelFunction
|
||||||
|
okButton.onClick = saveFunction
|
||||||
|
|
||||||
|
editVipWindow.onEscape = cancelFunction
|
||||||
|
editVipWindow.onEnter = saveFunction
|
||||||
|
end
|
||||||
|
|
||||||
function destroyAddWindow()
|
function destroyAddWindow()
|
||||||
addVipWindow:destroy()
|
addVipWindow:destroy()
|
||||||
addVipWindow = nil
|
addVipWindow = nil
|
||||||
|
@ -72,6 +177,38 @@ function addVip()
|
||||||
destroyAddWindow()
|
destroyAddWindow()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function removeVip(widgetOrName)
|
||||||
|
if not widgetOrName then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local widget
|
||||||
|
local vipList = vipWindow:getChildById('contentsPanel')
|
||||||
|
if type(widgetOrName) == 'string' then
|
||||||
|
local entries = vipList:getChildren()
|
||||||
|
for i = 1, #entries do
|
||||||
|
if entries[i]:getText():lower() == widgetOrName:lower() then
|
||||||
|
widget = entries[i]
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not widget then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
else
|
||||||
|
widget = widgetOrName
|
||||||
|
end
|
||||||
|
|
||||||
|
if widget then
|
||||||
|
local id = widget:getId():sub(4)
|
||||||
|
g_game.removeVip(id)
|
||||||
|
vipList:removeChild(widget)
|
||||||
|
if vipInfo[id] and g_game.getFeature(GameAdditionalVipInfo) then
|
||||||
|
vipInfo[id] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function hideOffline(state)
|
function hideOffline(state)
|
||||||
settings = {}
|
settings = {}
|
||||||
settings['hideOffline'] = state
|
settings['hideOffline'] = state
|
||||||
|
@ -90,7 +227,7 @@ end
|
||||||
|
|
||||||
function getSortedBy()
|
function getSortedBy()
|
||||||
local settings = g_settings.getNode('VipList')
|
local settings = g_settings.getNode('VipList')
|
||||||
if not settings then
|
if not settings or not settings['sortedBy'] then
|
||||||
return 'status'
|
return 'status'
|
||||||
end
|
end
|
||||||
return settings['sortedBy']
|
return settings['sortedBy']
|
||||||
|
@ -104,8 +241,7 @@ function sortBy(state)
|
||||||
refresh()
|
refresh()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function onAddVip(id, name, state, description, iconId, notify)
|
||||||
function onAddVip(id, name, state)
|
|
||||||
local vipList = vipWindow:getChildById('contentsPanel')
|
local vipList = vipWindow:getChildById('contentsPanel')
|
||||||
|
|
||||||
local label = g_ui.createWidget('VipListLabel')
|
local label = g_ui.createWidget('VipListLabel')
|
||||||
|
@ -113,6 +249,27 @@ function onAddVip(id, name, state)
|
||||||
label:setId('vip' .. id)
|
label:setId('vip' .. id)
|
||||||
label:setText(name)
|
label:setText(name)
|
||||||
|
|
||||||
|
if not g_game.getFeature(GameAdditionalVipInfo) then
|
||||||
|
local tmpVipInfo = vipInfo[tostring(id)]
|
||||||
|
label.iconId = 0
|
||||||
|
label.notifyLogin = false
|
||||||
|
if tmpVipInfo then
|
||||||
|
if tmpVipInfo.iconId then
|
||||||
|
label:setImageClip(torect((tmpVipInfo.iconId * 12) .. ' 0 12 12'))
|
||||||
|
label.iconId = tmpVipInfo.iconId
|
||||||
|
end
|
||||||
|
if tmpVipInfo.description then
|
||||||
|
label:setTooltip(tmpVipInfo.description)
|
||||||
|
end
|
||||||
|
label.notifyLogin = tmpVipInfo.notifyLogin or false
|
||||||
|
end
|
||||||
|
else
|
||||||
|
label:setTooltip(description)
|
||||||
|
label:setImageClip(torect((iconId * 12) .. ' 0 12 12'))
|
||||||
|
label.iconId = iconId
|
||||||
|
label.notifyLogin = notify
|
||||||
|
end
|
||||||
|
|
||||||
if state == VipState.Online then
|
if state == VipState.Online then
|
||||||
label:setColor('#00ff00')
|
label:setColor('#00ff00')
|
||||||
elseif state == VipState.Pending then
|
elseif state == VipState.Pending then
|
||||||
|
@ -135,13 +292,14 @@ function onAddVip(id, name, state)
|
||||||
|
|
||||||
for i=1,childrenCount do
|
for i=1,childrenCount do
|
||||||
local child = vipList:getChildByIndex(i)
|
local child = vipList:getChildByIndex(i)
|
||||||
if state == VipState.Online and child.vipState ~= VipState.Online and getSortedBy() == 'status' then
|
if (state == VipState.Online and child.vipState ~= VipState.Online and getSortedBy() == 'status')
|
||||||
|
or (label.iconId > child.iconId and getSortedBy() == 'type') then
|
||||||
vipList:insertChild(i, label)
|
vipList:insertChild(i, label)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if ((state ~= VipState.Online and child.vipState ~= VipState.Online)
|
if (((state ~= VipState.Online and child.vipState ~= VipState.Online) or (state == VipState.Online and child.vipState == VipState.Online)) and getSortedBy() == 'status')
|
||||||
or (state == VipState.Online and child.vipState == VipState.Online)) or getSortedBy() == 'name' then
|
or (label.iconId == child.iconId and getSortedBy() == 'type') or getSortedBy() == 'name' then
|
||||||
|
|
||||||
local childText = child:getText():lower()
|
local childText = child:getText():lower()
|
||||||
local length = math.min(childText:len(), nameLower:len())
|
local length = math.min(childText:len(), nameLower:len())
|
||||||
|
@ -154,6 +312,7 @@ function onAddVip(id, name, state)
|
||||||
break
|
break
|
||||||
elseif j == nameLower:len() then -- We are at the end of nameLower, and its shorter than childText, thus insert before
|
elseif j == nameLower:len() then -- We are at the end of nameLower, and its shorter than childText, thus insert before
|
||||||
vipList:insertChild(i, label)
|
vipList:insertChild(i, label)
|
||||||
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -165,10 +324,17 @@ end
|
||||||
function onVipStateChange(id, state)
|
function onVipStateChange(id, state)
|
||||||
local vipList = vipWindow:getChildById('contentsPanel')
|
local vipList = vipWindow:getChildById('contentsPanel')
|
||||||
local label = vipList:getChildById('vip' .. id)
|
local label = vipList:getChildById('vip' .. id)
|
||||||
local text = label:getText()
|
local name = label:getText()
|
||||||
|
local description = label:getTooltip()
|
||||||
|
local iconId = label.iconId
|
||||||
|
local notify = label.notifyLogin
|
||||||
label:destroy()
|
label:destroy()
|
||||||
|
|
||||||
onAddVip(id, text, state)
|
onAddVip(id, name, state, description, iconId, notify)
|
||||||
|
|
||||||
|
if notify and state ~= VipState.Pending then
|
||||||
|
modules.game_textmessage.displayFailureMessage(tr('%s has logged %s.', name, (state == VipState.Online and 'in' or 'out')))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function onVipListMousePress(widget, mousePos, mouseButton)
|
function onVipListMousePress(widget, mousePos, mouseButton)
|
||||||
|
@ -179,6 +345,7 @@ function onVipListMousePress(widget, mousePos, mouseButton)
|
||||||
local menu = g_ui.createWidget('PopupMenu')
|
local menu = g_ui.createWidget('PopupMenu')
|
||||||
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
|
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
|
||||||
|
|
||||||
|
menu:addSeparator()
|
||||||
if not isHiddingOffline() then
|
if not isHiddingOffline() then
|
||||||
menu:addOption(tr('Hide Offline'), function() hideOffline(true) end)
|
menu:addOption(tr('Hide Offline'), function() hideOffline(true) end)
|
||||||
else
|
else
|
||||||
|
@ -193,6 +360,10 @@ function onVipListMousePress(widget, mousePos, mouseButton)
|
||||||
menu:addOption(tr('Sort by status'), function() sortBy('status') end)
|
menu:addOption(tr('Sort by status'), function() sortBy('status') end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not(getSortedBy() == 'type') then
|
||||||
|
menu:addOption(tr('Sort by type'), function() sortBy('type') end)
|
||||||
|
end
|
||||||
|
|
||||||
menu:display(mousePos)
|
menu:display(mousePos)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -206,7 +377,8 @@ function onVipListLabelMousePress(widget, mousePos, mouseButton)
|
||||||
local menu = g_ui.createWidget('PopupMenu')
|
local menu = g_ui.createWidget('PopupMenu')
|
||||||
menu:addOption(tr('Send Message'), function() g_game.openPrivateChannel(widget:getText()) end)
|
menu:addOption(tr('Send Message'), function() g_game.openPrivateChannel(widget:getText()) end)
|
||||||
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
|
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
|
||||||
menu:addOption(tr('Remove %s', widget:getText()), function() if widget then g_game.removeVip(widget:getId():sub(4)) vipList:removeChild(widget) end end)
|
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: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)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
VipListLabel < GameLabel
|
VipListLabel < GameLabel
|
||||||
margin-top: 2
|
margin-top: 2
|
||||||
|
text-offset: 16 0
|
||||||
|
image-rect: 0 0 12 12
|
||||||
|
image-clip: 0 0 12 12
|
||||||
|
image-source: /images/game/viplist/icons
|
||||||
font: verdana-11px-monochrome
|
font: verdana-11px-monochrome
|
||||||
phantom: false
|
phantom: false
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,9 @@ EmblemBlue = 3
|
||||||
EmblemMember = 4
|
EmblemMember = 4
|
||||||
EmblemOther = 5
|
EmblemOther = 5
|
||||||
|
|
||||||
|
VipIconFirst = 0
|
||||||
|
VipIconLast = 10
|
||||||
|
|
||||||
North = 0
|
North = 0
|
||||||
East = 1
|
East = 1
|
||||||
South = 2
|
South = 2
|
||||||
|
@ -100,6 +103,8 @@ GameNewFluids = 47
|
||||||
GamePlayerStateU16 = 48
|
GamePlayerStateU16 = 48
|
||||||
GameNewOutfitProtocol = 49
|
GameNewOutfitProtocol = 49
|
||||||
GamePVPMode = 50
|
GamePVPMode = 50
|
||||||
|
GameWritableDate = 51
|
||||||
|
GameAdditionalVipInfo = 52
|
||||||
|
|
||||||
TextColors = {
|
TextColors = {
|
||||||
red = '#f55e5e', --'#c83200'
|
red = '#f55e5e', --'#c83200'
|
||||||
|
|
|
@ -375,6 +375,7 @@ namespace Otc
|
||||||
GameNewOutfitProtocol = 49,
|
GameNewOutfitProtocol = 49,
|
||||||
GamePVPMode = 50,
|
GamePVPMode = 50,
|
||||||
GameWritableDate = 51,
|
GameWritableDate = 51,
|
||||||
|
GameAdditionalVipInfo = 52,
|
||||||
|
|
||||||
LastGameFeature = 101
|
LastGameFeature = 101
|
||||||
};
|
};
|
||||||
|
|
|
@ -402,10 +402,10 @@ void Game::processRuleViolationLock()
|
||||||
g_lua.callGlobalField("g_game", "onRuleViolationLock");
|
g_lua.callGlobalField("g_game", "onRuleViolationLock");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::processVipAdd(uint id, const std::string& name, uint status, int iconId, bool notifyLogin)
|
void Game::processVipAdd(uint id, const std::string& name, uint status, const std::string& description, int iconId, bool notifyLogin)
|
||||||
{
|
{
|
||||||
m_vips[id] = Vip(name, status);
|
m_vips[id] = Vip(name, status, description, iconId, notifyLogin);
|
||||||
g_lua.callGlobalField("g_game", "onAddVip", id, name, status, iconId, notifyLogin);
|
g_lua.callGlobalField("g_game", "onAddVip", id, name, status, description, iconId, notifyLogin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::processVipStateChange(uint id, uint status)
|
void Game::processVipStateChange(uint id, uint status)
|
||||||
|
@ -1192,6 +1192,23 @@ void Game::removeVip(int playerId)
|
||||||
m_protocolGame->sendRemoveVip(playerId);
|
m_protocolGame->sendRemoveVip(playerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Game::editVip(int playerId, const std::string& description, int iconId, bool notifyLogin)
|
||||||
|
{
|
||||||
|
if(!canPerformGameAction())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto it = m_vips.find(playerId);
|
||||||
|
if(it == m_vips.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::get<2>(m_vips[playerId]) = description;
|
||||||
|
std::get<3>(m_vips[playerId]) = iconId;
|
||||||
|
std::get<4>(m_vips[playerId]) = notifyLogin;
|
||||||
|
|
||||||
|
if(getFeature(Otc::GameAdditionalVipInfo))
|
||||||
|
m_protocolGame->sendEditVip(playerId, description, iconId, notifyLogin);
|
||||||
|
}
|
||||||
|
|
||||||
void Game::setChaseMode(Otc::ChaseModes chaseMode)
|
void Game::setChaseMode(Otc::ChaseModes chaseMode)
|
||||||
{
|
{
|
||||||
if(!canPerformGameAction())
|
if(!canPerformGameAction())
|
||||||
|
@ -1521,6 +1538,10 @@ void Game::setProtocolVersion(int version)
|
||||||
enableFeature(Otc::GameOfflineTrainingTime);
|
enableFeature(Otc::GameOfflineTrainingTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(version >= 963) {
|
||||||
|
enableFeature(Otc::GameAdditionalVipInfo);
|
||||||
|
}
|
||||||
|
|
||||||
if(version >= 973) {
|
if(version >= 973) {
|
||||||
enableFeature(Otc::GameLoginPending);
|
enableFeature(Otc::GameLoginPending);
|
||||||
enableFeature(Otc::GameNewSpeedLaw);
|
enableFeature(Otc::GameNewSpeedLaw);
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
|
||||||
typedef std::tuple<std::string, uint> Vip;
|
typedef std::tuple<std::string, uint, std::string, int, bool> Vip;
|
||||||
|
|
||||||
//@bindsingleton g_game
|
//@bindsingleton g_game
|
||||||
class Game
|
class Game
|
||||||
|
@ -101,7 +101,7 @@ protected:
|
||||||
void processRuleViolationLock();
|
void processRuleViolationLock();
|
||||||
|
|
||||||
// vip related
|
// vip related
|
||||||
void processVipAdd(uint id, const std::string& name, uint status, int iconId, bool notifyLogin);
|
void processVipAdd(uint id, const std::string& name, uint status, const std::string& description, int iconId, bool notifyLogin);
|
||||||
void processVipStateChange(uint id, uint status);
|
void processVipStateChange(uint id, uint status);
|
||||||
|
|
||||||
// tutorial hint
|
// tutorial hint
|
||||||
|
@ -206,6 +206,7 @@ public:
|
||||||
// vip related
|
// vip related
|
||||||
void addVip(const std::string& name);
|
void addVip(const std::string& name);
|
||||||
void removeVip(int playerId);
|
void removeVip(int playerId);
|
||||||
|
void editVip(int playerId, const std::string& description, int iconId, bool notifyLogin);
|
||||||
|
|
||||||
// fight modes related
|
// fight modes related
|
||||||
void setChaseMode(Otc::ChaseModes chaseMode);
|
void setChaseMode(Otc::ChaseModes chaseMode);
|
||||||
|
|
|
@ -225,6 +225,7 @@ void Client::registerLuaFunctions()
|
||||||
g_lua.bindSingletonFunction("g_game", "changeOutfit", &Game::changeOutfit, &g_game);
|
g_lua.bindSingletonFunction("g_game", "changeOutfit", &Game::changeOutfit, &g_game);
|
||||||
g_lua.bindSingletonFunction("g_game", "addVip", &Game::addVip, &g_game);
|
g_lua.bindSingletonFunction("g_game", "addVip", &Game::addVip, &g_game);
|
||||||
g_lua.bindSingletonFunction("g_game", "removeVip", &Game::removeVip, &g_game);
|
g_lua.bindSingletonFunction("g_game", "removeVip", &Game::removeVip, &g_game);
|
||||||
|
g_lua.bindSingletonFunction("g_game", "editVip", &Game::editVip, &g_game);
|
||||||
g_lua.bindSingletonFunction("g_game", "setChaseMode", &Game::setChaseMode, &g_game);
|
g_lua.bindSingletonFunction("g_game", "setChaseMode", &Game::setChaseMode, &g_game);
|
||||||
g_lua.bindSingletonFunction("g_game", "setFightMode", &Game::setFightMode, &g_game);
|
g_lua.bindSingletonFunction("g_game", "setFightMode", &Game::setFightMode, &g_game);
|
||||||
g_lua.bindSingletonFunction("g_game", "setPVPMode", &Game::setPVPMode, &g_game);
|
g_lua.bindSingletonFunction("g_game", "setPVPMode", &Game::setPVPMode, &g_game);
|
||||||
|
|
|
@ -232,6 +232,7 @@ namespace Proto {
|
||||||
ClientMount = 212, // 870
|
ClientMount = 212, // 870
|
||||||
ClientAddVip = 220,
|
ClientAddVip = 220,
|
||||||
ClientRemoveVip = 221,
|
ClientRemoveVip = 221,
|
||||||
|
ClientEditVip = 222,
|
||||||
ClientBugReport = 230,
|
ClientBugReport = 230,
|
||||||
ClientRuleViolation = 231,
|
ClientRuleViolation = 231,
|
||||||
ClientDebugReport = 232,
|
ClientDebugReport = 232,
|
||||||
|
|
|
@ -102,6 +102,7 @@ public:
|
||||||
void sendMountStatus(bool mount);
|
void sendMountStatus(bool mount);
|
||||||
void sendAddVip(const std::string& name);
|
void sendAddVip(const std::string& name);
|
||||||
void sendRemoveVip(uint playerId);
|
void sendRemoveVip(uint playerId);
|
||||||
|
void sendEditVip(uint playerId, const std::string& description, int iconId, bool notifyLogin);
|
||||||
void sendBugReport(const std::string& comment);
|
void sendBugReport(const std::string& comment);
|
||||||
void sendRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
void sendRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
||||||
void sendDebugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d);
|
void sendDebugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d);
|
||||||
|
|
|
@ -1492,19 +1492,19 @@ void ProtocolGame::parseOpenOutfitWindow(const InputMessagePtr& msg)
|
||||||
void ProtocolGame::parseVipAdd(const InputMessagePtr& msg)
|
void ProtocolGame::parseVipAdd(const InputMessagePtr& msg)
|
||||||
{
|
{
|
||||||
uint id, iconId = 0, status;
|
uint id, iconId = 0, status;
|
||||||
std::string name, desc;
|
std::string name, desc = "";
|
||||||
bool notifyLogin = false;
|
bool notifyLogin = false;
|
||||||
|
|
||||||
id = msg->getU32();
|
id = msg->getU32();
|
||||||
name = g_game.formatCreatureName(msg->getString());
|
name = g_game.formatCreatureName(msg->getString());
|
||||||
if(g_game.getProtocolVersion() >= 963) {
|
if(g_game.getFeature(Otc::GameAdditionalVipInfo)) {
|
||||||
desc = msg->getString();
|
desc = msg->getString();
|
||||||
iconId = msg->getU32();
|
iconId = msg->getU32();
|
||||||
notifyLogin = msg->getU8();
|
notifyLogin = msg->getU8();
|
||||||
}
|
}
|
||||||
status = msg->getU8();
|
status = msg->getU8();
|
||||||
|
|
||||||
g_game.processVipAdd(id, name, status, iconId, notifyLogin);
|
g_game.processVipAdd(id, name, status, desc, iconId, notifyLogin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProtocolGame::parseVipState(const InputMessagePtr& msg)
|
void ProtocolGame::parseVipState(const InputMessagePtr& msg)
|
||||||
|
|
|
@ -740,6 +740,17 @@ void ProtocolGame::sendRemoveVip(uint playerId)
|
||||||
send(msg);
|
send(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProtocolGame::sendEditVip(uint playerId, const std::string& description, int iconId, bool notifyLogin)
|
||||||
|
{
|
||||||
|
OutputMessagePtr msg(new OutputMessage);
|
||||||
|
msg->addU8(Proto::ClientEditVip);
|
||||||
|
msg->addU32(playerId);
|
||||||
|
msg->addString(description);
|
||||||
|
msg->addU32(iconId);
|
||||||
|
msg->addU8(notifyLogin);
|
||||||
|
send(msg);
|
||||||
|
}
|
||||||
|
|
||||||
void ProtocolGame::sendBugReport(const std::string& comment)
|
void ProtocolGame::sendBugReport(const std::string& comment)
|
||||||
{
|
{
|
||||||
OutputMessagePtr msg(new OutputMessage);
|
OutputMessagePtr msg(new OutputMessage);
|
||||||
|
|
Loading…
Reference in New Issue