Yalabi

 partage Python - Notification joueur en ligne

Recommended Posts

 

 

Niveau requis Débutant

Temps estimé : Entre 5 et 10 minutes

 

Bonjour, sauf erreur de ma part je n'ai pas vue ça sur le forum, je trouvais ça pas spécialement utile mais ça vaut le coup d'œil.

 

Pré-requis

 

Présentation

 

Citation

12602fe277941f3e0055a8e9a6bec028.png

 

 

Tutoriel

 

Citation

 1 /root/uiMessenger.py :

Citation

# 1. Chercher :

	def OnLogin(self, groupIndex ...
	
# 2. Apres : 

		member.Online()
		self.OnRefreshList()
		
# 3. Ajouter

		if not name in constInfo.ALREADY_NOTIFY_LIST:
			self.onlinePopup = uiCommon.OnlinePopup()
			self.onlinePopup.SetUserName(name)
			self.onlinePopup.SetEvent(ui.__mem_func__(self.OpenWhisper), "MOUSE_LEFT_BUTTON_UP", name)
			self.onlinePopup.SlideIn()
		
			constInfo.ALREADY_NOTIFY_LIST.append(name)	
			
# 4. Apres: def OnLogin(... Ajouter:

	def OpenWhisper(self, eventType, userName):
		self.whisperButtonEvent(userName)

 2 /root/constInfo.py :

Citation

# 1. Ajouter:

ALREADY_NOTIFY_LIST = []

3 /root/ui.py :

Citation

# 1. Chercher:

class Board(Window): 

	(....)

# 2. Remplacer toute la "class" par :

class Board(Window):
	CORNER_WIDTH = 32
	CORNER_HEIGHT = 32
	LINE_WIDTH = 128
	LINE_HEIGHT = 128

	LT = 0
	LB = 1
	RT = 2
	RB = 3
	L = 0
	R = 1
	T = 2
	B = 3
	
	BASE_PATH = "d:/ymir work/ui/pattern"
	IMAGES = {
		'CORNER' : {
			0 : "Board_Corner_LeftTop",
			1 : "Board_Corner_LeftBottom",
			2 : "Board_Corner_RightTop",
			3 : "Board_Corner_RightBottom"
		},
		'BAR' : {
			0 : "Board_Line_Left",
			1 : "Board_Line_Right",
			2 : "Board_Line_Top",
			3 : "Board_Line_Bottom"
		},
		'FILL' : "Board_Base"
	}

	def __init__(self, layer = "UI"):
		Window.__init__(self, layer)
		self.skipMaxCheck = False

		self.MakeBoard()
		
	def MakeBoard(self):
		CornerFileNames = [ ]
		LineFileNames = [ ]
		
		for imageDictKey in (['CORNER', 'BAR']):
			for x in xrange(len(self.IMAGES[imageDictKey])):
				if imageDictKey == "CORNER":
					CornerFileNames.append("%s/%s.tga" % (self.BASE_PATH, self.IMAGES[imageDictKey][x]))
				elif imageDictKey == "BAR":
					LineFileNames.append("%s/%s.tga" % (self.BASE_PATH, self.IMAGES[imageDictKey][x]))
		
		self.Corners = []
		for fileName in CornerFileNames:
			Corner = ExpandedImageBox()
			Corner.AddFlag("not_pick")
			Corner.LoadImage(fileName)
			Corner.SetParent(self)
			Corner.SetPosition(0, 0)
			Corner.Show()
			self.Corners.append(Corner)

		self.Lines = []
		for fileName in LineFileNames:
			Line = ExpandedImageBox()
			Line.AddFlag("not_pick")
			Line.LoadImage(fileName)
			Line.SetParent(self)
			Line.SetPosition(0, 0)
			Line.Show()
			self.Lines.append(Line)

		self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT)
		self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0)

		self.Base = ExpandedImageBox()
		self.Base.AddFlag("not_pick")
		self.Base.LoadImage("%s/%s.tga" % (self.BASE_PATH, self.IMAGES['FILL']))
		self.Base.SetParent(self)
		self.Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT)
		self.Base.Show()

	def __del__(self):
		Window.__del__(self)

	def SetSize(self, width, height):
		if not self.skipMaxCheck:
			width = max(self.CORNER_WIDTH*2, width)
			height = max(self.CORNER_HEIGHT*2, height)
			
		Window.SetSize(self, width, height)

		self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT)
		self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0)
		self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT)
		self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT)
		self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT)

		verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT
		horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH
		self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
		self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)

		if self.Base:
			self.Base.SetRenderingRect(0, 0, horizontalShowingPercentage, verticalShowingPercentage)
			
# 3 Apres la "class Board" ajouter cette "class" :

class BorderB(Board):
	CORNER_WIDTH = 16
	CORNER_HEIGHT = 16
	LINE_WIDTH = 16
	LINE_HEIGHT = 16
	
	BASE_PATH = "d:/ymir work/ui/pattern"

	IMAGES = {
		'CORNER' : {
			0 : "border_b_left_top",
			1 : "border_b_left_bottom",
			2 : "border_b_right_top",
			3 : "border_b_right_bottom"
		},
		'BAR' : {
			0 : "border_b_left",
			1 : "border_b_right",
			2 : "border_b_top",
			3 : "border_b_bottom"
		},
		'FILL' : "border_b_center"
	}
	
	def __init__(self):
		Board.__init__(self)
			
		self.eventFunc = {
			"MOUSE_LEFT_BUTTON_UP" : None, 
		}
		self.eventArgs = {
			"MOUSE_LEFT_BUTTON_UP" : None, 
		}

	def __del__(self):
		Board.__del__(self)
		self.eventFunc = None
		self.eventArgs = None

	def SetSize(self, width, height):
		Board.SetSize(self, width, height)
		
	def SetEvent(self, func, *args) :
		result = self.eventFunc.has_key(args[0])		
		if result :
			self.eventFunc[args[0]] = func
			self.eventArgs[args[0]] = args
		else :
			print "[ERROR] ui.py SetEvent, Can`t Find has_key : %s" % args[0]
			
	def OnMouseLeftButtonUp(self):
		if self.eventFunc["MOUSE_LEFT_BUTTON_UP"] :
			apply(self.eventFunc["MOUSE_LEFT_BUTTON_UP"], self.eventArgs["MOUSE_LEFT_BUTTON_UP"])

 

