aster 53 #435157 Posted June 28, 2018 Хочется сделать прицел более контрастным, но в игре есть белые, коричневые, зелёные фоны. Даже тень не всегда помогает. Есть идеи, как можно сделать, скажем, смену цвета прицела в зависимости от карты? Quote Share this post Link to post Short link Share on other sites
SmashPuppet 72 #435160 Posted June 29, 2018 (edited) On 6/28/2018 at 3:22 PM, aster said: I want to make the sight more contrast, but the game has white, brown, green backgrounds. Even the shadow does not always help. There are ideas, how can you make, say, a change in the color of the sight depending on the map? Use {{py:map.kind}} from here in your config to change sight colours depending on the map to your liking. Edited July 1, 2018 by SmashPuppet maps.py updated. Edited to reflect changes 1 Quote Share this post Link to post Short link Share on other sites
SmashPuppet 72 #435241 Posted June 30, 2018 (edited) @aster I wrote a simple, quick and dirty script to help group the maps into categories. Winter or Summer. (Desert and all others default to Summer) You can then choose a colour depending on the map season. You can also use it to change the shadow alpha and/or strength for better contrast on a winter map. Color options in your battleLabelSight.xc like so: "color": "{{py:map.kind=winter?0xF50800|{{py:map.kind=desert?0x64FF30|0xD4FFAA}}}}" // Red if winter or bright Green if desert or lighter green if summer Put ktulho's maps.py in your py_macro folder and this one as well: (removed script) No longer needed. Ktulho updated maps.py =D Again, this is just an example. Choose whatever colours best suit your needs. Hope this helps. Cheers! Edited July 1, 2018 by SmashPuppet maps.py functionality updated. Post moot Quote Share this post Link to post Short link Share on other sites
SmashPuppet 72 #435336 Posted July 1, 2018 Discovered a possible issue with infoAutoAim.py. If you auto aim on a tank and then auto aim again on another tank without first disengaging, both tanks remain highlighted with the model and {{py:sight.autoAim*}} do not disappear after finally disengaging. It works normally if you disengage before auto aiming again on a different tank. (About 3 minutes after battle starts)20180630_1927_france-F37_AMX50_Foch_34_redshire.wotreplay Cheers! 1 Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #435341 Posted July 1, 2018 2 часа назад, SmashPuppet сказал: Discovered a possible issue with infoAutoAim.py. If you auto aim on a tank and then auto aim again on another tank without first disengaging, both tanks remain highlighted with the model and {{py:sight.autoAim*}} do not disappear after finally disengaging. It works normally if you disengage before auto aiming again on a different tank. Исправил. Обновил скрипт infoAutoAim.py. В 29.06.2018 в 01:22, aster сказал: Хочется сделать прицел более контрастным, но в игре есть белые, коричневые, зелёные фоны. Даже тень не всегда помогает. Есть идеи, как можно сделать, скажем, смену цвета прицела в зависимости от карты? Добавил. 3 Quote Share this post Link to post Short link Share on other sites
SmashPuppet 72 #435360 Posted July 1, 2018 8 hours ago, ktulho said: Исправил. Обновил скрипт infoAutoAim.py. Добавил. Excellent! Works and thank you! Also a much better/elegant solution for maps.py. Again cheers! Quote Share this post Link to post Short link Share on other sites
aster 53 #435418 Posted July 2, 2018 Спасибо) 1 Quote Share this post Link to post Short link Share on other sites
SmashPuppet 72 #435419 Posted July 2, 2018 19 minutes ago, aster said: Thank you) If you look here , the ability to change colour is simple. (simpler than I had originally thought) sight.xc { "sight": { // false - disable the mod "enabled": true, "colors": { // Set colours of sight elements depending on season of map "winter": "0xFF96FF", // Pink example "desert": "0x64FF30", // Vibrant Green "summer": "0xD4FFAA" // Light Green }, and an example in battleLabelSight.xc "textFormat": { "align": "left", "color": "{{.sight.colors.{{py:map.kind}}}}" }, Quote Share this post Link to post Short link Share on other sites
Heliomalt 53 #436579 Posted July 18, 2018 (edited) I use only the penetration calculator, as you can see on the screenshot, this is working. But I have some errors in the xvm.log, maybe someone could help? Thank you. 2018-07-18 16:03:51: XVM: eXtended Visualization Mod ( https://modxvm.com/ ) 2018-07-18 16:03:51: XVM Version : 7.6.8 2018-07-18 16:03:51: XVM Revision : 8514 2018-07-18 16:03:51: XVM Branch : default 2018-07-18 16:03:51: XVM Hash : 22539bca9a05d9e5e104307881d119b367458b48 2018-07-18 16:03:51: WoT Current : 1.0.2.2 2018-07-18 16:03:51: Current Time : 2018-07-18 16:03:51 +0200 2018-07-18 16:03:51: --------------------------- 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\xvm.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\@xvm.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapAlt.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimap.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapCircles.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapLines.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapMapSize.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapLabelsAlt.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapLabelsTemplates.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapLabelsData.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\hitLog.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battle.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\colors.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\export.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\sight.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\elements.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\camera.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\sounds.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleLabels.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleLabelsTemplates.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleLabelSight.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\minimapLabels.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleLoading.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\statisticForm.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\playersPanel.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\markers.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\markersDeadExtended.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\markersDeadNormal.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\markersAliveExtended.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\markersAliveNormal.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\squad.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\safeShot.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\iconset.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleMessages.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\tooltips.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\xmqp.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\tweaks.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\userInfo.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\alpha.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\battleResults.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\texts.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\captureBar.xc 2018-07-18 16:03:51: [JSONxLoader] load: res_mods\configs\xvm\default\vehicleNames.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\hotkeys.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\hangar.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\carousel.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\carouselNormal.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\carouselSmall.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\widgets.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\widgetsTemplates.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\damageLog.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\login.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\configs\xvm\default\battleLoadingTips.xc 2018-07-18 16:03:52: [JSONxLoader] load: res_mods\mods\shared_resources\xvm\l10n\de.xc 2018-07-18 16:03:52: Config loaded. Region: EU (detected), Language: de (detected) 2018-07-18 16:04:03: [INFO] HTTPS: /4.0/getToken/e4689f1a-****-****-****-********81d7/543716953 2018-07-18 16:04:03: [INFO] Time: 62 ms, Size: 279 (279) bytes 2018-07-18 16:04:03: [INFO] HTTPS: /4.0/getVersionWithLimit/e4689f1a-****-****-****-********81d7/543716953/50 2018-07-18 16:04:03: [INFO] Time: 61 ms, Size: 10640 (10640) bytes 2018-07-18 16:04:03: [X:000] Loading swf mods: 2018-07-18 16:04:03: [X:001] xvm_battle/as_battle_classic/xvm_battle_classic.swf 2018-07-18 16:04:03: [B:002] onLibLoaded: ../../res_mods/mods/xfw_packages/xvm_battle/as_battle_classic/xvm_battle_classic.swf 2018-07-18 16:04:03: [B:003] [XVM:BATTLE] processView: classicBattlePage 2018-07-18 16:04:04: [B:004] [XVM INFO] XVM_VERSION=7.6.8 #8514 for WoT 1.0.2.2 gameRegion=EU configVersion=6.1.0 autoReloadConfig=false markers.enabled=false servicesActive=true xmqp=true statBattle=false 2018-07-18 16:04:04: [B:005] [XFW] Mod loaded: xvm_battle_classic.swf 2018-07-18 16:04:04: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 156, in process_python_macro (func, deterministic) = get_function(arg) File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 147, in get_function (func, deterministic) = _container.get(func_name) TypeError: 'NoneType' object is not iterable arg='sight.cameraMode' 2018-07-18 16:04:04: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 156, in process_python_macro (func, deterministic) = get_function(arg) File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 147, in get_function (func, deterministic) = _container.get(func_name) TypeError: 'NoneType' object is not iterable arg='sight.cameraMode' 2018-07-18 16:04:04: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 156, in process_python_macro (func, deterministic) = get_function(arg) File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 147, in get_function (func, deterministic) = _container.get(func_name) TypeError: 'NoneType' object is not iterable arg='sight.cameraMode' 2018-07-18 16:04:04: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 156, in process_python_macro (func, deterministic) = get_function(arg) File "res_mods/mods/xfw_packages\xvm_main\python\python_macro.py", line 147, in get_function (func, deterministic) = _container.get(func_name) TypeError: 'NoneType' object is not iterable arg='sight.cameraMode' 2018-07-18 16:04:04: [INFO] HTTPS: /3.0/getComments/e4689f1a-****-****-****-********81d7 2018-07-18 16:04:09: [VM] initialized 2018-07-18 16:04:09: [VM] registered battleLabels.xc /** * List of battle interface labels. */ { "labels": { // Referenced labels: // * every custom field can be separate enabled or disabled by "enabled" switch in their settings. // * extended format supported, see extra-field.txt "formats": [ ${ "battleLabelsTemplates.xc":"def.hitlogHeader" }, ${ "battleLabelsTemplates.xc":"def.hitlogBody" }, ${ "battleLabelsTemplates.xc":"def.totalHP" }, ${ "battleLabelsTemplates.xc":"def.avgDamage" }, ${ "battleLabelsTemplates.xc":"def.mainGun" }, ${ "battleLabelsTemplates.xc":"def.damageLogBackground"}, ${ "battleLabelsTemplates.xc":"def.damageLog" }, ${ "battleLabelsTemplates.xc":"def.lastHit" }, ${ "battleLabelsTemplates.xc":"def.fire" }, ${ "battleLabelsTemplates.xc":"def.totalEfficiency" }, ${ "battleLabelsTemplates.xc":"def.repairTimeEngine" }, ${ "battleLabelsTemplates.xc":"def.repairTimeGun" }, ${ "battleLabelsTemplates.xc":"def.repairTimeTurret" }, ${ "battleLabelsTemplates.xc":"def.repairTimeTracks" }, ${ "battleLabelsTemplates.xc":"def.repairTimeSurveying" }, ${ "battleLabelsTemplates.xc":"def.repairTimeRadio" }, ${ "battleLabelSight.xc":"def.cameraMode"}, ${ "battleLabelSight.xc":"def.cameraMode_sn"}, ${ "battleLabelSight.xc":"def.piercingChance"}, ${ "battleLabelsTemplates.xc":"def.TEAM_ENEMY_HP_ground" }, ${ "battleLabelsTemplates.xc":"def.TEAM_HP_ground" }, ${ "battleLabelsTemplates.xc":"def.ENEMY_HP_ground" }, ${ "battleLabelsTemplates.xc":"def.TEAM_HP_bar" }, ${ "battleLabelsTemplates.xc":"def.ENEMY_HP_bar" }, ${ "battleLabelsTemplates.xc":"def.TEAM_HP_border" }, ${ "battleLabelsTemplates.xc":"def.ENEMY_HP_border" }, ${ "battleLabelsTemplates.xc":"def.TEAM_HP" }, ${ "battleLabelsTemplates.xc":"def.ENEMY_HP" }, ${ "battleLabelsTemplates.xc":"def.TEAM_ENEMY_HP_diff" } ] } } battleLabelSight.xc { "def": { "cameraMode": { "enabled": true, "updateEvent": "PY(ON_CAMERA_MODE)", "x": 0, //"y": "{{py:math.sum({{py:sight.sight_y}}, 12)}}", "y": 0, "width": 536, "height": 283, "screenHAlign": "center", "screenVAlign": "center", "alpha" : "{{py:sight.cameraMode=arc?100|0}}", "format": "" }, "cameraMode_sn": { "enabled": true, "updateEvent": "PY(ON_CAMERA_MODE)", "x": 0, //"y": "{{py:math.sum({{py:sight.sight_y}}, 2)}}", "y": 0, "width": 502, "height": 124, "screenHAlign": "center", "screenVAlign": "center", "alpha" : "{{py:sight.cameraMode=sn?100|0}}", "format": "" }, "piercingChance": { "enabled": true, "flags": [ "alive" ], "updateEvent": "PY(ON_CALC_ARMOR), PY(ON_CAMERA_MODE)", "x": 0, "y": "{{py:sight.cameraMode=arc?-49|{{py:sight.cameraMode=sn?39|44}}}}", "width": 100, "height": 26, // "borderColor": "0xFF0000", //!!! "screenHAlign": "center", "screenVAlign": "center", "alpha" : 100, "shadow": { "distance": 1, "angle": 90, "alpha": 90, "blur": 5, "strength": 3 }, "textFormat": { "align": "center", "valign": "center" }, "format": "<font color='{{py:sight.c_piercingChance}}' size='18'>{{py:sight.piercingActual}} {{py:sight.piercingActual?/|}} {{py:sight.armorActual}}</font>" } } } sight.xc { "sight": { // false "enabled": true, // {{py:....Target}} "delayHideTarget": 3, // "sphereDispersion": { // true "enabled": false, // ["LT", "MT", "HT", "TD", "SPG"] "vtype": ["SPG"], // "hotkey": { // true "enabled": false, // hotkeys.xc. "keyCode": 29, // onHold: false "onHold": true } }, // true "removeIndicator": false, // true "removeCentralMarker": false, // true "removeLoad": false, // true "removeCondition": false, // true "removeContainers": false, // true "removeLoadingTimer": false, // true "removeZoomIndicator": false, // true "removeDistance": false, // true "removeQuantityShells": false, // {{py:sight.shellType}}). "shellType": { "armor_piercing": "{{l10n:armor_piercing}}", // armor piercing "high_explosive": "{{l10n:high_explosive}}", // high explosive "armor_piercing_cr": "{{l10n:armor_piercing_cr}}", // armor piercing composite rigid "armor_piercing_he": "{{l10n:armor_piercing_he}}", // armor piercing high explosive "hollow_charge": "{{l10n:hollow_charge}}", // high explosive anti-tank "not_shell": "Netu" }, // ({{py:sight.c_piercingChance}}) "c_piercingChance": { "not_pierced": "#E82929", "little_pierced": "#E1C300", "great_pierced": "#2ED12F" }, // "autoAim": { "enabled": false, // : "arrow", "cylinder" // "arrow" // "cylinder" "markerType": "cylinder" } } } sight.py import traceback import BigWorld import Math import math import ProjectileMover import BattleReplay from projectile_trajectory import computeProjectileTrajectory from constants import SERVER_TICK_LENGTH, SHELL_TRAJECTORY_EPSILON_CLIENT # , ARENA_GUI_TYPE from Vehicle import Vehicle from Avatar import PlayerAvatar from gui.Scaleform.daapi.view.meta.CrosshairPanelContainerMeta import CrosshairPanelContainerMeta from VehicleGunRotator import VehicleGunRotator from ClientArena import CollisionResult from gui.battle_control.controllers.consumables.ammo_ctrl import AmmoReplayPlayer import gui.Scaleform.daapi.view.battle.shared.crosshair.plugins as plug from gui.Scaleform.daapi.view.battle.shared.crosshair.plugins import AmmoPlugin from gui.Scaleform.daapi.view.battle.classic.stats_exchange import FragsCollectableStats from xfw import * from xvm_main.python.logger import * import xvm_main.python.config as config from xvm import utils VEHICLE_CLASSES = {'mediumTank': 'MT', 'lightTank': 'LT', 'heavyTank': 'HT', 'AT-SPG': 'TD', 'SPG': 'SPG'} COLOR_PIERCING_CHANCE = {'not_pierced': '#E82929', 'little_pierced': '#E1C300', 'great_pierced': '#2ED12F'} currentDistance = None vehicle = None player = None timeFlight = None timeAIM = None sphere = None _explosionRadius = None isDisplaySphere = False isDownHotkey = True shellType = None cameraHeight = None isAlive = False isNotEvent = False def explosionRadius(): global _explosionRadius if vehicle is None or not hasattr(vehicle, 'typeDescriptor'): return _type = vehicle.typeDescriptor.shot.shell.type _explosionRadius = _type.explosionRadius if hasattr(_type, 'explosionRadius') else None @registerEvent(AmmoPlugin, '_AmmoPlugin__onGunAutoReloadTimeSet') def _AmmoPlugin__onGunAutoReloadTimeSet(self, state, stunned): if config.get('sight/enabled', True) and isNotEvent: explosionRadius() @registerEvent(AmmoReplayPlayer, 'setGunReloadTime') def AmmoReplayPlayer_setGunReloadTime(self, timeLeft, baseTime): if config.get('sight/enabled', True) and isNotEvent: explosionRadius() @registerEvent(CrosshairPanelContainerMeta, 'as_setReloadingS') def CrosshairPanelContainerMeta_as_setReloadingS(self, duration, baseTime, startTime, isReloading): if config.get('sight/enabled', True) and isNotEvent: explosionRadius() @registerEvent(FragsCollectableStats, 'addVehicleStatusUpdate') def FragsCollectableStats_addVehicleStatusUpdate(self, vInfoVO): if config.get('sight/enabled', True) and isNotEvent: if (not vInfoVO.isAlive()) and (vehicle is not None) and (vehicle.id == vInfoVO.vehicleID): setValueDead() @registerEvent(PlayerAvatar, 'handleKey') def handleKey(self, isDown, key, mods): if config.get('sight/enabled', True) and isNotEvent: global isDownHotkey hotkey = config.get('sight/sphereDispersion/hotkey', None) if hotkey is not None and hotkey['enabled'] and (key == hotkey['keyCode']): if isDown: if hotkey['onHold']: if not isDownHotkey: isDownHotkey = True else: isDownHotkey = not isDownHotkey else: if hotkey['onHold']: if isDownHotkey: isDownHotkey = False @overrideMethod(CrosshairPanelContainerMeta, 'as_setDistanceS') def CrosshairPanelContainerMeta_as_setDistanceS(base, self, dist): if not (config.get('sight/enabled', True) and config.get('sight/removeDistance', False)): return base(self, dist) @overrideMethod(CrosshairPanelContainerMeta, 'as_setNetVisibleS') def CrosshairPanelContainerMeta_as_setNetVisibleS(base, self, mask): if config.get('sight/enabled', True): if config.get('sight/removeIndicator', False): mask &= 2 if config.get('sight/removeQuantityShells', False): mask &= 1 base(self, mask) @overrideMethod(plug, '_makeSettingsVO') def plugins_makeSettingsVO(base, settingsCore, *keys): data = base(settingsCore, *keys) if config.get('sight/enabled', True) and isNotEvent: for mode in data: if config.get('sight/removeCentralMarker', False) and ('centerAlphaValue' in data[mode]): data[mode]['centerAlphaValue'] = 0 if config.get('sight/removeIndicator', False) and config.get('sight/removeQuantityShells', False) and ('netAlphaValue' in data[mode]): data[mode]['netAlphaValue'] = 0 if config.get('sight/removeLoad', False) and ('reloaderAlphaValue' in data[mode]): data[mode]['reloaderAlphaValue'] = 0 if config.get('sight/removeCondition', False) and ('conditionAlphaValue' in data[mode]): data[mode]['conditionAlphaValue'] = 0 if config.get('sight/removeContainers', False) and ('cassetteAlphaValue' in data[mode]): data[mode]['cassetteAlphaValue'] = 0 if config.get('sight/removeLoadingTimer', False) and ('reloaderTimerAlphaValue' in data[mode]): data[mode]['reloaderTimerAlphaValue'] = 0 if config.get('sight/removeZoomIndicator', False) and ('zoomIndicatorAlphaValue' in data[mode]): data[mode]['zoomIndicatorAlphaValue'] = 0 return data @registerEvent(PlayerAvatar, 'onBecomePlayer') def PlayerAvatar_onBecomePlayer(self): global player player = BigWorld.player() @registerEvent(Vehicle, 'onEnterWorld') def Vehicle_onEnterWorld(self, prereqs): if self.isPlayerVehicle and config.get('sight/enabled', True): global isNotEvent, vehicle, currentDistance, timeFlight, timeAIM, cameraHeight global _explosionRadius, isDisplaySphere, isDownHotkey, player, isAlive _explosionRadius = None currentDistance = None timeFlight = None timeAIM = None cameraHeight = None player = BigWorld.player() # isNotEvent = player.arenaGuiType not in [ARENA_GUI_TYPE.EVENT_BATTLES, ARENA_GUI_TYPE.EVENT_BATTLES_2] isNotEvent = True if isNotEvent: isAlive = self.isAlive and self.isCrewActive vehicle = self td = self.typeDescriptor _type = td.type vehClass = VEHICLE_CLASSES[list(_type.tags.intersection(VEHICLE_CLASSES.keys()))[0]] isDisplaySphere = config.get('sight/sphereDispersion/enabled', False) and (vehClass in config.get('sight/sphereDispersion/vtype', ['SPG'])) isDownHotkey = not config.get('sight/sphereDispersion/hotkey/enabled', False) def setValueDead(): global currentDistance, timeFlight, timeAIM global _explosionRadius, isDisplaySphere, isDownHotkey global cameraHeight, isAlive _explosionRadius = None currentDistance = None timeFlight = None timeAIM = None isDisplaySphere = False isDownHotkey = False cameraHeight = None isAlive = False as_event('ON_MARKER_POSITION') @registerEvent(Vehicle, 'onHealthChanged') def onHealthChanged(self, newHealth, attackerID, attackReasonID): if self.isPlayerVehicle and config.get('sight/enabled', True) and isNotEvent: isAlive = (newHealth > 0) and bool(vehicle.isCrewActive) if (not isAlive) and (sphere in BigWorld.models()): BigWorld.delModel(sphere) def update_sphere(position): global sphere if sphere is None: sphere = BigWorld.Model('objects/misc/bbox/sphere1.model') # log('sphere = %s' % (filter(lambda x: not x.startswith('__'), dir(sphere)))) # sphere = BigWorld.Model('content/Interface/Arrow/normal/lod0/arrow.model') elif sphere in BigWorld.models(): BigWorld.delModel(sphere) if (_explosionRadius is not None) and isAlive and isDownHotkey: sphere.position = position sphere.scale = Math.Vector3(_explosionRadius, _explosionRadius, _explosionRadius) BigWorld.addModel(sphere) @overrideMethod(VehicleGunRotator, '_VehicleGunRotator__getGunMarkerPosition') def _VehicleGunRotator__getGunMarkerPosition(base, self, shotPos, shotVec, dispersionAngles): if not (config.get('sight/enabled', True) and isNotEvent): return base(self, shotPos, shotVec, dispersionAngles) try: global timeFlight, currentDistance, timeAIM, cameraHeight shotDescr = self._VehicleGunRotator__avatar.getVehicleDescriptor().shot gravity = Math.Vector3(0.0, -shotDescr.gravity, 0.0) maxDist = shotDescr.maxDistance testVehicleID = self.getAttachedVehicleID() collideVehiclesAndStaticScene = ProjectileMover.collideDynamicAndStatic collideWithSpaceBB = self._VehicleGunRotator__avatar.arena.collideWithSpaceBB prevPos = shotPos endPos = shotPos direction = endPos - prevPos prevVelocity = shotVec dt = 0.0 maxDistCheckFlag = False while True: dt += SERVER_TICK_LENGTH checkPoints = computeProjectileTrajectory(prevPos, prevVelocity, gravity, SERVER_TICK_LENGTH, SHELL_TRAJECTORY_EPSILON_CLIENT) prevCheckPoint = prevPos bBreak = False for curCheckPoint in checkPoints: testRes = collideVehiclesAndStaticScene(prevCheckPoint, curCheckPoint, (testVehicleID,)) if testRes is not None: collData = testRes[1] if collData is not None and not collData.isVehicle(): collData = None direction = testRes[0] - prevCheckPoint endPos = testRes[0] timeFlight = dt if (curCheckPoint - prevCheckPoint).length < direction.length * 2 else dt - SERVER_TICK_LENGTH bBreak = True break collisionResult, intersection = collideWithSpaceBB(prevCheckPoint, curCheckPoint) if collisionResult is CollisionResult.INTERSECTION: collData = None maxDistCheckFlag = True direction = intersection - prevCheckPoint timeFlight = dt if (curCheckPoint - prevCheckPoint).length < direction.length * 2 else dt - SERVER_TICK_LENGTH endPos = intersection bBreak = True break elif collisionResult is CollisionResult.OUTSIDE: collData = None maxDistCheckFlag = True direction = prevVelocity endPos = prevPos + prevVelocity bBreak = True prevCheckPoint = curCheckPoint if bBreak: break prevPos = shotPos + shotVec.scale(dt) + gravity.scale(dt * dt * 0.5) prevVelocity = shotVec + gravity.scale(dt) direction.normalise() cameraHeight = BigWorld.camera().position.y - endPos.y distance = (endPos - shotPos).length markerDiameter = 2.0 * distance * dispersionAngles[0] idealMarkerDiameter = 2.0 * distance * dispersionAngles[1] if maxDistCheckFlag: if endPos.distTo(shotPos) >= maxDist: direction = endPos - shotPos direction.normalise() endPos = shotPos + direction.scale(maxDist) distance = maxDist markerDiameter = 2.0 * distance * dispersionAngles[0] idealMarkerDiameter = 2.0 * distance * dispersionAngles[1] replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isClientReady: markerDiameter, endPos, direction = replayCtrl.getGunMarkerParams(endPos, direction) currentDistance = distance aimingInfo = player._PlayerAvatar__aimingInfo aimingStartTime = aimingInfo[0] aimingFactor = aimingInfo[1] shotDispMultiplierFactor = aimingInfo[2] # unShotDispersionFactorsTurretRotation = aimingInfo[3] # chassisShotDispersionFactorsMovement = aimingInfo[4] # chassisShotDispersionFactorsRotation = aimingInfo[5] # chassisShotDispersionFactorsRotation = aimingInfo[5] aimingTime = aimingInfo[6] aimingTimeAll = math.log(aimingFactor / shotDispMultiplierFactor) * aimingTime aimingFinishTime = aimingTimeAll + aimingStartTime timeAIM = max(0.0, aimingFinishTime - BigWorld.time()) as_event('ON_MARKER_POSITION') if isDisplaySphere: update_sphere(endPos) return endPos, direction, markerDiameter, idealMarkerDiameter, collData except Exception as ex: err(traceback.format_exc()) return base(self, shotPos, shotVec, dispersionAngles) @xvm.export('sight.distance', deterministic=False) def sight_distance(): return currentDistance @xvm.export('sight.timeFlight', deterministic=False) def sight_timeFlight(): return timeFlight @xvm.export('sight.timeAIM', deterministic=False) def sight_timeAIM(): return timeAIM @xvm.export('sight.cameraHeight', deterministic=False) def sight_cameraHeight(): return cameraHeight @xvm.export('sight.dynamic_colorRGB') def smooth_transition_colorRGB(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('RGB', color_100, color_0, percent, maximum) @xvm.export('sight.dynamic_colorRBG') def smooth_transition_colorRBG(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('RBG', color_100, color_0, percent, maximum) @xvm.export('sight.dynamic_colorGRB') def smooth_transition_colorGRB(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('GRB', color_100, color_0, percent, maximum) @xvm.export('sight.dynamic_colorGBR') def smooth_transition_colorGBR(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('GBR', color_100, color_0, percent, maximum) @xvm.export('sight.dynamic_colorBRG') def smooth_transition_colorBRG(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('BRG', color_100, color_0, percent, maximum) @xvm.export('sight.dynamic_colorBGR') def smooth_transition_colorBGR(color_100, color_0, percent=None, maximum=100): if percent is None: return None else: return utils.smooth_transition_color('BGR', color_100, color_0, percent, maximum) chancePenetration.py import BigWorld import math from Vehicle import Vehicle from gui.Scaleform.daapi.view.battle.classic.stats_exchange import FragsCollectableStats from AvatarInputHandler.gun_marker_ctrl import _CrosshairShotResults, _SHOT_RESULT import gui.Scaleform.daapi.view.battle.shared.crosshair.plugins as plug from xfw import * from xvm_main.python.logger import * import xvm_main.python.config as config COLOR_PIERCING_CHANCE = {'not_pierced': '#E82929', 'little_pierced': '#E1C300', 'great_pierced': '#2ED12F'} piercingActual = None armorActual = None piercingChance = None shotResult = None hitAngle = None normHitAngle = None colorPiercingChance = COLOR_PIERCING_CHANCE playerVehicleID = None @registerEvent(plug.ShotResultIndicatorPlugin, '_ShotResultIndicatorPlugin__onGunMarkerStateChanged') def onGunMarkerStateChanged(self, markerType, position, dir, collision): if config.get('sight/enabled', True): if not self._ShotResultIndicatorPlugin__isEnabled: self._ShotResultIndicatorPlugin__shotResultResolver.getShotResult(position, collision, dir, excludeTeam=self._ShotResultIndicatorPlugin__playerTeam) @overrideClassMethod(_CrosshairShotResults, 'getShotResult') def _CrosshairShotResults_getShotResult(base, cls, hitPoint, collision, dir, excludeTeam=0): if config.get('sight/enabled', True): def updateLabel(): if (old_armorActual != armorActual) or (old_piercingActual != piercingActual): as_event('ON_CALC_ARMOR') global piercingActual, armorActual, shotResult, hitAngle, normHitAngle, piercingChance keyColor = [None, 'not_pierced', 'little_pierced', 'great_pierced'] old_piercingActual = piercingActual old_armorActual = armorActual piercingActual = None armorActual = None piercingChance = None hitAngle = None normHitAngle = None shotResult = keyColor[0] if collision is None: updateLabel() return _SHOT_RESULT.UNDEFINED else: entity = collision.entity if entity.__class__.__name__ not in ('Vehicle', 'DestructibleEntity'): updateLabel() return _SHOT_RESULT.UNDEFINED if entity.health <= 0 or entity.publicInfo['team'] == excludeTeam: updateLabel() return _SHOT_RESULT.UNDEFINED player = BigWorld.player() if player is None: updateLabel() return _SHOT_RESULT.UNDEFINED vDesc = player.getVehicleDescriptor() shell = vDesc.shot.shell caliber = shell.caliber shellKind = shell.kind ppDesc = vDesc.shot.piercingPower maxDist = vDesc.shot.maxDistance dist = (hitPoint - player.getOwnVehiclePosition()).length piercingPower = cls._computePiercingPowerAtDist(ppDesc, dist, maxDist) fullPiercingPower = piercingPower minPP, maxPP = cls._computePiercingPowerRandomization(shell) result = _SHOT_RESULT.NOT_PIERCED isJet = False jetStartDist = None ignoredMaterials = set() collisionsDetails = cls._getAllCollisionDetails(hitPoint, dir, entity) if collisionsDetails is None: updateLabel() return _SHOT_RESULT.UNDEFINED for cDetails in collisionsDetails: if isJet: jetDist = cDetails.dist - jetStartDist if jetDist > 0.0: piercingPower *= 1.0 - jetDist * cls._SHELL_EXTRA_DATA[shellKind].jetLossPPByDist if cDetails.matInfo is None: result = cls._CRIT_ONLY_SHOT_RESULT else: matInfo = cDetails.matInfo if (cDetails.compName, matInfo.kind) in ignoredMaterials: continue hitAngleCos = cDetails.hitAngleCos if matInfo.useHitAngle else 1.0 hitAngle = hitAngleCos normHitAngle = hitAngle if not isJet and cls._shouldRicochet(shellKind, hitAngleCos, matInfo, caliber): normHitAngle = -1.0 break piercingPercent = 1000.0 if piercingPower > 0.0: penetrationArmor = cls._computePenetrationArmor(shellKind, hitAngleCos, matInfo, caliber) normHitAngle = matInfo.armor / penetrationArmor if penetrationArmor != 0.0 else hitAngle piercingPercent = 100.0 + (penetrationArmor - piercingPower) / fullPiercingPower * 100.0 piercingActual = int(piercingPower) armorActual = int(penetrationArmor) piercingChance = min(1.0, (penetrationArmor / penetrationArmor - 0.75) * 2) if penetrationArmor > 0.0 else 1.0 piercingPower -= penetrationArmor # log('penetrationArmor = %s piercingPercent = %s piercingPower = %s' % (penetrationArmor, piercingPercent, piercingPower)) if matInfo.vehicleDamageFactor: if minPP < piercingPercent < maxPP: result = _SHOT_RESULT.LITTLE_PIERCED elif piercingPercent <= minPP: result = _SHOT_RESULT.GREAT_PIERCED break elif matInfo.extra: if piercingPercent <= maxPP: result = cls._CRIT_ONLY_SHOT_RESULT if matInfo.collideOnceOnly: ignoredMaterials.add((cDetails.compName, matInfo.kind)) if piercingPower <= 0.0: break if cls._SHELL_EXTRA_DATA[shellKind].jetLossPPByDist > 0.0: isJet = True mInfo = cDetails.matInfo armor = mInfo.armor if mInfo is not None else 0.0 jetStartDist = cDetails.dist + armor * 0.001 shotResult = keyColor[result] updateLabel() return result else: return base(hitPoint, collision, dir, excludeTeam) @registerEvent(Vehicle, 'onEnterWorld') def Vehicle_onEnterWorld(self, prereqs): global piercingActual, armorActual, shotResult, hitAngle, normHitAngle, colorPiercingChance, playerVehicleID, piercingChance if self.isPlayerVehicle and config.get('sight/enabled', True): piercingActual = None armorActual = None piercingChance = None shotResult = None hitAngle = None normHitAngle = None colorPiercingChance = config.get('sight/c_piercingChance', COLOR_PIERCING_CHANCE) playerVehicleID = self.id as_event('ON_CALC_ARMOR') @registerEvent(FragsCollectableStats, 'addVehicleStatusUpdate') def FragsCollectableStats_addVehicleStatusUpdate(self, vInfoVO): global piercingActual, armorActual, shotResult, hitAngle, normHitAngle, colorPiercingChance, piercingChance if (not vInfoVO.isAlive()) and (playerVehicleID == vInfoVO.vehicleID): piercingActual = None armorActual = None piercingChance = None shotResult = None hitAngle = None normHitAngle = None as_event('ON_CALC_ARMOR') @xvm.export('sight.piercingActual', deterministic=False) def sight_piercingActual(): return piercingActual @xvm.export('sight.hitAngle', deterministic=False) def sight_hitAngle(): return math.degrees(math.acos(hitAngle)) if hitAngle is not None else None @xvm.export('sight.normHitAngle', deterministic=False) def sight_normHitAngel(): return normHitAngle if (normHitAngle is None) or (normHitAngle < 0) else math.degrees(math.acos(normHitAngle)) @xvm.export('sight.armorActual', deterministic=False) def sight_piercingActual(): return armorActual @xvm.export('sight.c_piercingChance', deterministic=False) def sight_c_piercingChance(): return colorPiercingChance.get(shotResult, None) @xvm.export('sight.piercingChance', deterministic=False) def sight_piercingChance(norm=None): global piercingChance if piercingChance is not None: piercingChance = (piercingChance * 100 if norm is None else piercingChance * norm) return piercingChance Edited July 18, 2018 by Heliomalt Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #436583 Posted July 18, 2018 @Heliomalt скачайте aimingSystem.py 3 Quote Share this post Link to post Short link Share on other sites
Heliomalt 53 #436584 Posted July 18, 2018 Amazing fast answer, problem solved. Thank you. 1 Quote Share this post Link to post Short link Share on other sites
Heliomalt 53 #436871 Posted July 22, 2018 Is it possible to show the distance only, if I aim on a target? Now with this config I see it all the time. Makes no sense for me, when I see the distance, when I am aiming on a house for example. Thanks in advance. "distance": { "enabled": true, "flags": [ "alive" ], "updateEvent": "PY(ON_TARGET), PY(ON_CAMERA_MODE), PY(ON_MARKER_POSITION)", "x": 0, "y": "{{py:sight.cameraMode=arc?-238|{{py:sight.cameraMode=sn?-238|-230}}}}", "width": 100, "height": 32, //"borderColor": "0xFF0000", //!!! "screenHAlign": "center", "screenVAlign": "center", "alpha" : 100, "shadow": { "distance": 1, "angle": 90, "alpha": 70, "blur": 5, "strength": 3 }, "textFormat": { "align": "center", "color": "0xd4ffaa" }, //"format": " <font color='#{{py:sight.vehicleTarget?FF0000|d4ffaa}}' size='22'>{{py:sight.distance%3.f m}}</font>" "format": " <font color='#{{py:sight.vehicleTarget?d4ffaa|FF0000}}' size='22'>{{py:sight.distance%4.f m}}</font>" }, Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #436872 Posted July 22, 2018 @Heliomalt используйте {{py:sight.distanceTarget}} 1 Quote Share this post Link to post Short link Share on other sites
Heliomalt 53 #436873 Posted July 22, 2018 (edited) nevermind, it works. It need a few seconds to disappear, but it works. Edited July 22, 2018 by Heliomalt Quote Share this post Link to post Short link Share on other sites
PigBrains 492 #436887 Posted July 22, 2018 I took the py_macro infoAutoAim.py I added this to markersAliveNormal.xc }, "auto_AIM_vehicle": { "enabled": true, "updateEvent": "PY(ON_CAMERA_MODE), PY(ON_AUTO_AIM), ON_CURRENT_VEHICLE_DESTROYED", "x": "{{py:sight.cameraMode=arc?0|{{py:sight.cameraMode=sn?0}}}}", "y": "{{py:sight.cameraMode=arc?-90|{{py:sight.cameraMode=sn?-90}}}}", "align": "center", "width": 41, "height": 41, "alpha" : "{{alive?{{py:sight.autoAimVehicle?100|0}}|0}}", "format": "<img src='cfg://HAWGS/img/battle/m_autoaim.png'>" }, added to both ally & enemy ${ "def.auto_AIM_vehicle" }, it refers to this png I have tested this over and over . It now will show png file when someone has auto aim lock onto them from another player But it will only when I activate auto aim myself on someone. How do I get it to show all the time , I have tried "updateEvent": " ON_EVERY_SECOND", It still only shows when my auto aims is actvated Any ideals ? Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #436890 Posted July 22, 2018 21 минуту назад, PigBrains сказал: Any ideals ? В маркерах не получиться. Quote Share this post Link to post Short link Share on other sites
HEKPOMAHT 2,165 #437600 Posted August 6, 2018 Build 8535 СТ 2018-08-06 17:29:11.475: INFO: ============================= 2018-08-06 17:29:11.475: INFO: 2018-08-06 17:29:11: [ERROR] mods/xfw/python/xfw/events.pyc 2018-08-06 17:29:11.475: ERROR: Traceback (most recent call last): 2018-08-06 17:29:11.475: ERROR: File "mods/xfw/python/xfw/events.py", line 57, in __event_handler 2018-08-06 17:29:11.475: ERROR: File "mods/xfw/python/xfw/events.py", line 24, in fire 2018-08-06 17:29:11.475: ERROR: File "res_mods/configs/xvm/py_macro\reloading.py", line 112, in CrosshairPanelContainerMeta_as_setReloadingS 2018-08-06 17:29:11.476: ERROR: reloading(duration, baseTime, startTime) 2018-08-06 17:29:11.476: ERROR: File "res_mods/configs/xvm/py_macro\reloading.py", line 55, in reloading 2018-08-06 17:29:11.476: ERROR: as_event('ON_RELOAD') 2018-08-06 17:29:11.476: ERROR: NameError: global name 'as_event' is not defined 2018-08-06 17:29:11.476: INFO: ============================= 2018-08-06 17:29:11.473: INFO: ============================= 2018-08-06 17:29:11.473: INFO: 2018-08-06 17:29:11: [ERROR] mods/xfw/python/xfw/events.pyc 2018-08-06 17:29:11.473: ERROR: Traceback (most recent call last): 2018-08-06 17:29:11.473: ERROR: File "mods/xfw/python/xfw/events.py", line 57, in __event_handler 2018-08-06 17:29:11.474: ERROR: File "mods/xfw/python/xfw/events.py", line 24, in fire 2018-08-06 17:29:11.474: ERROR: File "res_mods/configs/xvm/py_macro\quantityShells.py", line 23, in CrosshairPanelContainerMeta_as_setAmmoStockS 2018-08-06 17:29:11.474: ERROR: as_event('ON_AMMO_COUNT') 2018-08-06 17:29:11.474: ERROR: NameError: global name 'as_event' is not defined 2018-08-06 17:29:11.474: INFO: ============================= 2018-08-06 17:28:49.573: INFO: ============================= 2018-08-06 17:28:49.573: INFO: 2018-08-06 17:28:49: [ERROR] mods/xfw/python/xfw/events.pyc 2018-08-06 17:28:49.573: ERROR: Traceback (most recent call last): 2018-08-06 17:28:49.573: ERROR: File "mods/xfw/python/xfw/events.py", line 57, in __event_handler 2018-08-06 17:28:49.574: ERROR: File "mods/xfw/python/xfw/events.py", line 24, in fire 2018-08-06 17:28:49.574: ERROR: File "res_mods/configs/xvm/py_macro\aimingSystem.py", line 63, in InterfaceScaleSetting_setSystemValue 2018-08-06 17:28:49.574: ERROR: as_event('ON_CAMERA_MODE') 2018-08-06 17:28:49.574: ERROR: NameError: global name 'as_event' is not defined 2018-08-06 17:28:49.574: INFO: ============================= Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #437632 Posted August 6, 2018 Скрипты для WoT 1.1 CT: sight.py infoAutoAim.py targetInfo.py infoChargedShell.py aimingSystem.py quantityShells.py reloading.py chancePenetration.py 4 Quote Share this post Link to post Short link Share on other sites
rzaruba 14 #438494 Posted August 21, 2018 (edited) В 24.01.2017 в 18:50, ktulho сказал: Спасибо!!! Вот это тема так тема! Подскажите пожалста кто-нить как сделать изменяемость цвета отображение от типа снаряда ( во я завернул!) . Edited August 21, 2018 by rzaruba Quote Share this post Link to post Short link Share on other sites
Pensioner 55 #438495 Posted August 21, 2018 5 минут назад, rzaruba сказал: Спасибо!!! Вот это тема так тема! Подскажите пожалста кто-нить как сделать изменяемость цвета отображение от типа снаряда ( во я завернул!) Можно только цвет "голд" отражать. {{py:sight.goldShell}} - возвращает 'gold' если снаряд можно купить за золото, иначе - пусто Quote Share this post Link to post Short link Share on other sites