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 | ||||
| vipButton = nil | ||||
| addVipWindow = nil | ||||
| editVipWindow = nil | ||||
| vipInfo = {} | ||||
| 
 | ||||
| function init() | ||||
|   connect(g_game, { onGameStart = refresh, | ||||
|  | @ -15,6 +17,9 @@ function init() | |||
|   vipButton:setOn(true) | ||||
|   vipWindow = g_ui.loadUI('viplist', modules.game_interface.getRightPanel()) | ||||
| 
 | ||||
|   if not g_game.getFeature(GameAdditionalVipInfo) then | ||||
|     loadVipInfo() | ||||
|   end | ||||
|   refresh() | ||||
|   vipWindow:setup() | ||||
| end | ||||
|  | @ -26,10 +31,38 @@ function terminate() | |||
|                        onAddVip = onAddVip, | ||||
|                        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() | ||||
|   vipButton:destroy() | ||||
| 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() | ||||
|   clear() | ||||
|   for id,vip in pairs(g_game.getVips()) do | ||||
|  | @ -62,6 +95,78 @@ function createAddWindow() | |||
|   addVipWindow = g_ui.displayUI('addvip') | ||||
| 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() | ||||
|   addVipWindow:destroy() | ||||
|   addVipWindow = nil | ||||
|  | @ -72,6 +177,38 @@ function addVip() | |||
|   destroyAddWindow() | ||||
| 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) | ||||
|   settings = {} | ||||
|   settings['hideOffline'] = state | ||||
|  | @ -90,7 +227,7 @@ end | |||
| 
 | ||||
| function getSortedBy() | ||||
|   local settings = g_settings.getNode('VipList') | ||||
|   if not settings then | ||||
|   if not settings or not settings['sortedBy'] then | ||||
|     return 'status' | ||||
|   end | ||||
|   return settings['sortedBy'] | ||||
|  | @ -104,8 +241,7 @@ function sortBy(state) | |||
|   refresh() | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| function onAddVip(id, name, state) | ||||
| function onAddVip(id, name, state, description, iconId, notify) | ||||
|   local vipList = vipWindow:getChildById('contentsPanel') | ||||
| 
 | ||||
|   local label = g_ui.createWidget('VipListLabel') | ||||
|  | @ -113,6 +249,27 @@ function onAddVip(id, name, state) | |||
|   label:setId('vip' .. id) | ||||
|   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 | ||||
|     label:setColor('#00ff00') | ||||
|   elseif state == VipState.Pending then | ||||
|  | @ -135,13 +292,14 @@ function onAddVip(id, name, state) | |||
|    | ||||
|   for i=1,childrenCount do | ||||
|     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) | ||||
|       return | ||||
|     end | ||||
| 
 | ||||
|     if ((state ~= VipState.Online and child.vipState ~= VipState.Online) | ||||
|       or (state == VipState.Online and child.vipState == VipState.Online)) or getSortedBy() == 'name' then | ||||
|     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()) | ||||
|  | @ -154,6 +312,7 @@ function onAddVip(id, name, state) | |||
|           break | ||||
|         elseif j == nameLower:len() then -- We are at the end of nameLower, and its shorter than childText, thus insert before | ||||
|           vipList:insertChild(i, label) | ||||
|           return | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | @ -165,10 +324,17 @@ end | |||
| function onVipStateChange(id, state) | ||||
|   local vipList = vipWindow:getChildById('contentsPanel') | ||||
|   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() | ||||
| 
 | ||||
|   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 | ||||
| 
 | ||||
| function onVipListMousePress(widget, mousePos, mouseButton) | ||||
|  | @ -179,6 +345,7 @@ function onVipListMousePress(widget, mousePos, mouseButton) | |||
|   local menu = g_ui.createWidget('PopupMenu') | ||||
|   menu:addOption(tr('Add new VIP'), function() createAddWindow() end) | ||||
| 
 | ||||
|   menu:addSeparator() | ||||
|   if not isHiddingOffline() then | ||||
|     menu:addOption(tr('Hide Offline'), function() hideOffline(true) end) | ||||
|   else | ||||
|  | @ -193,6 +360,10 @@ function onVipListMousePress(widget, mousePos, mouseButton) | |||
|     menu:addOption(tr('Sort by status'), function() sortBy('status') end) | ||||
|   end | ||||
| 
 | ||||
|   if not(getSortedBy() == 'type') then | ||||
|     menu:addOption(tr('Sort by type'), function() sortBy('type') end) | ||||
|   end | ||||
| 
 | ||||
|   menu:display(mousePos) | ||||
| 
 | ||||
