Jump to content
Korean Random
Kotyarko_O

battleMessages средствами XVM.

Recommended Posts

 

 

Hawk1983x, прикрепи конфиг battleMessages.xc.

вот правда там ничего особенного

battleMessages.xc

Edited by Hawk1983x

Share this post


Link to post

Short link
Share on other sites

@Hawk1983x, ошибку с форматом, на которую ты дал ссылку выше, не воспроизвёл. И с твоими конфигами у меня ничего не дублировалось.

Но заметил ошибки, связанные с неизвестностью информации о вражеской технике (особенность режима боя). Её исправил, но версию в шапке пока не буду заменять (нет возможности нормально потестить), прикреплю сюда. Попробуй: battleMessages.rar

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Kotyarko_O, с этим скриптом у меня тоже перестало двоиться в реплее.

Спасибо!

Share this post


Link to post

Short link
Share on other sites

Опишите, что не работает.

не отображает сообщения.

 

py:

import game
##import BigWorld
from math import ceil
from xfw import registerEvent
from xvm_main.python import config
from xvm_main.python.xvm import l10n
from Avatar import PlayerAvatar
from items import vehicles
from Vehicle import Vehicle
from messenger import MessengerEntry
from gui.app_loader import g_appLoader
from gui.Scaleform.framework import ViewTypes
from gui.Scaleform.daapi.view.battle.shared.markers2d.plugins import VehicleMarkerPlugin
from gui.Scaleform.daapi.view.battle.shared.indicators import SixthSenseIndicator
from gui.battle_control.controllers.chat_cmd_ctrl import CHAT_COMMANDS
from gui.shared.gui_items.Vehicle import VEHICLE_CLASS_NAME

player = None
battleMessagesConfig = config.get('battleMessages', {
    'teamDamage': {'enabled': False},
    'enemyArtyCooldown': {'enabled': False},
    'iAmSpotted': {'enabled': False}
})

def getSquarePosition():
    
    def clamp(val, vmin, vmax):
        if val < vmin:
            return vmin
        if val > vmax:
            return vmax
        return val
    
    def pos2name(pos):
        sqr = 'KJHGFEDCBA'
        line = '1234567890'
        return '{}{}'.format(sqr[int(pos[1]) - 1], line[int(pos[0]) - 1])
    
    boundingBox = player.arena.arenaType.boundingBox
    position = BigWorld.entities[player.playerVehicleID].position
    
    positionRect = (position[0], position[2])
    bottomLeft, upperRight = boundingBox
    spaceSize = upperRight - bottomLeft
    relPos = positionRect - bottomLeft
    relPos[0] = clamp(relPos[0], 0.1, spaceSize[0])
    relPos[1] = clamp(relPos[1], 0.1, spaceSize[1])
    
    return pos2name((ceil(relPos[0] / spaceSize[0] * 10), ceil(relPos[1] / spaceSize[1] * 10)))

#ENEMYARTYSCOOLDOWN

def showEnemyArtyCooldown(self, attacker):
    if (not self.isPlayerVehicle) or (not hasattr(attacker['vehicleType'], 'type')):
        return
    message = battleMessagesConfig['enemyArtyCooldown']['format']
    if vehicles.getVehicleClass(attacker['vehicleType'].type.compactDescr) == VEHICLE_CLASS_NAME.SPG:
        if player.team != attacker['team']:
            message = message.replace('{{arty-tank}}', attacker['vehicleType'].type.shortUserString)
            message = message.replace('{{arty-name}}', attacker['name'])
            player.guiSessionProvider.shared.chatCommands.proto.arenaChat.broadcast(message, 0)

#IAMSPOTTED

