Jump to content

Request Auto Cancel by Overtime


Recommended Posts

  • Honorable Member

M2 Download Center

This is the hidden content, please
( Internal )

Hello devs.

I don't want to talk a lot about nothing, but I have to say what is this.
With this little modification the party and the friend requests are cancelled automatically in seconds what you can change in the Open method. ( pyObj.Open(sec) )

Preview video:

Spoiler

Songname: Selena Gomez - Kill Em With Kindness (Robby Burke Bootleg)

Make a backup before you are implementing it! And if you found a bug, please explain it.

0.) Open your uiCommon.py file and import chat module.
1.) Replace the whole QuestionDialogWithTimeLimit class in the uiCommon.py file with this:

class QuestionDialogWithTimeLimit(QuestionDialog2):
	def __init__(self):
		ui.ScriptWindow.__init__(self)

		self.__CreateDialog()
		self.endTime = 0
		self.timeOverMsg = 0
		self.timeOverEvent = None
		self.timeOverEventArgs = None

	def __del__(self):
		QuestionDialog2.__del__(self)

	def __CreateDialog(self):
		pyScrLoader = ui.PythonScriptLoader()
		pyScrLoader.LoadScriptFile(self, "uiscript/questiondialog2.py")

		self.board = self.GetChild("board")
		self.textLine1 = self.GetChild("message1")
		self.textLine2 = self.GetChild("message2")
		self.acceptButton = self.GetChild("accept")
		self.cancelButton = self.GetChild("cancel")

	def Open(self, timeout):
		self.SetCenterPosition()
		self.SetTop()
		self.Show()

		self.endTime = app.GetTime() + timeout

	def SetTimeOverEvent(self, event, *args):
		self.timeOverEvent = event
		self.timeOverEventArgs = args

	def SetTimeOverMsg(self, msg):
		self.timeOverMsg = msg

	def OnTimeOver(self):
		if self.timeOverEvent:
			apply(self.timeOverEvent, self.timeOverEventArgs)
		if self.timeOverMsg:
			chat.AppendChat(chat.CHAT_TYPE_INFO, self.timeOverMsg)

	def OnUpdate(self):
		leftTime = max(0, self.endTime - app.GetTime())
		self.SetText2(localeInfo.UI_LEFT_TIME % (leftTime))
		if leftTime <= 0:
			self.OnTimeOver()

 

2.) Open your game.py file and replace each of these three methods to these:

	def OnMessengerAddFriendQuestion(self, name):
		messengerAddFriendQuestion = uiCommon.QuestionDialogWithTimeLimit()
		messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND % (name))
		messengerAddFriendQuestion.SetTimeOverMsg(localeInfo.MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER)
		messengerAddFriendQuestion.SetTimeOverEvent(self.OnDenyAddFriend)
		messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend))
		messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend))
		messengerAddFriendQuestion.Open(10)
		messengerAddFriendQuestion.name = name
		self.messengerAddFriendQuestion = messengerAddFriendQuestion
	def RecvPartyInviteQuestion(self, leaderVID, leaderName):
		partyInviteQuestionDialog = uiCommon.QuestionDialogWithTimeLimit()
		partyInviteQuestionDialog.SetText1(leaderName + localeInfo.PARTY_DO_YOU_JOIN)
		partyInviteQuestionDialog.SetTimeOverMsg(localeInfo.PARTY_ANSWER_TIMEOVER)
		partyInviteQuestionDialog.SetTimeOverEvent(self.AnswerPartyInvite, False)
		partyInviteQuestionDialog.SetAcceptEvent(lambda arg=True: self.AnswerPartyInvite(arg))
		partyInviteQuestionDialog.SetCancelEvent(lambda arg=False: self.AnswerPartyInvite(arg))
		partyInviteQuestionDialog.Open(10)
		partyInviteQuestionDialog.partyLeaderVID = leaderVID
		self.partyInviteQuestionDialog = partyInviteQuestionDialog
	def BINARY_OnQuestConfirm(self, msg, timeout, pid):
		confirmDialog = uiCommon.QuestionDialogWithTimeLimit()
		confirmDialog.SetText1(msg)
		confirmDialog.Open(timeout)
		confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		self.confirmDialog = confirmDialog

 

3.) Open your locale/xy/locale_game.txt and add these if these aren't exists:

MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER	Friend request was cancelled.
PARTY_ANSWER_TIMEOVER	Party invite was cancelled.

Remove MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2 line and change MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_1 with this:

MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND	%s added you as a friend, accept?

 

At last take a look at your files and correct the net module calls and the True-False syntax.  net <--> m2net, True <--> TRUE

  • Metin2 Dev 19
  • Not Good 1
  • Good 5
  • Love 21
Link to comment
Share on other sites

Nice Thanks for release, but for users without src Python modules changed like this:

 

confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())

change to this 

 

confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())

 

  • Metin2 Dev 1
Link to comment
Share on other sites

  • 1 year later...
Dnia 5.12.2018 o 22:14, Mind Rapist napisał:

Can someone explain me how is it possible that chat.AppendChat(chat.CHAT_TYPE_INFO, self.timeOverMsg) has a syntax error???????????????? Please someone show me what I'm doing wrong here? 

Try to change from UTF-8 to ANSI remove artifacts then paste again or rewrite whole code :D

  • Love 2
