oldschool-toontown/libotp/nametag/NametagGroup.py

426 lines
11 KiB
Python

from panda3d.core import *
from . import NametagGlobals
from .Nametag2d import Nametag2d
from .Nametag3d import Nametag3d
from ._constants import *
class NametagGroup:
CCNormal = 0
CCNoChat = 1
CCNonPlayer = 2
CCSuit = 3
CCToonBuilding = 4
CCSuitBuilding = 5
CCHouseBuilding = 6
CCSpeedChat = 7
CCFreeChat = 8
_unique_index = 0
def __init__(self):
self.m_nametags = []
self.m_name_font = None
self.m_chat_font = None
self.m_avatar = None
self.m_node = None
self.m_name = ''
self.m_display_name = ''
self.m_chat_pages = []
self.m_stomp_text = ''
self.m_unique_name = ''
self.m_region_seq = 0
self.m_name_icon = NodePath.anyPath(PandaNode('icon'))
self.m_name_frame = Vec4(0, 0, 0, 0)
self.m_wordwrap = -1.0
self.m_color_code = 0
self.m_qt_color = Vec4(NametagGlobals._default_qt_color)
self.m_balloon_color = Vec4(NametagGlobals._balloon_modulation_color)
self.m_shadow = (0, 0)
self.m_has_shadow = False
self.m_timeout = 0.0
self.m_timeout_start = 0.0
self.m_has_timeout = False
self.m_stomp_time = 0.0
self.m_stomp_chat_flags = None
self.m_chat_flags = 0
self.m_page_number = 0
self.m_stomp_delay = 0.5
self.m_chat_stomp = 0
self.m_unique_name = 'nametag-%d' % NametagGroup._unique_index
NametagGroup._unique_index += 1
self.m_object_code = 0
self.m_nametag3d_flag = 0
self.m_manager = None
self.m_region_seq += 1
self.m_contents = CFSpeech | CFThought | CFQuicktalker
self.m_is_active = 1
self.m_active = NametagGlobals._master_nametags_active
self.m_visible = NametagGlobals._master_nametags_visible
self.m_tag2d = Nametag2d()
self.m_tag3d = Nametag3d()
self.addNametag(self.m_tag2d)
self.addNametag(self.m_tag3d)
def setFont(self, font):
self.setNameFont(font)
self.setChatFont(font)
def setNameFont(self, font):
self.m_name_font = font
def getNameFont(self):
return self.m_name_font
def setChatFont(self, font):
self.m_chat_font = font
def getChatFont(self):
return self.m_chat_font
def setAvatar(self, avatar):
self.m_avatar = avatar
def getAvatar(self):
return self.m_avatar
def setNameIcon(self, icon):
self.m_name_icon = icon
def getNameIcon(self):
return self.m_name_icon
def setColorCode(self, code):
self.m_color_code = code
def getColorCode(self):
return self.m_color_code
def setContents(self, contents):
self.m_contents = contents
def getContents(self):
return self.m_contents
def setDisplayName(self, name):
self.m_display_name = name
if name and self.m_name_font:
text_node = NametagGlobals.getTextNode()
text_node.setFont(self.m_name_font)
text_node.setWordwrap(self.getNameWordwrap())
text_node.setAlign(TextNode.ACenter)
text_node.setText(name)
gen = text_node.generate()
self.m_node = gen
self.m_name_frame = text_node.getCardActual()
if self.m_has_shadow:
self.m_node = PandaNode('name')
self.m_node.addChild(gen)
pos = Point3(self.m_shadow[0], 0, -self.m_shadow[1])
attached = NodePath.anyPath(self.m_node).attachNewNode(gen.copySubgraph())
attached.setPos(pos)
attached.setColor(0, 0, 0, 1)
else:
self.m_node = None
self.updateContentsAll()
def getDisplayName(self):
return self.m_display_name
def setName(self, name):
self.m_name = name
self.setDisplayName(name)
def getName(self):
return self.m_name
def getNameFrame(self):
return self.m_name_frame
def setNameWordwrap(self, wordwrap):
self.m_wordwrap = wordwrap
self.setDisplayName(self.m_display_name)
def getNameWordwrap(self):
if self.m_wordwrap > 0.0:
return self.m_wordwrap
wordwrap = NametagGlobals.getNameWordwrap()
return {self.CCNoChat: 7.8,
self.CCToonBuilding: 8.5,
self.CCSuitBuilding: 8.5,
self.CCHouseBuilding: 10.0}.get(self.m_color_code, wordwrap)
def getNametag(self, index):
return self.m_nametags[index]
def getNametag2d(self):
return self.m_tag2d
def getNametag3d(self):
return self.m_tag3d
def setNametag3dFlag(self, flag):
self.m_nametag3d_flag = flag
def getNametag3dFlag(self):
return self.m_nametag3d_flag
def getNumChatPages(self):
return len(self.m_chat_pages)
def getNumNametags(self):
return len(self.m_nametags)
def setObjectCode(self, code):
self.m_object_code = code
def getObjectCode(self):
return self.m_object_code
def setPageNumber(self, page):
if self.m_page_number == page:
return
self.m_page_number = page
if self.willHaveButton():
self.m_timeout_start = globalClock.getFrameTime() + 0.2
self.m_has_timeout = True
self.updateContentsAll()
def getPageNumber(self):
return self.m_page_number
def getBalloonModulationColor(self):
return self.m_balloon_color
def setQtColor(self, color):
self.m_qt_color = color
def getQtColor(self):
return self.m_qt_color
def getRegionSeq(self):
return self.m_region_seq
def setShadow(self, shadow):
self.m_shadow = shadow
def getShadow(self):
return self.m_shadow
def getStompDelay(self):
return self.m_stomp_delay
def getStompText(self):
return self.m_stomp_text
def setUniqueId(self, name):
self.m_unique_name = name
def getUniqueId(self):
return self.m_unique_name
def hasButton(self):
if self.m_has_timeout:
return False
return self.willHaveButton()
def hasNoQuitButton(self):
return (not self.m_has_timeout) and self.m_chat_flags & CFSpeech
def hasQuitButton(self):
return (not self.m_has_timeout) and self.m_chat_flags & CFQuitButton
def hasPageButton(self):
return (not self.m_has_timeout) and self.m_chat_flags & CFPageButton
def hasShadow(self):
return self.m_has_shadow
def clearShadow(self):
self.m_has_shadow = False
def incrementNametag3dFlag(self, flag):
self.m_nametag3d_flag = max(self.m_nametag3d_flag, flag)
def isManaged(self):
return self.m_manager is not None
def manage(self, manager):
if not self.m_manager:
self.m_manager = manager
for nametag in self.m_nametags:
nametag.manage(manager)
def unmanage(self, manager):
if self.m_manager:
self.m_manager = None
for nametag in self.m_nametags:
nametag.unmanage(manager)
def addNametag(self, nametag):
if nametag.m_group:
print('Attempt to add %s twice to %s.' % (nametag.__class__.__name__, self.m_name))
return
nametag.m_group = self
nametag.updateContents()
self.m_nametags.append(nametag)
if self.m_manager:
nametag.manage(self.m_manager)
def removeNametag(self, nametag):
if not nametag.m_group:
print('Attempt to removed %s twice from %s.' % (nametag.__class__.__name__, self.m_name))
return
if self.m_manager:
nametag.unmanage(self.m_manager)
nametag.m_group = None
nametag.updateContents()
self.m_nametags.remove(nametag)
def setActive(self, active):
self.m_is_active = active
def isActive(self):
return self.m_active
def updateContentsAll(self):
for nametag in self.m_nametags:
nametag.updateContents()
def updateRegions(self):
for nametag in self.m_nametags:
nametag.updateRegion(self.m_region_seq)
self.m_region_seq += 1
now = globalClock.getFrameTime()
if self.m_stomp_time < now and self.m_chat_stomp > 1:
self.m_chat_stomp = 0
self.setChat(self.m_stomp_text, self.m_stomp_chat_flags, self.m_page_number)
if self.m_chat_flags & CFTimeout and now >= self.m_timeout:
self.clearChat()
self.m_chat_stomp = 0
v7 = False
if self.m_has_timeout and now >= self.m_timeout_start:
self.m_has_timeout = 0
v7 = True
if self.m_active != NametagGlobals._master_nametags_active:
self.m_active = NametagGlobals._master_nametags_active
v7 = True
if self.m_visible == NametagGlobals._master_nametags_visible:
if not v7:
return
else:
self.m_visible = NametagGlobals._master_nametags_visible
self.updateContentsAll()
def willHaveButton(self):
return self.m_chat_flags & (CFPageButton | CFQuitButton)
def setChat(self, chat, chat_flags, page_number=0):
self.m_chat_flags = chat_flags
self.m_page_number = page_number
now = globalClock.getFrameTime()
must_split = True
if chat_flags and chat:
self.m_chat_stomp += 1
if self.m_chat_stomp >= 2 and self.m_stomp_delay >= 0.05:
self.m_stomp_text = chat
self.m_stomp_chat_flags = self.m_chat_flags
self.m_stomp_time = now + self.m_stomp_delay
self.m_chat_flags = 0
must_split = False
else:
self.m_chat_flags = 0
self.m_chat_stomp = 0
must_split = False
if must_split:
self.m_chat_pages = chat.split('\x07')
else:
self.m_chat_pages = []
if self.m_chat_flags & CFTimeout and self.m_stomp_time < now:
timeout = len(chat) * 0.5
timeout = min(12.0, max(timeout, 4.0))
self.m_timeout = timeout + now
if self.willHaveButton():
self.m_has_timeout = True
self.m_timeout_start = now + 0.2
else:
self.m_has_timeout = False
self.m_timeout_start = 0.0
self.updateContentsAll()
def getChat(self):
if self.m_chat_pages:
return self.m_chat_pages[self.m_page_number]
return ''
def clearChat(self):
self.setChat('', 0, 0)
def getChatStomp(self):
return self.m_chat_stomp
def clearAuxNametags(self):
for nametag in self.nametags[:]:
if nametag not in (self.m_tag2d, self.m_tag3d):
self.removeNametag(nametag)
def click(self):
messenger.send(self.m_unique_name)
def copyNameTo(self, to):
return to.attachNewNode(self.m_node.copySubgraph())
def displayAsActive(self):
if self.m_is_active and NametagGlobals._master_nametags_active:
return 1
return self.hasButton()
def frameCallback(self):
# This should be in Nametag2d
# I have no idea where libotp called it
# so I'm doing it in MarginManager.update
self.updateRegions()