def iAmSpotted():
    
    def sosCommand():
        player.guiSessionProvider.shared.chatCommands.handleChatCommand(CHAT_COMMANDS.SOS)
    
    alive_allies = {id:data for id, data in player.arena.vehicles.items() if data['team'] == player.team and data['isAlive']}
    if (2 < len(alive_allies) < int(battleMessagesConfig['iAmSpotted']['showWhenLess'])) or (int(battleMessagesConfig['iAmSpotted']['showWhenLess']) == 0):
        message = battleMessagesConfig['iAmSpotted']['format']
        message = message.replace('{{position}}', getSquarePosition())
        if len(message) > 0:
            player.guiSessionProvider.shared.chatCommands.proto.arenaChat.broadcast(message, 0)
        if battleMessagesConfig['iAmSpotted']['helpMeCommand']:
            BigWorld.callback(0.5, sosCommand)

#TEAMDAMAGE

vehiclesHP = {}
damageReasons = {
    0: 'shot',
    1: 'fire',
    2: 'ramming',
    3: 'world_collision',
    4: 'death_zone',
    5: 'drowning'
}

def showTeamDamage(message):
    messageIn = battleMessagesConfig['teamDamage']['messageIn']
    if messageIn == 'chat':
        MessengerEntry.g_instance.gui.addClientMessage(message)
    elif messageIn == 'killog':
        ctrl = g_appLoader.getDefBattleApp()
        if ctrl is not None:
            battle_page = ctrl.containerManager.getContainer(ViewTypes.VIEW).getView()
            battle_page.components['battlePlayerMessages'].as_showRedMessageS(None, message)

@registerEvent(PlayerAvatar, '_PlayerAvatar__startGUI')
def __startGUI(self):
    global player, vehiclesHP
    player = BigWorld.player()
    arenaVehicles = player.arena.vehicles
    for key in arenaVehicles.keys():
        vehicle = arenaVehicles.get(key)
        if vehicle['vehicleType']:
            vehiclesHP[key] = vehicle['vehicleType'].maxHealth

@registerEvent(PlayerAvatar, '_PlayerAvatar__destroyGUI')
def __destroyGUI(self):
    global player, vehiclesHP
    player = None
    vehiclesHP = {}

@registerEvent(VehicleMarkerPlugin, '_VehicleMarkerPlugin__onVehicleMarkerAdded')
def __onVehicleMarkerAdded(self, vProxy, vInfo, guiProps):
    global vehiclesHP
    vehiclesHP.update({vProxy.id: vProxy.health})

def teamDamage_onHealthChanged(self, newHealth, attackerID, attackReasonID):
    attacker = player.arena.vehicles.get(attackerID)
    if None in [player, attacker]:
        return
    message = battleMessagesConfig['teamDamage']['format']
    enabledFor = battleMessagesConfig['teamDamage']['enabledFor']
    damage = vehiclesHP.get(self.id, 0) - max(0, newHealth)
    if player.team == attacker['team'] == self.publicInfo.team and self.id != attackerID:
        message = message.replace('{{damage}}', str(damage))
        message = message.replace('{{damage-reason}}', l10n(damageReasons[attackReasonID]))
        message = message.replace('{{victim-name}}', self.publicInfo.name)
        message = message.replace('{{victim-vehicle}}', self.typeDescriptor.type.shortUserString)
        message = message.replace('{{attacker-name}}', attacker['name'])
        message = message.replace('{{attacker-vehicle}}', attacker['vehicleType'].type.shortUserString)
        if enabledFor == 'all':
            showTeamDamage(message)
        elif enabledFor == 'player' and (self.publicInfo.name == player.name or attacker['name'] == player.name):
            showTeamDamage(message)
        elif enabledFor == 'ally' and self.publicInfo.name != player.name and attacker['name'] != player.name:
            showTeamDamage(message)
    vehiclesHP.update({self.id: newHealth})

#

@registerEvent(Vehicle, 'onHealthChanged')
def onHealthChanged(self, newHealth, attackerID, attackReasonID):
    if battleMessagesConfig['teamDamage']['enabled']:
        teamDamage_onHealthChanged(self, newHealth, attackerID, attackReasonID)