Link to comment
Share on other sites

  • 1 year later...
1103 16:53:54261 ::   File "uiCommon.py", line 349, in OnUpdate

1103 16:53:54261 ::   File "uiCommon.py", line 343, in OnTimeOver

1103 16:53:54262 :: NameError
1103 16:53:54262 :: : 
1103 16:53:54262 :: global name 'chat' is not defined

 

how can i do for erase this sysser ingame i don't got a problems but i wana erease the sysser

 

Link to comment
Share on other sites

  • 1 month later...
  • 1 year later...
  • Gold

@ xP3NG3Rx First of all, thanks for the release. But you did a mistake with this:

On 4/14/2017 at 8:29 PM, xP3NG3Rx said:
def BINARY_OnQuestConfirm(self, msg, timeout, pid):
		confirmDialog = uiCommon.QuestionDialogWithTimeLimit()
		confirmDialog.SetText1(msg)
		confirmDialog.Open(timeout)
		confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		self.confirmDialog = confirmDialog

dialog won't close because there is missing the "event" which is closing the dialog.

I solved that by these changes:

Open: root/game.py

Finddef BINARY_OnQuestConfirm(self, msg, timeout, pid):

Replace whole function with this:

Spoiler
def BINARY_OnQuestConfirm(self, msg, timeout, pid):
		confirmDialog = uiCommon.QuestionDialogWithTimeLimit2()
		confirmDialog.SetText1(msg)
		confirmDialog.SetText2(localeInfo.UI_ACCEPT_MARRIAGE)
		confirmDialog.SetTimeOverMsg(localeInfo.MARRIAGE_ANSWER_TIMEOVER)
		confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
		confirmDialog.Open(timeout)
		self.confirmDialog = confirmDialog

 

Now add this to locale/locale_game.txt:

Spoiler
UI_ACCEPT_MARRIAGE	Accept request?
MARRIAGE_ANSWER_TIMEOVER	Time limit for marriage accept is over!

 

Then open root/uicommon.py:

And add a new class:

Spoiler
class QuestionDialogWithTimeLimit2(QuestionDialog2):

	def __init__(self):
		ui.ScriptWindow.__init__(self)

		self.__CreateDialog()
		self.endTime = 0
		self.timeOverMsg = 0

	def __del__(self):
		QuestionDialog2.__del__(self)

	def __CreateDialog(self):
		pyScrLoader = ui.PythonScriptLoader()
		pyScrLoader.LoadScriptFile(self, "uiscript/questiondialog2.py")

		self.board = self.GetChild("board")
		self.textLine1 = self.GetChild("message1")
		self.textLine2 = self.GetChild("message2")
		self.acceptButton = self.GetChild("accept")
		self.cancelButton = self.GetChild("cancel")

	def Open(self, timeout):
		self.SetCenterPosition()
		self.SetTop()
		self.Show()

		self.endTime = app.GetTime() + timeout
	
	def Close(self):
		self.Hide()

	def SetTimeOverMsg(self, msg):
		self.timeOverMsg = msg

	def OnUpdate(self):
		leftTime = max(0, self.endTime - app.GetTime())
		# self.SetText2(localeInfo.UI_LEFT_TIME % (leftTime))

		if leftTime <= 0:
			self.Close()
			self.cancelButton.CallEvent()

			if self.timeOverMsg:
				chat.AppendChat(chat.CHAT_TYPE_INFO, self.timeOverMsg)

	def OnPressEscapeKey(self):
		self.Close()
		self.cancelButton.CallEvent()
		return True

 

Enjoy!

If anyone got an idea for better solution, I'll be really glad for that.

Edited by ReFresh
  • Metin2 Dev 1

I'll be always helpful! 👊 

Link to comment
Share on other sites

  • 10 months later...
  • Premium

Got following syserr and the Popup doesn't appear..

Would appreciate some help.

syserr:

Spoiler
1124 13:31:46024 ::   File "game.py", line 1023, in OnMessengerAddFriendQuestion

1124 13:31:46024 :: TypeError
1124 13:31:46024 :: : 
1124 13:31:46024 :: Open() takes exactly 3 arguments (2 given)

 

part of game.py:

Spoiler
	def ChangePartyParameter(self, distributionMode):
		self.interface.ChangePartyParameter(distributionMode)

	## Messenger
	def OnMessengerAddFriendQuestion(self, name):
		messengerAddFriendQuestion = uiCommon.QuestionDialogWithTimeLimit()
		messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND % (name))
		messengerAddFriendQuestion.SetTimeOverMsg(localeInfo.MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER)
		messengerAddFriendQuestion.SetTimeOverEvent(self.OnDenyAddFriend)
		messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend))
		messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend))
		messengerAddFriendQuestion.Open(10)
		messengerAddFriendQuestion.name = name
		self.messengerAddFriendQuestion = messengerAddFriendQuestion

	def OnAcceptAddFriend(self):
		name = self.messengerAddFriendQuestion.name
		net.SendChatPacket("/messenger_auth y " + name)
		self.OnCloseAddFriendQuestionDialog()
		return True

 

Line 1023 =         messengerAddFriendQuestion.Open(10)

Would appreciate some Help.

Best Regards

Link to comment
Share on other sites

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.