4 /root/uiCommon.py

Citation

# 1 Verifier si ceci est present au debut de votre fichier :

import app
# S'il ne l'est pas ajoutez le.

#2 Ajouter ceci a la fin de votre fichier :

class OnlinePopup(ui.BorderB):
	def __init__(self):
		ui.BorderB.__init__(self)
		
		self.isActiveSlide = False
		self.isActiveSlideOut = False
		self.endTime = 0
		self.wndWidth = 0

		self.textLine = ui.TextLine()
		self.textLine.SetParent(self)
		self.textLine.SetWindowHorizontalAlignCenter()
		self.textLine.SetWindowVerticalAlignCenter()
		self.textLine.SetHorizontalAlignCenter()
		self.textLine.SetVerticalAlignCenter()
		self.textLine.SetPosition(13, 0)
		self.textLine.Show()
		
		self.onlineImage = ui.ImageBox()
		self.onlineImage.SetParent(self)
		self.onlineImage.SetPosition(8, 8)
		self.onlineImage.LoadImage("d:/ymir work/ui/game/windows/messenger_list_online.sub")
		self.onlineImage.Show()
		
	def __del__(self):
		ui.BorderB.__del__(self)

	def SlideIn(self):
		self.SetTop()
		self.Show()
		
		self.isActiveSlide = True
		self.endTime = app.GetGlobalTimeStamp() + 5

	def Close(self):
		self.Hide()

	def Destroy(self):
		self.Close()

	def SetUserName(self, name):
		self.textLine.SetText("Player %s is online." % str(name))
		
		self.wndWidth = self.textLine.GetTextSize()[0] + 40
		self.SetSize(self.wndWidth, 25)
		self.SetPosition(-self.wndWidth, wndMgr.GetScreenHeight() - 200)
		
	def OnUpdate(self):
		if self.isActiveSlide and self.isActiveSlide == True:
			x, y = self.GetLocalPosition()
			if x < 0:
				self.SetPosition(x + 4, y)
				
		if self.endTime - app.GetGlobalTimeStamp() <= 0 and self.isActiveSlideOut == False and self.isActiveSlide == True:
			self.isActiveSlide = False
			self.isActiveSlideOut = True
				
		if self.isActiveSlideOut and self.isActiveSlideOut == True:
			x, y = self.GetLocalPosition()
			if x > -(self.wndWidth):
				self.SetPosition(x - 4, y)
				
			if x <= -(self.wndWidth):
				self.isActiveSlideOut = False
				self.Close()

 

 

 

Ajouter ceci a votre pack /etc/ :

 

Citation

DL FE

 

 

Src : M2dev, TkMmo

 

  • Like 2

Share this post


Link to post
Share on other sites

Merci à toi pour le partage, cependant tu peux utiliser funky-shack pour les images stp, merci :)

Share this post


Link to post
Share on other sites

Hum... 

J'ai jeté un bref aperçu sur le code :

  • Remplacer toute une classe, surtout de l'ui, ça peut être risqué...
  • Ton code crée une liste dans le constinfo.py afin de ne pas notifier plusieurs fois le même  membre (lors de la téléportation par exemple), cependant s'il se déconnecte... Même s'il se reconnecte 5h après, je suis pas sûr que ton code l'affiche à nouveau...

 

Share this post


Link to post
Share on other sites
il y a 11 minutes, Takuma a dit :

Hum... 

J'ai jeté un bref aperçu sur le code :

  • Remplacer toute une classe, surtout de l'ui, ça peut être risqué...
  • Ton code crée une liste dans le constinfo.py afin de ne pas notifier plusieurs fois le même  membre (lors de la téléportation par exemple), cependant s'il se déconnecte... Même s'il se reconnecte 5h après, je suis pas sûr que ton code l'affiche à nouveau...

 

 

Je ne saurais te repondre ^^

Share this post


Link to post
Share on other sites

Le problème, c'est que je ne vois pas comment vraiment améliorer le coder, je ne suis pas certain que le python est accès à cette information... Et mettre un timer c'est pas non plus une solution...

 

Il faudrait créer un évent de déconnexion/connexion côté source pour avoir l'information je pense... Et dans ce cas afficher la petite fenêtre.. Mais sur un changement de core le problème serait encore le même je crois... Je laisse ça à des gens plus doués que moi mdrrr

 

Merci du partage :D 

Share this post


Link to post
Share on other sites

Apres vérification et plusieurs connexion/déconnexion sur un compte secondaire, la notification s'affiche a chaque fois.

Share this post


Link to post
Share on other sites
il y a 30 minutes, Yalabi a dit :

Apres vérification et plusieurs connexion/déconnexion sur un compte secondaire, la notification s'affiche a chaque fois.

Ok ok j'ai rien dit alors 😛

Share this post


Link to post
Share on other sites