@registerEvent(Vehicle, 'showDamageFromShot')
def showDamageFromShot(self, attackerID, points, effectsIndex, damageFactor):
    if battleMessagesConfig['enemyArtyCooldown']['enabled']:
        showEnemyArtyCooldown(self, player.arena.vehicles.get(attackerID))

@registerEvent(Vehicle, 'showDamageFromExplosion')
def showDamageFromExplosion(self, attackerID, center, effectsIndex, damageFactor):
    if battleMessagesConfig['enemyArtyCooldown']['enabled']:
        showEnemyArtyCooldown(self, player.arena.vehicles.get(attackerID))

@registerEvent(SixthSenseIndicator, '_SixthSenseIndicator__show')
def _SixthSenseIndicator__show(self):
    if battleMessagesConfig['iAmSpotted']['enabled'] and player.isVehicleAlive:
        iAmSpotted()

xc

{
  "def": {
    "battleMessages": {
      "enemyArtyCooldown": {
        "enabled": true,
        "format": "Arty {{arty-tank}} ({{arty-name}}) Shoot me >:0 "
      },
      "iAmSpotted": {
        "enabled": true,
        "showWhenLess": 6,
        "helpMeCommand": true,
        "format": "I'm Spotted in {{position}} :(!"
      },	
      "teamDamage": {
        "enabled": tue,
        "enabledFor": "all",
        "messageIn": "chat",
        "format": "<font color='#00EAFF'>{{attacker-name}} ({{attacker-vehicle}})</font> Damaged in ally {{victim-name}} ({{victim-vehicle}}) <font color='#FFDD33'>{{damage}} hp </font>!"
      }
    }
  }
}

Share this post


Link to post

Short link
Share on other sites

@DKRUBEN,

 

Установка аддона:

  1. В @xvm.xc добавить ссылку на конфиг аддона:
    "battleMessages": ${"battleMessages.xc":"battleMessages"}
    
  2. Содержимое архива раcпаковать в "res_mods": attachicon.gifbattleMessages.rar

* Обратите внимание, что внутри архива, для примера, имя папки конфигов было взято стандартное - "default".

* Соответственно, если у вас папка конфигов имеет уникальное имя, вам нужно скопировать конфиг battleMessages.xc, находящийся в папке "default" загруженного архива, в свою папку конфигов.

 

В @xvm.xc добавить ссылку на конфиг аддона:

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@ktulho , спамер хочет убрать свой же спам, интересно. От поставил какой то мод который чат засирает, ему клиент отправляет сообщение об ограничении времени на отправку сообщения в 0.5 секунд. Если я не ошибаюсь на реплее эти предупреждения не выводятся.

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, night_dragon_on сказал:

От поставил какой то мод который чат засирает,

Поэтому нужны логи.

Share this post


Link to post

Short link
Share on other sites

can't provide any logs or replay, sorry - i've already removed it from my config. i'm also quite sure that there was no error or anything related to the script.

 

script seem to send it's messages multiple times instead of once, which triggers the built in antispam. in case of the team damage message, it fills up the entire screen with the same message.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
В 30/10/2017 в 20:20, Kaeptn сказал:

can't provide any logs or replay, sorry - i've already removed it from my config. i'm also quite sure that there was no error or anything related to the script.

 

script seem to send it's messages multiple times instead of once, which triggers the built in antispam. in case of the team damage message, it fills up the entire screen with the same message.

same probleme here

 

Share this post


Link to post

Short link
Share on other sites
В 24.01.2017 в 20:23, Kotyarko_O сказал:

Я не стал вводить возможность прокликивать квадрат. Ведь в конфиге есть параметр "helpMeCommand", отправляющий команду "Нужна помощь!". И, как все знают, эта команда отображается соответствующей анимацией поверх своего маркера на миникарте.

В другом моде у меня к примеру настроено так: "Засвет в А1. Внимание на квадрат А1" и на миникарте моргает квадрат. (т.е. все сообщение занимает одну строку).

