mirror of
				https://github.com/ErikasKontenis/SabrehavenServer.git
				synced 2025-10-30 19:56:22 +01:00 
			
		
		
		
	commit client
This commit is contained in:
		
							
								
								
									
										191
									
								
								SabrehavenOTClient/modules/game_containers/containers.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								SabrehavenOTClient/modules/game_containers/containers.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | ||||
| local gameStart = 0 | ||||
|  | ||||
| function init() | ||||
|   connect(Container, { onOpen = onContainerOpen, | ||||
|                        onClose = onContainerClose, | ||||
|                        onSizeChange = onContainerChangeSize, | ||||
|                        onUpdateItem = onContainerUpdateItem }) | ||||
|   connect(g_game, { | ||||
|     onGameStart = markStart, | ||||
|     onGameEnd = clean | ||||
|   }) | ||||
|  | ||||
|   reloadContainers() | ||||
| end | ||||
|  | ||||
| function terminate() | ||||
|   disconnect(Container, { onOpen = onContainerOpen, | ||||
|                           onClose = onContainerClose, | ||||
|                           onSizeChange = onContainerChangeSize, | ||||
|                           onUpdateItem = onContainerUpdateItem }) | ||||
|   disconnect(g_game, {  | ||||
|     onGameStart = markStart, | ||||
|     onGameEnd = clean | ||||
|   }) | ||||
| end | ||||
|  | ||||
| function reloadContainers() | ||||
|   clean() | ||||
|   for _,container in pairs(g_game.getContainers()) do | ||||
|     onContainerOpen(container) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function clean() | ||||
|   for containerid,container in pairs(g_game.getContainers()) do | ||||
|     destroy(container) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function markStart() | ||||
|   gameStart = g_clock.millis() | ||||
| end | ||||
|  | ||||
| function destroy(container) | ||||
|   if container.window then | ||||
|     container.window:destroy() | ||||
|     container.window = nil | ||||
|     container.itemsPanel = nil | ||||
|   end | ||||
| end | ||||
|  | ||||
| function refreshContainerItems(container) | ||||
|   for slot=0,container:getCapacity()-1 do | ||||
|     local itemWidget = container.itemsPanel:getChildById('item' .. slot) | ||||
|     itemWidget:setItem(container:getItem(slot)) | ||||
|   end | ||||
|  | ||||
|   if container:hasPages() then | ||||
|     refreshContainerPages(container) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function toggleContainerPages(containerWindow, hasPages) | ||||
|   if hasPages == containerWindow.pagePanel:isOn() then | ||||
|     return | ||||
|   end | ||||
|   containerWindow.pagePanel:setOn(hasPages) | ||||
|   if hasPages then | ||||
|     containerWindow.miniwindowScrollBar:setMarginTop(containerWindow.miniwindowScrollBar:getMarginTop() + containerWindow.pagePanel:getHeight()) | ||||
|     containerWindow.contentsPanel:setMarginTop(containerWindow.contentsPanel:getMarginTop() + containerWindow.pagePanel:getHeight())   | ||||
|   else   | ||||
|     containerWindow.miniwindowScrollBar:setMarginTop(containerWindow.miniwindowScrollBar:getMarginTop() - containerWindow.pagePanel:getHeight()) | ||||
|     containerWindow.contentsPanel:setMarginTop(containerWindow.contentsPanel:getMarginTop() - containerWindow.pagePanel:getHeight()) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function refreshContainerPages(container) | ||||
|   local currentPage = 1 + math.floor(container:getFirstIndex() / container:getCapacity()) | ||||
|   local pages = 1 + math.floor(math.max(0, (container:getSize() - 1)) / container:getCapacity()) | ||||
|   container.window:recursiveGetChildById('pageLabel'):setText(string.format('Page %i of %i', currentPage, pages)) | ||||
|  | ||||
|   local prevPageButton = container.window:recursiveGetChildById('prevPageButton') | ||||
|   if currentPage == 1 then | ||||
|     prevPageButton:setEnabled(false) | ||||
|   else | ||||
|     prevPageButton:setEnabled(true) | ||||
|     prevPageButton.onClick = function() g_game.seekInContainer(container:getId(), container:getFirstIndex() - container:getCapacity()) end | ||||
|   end | ||||
|  | ||||
|   local nextPageButton = container.window:recursiveGetChildById('nextPageButton') | ||||
|   if currentPage >= pages then | ||||
|     nextPageButton:setEnabled(false) | ||||
|   else | ||||
|     nextPageButton:setEnabled(true) | ||||
|     nextPageButton.onClick = function() g_game.seekInContainer(container:getId(), container:getFirstIndex() + container:getCapacity()) end | ||||
|   end | ||||
| end | ||||
|  | ||||
| function onContainerOpen(container, previousContainer) | ||||
|   local containerWindow | ||||
|   if previousContainer then | ||||
|     containerWindow = previousContainer.window | ||||
|     previousContainer.window = nil | ||||
|     previousContainer.itemsPanel = nil | ||||
|   else | ||||
|     containerWindow = g_ui.createWidget('ContainerWindow', modules.game_interface.getContainerPanel()) | ||||
|   end | ||||
|    | ||||
|   containerWindow:setId('container' .. container:getId()) | ||||
|   if gameStart + 1000 < g_clock.millis() then | ||||
|     containerWindow:clearSettings() | ||||
|   end | ||||
|    | ||||
|   local containerPanel = containerWindow:getChildById('contentsPanel') | ||||
|   local containerItemWidget = containerWindow:getChildById('containerItemWidget') | ||||
|   containerWindow.onClose = function() | ||||
|     g_game.close(container) | ||||
|     containerWindow:hide() | ||||
|   end | ||||
|   containerWindow.onDrop = function(container, widget, mousePos) | ||||
|     if containerPanel:getChildByPos(mousePos) then | ||||
|       return false | ||||
|     end | ||||
|     local child = containerPanel:getChildByIndex(-1) | ||||
|     if child then | ||||
|       child:onDrop(widget, mousePos, true)         | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   -- this disables scrollbar auto hiding | ||||
|   local scrollbar = containerWindow:getChildById('miniwindowScrollBar') | ||||
|   scrollbar:mergeStyle({ ['$!on'] = { }}) | ||||
|  | ||||
|   local upButton = containerWindow:getChildById('upButton') | ||||
|   upButton.onClick = function() | ||||
|     g_game.openParent(container) | ||||
|   end | ||||
|   upButton:setVisible(container:hasParent()) | ||||
|  | ||||
|   local name = container:getName() | ||||
|   name = name:sub(1,1):upper() .. name:sub(2) | ||||
|   containerWindow:setText(name) | ||||
|  | ||||
|   containerItemWidget:setItem(container:getContainerItem()) | ||||
|  | ||||
|   containerPanel:destroyChildren() | ||||
|   for slot=0,container:getCapacity()-1 do | ||||
|     local itemWidget = g_ui.createWidget('Item', containerPanel) | ||||
|     itemWidget:setId('item' .. slot) | ||||
|     itemWidget:setItem(container:getItem(slot)) | ||||
|     itemWidget:setMargin(0) | ||||
|     itemWidget.position = container:getSlotPosition(slot) | ||||
|  | ||||
|     if not container:isUnlocked() then | ||||
|       itemWidget:setBorderColor('red') | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   container.window = containerWindow | ||||
|   container.itemsPanel = containerPanel | ||||
|  | ||||
|   toggleContainerPages(containerWindow, container:hasPages()) | ||||
|   refreshContainerPages(container) | ||||
|  | ||||
|   local layout = containerPanel:getLayout() | ||||
|   local cellSize = layout:getCellSize() | ||||
|   containerWindow:setContentMinimumHeight(cellSize.height) | ||||
|   containerWindow:setContentMaximumHeight(cellSize.height*layout:getNumLines()) | ||||
|  | ||||
|   if not previousContainer then | ||||
|     local filledLines = math.max(math.ceil(container:getItemsCount() / layout:getNumColumns()), 1) | ||||
|     containerWindow:setContentHeight(filledLines*cellSize.height) | ||||
|   end | ||||
|  | ||||
|   containerWindow:setup() | ||||
| end | ||||
|  | ||||
| function onContainerClose(container) | ||||
|   destroy(container) | ||||
| end | ||||
|  | ||||
| function onContainerChangeSize(container, size) | ||||
|   if not container.window then return end | ||||
|   refreshContainerItems(container) | ||||
| end | ||||
|  | ||||
| function onContainerUpdateItem(container, slot, item, oldItem) | ||||
|   if not container.window then return end | ||||
|   local itemWidget = container.itemsPanel:getChildById('item' .. slot) | ||||
|   itemWidget:setItem(item) | ||||
| end | ||||
| @@ -0,0 +1,9 @@ | ||||
| Module | ||||
|   name: game_containers | ||||
|   description: Manage containers | ||||
|   author: edubart, baxnie | ||||
|   website: https://github.com/edubart/otclient | ||||
|   sandboxed: true | ||||
|   scripts: [containers] | ||||
|   @onLoad: init() | ||||
|   @onUnload: terminate() | ||||
		Reference in New Issue
	
	Block a user
	 ErikasKontenis
					ErikasKontenis