// PORT: server rates and privilege events are not character AFFECT packets in 40250. // Add distinct entries to the original affect bar; leave packed scripts unchanged. static const char c_szServerBonusScript[] = R"PY(# -*- coding: utf-8 -*- import app import game import net import player import ui import uiAffectShower L = player.AutoHuntLocalize PREFIX = "d:/ymir work/ui/skill/common/affect/" ENTRIES = ( ("服务器经验 %d%%", "exp_bonus.sub", 100), ("服务器金币数量 %d%%", "gold_bonus.sub", 100), ("服务器金币掉落率 %d%%", "gold_bonus.sub", 100), ("服务器物品掉落率 %d%%", "item_bonus.sub", 100), ("活动经验加成 %+d%%", "exp_bonus.sub", 0), ("活动物品掉落加成 %+d%%", "item_bonus.sub", 0), ("活动金币掉落加成 %+d%%", "gold_bonus.sub", 0), ("活动金币礼包掉落加成 %+d%%", "gold_premium.sub", 0), ) KEY_START = 20000 g_game = None g_ticker = None def Update(window, *values): if len(values) != len(ENTRIES): return try: values = tuple(int(value) for value in values) except (ValueError, TypeError): return bar = window.affectShower if not bar: return for i, ((text, asset, baseline), value) in enumerate(zip(ENTRIES, values)): key = KEY_START + i image = bar.affectImageDict.get(key) if value == baseline: if image: image.Hide() del bar.affectImageDict[key] continue if not image: image = uiAffectShower.AffectImage() image.SetParent(bar) image.LoadImage(PREFIX + asset) image.SetScale(0.7, 0.7) image.SetAffect(key) image.SetSkillAffectFlag(False) image.SetClock(False) bar.affectImageDict[key] = image image.SetDescription(L(text % value)) image.UpdateDescription() image.Show() bar._AffectShower__ArrangeImageList() class Ticker(ui.Window): def __init__(self, window): ui.Window.__init__(self) self.window = window self.nextQuery = app.GetTime() + 3.0 self.Show() def OnUpdate(self): now = app.GetTime() if self.window and now >= self.nextQuery: self.nextQuery = now + 15.0 net.SendChatPacket("/server_bonuses") _open = game.GameWindow.Open _close = game.GameWindow.Close _command = game.GameWindow.BINARY_ServerCommand_Run def Open(self): global g_game, g_ticker _open(self) g_game = self g_ticker = Ticker(self) def Close(self): global g_game, g_ticker if g_ticker: g_ticker.Hide() g_ticker.window = None g_game = g_ticker = None _close(self) def Command(self, line): words = line.split() if words and words[0] == "ServerBonuses": Update(self, *words[1:]) return 1 return _command(self, line) game.GameWindow.Open = Open game.GameWindow.Close = Close game.GameWindow.BINARY_ServerCommand_Run = Command )PY";