acestea sunt: warp / transfer / kill / kick /
Aceste obțiuni sunt doar pentru gm vizibile în pm cu un jucator
se poate extinde după bunul plac
*Poze / Video (obligatoriu):
![[Py] Optiuni Staff in PM (Kick / Teleport / Kill / etc) - Mesaj 1 - Imagine 1 [Py] Optiuni Staff in PM (Kick / Teleport / Kill / etc) - Mesaj 1 - Imagine 1](https://i.gyazo.com/3d7c0eebcf8ecae3837f6c75f774fe0c.webp)
![[Py] Optiuni Staff in PM (Kick / Teleport / Kill / etc) - Mesaj 1 - Imagine 1 [Py] Optiuni Staff in PM (Kick / Teleport / Kill / etc) - Mesaj 1 - Imagine 1](https://i.gyazo.com/3d7c0eebcf8ecae3837f6c75f774fe0c.webp)
Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.
Alătură-te acum!
scott.petrica5287 scrie: ↑ cum ai facut sa stea lipite acolo ?
i-am făcut un thinboard separat şi l-am pus să-şi dea update la poziţie după mărimea ferestrei în funcţia de refresh, să rămână centrat.
import ui
import net
import chat
import player
import app
import localeInfo
import ime
import chr
class WhisperButton(ui.Button):
def __init__(self):
ui.Button.__init__(self, "TOP_MOST")
def __del__(self):
ui.Button.__del__(self)
def SetToolTipText(self, text, x=0, y = 32):
ui.Button.SetToolTipText(self, text, x, y)
self.ToolTipText.Show()
def SetToolTipTextWithColor(self, text, color, x=0, y = 32):
ui.Button.SetToolTipText(self, text, x, y)
self.ToolTipText.SetPackedFontColor(color)
self.ToolTipText.Show()
def ShowToolTip(self):
if 0 != self.ToolTipText:
self.ToolTipText.Show()
def HideToolTip(self):
if 0 != self.ToolTipText:
self.ToolTipText.Show()
class WhisperDialog(ui.ScriptWindow):
class TextRenderer(ui.Window):
def SetTargetName(self, targetName):
self.targetName = targetName
def OnRender(self):
(x, y) = self.GetGlobalPosition()
chat.RenderWhisper(self.targetName, x, y)
class ResizeButton(ui.DragButton):
def __init__(self):
ui.DragButton.__init__(self)
def __del__(self):
ui.DragButton.__del__(self)
def OnMouseOverIn(self):
app.SetCursor(app.HVSIZE)
def OnMouseOverOut(self):
app.SetCursor(app.NORMAL)
def __init__(self, eventMinimize, eventClose):
print "NEW WHISPER DIALOG ----------------------------------------------------------------------------"
ui.ScriptWindow.__init__(self)
self.targetName = ""
self.eventMinimize = eventMinimize
self.eventClose = eventClose
self.eventAcceptTarget = None
def __del__(self):
print "---------------------------------------------------------------------------- DELETE WHISPER DIALOG"
ui.ScriptWindow.__del__(self)
def LoadDialog(self):
try:
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, "UIScript/WhisperDialog.py")
except:
import exception
exception.Abort("WhisperDialog.LoadDialog.LoadScript")
try:
GetObject=self.GetChild
self.titleName = GetObject("titlename")
self.titleNameEdit = GetObject("titlename_edit")
self.closeButton = GetObject("closebutton")
self.scrollBar = GetObject("scrollbar")
self.chatLine = GetObject("chatline")
self.minimizeButton = GetObject("minimizebutton")
self.ignoreButton = GetObject("ignorebutton")
self.reportViolentWhisperButton = GetObject("reportviolentwhisperbutton")
self.acceptButton = GetObject("acceptbutton")
self.sendButton = GetObject("sendbutton")
self.board = GetObject("board")
self.editBar = GetObject("editbar")
self.gamemasterMark = GetObject("gamemastermark")
self.warp = GetObject("warp")
self.transfer = GetObject("transfer")
self.kill = GetObject("kill")
self.kick = GetObject("kick")
except:
import exception
exception.Abort("DialogWindow.LoadDialog.BindObject")
self.titleName.SetText("")
self.titleNameEdit.SetText("")
self.minimizeButton.SetEvent(ui.__mem_func__(self.Minimize))
self.closeButton.SetEvent(ui.__mem_func__(self.Close))
self.scrollBar.SetPos(1.0)
self.scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll))
self.chatLine.SetReturnEvent(ui.__mem_func__(self.SendWhisper))
self.chatLine.SetEscapeEvent(ui.__mem_func__(self.Minimize))
self.chatLine.SetMultiLine()
self.sendButton.SetEvent(ui.__mem_func__(self.SendWhisper))
self.titleNameEdit.SetReturnEvent(ui.__mem_func__(self.AcceptTarget))
self.titleNameEdit.SetEscapeEvent(ui.__mem_func__(self.Close))
self.warp.SetEvent(ui.__mem_func__(self.__OnWarp))
self.transfer.SetEvent(ui.__mem_func__(self.__OnTransfer))
self.kill.SetEvent(ui.__mem_func__(self.__OnKill))
self.kick.SetEvent(ui.__mem_func__(self.__OnKick))
self.ignoreButton.SetToggleDownEvent(ui.__mem_func__(self.IgnoreTarget))
self.ignoreButton.SetToggleUpEvent(ui.__mem_func__(self.IgnoreTarget))
self.reportViolentWhisperButton.SetEvent(ui.__mem_func__(self.ReportViolentWhisper))
self.acceptButton.SetEvent(ui.__mem_func__(self.AcceptTarget))
self.textRenderer = self.TextRenderer()
self.textRenderer.SetParent(self)
self.textRenderer.SetPosition(20, 28)
self.textRenderer.SetTargetName("")
self.textRenderer.Show()
self.resizeButton = self.ResizeButton()
self.resizeButton.SetParent(self)
self.resizeButton.SetSize(20, 20)
self.resizeButton.SetPosition(280, 180)
self.resizeButton.SetMoveEvent(ui.__mem_func__(self.ResizeWhisperDialog))
self.resizeButton.Show()
self.ResizeWhisperDialog()
def Destroy(self):
self.eventMinimize = None
self.eventClose = None
self.eventAcceptTarget = None
self.warp = None
self.transfer = None
self.kill = None
self.kick = None
self.ClearDictionary()
self.scrollBar.Destroy()
self.titleName = None
self.titleNameEdit = None
self.closeButton = None
self.scrollBar = None
self.chatLine = None
self.sendButton = None
self.ignoreButton = None
self.reportViolentWhisperButton = None
self.acceptButton = None
self.minimizeButton = None
self.textRenderer = None
self.board = None
self.editBar = None
self.resizeButton = None
def ResizeWhisperDialog(self):
(xPos, yPos) = self.resizeButton.GetLocalPosition()
if xPos < 280:
self.resizeButton.SetPosition(280, yPos)
return
if yPos < 150:
self.resizeButton.SetPosition(xPos, 150)
return
self.SetWhisperDialogSize(xPos + 20, yPos + 20)
def SetWhisperDialogSize(self, width, height):
try:
max = int((width-90)/6) * 3 - 6
self.board.SetSize(width, height)
self.scrollBar.SetPosition(width-25, 35)
self.scrollBar.SetScrollBarSize(height-100)
self.scrollBar.SetPos(1.0)
self.editBar.SetSize(width-18, 50)
self.chatLine.SetSize(width-90, 40)
self.chatLine.SetLimitWidth(width-90)
self.SetSize(width, height)
if 0 != self.targetName:
chat.SetWhisperBoxSize(self.targetName, width - 50, height - 90)
if localeInfo.IsARABIC():
self.textRenderer.SetPosition(width-20, 28)
self.scrollBar.SetPosition(width-25+self.scrollBar.GetWidth(), 35)
self.editBar.SetPosition(10 + self.editBar.GetWidth(), height-60)
self.sendButton.SetPosition(width - 80 + self.sendButton.GetWidth(), 10)
self.minimizeButton.SetPosition(width-42 + self.minimizeButton.GetWidth(), 12)
self.closeButton.SetPosition(width-24+self.closeButton.GetWidth(), 12)
self.chatLine.SetPosition(5 + self.chatLine.GetWidth(), 5)
self.board.SetPosition(self.board.GetWidth(), 0)
else:
self.textRenderer.SetPosition(20, 28)
self.scrollBar.SetPosition(width-25, 35)
self.editBar.SetPosition(10, height-60)
self.sendButton.SetPosition(width-80, 10)
self.minimizeButton.SetPosition(width-42, 12)
self.closeButton.SetPosition(width-24, 12)
self.SetChatLineMax(max)
except:
import exception
exception.Abort("WhisperDialog.SetWhisperDialogSize.BindObject")
def SetChatLineMax(self, max):
self.chatLine.SetMax(max)
from grpText import GetSplitingTextLine
text = self.chatLine.GetText()
if text:
self.chatLine.SetText(GetSplitingTextLine(text, max, 0))
def OpenWithTarget(self, targetName):
chat.CreateWhisper(targetName)
chat.SetWhisperBoxSize(targetName, self.GetWidth() - 60, self.GetHeight() - 90)
self.chatLine.SetFocus()
self.titleName.SetText(targetName)
self.targetName = targetName
self.textRenderer.SetTargetName(targetName)
self.titleNameEdit.Hide()
self.ignoreButton.Hide()
if app.IsDevStage():
self.reportViolentWhisperButton.Show()
else:
self.reportViolentWhisperButton.Hide()
self.acceptButton.Hide()
self.gamemasterMark.Hide()
self.minimizeButton.Show()
if chr.IsGameMaster(player.GetMainCharacterIndex()):
self.warp.Show()
self.transfer.Show()
self.kill.Show()
self.kick.Show()
else:
self.warp.Hide()
self.transfer.Hide()
self.kill.Hide()
self.kick.Hide()
def OpenWithoutTarget(self, event):
self.eventAcceptTarget = event
self.titleName.SetText("")
self.titleNameEdit.SetText("")
self.titleNameEdit.SetFocus()
self.targetName = 0
self.titleNameEdit.Show()
self.ignoreButton.Hide()
self.reportViolentWhisperButton.Hide()
self.acceptButton.Show()
self.minimizeButton.Hide()
self.gamemasterMark.Hide()
def SetGameMasterLook(self):
self.gamemasterMark.Show()
self.reportViolentWhisperButton.Hide()
def Minimize(self):
self.titleNameEdit.KillFocus()
self.chatLine.KillFocus()
self.Hide()
if None != self.eventMinimize:
self.eventMinimize(self.targetName)
def Close(self):
chat.ClearWhisper(self.targetName)
self.titleNameEdit.KillFocus()
self.chatLine.KillFocus()
self.Hide()
if None != self.eventClose:
self.eventClose(self.targetName)
def __OnWarp(self):
net.SendChatPacket("/warp " + self.targetName)
def __OnTransfer(self):
net.SendChatPacket("/transfer " + self.targetName)
def __OnKill(self):
net.SendChatPacket("/kill " + self.targetName)
def __OnKick(self):
net.SendChatPacket("/kick" + self.targetName)
def ReportViolentWhisper(self):
net.SendChatPacket("/reportviolentwhisper " + self.targetName)
def IgnoreTarget(self):
net.SendChatPacket("/ignore " + self.targetName)
def AcceptTarget(self):
name = self.titleNameEdit.GetText()
if len(name) <= 0:
self.Close()
return
if None != self.eventAcceptTarget:
self.titleNameEdit.KillFocus()
self.eventAcceptTarget(name)
def OnScroll(self):
chat.SetWhisperPosition(self.targetName, self.scrollBar.GetPos())
def SendWhisper(self):
text = self.chatLine.GetText()
textLength = len(text)
if textLength > 0:
if net.IsInsultIn(text):
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_INSULT_STRING)
return
net.SendWhisperPacket(self.targetName, text)
self.chatLine.SetText("")
chat.AppendWhisper(chat.WHISPER_TYPE_CHAT, self.targetName, player.GetName() + " : " + text)
def OnTop(self):
self.chatLine.SetFocus()
def BindInterface(self, interface):
self.interface = interface
def OnMouseLeftButtonDown(self):
hyperlink = ui.GetHyperlink()
if hyperlink:
if app.IsPressed(app.DIK_LALT):
link = chat.GetLinkFromHyperlink(hyperlink)
ime.PasteString(link)
else:
self.interface.MakeHyperlinkTooltip(hyperlink)
if "__main__" == __name__:
import uiTest
class TestApp(uiTest.App):
def OnInit(self):
wnd = WhisperDialog(self.OnMax, self.OnMin)
wnd.LoadDialog()
wnd.OpenWithoutTarget(self.OnNew)
wnd.SetPosition(0, 0)
wnd.Show()
self.wnd = wnd
def OnMax(self):
pass
def OnMin(self):
pass
def OnNew(self):
pass
TestApp().MainLoop()
import uiScriptLocale
ROOT = "d:/ymir work/ui/public/"
window = {
"name" : "WhisperDialog",
"style" : ("movable", "float",),
"x" : 0,
"y" : 0,
"width" : 280,
"height" : 200,
"children" :
(
{
"name" : "board",
"type" : "thinboard",
"style" : ("attach",),
"x" : 0,
"y" : 0,
"width" : 280,
"height" : 200,
"children" :
(
## Title
{
"name" : "name_slot",
"type" : "image",
"style" : ("attach",),
"x" : 10,
"y" : 10,
"image":"d:/ymir work/ui/public/Parameter_Slot_05.sub",
"children" :
(
{
"name" : "titlename",
"type" : "text",
"x" : 3,
"y" : 3,
"text" : uiScriptLocale.WHISPER_NAME,
},
{
"name" : "titlename_edit",
"type" : "editline",
"x" : 3,
"y" : 3,
"width" : 120,
"height" : 17,
"input_limit" : PLAYER_NAME_MAX_LEN,
"text" : uiScriptLocale.WHISPER_NAME,
},
),
},
{
"name" : "gamemastermark",
"type" : "expanded_image",
"style" : ("attach",),
"x" : 206,
"y" : 6,
"x_scale" : 0.2,
"y_scale" : 0.2,
"image" : "locale/common/effect/ymirred.tga",
},
{
"name" : "warp",
"type" : "button",
"x" : 10,
"y" : 30,
"text" : "warp",
"default_image": "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
{
"name" : "transfer",
"type" : "button",
"x" : 10 + 60 * 1,
"y" : 30,
"text" : "transfer",
"default_image": "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
{
"name" : "kill",
"type" : "button",
"x" : 10 + 60 * 2,
"y" : 30,
"text" : "kill",
"default_image": "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
{
"name" : "kick",
"type" : "button",
"x" : 10 + 60 * 3,
"y" : 30,
"text" : "kick",
"default_image": "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
## Button
{
"name" : "ignorebutton",
"type" : "toggle_button",
"x" : 145,
"y" : 10,
"text" : uiScriptLocale.WHISPER_BAN,
"default_image" : "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
{
"name" : "reportviolentwhisperbutton",
"type" : "button",
"x" : 145,
"y" : 10,
"text" : uiScriptLocale.WHISPER_REPORT,
"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
"down_image" : "d:/ymir work/ui/public/large_button_03.sub",
},
{
"name" : "acceptbutton",
"type" : "button",
"x" : 145,
"y" : 10,
"text" : uiScriptLocale.OK,
"default_image" : "d:/ymir work/ui/public/small_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/small_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/small_thin_button_03.sub",
},
{
"name" : "minimizebutton",
"type" : "button",
"x" : 280 - 41,
"y" : 12,
"tooltip_text" : uiScriptLocale.MINIMIZE,
"default_image" : "d:/ymir work/ui/public/minimize_button_01.sub",
"over_image" : "d:/ymir work/ui/public/minimize_button_02.sub",
"down_image" : "d:/ymir work/ui/public/minimize_button_03.sub",
},
{
"name" : "closebutton",
"type" : "button",
"x" : 280 - 24,
"y" : 12,
"tooltip_text" : uiScriptLocale.CLOSE,
"default_image" : "d:/ymir work/ui/public/close_button_01.sub",
"over_image" : "d:/ymir work/ui/public/close_button_02.sub",
"down_image" : "d:/ymir work/ui/public/close_button_03.sub",
},
## ScrollBar
{
"name" : "scrollbar",
"type" : "thin_scrollbar",
"x" : 280 - 25,
"y" : 35,
"size" : 280 - 160,
},
## Edit Bar
{
"name" : "editbar",
"type" : "bar",
"x" : 10,
"y" : 200 - 60,
"width" : 280 - 18,
"height" : 50,
"color" : 0x77000000,
"children" :
(
{
"name" : "chatline",
"type" : "editline",
"x" : 5,
"y" : 5,
"width" : 280 - 70,
"height" : 40,
"with_codepage" : 1,
"input_limit" : 40,
"limit_width" : 280 - 90,
"multi_line" : 1,
},
{
"name" : "sendbutton",
"type" : "button",
"x" : 280 - 80,
"y" : 10,
"text" : uiScriptLocale.WHISPER_SEND,
"default_image" : "d:/ymir work/ui/public/xlarge_thin_button_01.sub",
"over_image" : "d:/ymir work/ui/public/xlarge_thin_button_02.sub",
"down_image" : "d:/ymir work/ui/public/xlarge_thin_button_03.sub",
},
),
},
),
},
),
}
Ultima oară modificat 10 Ian 2026, 20:30 de către l3oogie, modificat de 3 ori în total.
Zeci de resurse Metin2 Premium - exclusive și 100% funcționale începând cu 15.99€!.
Vezi resursele Cumpără premium
Trebuie să fii membru pentru a răspunde
Membrii pot crea subiecte noi și pot descărca resurse Metin2 Gratuit!
Te poți înregistra sau conecta rapid utilizând contul tău de Discord, Github sau Google.
Utilizatori ce navighează pe acest forum: br34k3r, fr3sh23, HunMark, mikee012, salexandru9982 și 5 vizitatori