waza123 Posted June 5, 2015 Share Posted June 5, 2015 (edited) Почему несрабатывают события ? В логах пуста. import BigWorld from debug_utils import * from clientarena import ClientArena def new_onBaseCaptured(self, argStr): LOG_NOTE('BaseCaptured: onBaseCaptured !!!!!!') ClientArena._ClientArena__onBaseCaptured = new_onBaseCaptured def new_onBasePointsUpdate(self, argStr): LOG_NOTE('BaseCaptured: onBasePointsUpdated !!!!!!') ClientArena._ClientArena__onBasePointsUpdate = new_onBasePointsUpdate clientarena.py class class ClientArena(object): functions def _ClientArena__onBasePointsUpdate(self, argStr): (team, baseID, points, capturingStopped) = cPickle.loads(argStr) self.onTeamBasePointsUpdate(team, baseID, points, capturingStopped) def _ClientArena__onBaseCaptured(self, argStr): (team, baseID) = cPickle.loads(argStr) self.onTeamBaseCaptured(team, baseID) v0.9.8.1 Нужно что бы во время захвата или как достигло 100% захвата, срабатывали события, но этого не происходит. тут таже история import BigWorld from debug_utils import * from gui.scaleform.battle import * def new_y(self, team, baseID, points, capturingStopped): LOG_NOTE('BaseCaptured: _TeamBasesPanel__onTeamBasePointsUpdate !!!!!!') TeamBasesPanel._TeamBasesPanel__onTeamBasePointsUpdate = new_y def new_x(self, team, baseID): LOG_NOTE('BaseCaptured: _TeamBasesPanel__onTeamBaseCaptured !!!!!!') TeamBasesPanel._TeamBasesPanel__onTeamBaseCaptured = new_x battle.py class class TeamBasesPanel(object): functions def _TeamBasesPanel__onTeamBasePointsUpdate(self, team, baseID, points, capturingStopped): if team not in (1, 2): return None id = None._getID(team, baseID) if points or id in self._TeamBasesPanel__baseIds: self._TeamBasesPanel__clearUpdateCallback(id) self._TeamBasesPanel__baseIds.remove(id) self._TeamBasesPanel__callFlash('remove', [ id]) if not self._hasBaseId(team) or team ^ BigWorld.player().team: self._TeamBasesPanel__stopCaptureSound(team) if id in self._TeamBasesPanel__baseIds: self._TeamBasesPanel__capturePoints[id] = points if capturingStopped: self._TeamBasesPanel__callFlash('stop', [ id, points]) else: self._TeamBasesPanel__baseIds.add(id) key = team ^ BigWorld.player().team if isControlPointExists(BigWorld.player().arenaTypeID): settings = self._TeamBasesPanel__settings.get('controlPoint', { }) color = settings.get('color', { }).get(key, 'green') weight = settings.get('weight', { }).get(key, 0) else: settings = self._TeamBasesPanel__settings.get(key, { }) color = settings.get('color', 'green') weight = settings.get('weight', 0) capturingString = settings.get('capturing', '') % getBattleSubTypeBaseNumder(BigWorld.player().arenaTypeID, team, baseID) rate = 1 replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.playbackSpeed is not None: rate = replayCtrl.playbackSpeed self._TeamBasesPanel__callFlash('add', [ id, weight, color, capturingString, points, rate]) if capturingStopped: self._TeamBasesPanel__callFlash('stop', [ id, points]) self._TeamBasesPanel__capturePoints[id] = points self._TeamBasesPanel__loadUpdateCallback(id) if not capturingStopped: self._TeamBasesPanel__playCaptureSound(team) elif not self._hasBaseId(team, exclude = id) or team ^ BigWorld.player().team: self._TeamBasesPanel__stopCaptureSound(team) def _TeamBasesPanel__onTeamBaseCaptured(self, team, baseID): if team not in (1, 2): return None id = None._getID(team, baseID) if isControlPointExists(BigWorld.player().arenaTypeID): settings = self._TeamBasesPanel__settings.get('controlPoint', { }) color = settings.get('color', { }).get(team ^ BigWorld.player().team, 'green') else: settings = self._TeamBasesPanel__settings.get(team ^ BigWorld.player().team, { }) color = settings.get('color', 'green') if id in self._TeamBasesPanel__baseIds: self._TeamBasesPanel__callFlash('setCaptured', [ id, settings.get('captured', '') % getBattleSubTypeBaseNumder(BigWorld.player().arenaTypeID, team, baseID)]) else: self._TeamBasesPanel__baseIds.add(id) self._TeamBasesPanel__callFlash('add', [ id, color, settings.get('weight', 0), settings.get('captured', '') % getBattleSubTypeBaseNumder(BigWorld.player().arenaTypeID, team, baseID), 100]) self._TeamBasesPanel__stopCaptureSound(team) Edited June 5, 2015 by waza123 @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted June 5, 2015 Share Posted June 5, 2015 (edited) Потому что хуки нужно ставить правильно. Функция хука должна возвращать результат выполнения оригинала. Посмотри в теме Ориона, я там выкладывал примеры. А тут ты просто перегружаешь метод... А оригинал не вызывается, результат не отправляется на вызов функции извне. Иногда такие оленепатчи могут и крашнуть клиент... Не факт, что твои методы вывода выдают в лог нужную информацию. Проверь отдельно. Методы работают 100%. Как раз недавно их проверял. В 0.9.8.1. Один (__onTeamBasePointsUpdate) по крайней мере точно. Upd. Вот оно, почитай на досуге)) Advanced Hooks.zip Edited June 5, 2015 by GPCracker @ Quote Link to comment Short link Share on other sites More sharing options...
waza123 Posted June 6, 2015 Author Share Posted June 6, 2015 Ок добавил их функции, все равно не срабатывает, логи пусты, че не так? import BigWorld from debug_utils import * from gui.scaleform.battle import * from clientarena import ClientArena def new_onTeamBasePointsUpdate(self, team, baseID, points, capturingStopped): result = old_onTeamBasePointsUpdate(self, team, baseID, points, capturingStopped) LOG_NOTE('BaseCaptured: _TeamBasesPanel__onTeamBasePointsUpdate '+str(points)+' !!!!!!') return result old_onTeamBasePointsUpdate = TeamBasesPanel._TeamBasesPanel__onTeamBasePointsUpdate.__func__ TeamBasesPanel._TeamBasesPanel__onTeamBasePointsUpdate = new_onTeamBasePointsUpdate def new_onTeamBaseCaptured(self, team, baseID): result = old_onTeamBaseCaptured(self, team, baseID) LOG_NOTE('BaseCaptured: _TeamBasesPanel__onTeamBaseCaptured !!!!!!') return result old_onTeamBaseCaptured = TeamBasesPanel._TeamBasesPanel__onTeamBaseCaptured.__func__ TeamBasesPanel._TeamBasesPanel__onTeamBaseCaptured = new_onTeamBaseCaptured def new_onBaseCaptured(self, argStr): result = old_onBaseCaptured(self, argStr) LOG_NOTE('BaseCaptured: onBaseCaptured !!!!!!') return result old_onBaseCaptured = ClientArena._ClientArena__onBaseCaptured.__func__ ClientArena._ClientArena__onBaseCaptured = new_onBaseCaptured def new_onBasePointsUpdate(self, argStr): result = old_onBasePointsUpdate(self, argStr) LOG_NOTE('BaseCaptured: onBasePointsUpdate !!!!!!') return result old_onBasePointsUpdate = ClientArena._ClientArena__onBasePointsUpdate.__func__ ClientArena._ClientArena__onBasePointsUpdate = new_onBasePointsUpdate LOG_NOTE('EXECUTED') @ Quote Link to comment Short link Share on other sites More sharing options...
DrWebber Posted June 7, 2015 Share Posted June 7, 2015 Так будет правильнее: import BigWorld from PlayerEvents import g_playerEvents def TeamBasePointsUpdate(team, baseID, points, capturingStopped): print 'TeamBasePointsUpdate' def TeamBaseCaptured(team, baseID): print 'TeamBaseCaptured' def PeriodChange(period, *args): print 'PeriodChange' def avatarReady(): arena = BigWorld.player().arena if arena is not None: arena.onTeamBasePointsUpdate += TeamBasePointsUpdate arena.onTeamBaseCaptured += TeamBaseCaptured arena.onPeriodChange += PeriodChange g_playerEvents.onAvatarReady += avatarReady @ Quote Link to comment Short link Share on other sites More sharing options...
waza123 Posted June 7, 2015 Author Share Posted June 7, 2015 шикарно работает, спасибо. @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.