У тебя так понимаю будет сообщение о засвете и на второй строке будет сообщение "Нужна помощь"?

Share this post


Link to post

Short link
Share on other sites

py: well work for me :hmm:

 

import BigWorld
from math import ceil
from xfw import * #New Line 
#from xfw import registerEvent """need fix"""
from xvm_main.python import config
from xvm_main.python.xvm import l10n
from Avatar import PlayerAvatar
from items import vehicles
from Vehicle import Vehicle
from messenger import MessengerEntry
from gui.app_loader import g_appLoader
from gui.Scaleform.framework import ViewTypes
from gui.Scaleform.daapi.view.battle.shared.markers2d.plugins import VehicleMarkerPlugin
from gui.Scaleform.daapi.view.battle.shared.indicators import SixthSenseIndicator
from gui.battle_control.controllers.chat_cmd_ctrl import CHAT_COMMANDS
from gui.shared.gui_items.Vehicle import VEHICLE_CLASS_NAME

player = None
battleMessagesConfig = config.get('battleMessages', {
    'teamDamage': {'enabled': False},
    'enemyArtyCooldown': {'enabled': False},
    'iAmSpotted': {'enabled': False}
})

def getSquarePosition():
    
    def clamp(val, vmin, vmax):
        if val < vmin:
            return vmin
        if val > vmax:
            return vmax
        return val
    
    def pos2name(pos):
        sqr = 'KJHGFEDCBA'
        line = '1234567890'
        return '{}{}'.format(sqr[int(pos[1]) - 1], line[int(pos[0]) - 1])
    
    boundingBox = player.arena.arenaType.boundingBox
    position = BigWorld.entities[player.playerVehicleID].position
    
    positionRect = (position[0], position[2])
    bottomLeft, upperRight = boundingBox
    spaceSize = upperRight - bottomLeft
    relPos = positionRect - bottomLeft
    relPos[0] = clamp(relPos[0], 0.1, spaceSize[0])
    relPos[1] = clamp(relPos[1], 0.1, spaceSize[1])
    
    return pos2name((ceil(relPos[0] / spaceSize[0] * 10), ceil(relPos[1] / spaceSize[1] * 10)))

#ENEMYARTYSCOOLDOWN

def showEnemyArtyCooldown(self, attackerID):
    if not self.isPlayerVehicle:
        return
    message = battleMessagesConfig['enemyArtyCooldown']['format']
    attacker = player.arena.vehicles.get(attackerID)
    if vehicles.getVehicleClass(attacker['vehicleType'].type.compactDescr) == VEHICLE_CLASS_NAME.SPG:
        if player.team != attacker['team']:
            message = message.replace('{{arty-tank}}', attacker['vehicleType'].type.shortUserString)
            message = message.replace('{{arty-name}}', attacker['name'])
            player.guiSessionProvider.shared.chatCommands.proto.arenaChat.broadcast(message, 0)

#IAMSPOTTED

def IAmSpotted():
    
    def SOSCommand():
        player.guiSessionProvider.shared.chatCommands.handleChatCommand(CHAT_COMMANDS.SOS)
    
    alive_allies = {id:data for id, data in player.arena.vehicles.items() if data['team'] == player.team and data['isAlive']}
    if (2 < len(alive_allies) < int(battleMessagesConfig['iAmSpotted']['showWhenLess'])) or (int(battleMessagesConfig['iAmSpotted']['showWhenLess']) == 0):
        message = battleMessagesConfig['iAmSpotted']['format']
        message = message.replace('{{position}}', getSquarePosition())
        if len(message) > 0:
            player.guiSessionProvider.shared.chatCommands.proto.arenaChat.broadcast(message, 0)
        if battleMessagesConfig['iAmSpotted']['helpMeCommand']:
            BigWorld.callback(0.5, SOSCommand)

#TEAMDAMAGE

vehiclesHP = {}
damageReasons = {
    0: 'shot',
    1: 'fire',
    2: 'ramming',
    3: 'world_collision',
    4: 'death_zone',
    5: 'drowning'
}