|   return true | ||||
|  | @ -206,7 +377,8 @@ function onVipListLabelMousePress(widget, mousePos, mouseButton) | |||
|   local menu = g_ui.createWidget('PopupMenu') | ||||
|   menu:addOption(tr('Send Message'), function() g_game.openPrivateChannel(widget:getText()) 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:addOption(tr('Copy Name'), function() g_window.setClipboardText(widget:getText()) end)  | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,9 @@ | |||
| VipListLabel < GameLabel | ||||
|   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 | ||||
|   phantom: false | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,6 +31,9 @@ EmblemBlue = 3 | |||
| EmblemMember = 4 | ||||
| EmblemOther = 5 | ||||
| 
 | ||||
| VipIconFirst = 0 | ||||
| VipIconLast = 10 | ||||
| 
 | ||||
| North = 0 | ||||
| East = 1 | ||||
| South = 2 | ||||
|  | @ -100,6 +103,8 @@ GameNewFluids = 47 | |||
| GamePlayerStateU16 = 48 | ||||
| GameNewOutfitProtocol = 49 | ||||
| GamePVPMode = 50 | ||||
| GameWritableDate = 51 | ||||
| GameAdditionalVipInfo = 52 | ||||
| 
 | ||||
| TextColors = { | ||||
|   red       = '#f55e5e', --'#c83200' | ||||
|  |  | |||
|  | @ -375,6 +375,7 @@ namespace Otc | |||
|         GameNewOutfitProtocol = 49, | ||||
|         GamePVPMode = 50, | ||||
|         GameWritableDate = 51, | ||||
|         GameAdditionalVipInfo = 52, | ||||
| 
 | ||||
|         LastGameFeature = 101 | ||||
|     }; | ||||
|  |  | |||
|  | @ -402,10 +402,10 @@ void Game::processRuleViolationLock() | |||
|     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); | ||||
|     g_lua.callGlobalField("g_game", "onAddVip", id, name, status, iconId, notifyLogin); | ||||
|     m_vips[id] = Vip(name, status, description, iconId, notifyLogin); | ||||
|     g_lua.callGlobalField("g_game", "onAddVip", id, name, status, description, iconId, notifyLogin); | ||||
| } | ||||
| 
 | ||||
| void Game::processVipStateChange(uint id, uint status) | ||||
|  | @ -1192,6 +1192,23 @@ void Game::removeVip(int 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) | ||||
| { | ||||
|     if(!canPerformGameAction()) | ||||
|  | @ -1521,6 +1538,10 @@ void Game::setProtocolVersion(int version) | |||
|         enableFeature(Otc::GameOfflineTrainingTime); | ||||
|     } | ||||
| 
 | ||||
|     if(version >= 963) { | ||||
|         enableFeature(Otc::GameAdditionalVipInfo); | ||||
|     } | ||||
| 
 | ||||
|     if(version >= 973) { | ||||
|         enableFeature(Otc::GameLoginPending); | ||||
|         enableFeature(Otc::GameNewSpeedLaw); | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ | |||
| 
 | ||||
| #include <bitset> | ||||
| 
 | ||||
| typedef std::tuple<std::string, uint> Vip; | ||||
| typedef std::tuple<std::string, uint, std::string, int, bool> Vip; | ||||
| 
 | ||||
| //@bindsingleton g_game
 | ||||
| class Game | ||||
|  | @ -101,7 +101,7 @@ protected: | |||
|     void processRuleViolationLock(); | ||||
| 
 | ||||
|     // 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); | ||||
| 
 | ||||
|     // tutorial hint
 | ||||
|  | @ -206,6 +206,7 @@ public: | |||
|     // vip related
 | ||||
|     void addVip(const std::string& name); | ||||
|     void removeVip(int playerId); | ||||
|     void editVip(int playerId, const std::string& description, int iconId, bool notifyLogin); | ||||
| 
 | ||||
|     // fight modes related
 | ||||
|     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", "addVip", &Game::addVip, &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", "setFightMode", &Game::setFightMode, &g_game); | ||||
|     g_lua.bindSingletonFunction("g_game", "setPVPMode", &Game::setPVPMode, &g_game); | ||||
|  |  | |||
|  | @ -232,6 +232,7 @@ namespace Proto { | |||
|         ClientMount                         = 212, // 870
 | ||||
|         ClientAddVip                        = 220, | ||||
|         ClientRemoveVip                     = 221, | ||||
|         ClientEditVip                       = 222, | ||||
|         ClientBugReport                     = 230, | ||||
|         ClientRuleViolation                 = 231, | ||||
|         ClientDebugReport                   = 232, | ||||
|  |  | |||
|  | @ -102,6 +102,7 @@ public: | |||
|     void sendMountStatus(bool mount); | ||||
|     void sendAddVip(const std::string& name); | ||||
|     void sendRemoveVip(uint playerId); | ||||
|     void sendEditVip(uint playerId, const std::string& description, int iconId, bool notifyLogin); | ||||
|     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 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) | ||||
| { | ||||
|     uint id, iconId = 0, status; | ||||
|     std::string name, desc; | ||||
|     std::string name, desc = ""; | ||||
|     bool notifyLogin = false; | ||||
| 
 | ||||
|     id = msg->getU32(); | ||||
|     name = g_game.formatCreatureName(msg->getString()); | ||||
|     if(g_game.getProtocolVersion() >= 963) { | ||||
|     if(g_game.getFeature(Otc::GameAdditionalVipInfo)) { | ||||
|         desc = msg->getString(); | ||||
|         iconId = msg->getU32(); | ||||
|         notifyLogin = 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) | ||||
|  |  | |||
|  | @ -740,6 +740,17 @@ void ProtocolGame::sendRemoveVip(uint playerId) | |||
|     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) | ||||
| { | ||||
|     OutputMessagePtr msg(new OutputMessage); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Sam
						Sam