def showTeamDamage(message):
    messageIn = battleMessagesConfig['teamDamage']['messageIn']
    if messageIn == 'chat':
        MessengerEntry.g_instance.gui.addClientMessage(message)
    elif messageIn == 'killog':
        ctrl = g_appLoader.getDefBattleApp()
        if ctrl is not None:
            battle_page = ctrl.containerManager.getContainer(ViewTypes.VIEW).getView()
            battle_page.components['battlePlayerMessages'].as_showRedMessageS(None, message)

@registerEvent(PlayerAvatar, '_PlayerAvatar__startGUI')
def __startGUI(self):
    global player, vehiclesHP
    player = BigWorld.player()
    arenaVehicles = player.arena.vehicles
    for key in arenaVehicles.keys():
        vehicle = arenaVehicles.get(key)
        if vehicle['vehicleType']:
            vehiclesHP[key] = vehicle['vehicleType'].maxHealth

@registerEvent(PlayerAvatar, '_PlayerAvatar__destroyGUI')
def __destroyGUI(self):
    global player, vehiclesHP
    player = None
    vehiclesHP = {}

@registerEvent(VehicleMarkerPlugin, '_VehicleMarkerPlugin__onVehicleMarkerAdded')
def __onVehicleMarkerAdded(self, vProxy, vInfo, guiProps):
    global vehiclesHP
    vehiclesHP.update({vProxy.id: vProxy.health})

def teamDamage_onHealthChanged(self, newHealth, attackerID, attackReasonID):
    if player is None:
        return
    message = battleMessagesConfig['teamDamage']['format']
    enabledFor = battleMessagesConfig['teamDamage']['enabledFor']
    damage = vehiclesHP.get(self.id, 0) - max(0, newHealth)
    attacker = player.arena.vehicles.get(attackerID)
    if player.team == attacker['team'] == self.publicInfo.team and self.id != attackerID:
        message = message.replace('{{damage}}', str(damage))
        message = message.replace('{{damage-reason}}', l10n(damageReasons[attackReasonID]))
        message = message.replace('{{victim-name}}', self.publicInfo.name)
        message = message.replace('{{victim-vehicle}}', self.typeDescriptor.type.shortUserString)
        message = message.replace('{{attacker-name}}', attacker['name'])
        message = message.replace('{{attacker-vehicle}}', attacker['vehicleType'].type.shortUserString)
        if enabledFor == 'all':
            showTeamDamage(message)
        elif enabledFor == 'player' and (self.publicInfo.name == player.name or attacker['name'] == player.name):
            showTeamDamage(message)
        elif enabledFor == 'ally' and self.publicInfo.name != player.name and attacker['name'] != player.name:
            showTeamDamage(message)
    vehiclesHP.update({self.id: newHealth})

#

@registerEvent(Vehicle, 'onHealthChanged')
def onHealthChanged(self, newHealth, attackerID, attackReasonID):
    if battleMessagesConfig['teamDamage']['enabled']:
        teamDamage_onHealthChanged(self, newHealth, attackerID, attackReasonID)

@registerEvent(Vehicle, 'showDamageFromShot')
def showDamageFromShot(self, attackerID, points, effectsIndex, damageFactor):
    if battleMessagesConfig['enemyArtyCooldown']['enabled']:
        showEnemyArtyCooldown(self, attackerID)

@registerEvent(Vehicle, 'showDamageFromExplosion')
def showDamageFromExplosion(self, attackerID, center, effectsIndex, damageFactor):
    if battleMessagesConfig['enemyArtyCooldown']['enabled']:
        showEnemyArtyCooldown(self, attackerID)

@registerEvent(SixthSenseIndicator, '_SixthSenseIndicator__show')
def _SixthSenseIndicator__show(self):
    if battleMessagesConfig['iAmSpotted']['enabled'] and player.isVehicleAlive:
        IAmSpotted()

 

Share this post


Link to post

Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...