diff --git a/AUTHORS.txt b/AUTHORS.txt index 29861f1e50a..18b3e30abc1 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -60,6 +60,7 @@ Clon1998 Codingboy Coren Crusty +C0kkie Dharma Bellamkonda Dimaslg diwako diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 09d992a7694..6d57aed2546 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -91,6 +91,7 @@ 启用枪口初速变化 Activer les variations de la vitesse initiale Aktywuj wariację prędkości wylotowej + Вкл. вариацию начальной скорости Simulates slight variations in muzzle velocity between each shot @@ -102,6 +103,7 @@ 模拟每发子弹的枪口初速都略有不同 Simule les légères variations Symuluje lekkie zmiany w prędkości wylotowej między każdym strzałem + Имитирует небольшие изменения начальной скорости при каждом выстреле Enable Ammo Temperature Simulation diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf index 1cb60db9173..12f007ccf66 100644 --- a/addons/advanced_fatigue/XEH_preInit.sqf +++ b/addons/advanced_fatigue/XEH_preInit.sqf @@ -10,5 +10,6 @@ PREP_RECOMPILE_END; GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40); GVAR(dutyList) = [[], []]; +GVAR(setAnimExclusions) = []; ADDON = true; diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index 1283d865558..fbbb6852171 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -58,8 +58,9 @@ if (GVAR(ppeBlackoutLast) == 1) then { // - Physical effects --------------------------------------------------------- if (GVAR(isSwimming)) exitWith { - _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; - + if (GVAR(setAnimExclusions) isEqualTo []) then { + _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; + }; if ((isSprintAllowed _unit) && {_fatigue > 0.7}) then { [_unit, "blockSprint", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); } else { @@ -69,7 +70,10 @@ if (GVAR(isSwimming)) exitWith { }; }; if ((getAnimSpeedCoef _unit) != 1) then { - _unit setAnimSpeedCoef 1; + if (GVAR(setAnimExclusions) isEqualTo []) then { + TRACE_1("reset",getAnimSpeedCoef _unit); + _unit setAnimSpeedCoef 1; + }; }; if (_overexhausted) then { diff --git a/addons/advanced_fatigue/stringtable.xml b/addons/advanced_fatigue/stringtable.xml index 8fb6bc7e5ec..b3a24a4396e 100644 --- a/addons/advanced_fatigue/stringtable.xml +++ b/addons/advanced_fatigue/stringtable.xml @@ -11,6 +11,7 @@ ACE 고급 피로도 ACE Fatigue Avancée ACE Zaawansowane Zmęczenie + ACE Продвинутая усталость Performance Factor @@ -22,6 +23,7 @@ Fattore Prestazione 體力值 体力值 + Фактор производительности Influences the overall performance of all players with no custom factor. Higher means better. @@ -33,6 +35,7 @@ Influenza qualsiasi prestazione di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore. 影響所有玩家的體力表現,值越高代表體力越好 影响所有玩家的体力表现,值越高代表体力越好 + Влияет на общую производительность игроков, у которых не задано персональное значение. Influences the overall performance of this unit. Higher means better. @@ -44,6 +47,7 @@ Influenza qualsiasi prestazione di questa unità. Maggiore significa migliore. 影響這個單位的體力表現,值越高代表體力越好 影响这个单位的体力表现,值越高代表体力越好 + Влияет на общую производительность юнита. Recovery Factor @@ -55,6 +59,7 @@ Fattore Recupero 回復值 回复值 + Фактор восстановления Changes how fast the player recovers when resting. Higher is faster. @@ -66,6 +71,7 @@ Determina in quanto tempo il giocatore recupera quando rilassato. Maggiore significa migliore. 決定玩家休息多久就能回復體力,值越高恢復越快 决定玩家休息多久就能回复体力,值越高恢复越快 + Изменяет скорость восстановления игрока во время отдыха. Чем выше, тем быстрее. Load Factor @@ -77,6 +83,7 @@ Fattore Caricamento 負重量 负重量 + Фактор нагрузки Increases or decreases how much weight influences the players performance. Zero means equipment weight has no performance influence. @@ -88,6 +95,7 @@ Incrementa o decrementa quanto il peso influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non ha alcuna influenza nelle prestazioni. 增加或降低玩家所能承受的負重量. 如設定值為0, 代表裝備的重量將不會影響到玩家的體力表現 增加或降低玩家所能承受的负重量. 如设定值为0, 代表装备的重量将不会影响到玩家的体力表现 + Увеличивает или уменьшает вес, влияющий на производительность игроков. Ноль означает, что вес снаряжения не влияет на производительность Terrain Gradient Factor @@ -99,6 +107,7 @@ Fattore Pendenza Terreno 地形陡峭影響值 地形陡峭影响值 + Фактор местности Sets how much steep terrain increases stamina loss. Higher means higher stamina loss. @@ -110,24 +119,29 @@ Stabilisce quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa. 設定陡峭的地形將會影響多少體力的流失,值越高代表體力流失越快 设定陡峭的地形将会影响多少体力的流,失值越高代表体力流失越快 + Устанавливает, насколько крутая местность увеличивает потерю выносливости. Чем выше, тем быстрее теряется выносливость. Sway factor + Verwacklungsfaktor 手ぶれ因数 抖动因数 抖動因素 Facteur de stabilisation Fattore di oscillazione Czynnik kołysania + Фактор колебания прицела Influences the amount of weapon sway. Higher means more sway. + Beeinflusst den Faktor, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung 武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。 影响手持武器的晃动程度,数值越高,抖动的越厉害. 影響手持武器晃動程度,數值越高抖動越厲害 Influence les mouvements de l'arme, une valeur plus élevée signifie plus de mouvements Influenza l'ammontare di oscillazione dell'arma. Maggiore significa più oscillazione. Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie. + Влияет на колебания прицела оружия. Чем выше - тем больше. Enabled @@ -139,6 +153,7 @@ Abilitato 啟用 启用 + Включена Enables/disables Advanced Fatigue. @@ -150,6 +165,7 @@ Abilita/disabilita la Fatica Avanzata. 啟用/關閉進階體力. 启用/关闭进阶体力. + Включает / Отключает Продвинутую усталость Show stamina bar @@ -161,6 +177,7 @@ Mostra barra stamina 顯示體力條 显示体力条 + Показать шкалу усталости Shows the stamina bar. @@ -172,6 +189,7 @@ Mostra la barra della stamina. 顯示體力條 显示体力条 + Показывает шкалу усталости. diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml index 59dca33cb46..ff6f1232618 100644 --- a/addons/ai/stringtable.xml +++ b/addons/ai/stringtable.xml @@ -3,6 +3,7 @@ Invalid position provided. + Ungültige Position Position invalide fourni 位置が無効です。 Posizione invalida fornita. @@ -10,9 +11,11 @@ 提供的位置无效。 위치가 잘못되었습니다. Podano błędną pozycję. + Указана неверная позиция No units provided. + Keine Einheit ausgewählt Aucune unité fourni ユニットがありません。 Nessuna unità fornita. @@ -20,9 +23,11 @@ 找不到可用的单位。 병력이 없습니다. Nie podano żadnych jednostek. + Не указаны юниты There aren't enough positions to place all units. + Es gibt nicht genug Positionen, um alle Einheiten zu platzieren Il n'y a pas assez de positions pour placer toutes les unités 全ユニットを置くために十分な位置がありません。 Non ci sono abbastanza posizioni per piazzare tutte le unità. @@ -30,9 +35,11 @@ 没有足够的位置能摆放所有单位。 모든 병력을 배치 할 공간이 없습니다. Nie ma wystarczającej ilości pozycji, aby umieścić wszystkie jednostki. + Недостаточно позиций для размещения всех юнитов No building found. + Kein Gebäude gefunden Aucun bâtiment trouvé 建物がありません。 Nessun edificio trovato. @@ -40,6 +47,7 @@ 没找到建筑物。 건물이 없습니다. Nie znaleziono budynku. + Здание не найдено diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 3593e14af9e..d42e27d5198 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -11,6 +11,7 @@ 숨김 隱藏 隐藏 + Спрятать Hide interface @@ -22,6 +23,7 @@ 인터페이스 숨기기 隱藏介面 隐藏介面 + Скрыть интерфейс Loadouts @@ -33,6 +35,7 @@ 로드아웃 裝備 装备 + Комплекты Export @@ -44,6 +47,7 @@ 내보내기 匯出 汇出 + Экспорт Import @@ -55,6 +59,7 @@ 가져오기 匯入 汇入 + Импорт Close @@ -66,6 +71,7 @@ 닫기 關閉 关闭 + Закрыть No virtual item available @@ -77,6 +83,7 @@ 가상장비 사용 불가 沒有可用的虛擬物品 没有可用的虚拟物品 + Виртуальный предмет недоступен Save @@ -88,6 +95,7 @@ 저장 保存 保存 + Сохранить Save the current loadout @@ -99,11 +107,13 @@ 현재 로드아웃 저장 保存當前的裝備 保存当前的装备 + Сохранить текущий комплект экипировки [Shift+Click to save to mission defaults] [Shift + クリック] でミッション標準として保存します Shift + Klik aby zapisac jako domyślne dla misji + [Shift+Клик, чтобы сохранить в настройках по умолчанию] Rename @@ -115,6 +125,7 @@ 이름바꾸기 重新命名 重新命名 + Переименовать Rename the selected loadout @@ -126,6 +137,7 @@ 선택한 로드아웃의 이름 바꾸기 重新命名當前選擇的裝備 重新命名当前选择的装备 + Переименовать выбранный комплект экипировки Load @@ -137,6 +149,7 @@ 불러오기 載入 载入 + Загрузить Load the selected loadout @@ -148,6 +161,7 @@ 선택한 로드아웃 불러오기 載入當前選擇的裝備 载入当前选择的装备 + Загрузить выбранный комплект экипировки Delete @@ -159,6 +173,7 @@ 삭제 刪除 删除 + Удалить Delete the selected loadout @@ -170,6 +185,7 @@ 선택한 로드아웃 삭제하기 刪除當前選擇的裝備 删除当前选择的装备 + Удалить выбранный комплект экипировки My loadouts @@ -181,6 +197,7 @@ 내 로드아웃 我的裝備 我的装备 + Мои комплекты Loadouts saved in your profile @@ -192,6 +209,7 @@ 프로필에 저장된 로드아웃 裝備已保存到你的設定檔中 装备已保存到你的设定档中 + Комплекты экипировки, сохраненные в вашем профиле Default loadouts @@ -203,6 +221,7 @@ 기본 로드아웃 預設裝備 预设装备 + По умолчанию Loadouts made available by the mission maker @@ -214,6 +233,7 @@ 미션메이커가 허용한 로드아웃 任務作者提供的預設裝備 任务作者提供的预设装备 + Комплекты экипировки, предоставляемые создателем миссии Public loadouts @@ -225,6 +245,7 @@ 공용 로드아웃 公用裝備 公用装备 + Публичные комплекты Loadouts shared by you and other players @@ -236,6 +257,7 @@ 플레이어들이 공유하는 로드아웃 由你與其他玩家分享的裝備配置 由你与其他玩家分享的装备配置 + Комплекты экипировки, опубликованные вами и другими игроками Sort by weight @@ -247,6 +269,7 @@ 무게로 정렬 以重量排序 以重量排序 + Сортировка по весу Sort by amount @@ -258,6 +281,7 @@ 갯수로 정렬 以數量排序 以数量排序 + Сортировка по количеству Share or stop sharing the selected loadout @@ -269,6 +293,7 @@ 선택한 로드아웃 공유 혹은 공유중지 開始/停止分享當前選擇的裝備 开始/停止分享当前选择的装备 + Открыть или закрыть общий доступ к комплекту экипировки Private @@ -280,6 +305,7 @@ 개인 私用 私用 + Приватный Public @@ -291,6 +317,7 @@ 공용 公用 公用 + Публичный The default loadouts list is empty! @@ -302,6 +329,7 @@ 기본 로드아웃 목록이 비어있습니다! 沒有預設的裝備清單! 没有预设的装备清单! + Список комплекта экипировки пуст! Default loadouts list exported to clipboard @@ -313,6 +341,7 @@ 클립보드에 기본 로드아웃 목록 내보내기 預設的裝備清單已匯出到剪貼簿中 预设的装备清单已汇出到剪贴簿中 + Список комплекта экипировки по умолчанию экспортирован в буфер Current loadout exported to clipboard @@ -324,6 +353,7 @@ 현재 로드아웃을 클립보드로 내보냈습니다. 當前的裝備已匯出到剪貼簿中 当前的装备已汇出到剪贴簿中 + Текущий список комплекта экипировки экспортирован в буфер Wrong format provided @@ -335,6 +365,7 @@ 잘못된 형식 입력됨 提供的格式錯誤 提供的格式错误 + Неверный формат импорта Default loadouts list imported from clipboard @@ -346,6 +377,7 @@ 클립보드에서 기본 로드아웃 가져오기 預設的裝備清單已從剪貼簿中匯入 预设的装备清单已从剪贴簿中汇入 + Список комплекта экипировки по умолчанию импортирован из буфера Loadout imported from clipboard @@ -357,6 +389,7 @@ 클립보드에서 로드아웃을 가져왔습니다. 裝備已從剪貼簿中匯入 装备已从剪贴簿中汇入 + Список комплекта экипировки импортирован из буфера The following loadout was deleted: @@ -368,6 +401,7 @@ 다음 로드아웃이 삭제됨 : 以下的裝備已被刪除: 以下的装备已被删除: + Удален комплект экипировки: The following loadout is not public anymore: @@ -379,6 +413,7 @@ 다음 로드아웃이 더이상 공용이 아님: 以下的裝備已不再被分享: 以下的装备已不再被分享: + Этот комплект экипировки больше не публичный: The name field is empty! @@ -390,6 +425,7 @@ 이름칸이 비었습니다! 名稱欄位為空! 名称栏位为空! + Поле имени пустое! You are the author of this loadout @@ -401,6 +437,7 @@ 이 로드아웃의 제작자입니다. 你是這個裝備的作者 你是这个装备的作者 + Вы автор этого комплекта экипировки A loadout of yours with the same name is public @@ -412,6 +449,7 @@ 같은 이름의 로드아웃이 공용에 있습니다. 已有相同名稱的裝備在公用分享區 已有相同名称的装备在公用分享区 + Ваш комплект экипировки с таким же именем является публичным The following loadout was saved: @@ -423,6 +461,7 @@ 다음 로드아웃이 저장됨: 以下的裝備已被保存: 以下的装备已被保存: + Сохранен комплект экипировки: The following loadout was loaded: @@ -434,6 +473,7 @@ 다음 로드아웃을 불러옴: 以下的裝備已被載入: 以下的装备已被载入: + Загружен комплект экипировки: A loadout with the same name already exist! @@ -445,6 +485,7 @@ 같은 이름의 로드아웃이 이미 존재합니다! 已有相同名稱的裝備! 已有相同名称的装备! + Комплект с таким именем уже существует! was renamed to @@ -456,6 +497,7 @@ 이름이 다음과 같이 변경됨: 已被改名為 已被改名为 + был переименован в Invert camera controls @@ -467,6 +509,7 @@ 카메라 조종 반전 反轉攝影機控制 反转摄影机控制 + Инвертировать управление камерой Enable mod icons @@ -478,6 +521,7 @@ 모드 아이콘 허가 啟用模組圖示 启用模组图示 + Включить иконки модов Panel font height @@ -489,6 +533,7 @@ 패널 폰트 높이 面板字體高度 面板字体高度 + Размер шрифта панели Allow default loadouts @@ -500,6 +545,7 @@ 기본 로드아웃 허용 允許預設裝備 允许预设装备 + Разрешить комплекты по умолчанию Allow loadout sharing @@ -511,6 +557,7 @@ 로드아웃 공유 허용 允許分享裝備 允许分享装备 + Разрешить публикацию комплектов Log missing / unavailable items @@ -522,6 +569,7 @@ 누락 된 항목 / 사용 할 수 없는 항목 기록 記錄遺失/無法使用的項目 记录遗失/无法使用的项目 + Вести журнал недоступных предметов Primary magazine @@ -533,6 +581,7 @@ Primärmagazin 主要武器彈匣 主要武器弹匣 + Основной магазин Secondary magazine @@ -544,6 +593,7 @@ Sekundärmagazin 次要武器彈匣 次要武器弹匣 + Вторичный магазин ACE Arsenal @@ -555,6 +605,7 @@ ACE 아스날 ACE虛擬軍火庫 ACE虚拟军火库 + ACE Арсенал Allow the use of the default loadouts tab @@ -566,6 +617,7 @@ Erlaube die Nutzung des Standardausrüstungsreiters 允許使用預設的裝備 允许使用预设的装备 + Разрешить использование вкладки комплектов экипировки по умолчанию Show / hide mod icons for the left panel @@ -577,6 +629,7 @@ Zeigt/Versteckt Mod-Symbole in der linken Leiste 在左面板中顯示/隱藏模組圖示 在左面板中显示/隐藏模组图示 + Показать / скрыть значки модов в левой панели Change the font height for text in the left / right panels @@ -588,6 +641,7 @@ Ändert die Schriftgröße für die linke/rechte Leiste 變更左/右面板中的字體高度 变更左/右面板中的字体高度 + Изменить размер шрифта для текста в левой / правой панелях Log missing / unavailable items in the RPT @@ -599,6 +653,7 @@ Fehlende Gegenstände werden in der RPT aufgezeichnet 記錄遺失/無法使用的項目到RPT檔案中 记录遗失/无法使用的项目到RPT档案中 + Вести журнал отсутствующих / недоступных предметов в RPT Unable to open ACE arsenal @@ -610,6 +665,7 @@ 無法開啟ACE虛擬軍火庫 无法开启ACE虚拟军火库 Nie można otworzyć arsenału ACE + Невозможно открыть ACE Арсенал Import BI VA loadouts to ACE Arsenal @@ -621,6 +677,7 @@ 汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中 Importa l'arsenale virtuale BI nell'arsenale ACE Importuj zestawy wyposażenia z wirtualnego arsenału BI do arsenału ACE + Импорт комплектов из Арсенала BI в Арсенал ACE No player unit available! Place a unit and mark it as "Player". @@ -632,6 +689,7 @@ 没有可用的玩家单位!请摆放一个单位并设定成"玩家"。 Non ci sono giocatori! Poisziona una unità e impostala come "Giocatore". Brak dostępnych jednostek gracza! Postaw jednostkę i oznacz ją jako "Gracz". + Нет доступных игроков! Разместите юнит и отметьте его как «Игрок» No loadouts to import. @@ -643,6 +701,7 @@ 没有装备被汇入。 Non ci sono equipaggiamenti da importare. Brak zestawów wyposażenia do zaimportowania. + Нет комплектов для импорта ACE Arsenal @@ -653,6 +712,7 @@ ACE虚拟军火库 Arsenale ACE Arsenał ACE + ACE Арсенал Return to ACE Arsenal. @@ -663,6 +723,7 @@ 返回到ACE虚拟军火库。 Torna all'arsenale ACE Wróć do arsenału ACE. + Вернуться в ACE Арсенал Use ACE Arsenal to try out different weapons and equipment. @@ -673,6 +734,7 @@ 使用ACE虚拟军火库来尝试不同的武器与装备。 Usa l'arsenale ACE per provare armi ed equipaggiamenti vari. Skorzystaj z arsenału ACE by wypróbować broń i ekwipunek. + Используйте ACE Arsenal, чтобы опробовать различное оружие и снаряжение. Try weapons and equipment and create your own loadouts. @@ -683,33 +745,40 @@ 尝试不同的武器与装备来组合你个人的装备配置。 Prova armi ed equipaggiamenti e creai i tuoi equipaggiamenti personalizzati. Wypróbuj broń i ekwipunek i stwórz swoje własne zestawy wyposażenia. + Опробуйте оружие и снаряжение, создавайте собственные комплекты экипировки. Open the loadouts screen + Öffnet das Ausrüstungsmenü Affiche la page des équipements 開啟裝備選單 开启装备选单 装備画面を開く Apri la pagina degli equipaggiamenti Otwórz ekran zestawów + Открыть окно комплектов экипировки Export current / default loadouts + Exportiert aktuelles / standard Loadout Exporte l'équipement actuel ou la liste d'équipements de base 匯出當前/預設的裝備 汇出当前/预设的装备 現在/標準装備をエクスポートします Esporta l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Eksportuj obecne / domyślne zestawy wyposażenia + Экспорт комплектов экипировки Import current / default loadouts + Importiert aktuelles / standard Loadout Importer l'équipement actuel ou la liste d'équipements de base 匯入當前/預設的裝備 汇入当前/预设的装备 現在/標準装備をインポートします Importa l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Importuj obecne / domyślne zestawy wyposażenia + Импорт комплектов экипировки Potassium levels @@ -719,6 +788,7 @@ 鉀水平 Ilvello di potassio Poziomy potasu + Уровень Калия Magnification @@ -742,6 +812,7 @@ 暗視装置への対応有無 Wsparcie noktowizyjne Supporto visore notturno + Поддержка ночного видения Primary supported @@ -749,6 +820,7 @@ プライマリが対応 Wspierane przez broń główną Primario supportato + Поддерживается осн. прицелом Secondary supported @@ -756,6 +828,7 @@ セカンダリが対応 Wspierane przez broń drugorzędną Secondario supportato + Поддерживается доп. прицелом Primary integrated @@ -763,6 +836,7 @@ プライマリに内蔵 Zintegrowane z bronią główną Primario integrato + Интегрирован в осн. прицел Not Supported @@ -770,42 +844,51 @@ セカンダリに内蔵 Nie wspierane Non supportato + Не поддерживается Page + Seite Page ページ 页面 頁面 Pagina Strona + Стр. Enable the faces / voices / insignias tabs + Aktiviere die Gesichter-, Stimmen- und Abzeichenübersicht Activer les onglets faces / voix / insignes 顔 / 声 / 記章タブを有効化 启用脸谱/声音/徽章/选项 啟用臉譜/聲音/徽章選項 Abilita volti, voci e insegne Aktywuj zakładki twarz / głos / insygnia + Включить вкладки Лиц / Голосов / Знаков различия Empty the selected container + Aktuellen Container leeren Vider le conteneur selectionné 選択されたコンテナは空です 选择的箱子是空的 清空選擇的箱子 Svuota il contenitore selezionato Opróżnij wybrany pojemnik + Очистить контейнер Exported class name to clipboard + Der Klassenname wurde in die Zwischenablage exportiert Nom de classe exporté dans le presse papier クリップボードへクラスネームをエクスポート 将种类复制到剪贴板 輸出 class name 到剪貼簿上 Copiato il nome della classe negli appunti Wyeksportowano nazwę klasy do schowka + Имя класса, экспортированного в буфер Mode @@ -841,9 +924,11 @@ Blacklist + Blacklist 禁止リスト Lista Nera Czarna lista (lista wykluczeń) + Чёрный список Items @@ -863,31 +948,41 @@ Export current items list as an array for use in scripts + Exportiert aktuelle Gegenstände als Array, um es in Scripten zu verwenden スクリプト用に現在のアイテム リストをアレイでエクスポートします Esporta l'attuale lista di elementi come un array, per essere usati negli script Eksportuj obecną listę przedmiotów jako tablicę do wykorzystania w skryptach + Экспорт текущего списка предметов в виде массива для использования в скриптах Import items list array from clipboard (should be the same format as export) + Importiert alles aus der Zwischenablage (Sollte im gleichen Format sein, wie beim Exportieren) Zaimportuj listę przedmiotów ze schowka (lista musi być w tym samym formacie jak przy exporcie) クリップボードからアイテムリストをアレイでインポートします (エクスポートと同じフォーマットである必要があります) + Импорт массива списка предметов из буфера (должен иметь тот же формат, что при экспорте) Add Compatible Items + Füge kompatible Gegenstände hinzu Dodaj kompatybilne przedmioty 対応アイテムを追加 + Добавить совместимые предметы Will automatically add compatible attachments or magazines (based on selected category) for all weapons in current items list + Es werden automatisch kompatible Aufsätze oder Magazine für alle ausgewählten Waffen hinzugefügt Automatycznie doda kompatybilne dodatki oraz magazynki (odpowiednio do każdej kategorii) dla wszystkich broni na liście 現在のアイテム リスト内にある全武器に対応するアタッチメントと弾倉 (選択したカテゴリに基づき) を自動的に追加します + Добавляет совместимые приспособления или магазины (в зависимости от выбранной категории) для всего оружия в текущем списке предметов Time to live + Lebenszeit Durée de vie 有効時間 Czas by żyć Scadenza (TTL) + Время действия diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 0fe41a517a5..a240840bcca 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -604,15 +604,17 @@ class CfgAmmo { ACE_barrelLengths[]={304.8, 406.4, 609.6}; }; class B_570x28_Ball: BulletBase { - ACE_caliber = 5.7; + ACE_caliber = 5.7; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/tabical-en-page7.pdf ACE_bulletLength = 21.6; // http://blog.thejustnation.org/2011/04/5-7x28mm-ammo-review/ ACE_bulletMass = 2; // based on the SS190 - ACE_ballisticCoefficients[] = {0.177}; //http://m.delphiforums.com/autogun/messages/5267/7 + ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[] = {0.084}; // https://www.thefirearmblog.com/blog/2016/10/24/modern-personal-defense-weapon-calibers-4-6x30mm-hk/ ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; // 50/50 chance to get it right + ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 7; - ACE_muzzleVelocities[] = {716,776}; - ACE_barrelLengths[] = {264,407}; + ACE_muzzleVelocities[] = {716, 776}; // at 21°C, 715-775 m/s at 15°C according with the 50Rnd_570x28_SMG_03 initSpeed + ACE_barrelLengths[] = {264, 407}; + airFriction = -0.002619; // default BI value -0.001412 }; class B_19mm_HE: BulletBase { tracerScale = 1; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index e81e6bbc856..2616015e7d5 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -75,6 +75,7 @@ class CfgWeapons { ACE_barrelTwist = 228.6; // 1:9 inch twist ACE_barrelLength = 407; ACE_twistDirection = 1; + initSpeed = -1.083916; // 775 m/s according with the ACE_muzzleVelocities at 15°C, default BI value -1.1 (786 m/s) modes[] = {"Single"}; }; class SMG_03C_BASE: SMG_03_TR_BASE { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index bbd6e4ddd96..1c691d960af 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -2283,47 +2283,57 @@ Barrel twist + Dralllänge 銃身の転度 膛线缠距 膛線扭度 Rigatura della canna Gwintowanie lufy + Нарезы ствола Barrel length + Lauflänge Longueur du canon 銃身長 身管长度 槍管長度 Lunghezza della canna Długość lufy + Длина ствола Ballistic coefficient + Ballistischer Koeffizient Coefficient ballistique 弾道係数 弹道系数 彈道係數 Coefficente balistico Współczynnik balistyczny + Баллистический коэффициент Bullet mass + Projektilgewicht Masse d'une balle 弾丸重量 弹头重量 彈頭重量 Massa del proiettile Masa pocisku + Масса пули Muzzle velocity + Mündungsgeschwindigkeit Vitesse à la bouche 銃口初速 枪口初速 槍口初速 Velocità iniziale Prędkość wylotowa + Начальная скорость diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 5683d9b5f4a..89911305e00 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -10,6 +10,7 @@ 捕虜 포로설정 Jeńcy + Пленные Take Prisoner @@ -21,7 +22,7 @@ Arresta il prigioniero Tomar Prisioneiro Foglyul ejtés - Взять в плен + Арестовать 捕虜にする 포박하기 逮捕俘虜 @@ -37,7 +38,7 @@ Libera il prigioniero Libertar Prisioneiro Fogoly szabadon engedése - Освободить пленника + Освободить пленного 捕虜を解放する 풀어주기 釋放俘虜 @@ -53,7 +54,7 @@ Scorta il Prigioniero Escoltar Prisioneiro Fogoly kísérése - Конвоировать пленника + Конвоировать пленного 捕虜を移動させる 포로 호송하기 護送俘虜 @@ -85,7 +86,7 @@ Prima devi arrestarlo! Você deve tomá-lo como prisioneiro primeiro! Először foglyul kell ejtened őt! - Вы должны сначала взять его в плен! + Вы должны сначала арестовать его! 捕虜を取っている必要があります! 먼저 포로로 만들어야합니다! 你必須先逮捕他! @@ -149,7 +150,7 @@ A algema plástica permite que você contenha prisioneiros. Fascetta per arrestare i prigionieri Gyorskötöző, emberek foglyulejtéséhez használható. - Кабельные стяжки позволяют связывать пленников. + Кабельные стяжки используются для связывания рук при аресте ケーブル タイは捕虜を制圧できます。 케이블 타이는 포로를 구류시킬때 씁니다. 束線帶可以綁住俘虜 @@ -179,7 +180,7 @@ Parar de se render Přestat se vzdávat Podejmij walkę ponownie - Прекратить сдачу в плен + Прекратить сдаваться Megadás abbahagyása Smetti di arrenderti 投降をやめる @@ -212,7 +213,7 @@ Sincroniza uma unidade para fazer com que ela se renda. Synchronise une unité pour la rendre captive. Egység szinkronizálása, hogy kapituláljon. - Синхронизируйте с юнитами, чтобы заставить их сдаться в плен. + Синхронизируйте с юнитами, чтобы заставить их сдаться. Sincronizza una unità per farla arrendere. 同期されたユニットを投降させます。 투항시키기 위해 동기화합니다. @@ -224,7 +225,7 @@ Einheit in Handschellen legen Skuj jednostkę Fazer unidade algemada - Связать юнита + Связать юниту руки Spoutat jednotku Metti manette all'unità Hacer que la unidad esté esposada @@ -239,7 +240,7 @@ Synchronisiere eine Einheit, um sie in Handschellen zu legen. Zsynchronizuj z jednostką, aby została skuta. Sincronizar uma unidade para deixá-la algemada. - Синхронизируйте с юнитами, чтобы сделать их связанными. + Синхронизируйте с юнитами, чтобы связать им руки. Synchronizovat s jednotkou, která má být v poutech. Sincronizza un'unità per metterle le manette. Sincroniza una unidad para hacer que esté esposada. @@ -274,7 +275,7 @@ Controla as configurações de rendição e abraçadeiras Contrôle les paramètres de la reddition et des Serflex Szabályozza a kapituláció és bilincselés beállításait - Управляет настройками сдачи в плен и связывания + Управляет настройками ареста и сдачи в плен Controlla le impostazioni per la resa e le manette 投降したユニットや拘束されたユニットの扱いを設定します。 투항과 케이블 타이에 관련한 설정 @@ -290,7 +291,7 @@ Pode algemar o próprio lado Peut capturer sa propre faction Saját oldal megbilincselhető - Связать союзника + Можно связывать руки союзникам Puoi ammanettare unità alleate 拘束ユニットを自陣営へ 자기편을 포박 할 수 있습니다. @@ -306,7 +307,7 @@ Os jogadores podem algemar unidades do seu lado Les joueurs peuvent utiliser les Serflex sur leur propre camp A játékosok megkötözhetik-e a saját oldalukon lévő egységeket - Разрешить игрокам связывать юнитов своей стороны + Разрешить игрокам арестовывать юнитов своей стороны I giocatori possono ammanettare unità alleate プレイヤーが拘束したユニットの陣営を自陣営に変更させます。 자기편에게 케이블타이를 사용할 수 있게합니다 @@ -322,7 +323,7 @@ Permite rendição Permettre la reddition Kapituláció engedélyezése - Сдаться в плен + Разрешить сдаваться Permetti Resa 投降を許可 투항 활성화 @@ -338,7 +339,7 @@ Jogadores podem se render depois de guardar sua arma Les joueurs peuvent se rendre après avoir rangé leur arme A játékosok megadhatják magukat a fegyverük elrakása után - Игроки могут сдаться в плен после того, как уберут оружие + Игроки могут сдаваться после того, как уберут оружие I giocatori possono arrendersi dopo aver messo via le proprie armi プレイヤーは武器を収めたあと投降できるようにします。 비무장한 플레이어가 투항할 수 있게 합니다 @@ -350,7 +351,7 @@ Benötigt Kapitulation Wymagaj kapitulacji Requer rendição - Требовать пленения + Требовать сдаться для ареста Requiere rendición Vzdávání vyžadováno Richiedi Resa @@ -365,7 +366,7 @@ Spieler müssen sich erst ergeben, bevor sie gefangen genommen werden können Wymagaj od graczy kapitulacji zanim będzie można ich zaaresztować Requer que jogadores se rendam antes de poderem ser presos - Требуется, чтобы игрок сдался в плен прежде, чем его можно будет связать + Требовать для ареста, чтобы игроки вначале сдавались Requiere que los Jugadores se rindan antes de arrestarlos Vyžaduje, aby se hráč nejdříve vzdal, poté může být spoután I giocatori devono arrendersi prima che possano essere arrestati @@ -380,7 +381,7 @@ Nur Ergeben Tylko kapitulacja Somente rendição - Только сдавшийся в плен + Только сдавшийся Solo rendición Pouze vzdávání Solo Resa @@ -414,6 +415,7 @@ 设置在游标下的单位成俘虏状态。 커서의 병력을 포박합니다. Ustawia jednostkę pod kursorem jako jeniec. + Арестовывает указанный курсором юнит Require AI surrendering @@ -424,6 +426,7 @@ 需要AI先行投降 AI 항복 필요 Wymaga poddania się przez SI + Требовать ИИ сдаться для ареста Require AI to surrender before they can be arrested @@ -434,6 +437,7 @@ 在逮捕AI之前该AI必须先进入投降状态。 포박하기 전에 먼저 AI가 투항해야만 합니다. Wymaga poddania się przez SI zanim aresztowanie będzie możliwe + Требовать для ареста, чтобы ИИ вначале сдавались diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index 86e0106a93e..ed7b135e8fa 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -237,6 +237,7 @@ 货物空间 Przestrzeń ładunkowa 화물 공간 + Грузовое пространство The cargo space available in this vehicle/container @@ -247,6 +248,7 @@ 设定此载具/集装箱可装载多少货物 Dostępna przestrzeń ładunkowa w tym pojeździe/kontenerze 이 차량/컨테이너에서 사용가능한 화물 공간 + Грузовое пространство, доступное в этом транспортном средстве / контейнере Cargo Size @@ -257,6 +259,7 @@ 货物的大小 Wielkość ładunku 화물 크기 + Размер груза The cargo space required to hold this object (-1 for unloadable) @@ -267,6 +270,7 @@ 此货物会占掉多少空间(设定-1的话此货物就不能被装载) Wymagana przestrzeń ładunkowa dla tego obiektu (-1 dla niemożliwych do załadowania) 이 화물을 적재하는데 필요한 공간 (-1=무조건 적재가능) + Грузовое пространство, необходимое для размещения этого объекта (-1 для незагружаемого) Airdrop @@ -278,6 +282,7 @@ Lancio Aereo 空投 空投 + Десантирование груза Unlevel Flight @@ -289,6 +294,7 @@ Volo non Livellato 此架飛機並無保持水平飛行 此架飞机并无保持水平飞行 + Неподходящее положение Paradrop Time Coefficient @@ -300,6 +306,7 @@ 空投时间系数 Współczynnik czasu zrzutu 공중 투하 시간 계수 + Коэффициент времени десантирования Modifier for how long it takes to paradrop a cargo item. @@ -311,18 +318,23 @@ 设定空投所需消耗的时间. Modyfikator wskazujący jak dużo czasu potrzeba by zrzucić przedmiot na spadochronie. 화물을 공중 투하 하는데 얼마나 걸리는 시간 설정 + Модификатор времени, необходимого для десантирования груза Load Time Coefficient + Ladezeitmultiplikator 積載時間の係数 Współczynnik czasu załadowania Coefficente Tempo Caricamento + Коэффициент времени погрузки Modifies how long it takes to load/unload items.\nTime, in seconds, is the size of the item multiplied by this value. + Gibt an, wie lange das Laden / Entladen von Gegenständen dauern soll.\nZeit in Sekunden, die mit der Größe des Gegenstandes multipliziert wird. アイテムの積み下ろし作業にかかる時間を編集できます。\nアイテムの大きさにこの値が乗法され、時間 (秒) を変更できます。 Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość. Modifica quanto tempo ci impiega a caricare o scaricare gli oggetti.\n Tempo, in secondi, è la dimensione dell'oggetto moltiplicata per questo valore + Изменяет время для загрузки/выгрузки предметов. \n Время (сек) - это размер предмета, умноженный на это значение. diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index 4fc7cc4e8be..ec638f64ec0 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -11,6 +11,7 @@ Luce chimica 螢光棒 萤光棒 + Химсвет Prepare %1 @@ -22,6 +23,7 @@ Prepara %1 使用%1 使用%1 + Приготовить %1 %1<br/>Prepared @@ -33,6 +35,7 @@ %1 <br/> Preparata %1<br/>已使用 %1<br/>已使用 + %1<br/>Приготовлен No inventory space @@ -60,6 +63,7 @@ [ACE] Luci chimiche [ACE] 螢光棒 [ACE] 萤光棒 + [ACE] Химсвет Chemlight (Orange) @@ -71,6 +75,7 @@ Luce chimica (Arancione) 螢光棒 (橘色) 萤光棒 (橘色) + Химсвет (Оранжевый) Orange Light @@ -82,6 +87,7 @@ Luce Arancione 橘色光 橘色光 + Оранжевый свет Type: Light - Orange<br />Rounds: 1<br />Used in: Hand @@ -93,6 +99,7 @@ Tipo: Luce - Arancione<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 橘色<br />發數: 1<br />使用於: 手 类型: 光 - 橘色<br />发数: 1<br />使用于: 手 + Тип: Свет - Оранжевый<br />1 штука<br />В руках Chemlight (White) @@ -104,6 +111,7 @@ Luce chimica (Bianca) 螢光棒 (白色) 萤光棒 (白色) + Химсвет (Белый) White Light @@ -115,6 +123,7 @@ Luce Bianca 白色光 白色光 + Белый свет Type: Light - White<br />Rounds: 1<br />Used in: Hand @@ -126,6 +135,7 @@ Tipo: Luce - Bianca<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 白色<br />發數: 1<br />使用於: 手 类型: 光 - 白色<br />发数: 1<br />使用于: 手 + Тип: Свет - Белый<br />1 штука<br />В руках Chemlight (Hi Red) @@ -137,6 +147,7 @@ Luce chimica (Hi Rossa) 螢光棒 (超亮紅色) 萤光棒 (超亮红色) + Химсвет (Ярко-Красный) Red Hi Light @@ -148,6 +159,7 @@ Luce Hi Rossa 超亮紅色光 超亮红色光 + Яркий Красный свет Type: Light - Red Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -159,6 +171,7 @@ Tipo: Luce - Rossa Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮紅色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮红色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Красный (30 минут)<br />1 штука<br />В руках Chemlight (Hi Yellow) @@ -170,6 +183,7 @@ Luce chimica (Hi Gialla) 螢光棒 (超亮黃色) 萤光棒 (超亮黄色) + Химсвет (Ярко-Желтый) Yellow Hi Light @@ -181,6 +195,7 @@ Luce Hi Gialla 超亮黃色光 超亮黄色光 + Яркий Желтый свет Type: Light - Yellow Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -192,6 +207,7 @@ Tipo: Luce - Gialla Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮黃色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮黄色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Желтый (30 минут)<br />1 штука<br />В руках Chemlight (Hi White) @@ -203,6 +219,7 @@ Luce chimica (Hi Bianca) 螢光棒 (超亮白色) 萤光棒 (超亮白色) + Химсвет (Ярко-Белый) White Hi Light @@ -214,6 +231,7 @@ Luce Hi Bianca 超亮白色光 超亮白色光 + Яркий Белый свет Type: Light - White Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -225,6 +243,7 @@ Tipo: Luce - Bianca Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮白色 (30分鐘)<br />發數: 1<br />使用於: 手 类型: 光 - 超亮白色 (30分钟)<br />发数: 1<br />使用于: 手 + Тип: Свет - Ярко-Белый (30 минут)<br />1 штука<br />В руках Chemlight (Hi Blue) @@ -232,6 +251,7 @@ ケミライト (高輝度 青) Świetlik (jaskrawy niebieski) Luce chimica (Hi Blu) + Химсвет (Ярко-Синий) Blue Hi Light @@ -239,6 +259,7 @@ 高輝度の青色 Jaskrawe niebieskie światło Luce Hi Blu + Яркий Синий свет Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -246,6 +267,7 @@ 種類: 照明 - 高輝度 青 (30分間)<br />装填数: 1<br />次で使用: 携帯 Typ: Światło - jaskrawe niebieskie (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Hi blu (30 minuti)<br/>Rimanenti:1 <br/>Usata in: Mano + Тип: Свет - Ярко-Синий (30 минут)<br />1 штука<br />В руках Chemlight (Hi Green) @@ -253,6 +275,7 @@ ケミライト (高輝度 緑) Świetlik (jaskrawy zielony) Luce chimica (Hi Verde) + Химсвет (Ярко-Зеленый) Green Hi Light @@ -260,6 +283,7 @@ 高輝度の青色 Jaskrawe zielone światło Luce Hi Verde + Яркий Зеленый свет Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -267,6 +291,7 @@ 種類: 照明 - 高輝度 緑 (30分間)<br />装填数: 1<br />次で使用: 携帯 Typ: Światło - jaskrawe zielone (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Hi verde (30 minuti)<br/>Rimanenti: 1<br/>Usata in: Mano + Тип: Свет - Ярко-Зеленый (30 минут)<br />1 штука<br />В руках Chemlight (Ultra-Hi Orange) @@ -274,6 +299,7 @@ ケミライト (高輝度 オレンジ) Świetlik (ultra-jaskrawy pomarańczowy) Luce chimica (Ultra-Hi Arancione) + Химсвет (Ультраяркий Оранжевый) Orange Ultra-Hi Light @@ -281,6 +307,7 @@ ウルトラ高輝度のオレンジ色 Ultra-jaskrawe pomarańczowe światło Luce Ultra-Hi Arancione + Ультраяркий Оранжевый свет Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -288,6 +315,7 @@ 種類: 照明 - ウルトラ高輝度 オレンジ (5分間)<br />装填数: 1<br />次で使用: 携帯 Typ: Światło - ultra-jaskrawe pomarańczowe (30 minut)<br/>Pociski: 1<br/>Używany w: ręce Tipo: Luce - Ultra-Hi (5 minuti)<br/>Rimanenti: 1<br/>Usata in: Mano + Тип: Свет - Ультраяркий Оранжевый (5 минут)<br />1 штука<br />В руках Chemlight (IR) @@ -299,6 +327,7 @@ Luce chimica (IR) 螢光棒 (紅外線) 萤光棒 (红外线) + Химсвет (Инфракрасный) IR Light @@ -310,6 +339,7 @@ Luce IR 紅外線光 红外线光 + Инфракрасный свет Type: Light - Infrared<br />Rounds: 1<br />Used in: Hand @@ -321,6 +351,7 @@ Tipo: Luce - Infrarossi<br />Usata in: Mano 類型: 光 - 紅外線<br />發數: 1<br />使用於: 手 类型: 光 - 红外线<br />发数: 1<br />使用于: 手 + Тип: Свет - Инфракрасный<br />1 штука<br />В руках Chemlight Shield (Empty) @@ -332,6 +363,7 @@ Scudo Luce chimica (Vuoto) 螢光棒保護殼 (空) 萤光棒保护壳 (空) + Контейнер для Химсвета (Пуст) Shield for chemlights. Combine with chemlight to prepare reading light. @@ -343,6 +375,7 @@ Scudo per luci chimiche. Combina con una luce chimica per una luce da lettura. 螢光棒的保護殼. 與螢光棒結合後可充當閱讀燈 萤光棒的保护壳. 与萤光棒结合后可充当阅读灯. + Защитный контейнер для Химсвета. Объедините с Химсветом, чтобы подготовить Свет для чтения Chemlight Shield (Green) @@ -354,6 +387,7 @@ Scudo Luce Chimica (Verde) 螢光棒保護殼 (綠色) 萤光棒保护壳 (绿色) + Контейнер для Химсвета (Зел) Green reading light. @@ -365,6 +399,7 @@ Luce da lettura Verde. 綠色閱讀燈 绿色阅读灯。 + Ночник из Химсвета (Зеленый) Chemlight Shield (Red) @@ -376,6 +411,7 @@ Scudo Luce Chimica (Rossa) 螢光棒保護殼 (紅色) 萤光棒保护壳 (红色) + Контейнер для Химсвета (Красн) Red reading light. @@ -387,6 +423,7 @@ Luce da lettura Rossa. 紅色閱讀燈 红色阅读灯。 + Ночник из Химсвета (Красный) Chemlight Shield (Blue) @@ -398,6 +435,7 @@ Scudo Luce Chimica (Blu) 螢光棒保護殼 (藍色) 萤光棒保护壳 (蓝色) + Контейнер для Химсвета (Син) Blue reading light. @@ -409,6 +447,7 @@ Luce da lettura Blu. 藍色閱讀燈 蓝色阅读灯。 + Ночник из Химсвета (Синий) Chemlight Shield (Yellow) @@ -420,6 +459,7 @@ Scudo Luce Chimica (Gialla) 螢光棒保護殼 (黃色) 萤光棒保护壳 (黄色) + Контейнер для Химсвета (Желт) Yellow reading light. @@ -431,6 +471,7 @@ Luce da lettura Gialla. 黃色閱讀燈 黄色阅读灯。 + Ночник из Химсвета (Желтый) Chemlight Shield (Orange) @@ -442,6 +483,7 @@ Scudo Luce Chimica (Arancione) 螢光棒保護殼 (橘色) 萤光棒保护壳 (橘色) + Контейнер для Химсвета (Оранж) Orange reading light. @@ -453,6 +495,7 @@ Luce da lettura Arancione. 橘色閱讀燈 橘色阅读灯。 + Ночник из Химсвета (Оранжевый) Chemlight Shield (White) @@ -464,6 +507,7 @@ Scudo Luce Chimica (Bianca) 螢光棒保護殼 (白色) 萤光棒保护壳 (白色) + Контейнер для Химсвета (Белый) White reading light. @@ -475,6 +519,7 @@ Luce da lettura Bianca. 白色閱讀燈 白色阅读灯。 + Ночник из Химсвета (Белый) diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 7c973320d95..8227740fc07 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -10,6 +10,7 @@ 通用 일반 Ogólny + Общий ACE-Team @@ -27,7 +28,7 @@ ACE-製作團隊 ACE-制作团队 - + Advanced Усложненный Zaawansowany @@ -410,7 +411,7 @@ 未知的 未知的 - + Normal Normal Normale @@ -506,30 +507,36 @@ Check PBO Action + PBO Überprüfung Controlla Azioni PBO 檢查PBO動作 检查PBO动作 PBO 検査の挙動 PBO 검사 Sprawdź akcję PBO + Действие при проверке PBO Check PBO All + Alle PBOs überprüfen Controlla Tutti i PBO 檢查所有PBO 检查所有PBO PBO 全てを検査 모든 PBO 검사 Sprawdź wszystkie PBO + Проверять все PBO Check PBO Whitelist + PBO Whitelist Controlla Whitelist PBO 檢查PBO白名單 检查PBO白名单 許可リスト内の PBO を検査 검사 제외 PBO Sprawdź białą listę PBO + Белый список для проверки PBO Feedback icons @@ -998,11 +1005,13 @@ 啟用 启用 - + Always + Immer 常に + Всегда - + Anywhere Где угодно Wszędzie @@ -1016,7 +1025,7 @@ どこでも 어디서나 - + Basic Базовый Podstawowy @@ -1031,7 +1040,7 @@ 기본 - Medical vehicles + Medical Vehicles В медицинском транспорте Pojazdy medyczne Vehiculos médicos @@ -1079,10 +1088,14 @@ Confirm 確認 + Bestätigen + Подтвердить Never 行わない + Nie + Никогда Vehicles only @@ -1260,6 +1273,7 @@ 音楽の音量低下を許可 Permesso di abbassare la musica Zezwól na przyciszanie muzyki + Разрешить приглушение музыки Allow ACE scripts to turn down the music. @@ -1270,22 +1284,27 @@ ACE スプリントへ音量低下を許可します。 Permetti agli script di ACEdi abbassare la musica. Zezwól skrypty ACE na przyciszanie muzyki. + Позволить скриптам ACE приглушать музыку Flag (ACE - Black) + Flagge (Ace - Schwarz) 旗帜(ACE-黑色): 旗幟(ACE-黑色) Bandiera (ACE - Nera) 旗 (ACE - 黒) Flaga (ACE - Czarna) + Флаг (ACE - Черный) Flag (ACE - White) + Flagge (Ace - Weiß) 旗帜(ACE-白色): 旗幟(ACE-白色) Bandiera (ACE - Bianca) 旗 (ACE - 白) Flaga (ACE - Biała) + Флаг (ACE - Белый) diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 7612e242113..452b213fe9b 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -11,14 +11,19 @@ ACE Durchzündung ACE Cook off ACE Samozapłon + ACE Возгорание Damage handling and turret effects + Schadensberechnung und Geschützturmeffekte 損傷処理と砲塔の効果 + Обработка урона и эффектов срыва башни Changes damage handling for cook off and turret explosion effects + Ändert die Schadensberechnung für die Durchzündung und die Explosionseffekte des Geschützturmes 誘爆の損傷処理と砲塔の爆発効果を変更します。 + Изменяет обработку урона для возгорания и эффекта срыва башни Wreck (Turret) @@ -45,6 +50,7 @@ Abilita esplosione cassa munizioni 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 + Разрешить возгорание ящиков с боеприпасами Enables cooking off of ammo boxes. @@ -56,6 +62,7 @@ Abilita l'esplosione della cassa di munizioni. 開啟彈藥箱殉爆效果 开启弹药箱殉爆效果 + Активирует возгорание ящиков с боеприпасами Enable Ammunition cook off @@ -67,6 +74,7 @@ Abilita Esplosione munizioni 開啟彈藥殉爆效果 开启弹药殉爆效果 + Разрешить детонацию боекомплекта Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. @@ -78,6 +86,7 @@ 開啟彈藥殉爆效果。當一台載有彈藥的載具起火時, 將會有殉爆的效果 开启弹药殉爆效果。当一台载有弹药的载具起火时, 将会有殉爆的效果。 쿡오프 현상을 활성화 합니다. 이것은 탄약에 불이 붙어있는 동안 주변에 발사체를 발사합니다. + Активирует возгорание и детонацию боекомплекта в горящей технике Ammunition cook off duration @@ -89,6 +98,7 @@ 彈藥殉爆效果持續時間 弹药殉爆效果持续时间 쿡오프 지속 시간 + Длительность возгорания боеприпасов Multiplier for how long cook off lasts [Setting to 0 will disable ammo cookoff] @@ -100,6 +110,7 @@ 設定彈藥殉爆效果會持續多久時間 [輸入0來關閉殉爆效果] 设定弹药殉爆效果会持续多久时间 [输入0来关闭殉爆效果] 쿡오프 지속 시간의 배수 [0 이면 비활성] + Множитель длительности возгорания [0 - отключает возгорание боеприпасов] Cook-off probability coefficient @@ -110,6 +121,7 @@ 殉爆发生机率系数 Coefficient de probabilité du cook off Współczynnik prawdopodobieństwa samozapłonu + Коэффициент вероятности возгорания Multiplier for cook-off probability. Higher value results in higher cook-off probability @@ -120,6 +132,7 @@ 调整殉爆发生机率系数。值越高代表越容易发生殉爆。 Multiplicateur pour la probabilité du cook off. Plus la valeur est élevée, plus la probabilité de cook off est haute. Mnożnik prawdopodobieństwa samozapłonu. Większa wartość oznacza większe prawdopodobieństwo samozapłonu + Множитель коэффициента вероятности возгорания. Чем выше значение, тем выше вероятность. diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index 45d2e827d74..72793fd471c 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -81,10 +81,12 @@ Onscreen display for checking dogtags + Anzeige um Hundemarke zu überprüfen 在畫面中顯示檢查兵籍牌 確認中のドッグタグを画面上で表示します Display su schermo per il controllo delle piastrine Wyświetlacz ekranowy dla sprawdzania nieśmiertelników + Экран для проверки жетонов diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 8923f1c5ddd..810d74bf92c 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -882,7 +882,7 @@ Mina M6 SLAM (atak od boku) Mina M6 SLAM (Ataque Lateral) Mine M6 SLAM (de flanc) - STR_ACE_Explosives_Module_SLAMBottomAttack_DisplayName M6 SLAM Mine (Bottom Attack) Mine M6 SLAM (par le bas) M6-SLAM-Mine (Bodenangriff) Mina M6 SLAM (base) Mina M6 SLAM (atak od dołu) Mina M6 SLAM (Laterale) + Mina M6 SLAM (Laterale) M6 SLAM (Útok do strany) Mina M6 SLAM (Ataque Lateral) Мина M6 SLAM (направлена вбок) @@ -1009,7 +1009,7 @@ Type: Tripwire flare - Ignites a non-lethal flare when triggered.<br />Rounds: 1<br />Used on: Ground - Тип: Сигнальная растяжка - При срабатывании выпускает несмертельную сгнальную вспышку.<br />Зарядов: 1<br />Используется на: Земле + Тип: Сигнальная растяжка - При срабатывании выпускает несмертельную сигнальную вспышку.<br />Зарядов: 1<br />Используется на: Земле 種類: 仕掛け型照明地雷 - 発動したとき、非致死性の照明を発炎します。<br />装填数: 1<br />次で使用: 地表 Typ: Flara na linkę - Wystrzeliwuje nieszkodliwą flarę przy nadepnięciu linki.<br/>Pociski: 1<br/>Używane na: ziemia Typ: Stolperdraht-Leuchtrakete - Schießt bei Auslösung eine nicht-tödliche Leuchtrakete ab.<br />Ladungen: 1<br />Benutzt auf: Boden @@ -1021,18 +1021,22 @@ Explosive range + Explosionsradius Portée du détonateur 爆発範囲 爆炸范围 爆炸範圍 Raggio di detonazione Zasięg wybuchu + Дальность подрыва Explosive Timer + Detonationszeit Timer di detonazione 爆発タイマー Czasomierz Wybuchu + Таймер взрывчатки diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index 71a2f17038e..5fe476a3362 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -55,6 +55,7 @@ 收起快速绳降系统 패스트 로프 시스템 보관 Schowaj system zjazdu na linach + Спрятать систему спуска Deploy ropes @@ -146,81 +147,107 @@ Deploy 12m ropes + 12m Seile einsetzen Déployer les cordes 12m 12m ロープを展開 Wysuń linę o długości 12 m. + Выпустить 12 м канат Deploy 15m ropes + 15m Seile einsetzen Déployer les cordes 15m 15m ロープを展開 Wysuń linę o długości 15 m. + Выпустить 15 м канат Deploy 18m ropes + 18m Seile einsetzen Déployer les cordes 18m 18m ロープを展開 Wysuń linę o długości 18 m. + Выпустить 18 м канат Deploy 27m ropes + 27m Seile einsetzen Déployer les cordes 27m 27m ロープを展開 Wysuń linę o długości 27 m. + Выпустить 27 м канат Deploy 36m ropes + 36m Seile einsetzen Déployer les cordes 36m 36m ロープを展開 Wysuń linę o długości 36 m. + Выпустить 36 м канат [ACE] Ropes Supply crate + [ACE] Seil Versorgungskiste [ACE] Caisse de Cordes [ACE] ロープ収納箱 Skrzynia z linami ACE + [ACE] Ящик с канатами Used to do deploy ropes from a compatibile helicopter + Wird zum Bereitstellen von Seilen aus einem kompatiblen Hubschrauber verwendet Utilisé pour déployer des cordes depuis un hélicoptère compatible 対応するヘリコプターからロープを展開する為に使用されます Używane do opuszczania lin z kompatybilnych smigłowców + Используется для выпуска канатов с совместимого вертолета Rope 12.2 meters + 12.2 Meter Seil Corde 12.2 mètres ロープ (12.2 メートル) Lina, długość 12,2 m. + Канат 12.2 метров Rope 15.2 meters + 15.2 Meter Seil Corde 15.2 mètres ロープ (15.2 メートル) Lina, długość 15,2 m. + Канат 15.2 метров Rope 18.3 meters + 18.3 Meter Seil Corde 18.3 mètres ロープ (18.3 メートル) Lina, długość 18,3 m. + Канат 18.3 метров Rope 27.4 meters + 27.4 Meter Seil Corde 27.4 mètres ロープ (27.4 メートル) Lina, długość 27,4 m. + Канат 27.4 метров Rope 36.6 meters + 36.6 Meter Seil Corde 36.6 mètres ロープ (36.6 メートル) Lina, długość 36,6 m. + Канат 36.6 метров Require rope item to deploy + Seil-Item zum aufbauen benötigt Exiger une corde pour déployer 展開にはロープ アイテムを必須に Wymaga przedmiotu typu lina + Требуется канат diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index 24941404c59..e7edbdac911 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -11,6 +11,7 @@ 가리키기 Pointage Wskazywanie + Указание пальцем Show pointing indicator to self diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index 418c10cc6a8..dc2c76dd4f1 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -93,12 +93,14 @@ Map light color + Farbe des Kartenlichts Couleur de la lampe sur carte 光の色 地图上手电的颜色 地圖上使用手電筒的顏色 Colore della luce sulla mappa Kolor światła na mapie + Цвет подсветки карты diff --git a/addons/gforces/stringtable.xml b/addons/gforces/stringtable.xml index 737188f76b8..2fb8c1b1d1a 100644 --- a/addons/gforces/stringtable.xml +++ b/addons/gforces/stringtable.xml @@ -33,12 +33,14 @@ G-force reduction + G-Kräfte Reduzierung Reduction des Gs 耐 G 性 减少G力 減少G力 Riduzione forza G Redukcja przeciążenia + Уменьшение перегрузок diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index a4be10b0fc2..f12d4d31e53 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -10,6 +10,7 @@ ゴーグル 고글 Gogle + Очки Show Goggle Effects in Third Person diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index d876f126b9a..7beb128df63 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -74,6 +74,9 @@ _affected = _affected - [ACE_player]; // Affect local player, independently of distance if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { + if ((getNumber (configFile >> "CfgVehicles" >> (typeOf ACE_player) >> "isPlayableLogic")) == 1) exitWith { + TRACE_1("skipping playable logic",typeOf ACE_player); // VirtualMan_F (placeable logic zeus / spectator) + }; // Do effects for player // is there line of sight to the grenade? private _eyePos = eyePos ACE_player; //PositionASL diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index 3483b740379..a5423468a65 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -136,7 +136,7 @@ Aussi connu en tant que "Flashbang". Explose en causant cécité, surdité, bourdonnements d'oreilles et perturbation de l'oreille interne. Znany też jako flashbang. Powoduje natychmiastową tymczasową ślepotę, głuchotę, dzwonienie w uszach i inne zaburzenia ucha wewnętrznego. Omračující granát je taktická nesmrtící zbraň používaná při záchraně rukojmí a zvládání davu. - XM84 (M84) - граната нелетального действия, и предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. + XM84 (M84) - граната нелетального действия, предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. Villanógránát néven is ismert. Azonnali villanási vakságot, süketséget, fülzúgást, és belső füli zavart okoz. Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. Também conhecida como flashbang. Causa uma clarão imediato, cegueira, surdez, zumbido e distúrbio no tímpano. @@ -201,7 +201,7 @@ M127A1 Bengala (Giallo) Flara ręczna sygnałowa M127A1 (żółta) M127A1 Sinalizador (Amarelo) - M127A1 Фальшфейер (Жёлтые) + M127A1 Фальшфейер (Жёлтый) Bengala M127A1 (Amarilla) M127A1 Feux à main (Jaune) M127A1 信号弾 (黄) @@ -265,7 +265,7 @@ Bengala (Giallo) Flara ręczna (żółta) Sinalizador de Mão (Amarelo) - Фальшфейер (Жёлтые) + Фальшфейер (Жёлтый) Bengala (Amarilla) Feux à main (Jaune) 黄の手持ち式信号弾 @@ -330,7 +330,7 @@ M127A1 (Giallo) M127A1 (żółta) M127A1 (Amarelo) - M127A1 (Жёлтые) + M127A1 (Жёлтый) M127A1 (Amarilla) M127A1 (黄) M127A1 (노랑) @@ -378,36 +378,42 @@ Typ: Gwiezdna Flara Spadochronowa Tipo: Granata a paracadute con bengala 種類: パラシュート式照明弾 (星弾) + Тип: Осветительная ракета - звезда на парашюте M583 Illumination Flare (White) M583 Flara oświetlająca (Biała) M583 Granata con bengala (Bianca) M583 照明弾 (白) + M583 Осветит. ракета (Белая) M662 Illumination Flare (Red) M662 Flara oświetlająca (Czerwona) M662 Granata con bengala (Rossa) M662 照明弾 (赤) + M662 Осветит. ракета (Красная) M661 Illumination Flare (Green) M661 Flara oświetlająca (Zielona) M661 Granata con bengala (Verde) M661 照明弾 (緑) + M661 Осветит. ракета (Зеленая) Type: Parachute IR Flare Typ: Spadochronowa Flara IR Tipo: Granata a paracadute con infrarosso 種類: パラシュート式赤外線照明弾 + Тип: ИК-осветительная ракета на парашюте M992 Illumination IR Flare M992 Oświetlająca flara IR M992 Granata con infrarosso M992 赤外線照明弾 + M992 ИК-осветительная ракета diff --git a/addons/gunbag/CfgVehicles.hpp b/addons/gunbag/CfgVehicles.hpp index e23966cfa24..0addf227100 100644 --- a/addons/gunbag/CfgVehicles.hpp +++ b/addons/gunbag/CfgVehicles.hpp @@ -73,6 +73,7 @@ class CfgVehicles { hiddenSelectionsTextures[] = {QPATHTOF(data\gunbag_co.paa)}; maximumLoad = 80; mass = 11; + ADDON = 1; }; class GVAR(Tan): ADDON { diff --git a/addons/gunbag/functions/fnc_calculateMass.sqf b/addons/gunbag/functions/fnc_calculateMass.sqf index 8f845dc4ee5..6d66d191df2 100644 --- a/addons/gunbag/functions/fnc_calculateMass.sqf +++ b/addons/gunbag/functions/fnc_calculateMass.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Calculate mass of weapon an items. + * Calculate mass of weapon and items. * * Arguments: * 0: Weapon diff --git a/addons/gunbag/functions/fnc_canInteract.sqf b/addons/gunbag/functions/fnc_canInteract.sqf index 46451b50d51..fbf17819f67 100644 --- a/addons/gunbag/functions/fnc_canInteract.sqf +++ b/addons/gunbag/functions/fnc_canInteract.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Check if client able to interact with gunbag. + * Check if client is able to interact with gunbag. * * Arguments: * 0: Unit diff --git a/addons/gunbag/functions/fnc_hasGunbag.sqf b/addons/gunbag/functions/fnc_hasGunbag.sqf index 5fa90c7b9cd..7f9c7135e08 100644 --- a/addons/gunbag/functions/fnc_hasGunbag.sqf +++ b/addons/gunbag/functions/fnc_hasGunbag.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Ir0n1E - * Switches gunbag full/empty for mass calculation. + * Check if unit has a gunbag. * * Arguments: * 0: Unit @@ -17,4 +17,4 @@ params ["_unit"]; -(backpackContainer _unit) isKindOf QUOTE(ADDON) +getNumber (configFile >> "CfgVehicles" >> (backpack _unit) >> QUOTE(ADDON)) == 1 diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 048445d3fa7..e5cb9df251d 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -284,53 +284,65 @@ Hearing protection + Gehörschutz Protection auditive 聴覚保護 听力保护 聽力保護 Protezione auditiva Ochrona słuchu + Защита слуха Volume muffling + Lautstärkedämpfung Étouffement des sons 音量低下 降低音量 進低音量 Volume attenuazione Tłumienie głośności + Глушение звука Earplugs Volume + Lautstärke Ohrenstöpsel 耳栓時の音量 耳塞时音量 耳塞時音量 Volume tappi per le orecchie Głośność Stoperów + Громкость в берушах Volume when using earplugs. + Lautstärke wenn man Ohrenstöpsel benutzt 耳栓使用時の音量を決定します。 决定带上耳塞时的音量 使用耳塞時音量 Volume audio quandi si indossano i tappi per le orecchie. Głośność podczas używania stoperów. + Громкость при одетых берушах Unconscious Volume + Lautstärke Bewusstlosigkeit 気絶時の音量 无意识时音量 昏迷時音量 Volume quando incoscente Nieprzytomna Głośność + Громкость без сознания Volume when unconscious. + Lautstärke während man Bewusstlos ist 気絶時の音量を決定します。 决定处于无意识时的音量 昏迷時使用耳塞的音量 Volume quando incoscente. Głośność podczas bycia nieprzytomnym. + Громкость при потере сознания diff --git a/addons/hellfire/stringtable.xml b/addons/hellfire/stringtable.xml index 990e5a5b845..e3deab91105 100644 --- a/addons/hellfire/stringtable.xml +++ b/addons/hellfire/stringtable.xml @@ -10,6 +10,7 @@ 設定地獄火模式 Ustaw tryb pocisku Hellfire 헬파이어 모드 세팅 + Установить режим Hellfire diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml index b727e485145..fa654795088 100644 --- a/addons/hitreactions/stringtable.xml +++ b/addons/hitreactions/stringtable.xml @@ -10,6 +10,7 @@ 방아쇠를 당기는 최소한의 피해 Mindestschaden, um Sturz auszulösen Minimalne obrażenie, żeby aktywować spadanie + Минимальный урон для активации падения diff --git a/addons/hot/stringtable.xml b/addons/hot/stringtable.xml index 56df14fb823..a6b427f4080 100644 --- a/addons/hot/stringtable.xml +++ b/addons/hot/stringtable.xml @@ -7,6 +7,7 @@ Kierowany przewodem Filoguidato ワイヤ有線誘導 + Проводное управление Semi-automatic command to line of sight @@ -14,6 +15,7 @@ Semi-automatyczna komenda do pola widzenia Comando Semi-Automatico via Contatto Visivo(SACLOS) 半自動指令照準線一致誘導方式 + Полуавтоматическое командное наведение по линии визирования (SACLOS) Wire-Guided Missile @@ -21,114 +23,151 @@ Pocisk kierowany przewodowo Missile filoguidato ワイヤ有線誘導ミサイル + Ракета с проводным управлением HOT Missile + Lenkflugkörper Pocisk HOT Missile HOT HOT ミサイル + Ракета HOT HOT 1 + HOT 1 HOT 1 HOT 1 HOT 1 + HOT 1 HOT 2 + HOT 2 HOT 2 HOT 2 HOT 2 + HOT 2 HOT 2MP + HOT 2MP HOT 2MP HOT 2MP HOT 2MP + HOT 2MP HOT 3 + HOT 3 HOT 3 HOT 3 HOT 3 + HOT 3 Wire-Guided Missile (Anti-Personnel) + Anti Personen Lenkflugkörper Pocisk kierowany przewodowo (przeciwpiechotny) Missile filoguidato antiuomo ワイヤ有線誘導ミサイル (対人) + Ракета с проводным управлением (Противопехотная) 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 1x HOT 1 [ACE] 1x HOT1 [ACE] 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 2e29db71e56..599855f826d 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -448,11 +448,13 @@ Selector Color + Farbauswahl セレクターの色 选择器颜色 選單的顏色 Controllo Settore Kolor wybierającego + Цвет селектора diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 50b023f95de..65c1dfa00fc 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -10,6 +10,7 @@ インタラクション 상호작용 Interakcja + Взаимодействие Interactions @@ -450,7 +451,7 @@ Odejdź! Jděte pryč! Allez-vous-en ! - Уходите отсюда! + Уйдите отсюда! Tűnés! Vá Embora! Via di qui! @@ -482,7 +483,7 @@ Aussteigen! Sal del vehículo! Sortez ! - Выходи + Выходи! Vystupte 降りろ 나가 @@ -843,6 +844,7 @@ Flip + Umdrehen Перевернуть ひっくり返す @@ -954,6 +956,7 @@ 关闭负面评价 부정행위 가중치 사용안함 Wyłącz negatywną ocenę + Отключить отрицательный рейтинг Should players receive negative rating? When enabled players are only receiving positive ratings which prevents friendly AI fire when destroying friendly equipment or killing team members. @@ -964,6 +967,7 @@ 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 높은 레이팅을 가질때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다. Czy powinni gracze otrzymywać negatywną ocenę? Kiedy aktywowani gracze otrzymuję wyłącznie pozytywną ocenę, która zapobiega ognia przyjaznego SI podczas niszczenia przyjaznego wyposażenia lub zabijaniu członków drużyny. + Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды. Team management allows color allocation for team members, taking team command and joining/leaving teams. @@ -1088,6 +1092,7 @@ Pull out body + Person herausziehen Вытащить тело 身体を引き出す Estrai il corpo diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 016c8f5c8a3..632d45708e4 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -11,6 +11,7 @@ Contatore di Simulazione della Dispersione del Laser 雷射散射模拟计算 雷射散射模擬計算 + Число симуляций рассеивания лазерного луча Laser Code diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 3145b220eb0..6eab4dd180e 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -3,12 +3,14 @@ Magazine Repack + Magazine umpacken Riempimento Caricatori 重新整理彈匣 重新整理弹匣 弾倉詰め替え 탄약 채우기 Przepakowywanie magazynków + Перепаковка Магазинов Time per round @@ -19,6 +21,7 @@ 弾頭毎の所有時間 구경 당 시간 Czas na nabój + Время на патрон Time per magazine @@ -29,6 +32,7 @@ 弾倉毎の所有時間 탄창 당 시간 Czas na magazynek + Время на магазин Time per belt link @@ -39,6 +43,7 @@ ベルトリンク毎の所有時間 탄약띠 당 시간 Czas na taśmę + Время на звено ленты Repack Magazines diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index c368490e8dc..8d829092e96 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,7 +10,7 @@ // MINIMAL required version for the Mod. Components can specify others.. #define REQUIRED_VERSION 1.88 -#define REQUIRED_CBA_VERSION {3,11,1} +#define REQUIRED_CBA_VERSION {3,11,2} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index d2cc5e90d0b..5052582c9da 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -512,6 +512,7 @@ Disablita BFT 关闭友军踪迹 關閉友軍蹤跡 + Отключить BFT Always disable Blue Force Tracking for this group. @@ -523,6 +524,7 @@ Disabilita sempre il Blue Force Tracking per questo gruppo. 对此小队永远关闭友军踪迹显示 對此小隊永遠關閉友軍蹤跡顯示 + Всегда отключать Blue Force Tracking для этой группы diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index f0fdd8f1865..c22c654bfbd 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -211,6 +211,7 @@ Disegna linee dritte con gli strumenti di mappatura 使用地图工具来绘制直线 使用地圖工具來繪製直線 + Прямые линии с инструментами карты Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete. @@ -222,6 +223,7 @@ Disegna sul bordo degli strumenti di mappatura per disegnare linee dritte. Nota: Deve spostarsi al centro per essere cancellato. 使用地图工具的边缘来绘制直线。备注: 要删除直线时,请把滑鼠移动到该线条的中央即可删除该线。 使用地圖工具的邊緣來繪製直線。備註: 要刪除直線時,請把滑鼠移動到該線條的中央即可刪除該線 + Рисуйте по краю инструмента карты, чтобы провести прямые линии. Примечание: при удалении линии размещайте курсор над ее серединой diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 4c1e4d1c3b5..ddb2267645f 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -26,6 +26,7 @@ 标志 맵마커 Znaczniki + Маркеры Allow moving markers for @@ -36,6 +37,7 @@ 谁可以移动标志 Permetti di spostare i marcatori a: Zezwól na poruszanie znaczników dla + Разрешить перемещение маркеров для Restricts which players are able to move markers while holding the Alt key. @@ -46,6 +48,7 @@ 设定谁可以透过按住Alt键来移动标志。 Limita quali giocatori possono spostare i marcatori mentre premono il tasto Alt. Ogranicz którzy gracze mogą poruszać znacznikami podczas trzymania przycisku Alt. + Устанавливает ограничение на перемещения маркеров игроками при помощи клавиши Alt Nobody @@ -56,6 +59,7 @@ 没有人 Nessuno Nikt + Никого All players @@ -66,6 +70,7 @@ 所有玩家 모든 플레이어 Wszyscy gracze + Всех игроков Admins @@ -76,6 +81,7 @@ 管理员 관리자 Administratorzy + Админов Group leaders @@ -86,6 +92,7 @@ 小队长 분대장 Przywódcy grup + Лидеров групп Group leaders and Admins @@ -96,12 +103,14 @@ 小队长与管理员 분대장과 관리자 Przywódcy grup i Administratorzy + Лидеров групп и Админов Creator Ersteller 設置者 Twórca + Создателя diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml index 4b0a83cc947..3b089fd42ba 100644 --- a/addons/maverick/stringtable.xml +++ b/addons/maverick/stringtable.xml @@ -11,6 +11,7 @@ AGM-65"小牛"空地L型,雷射导引对地导弹 AGM-65 Maverick L, 레이저 유도 대지 미사일 AGM-65 Maverick L, Kierowany laserowo pocisk powietrze-ziemia + AGM-65 Maverick L, ракета Воздух-Земля с лазерным наведением AGM-65 Maverick L [ACE] @@ -21,6 +22,7 @@ AGM-65"小牛"空地L型 [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] + AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] @@ -31,6 +33,7 @@ 2x AGM-65"小牛"空地L型 [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] + 2x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] @@ -41,6 +44,7 @@ 3x AGM-65"小牛"空地L型 [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] + 3x AGM-65 Maverick L [ACE] Laser Guided @@ -51,6 +55,7 @@ 雷射导引 레이저 유도 Kierowany laserowo + С лазерным наведением Kh-25ML, Laser Guided Air-to-Ground-Missile @@ -61,6 +66,7 @@ Kh-25ML、レーザー誘導対地ミサイル Kh-25ML, a Guida Laser Missile Aria-Terra Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia + Х-25МЛ, ракета Воздух-Земля с лазерным наведением 1x Kh-25ML [ACE] @@ -84,6 +90,7 @@ AGM-65"小牛"飞弹L型 AGM-65 Maverick L AGM-65 Maverick L + AGM-65 Maverick L Kh-25ML diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index aac77adab91..2ebebbbd3df 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -11,7 +11,44 @@ PREP_RECOMPILE_END; // Add warning for old functions that were technically public, Remove at 3.14.0 { missionNamespace setVariable [_x, compileFinal format ['diag_log text "ACE Medical WARNING: Formerly public function [%1] has no effect in medical rewrite."; nil', _x]]; -} forEach ["ace_medical_fnc_actionPlaceInBodyBag","ace_medical_fnc_actionRemoveTourniquet","ace_medical_fnc_addHeartRateAdjustment","ace_medical_fnc_addToLog","ace_medical_fnc_addToTriageCard -","ace_medical_fnc_addUnconsciousCondition","ace_medical_fnc_addVitalLoop","ace_medical_fnc_canAccessMedicalEquipment","ace_medical_fnc_canTreat","ace_medical_fnc_displayTriageCard","ace_medical_fnc_dropDownTriageCard","ace_medical_fnc_getTriageStatus","ace_medical_fnc_getUnconsciousCondition","ace_medical_fnc_hasItem","ace_medical_fnc_hasItems","ace_medical_fnc_hasTourniquetAppliedTo","ace_medical_fnc_isInMedicalFacility","ace_medical_fnc_isInMedicalVehicle","ace_medical_fnc_isMedic","ace_medical_fnc_isMedicalVehicle","ace_medical_fnc_itemCheck","ace_medical_fnc_selectionNameToNumber","ace_medical_fnc_setCardiacArrest","ace_medical_fnc_setDead","ace_medical_fnc_setHitPointDamage","ace_medical_fnc_showBloodEffect","ace_medical_fnc_treatment","ace_medical_fnc_treatmentAdvanced_bandage","ace_medical_fnc_treatmentAdvanced_CPR","ace_medical_fnc_treatmentAdvanced_CPRLocal","ace_medical_fnc_treatmentAdvanced_medication","ace_medical_fnc_treatmentAdvanced_medicationLocal","ace_medical_fnc_treatmentIV","ace_medical_fnc_treatmentIVLocal","ace_medical_fnc_unconsciousPFH","ace_medical_fnc_useItem","ace_medical_fnc_useItems"]; +} forEach [ + QFUNC(actionPlaceInBodyBag), + QFUNC(actionRemoveTourniquet), + QFUNC(addHeartRateAdjustment), + QFUNC(addToLog), + QFUNC(addToTriageCard), + QFUNC(addUnconsciousCondition), + QFUNC(addVitalLoop), + QFUNC(canAccessMedicalEquipment), + QFUNC(canTreat), + QFUNC(displayTriageCard), + QFUNC(dropDownTriageCard), + QFUNC(getTriageStatus), + QFUNC(getUnconsciousCondition), + QFUNC(hasItem), + QFUNC(hasItems), + QFUNC(hasTourniquetAppliedTo), + QFUNC(isInMedicalFacility), + QFUNC(isInMedicalVehicle), + QFUNC(isMedic), + QFUNC(isMedicalVehicle), + QFUNC(itemCheck), + QFUNC(selectionNameToNumber), + QFUNC(setCardiacArrest), + QFUNC(setDead), + QFUNC(setHitPointDamage), + QFUNC(showBloodEffect), + QFUNC(treatment), + QFUNC(treatmentAdvanced_bandage), + QFUNC(treatmentAdvanced_CPR), + QFUNC(treatmentAdvanced_CPRLocal), + QFUNC(treatmentAdvanced_medication), + QFUNC(treatmentAdvanced_medicationLocal), + QFUNC(treatmentIV), + QFUNC(treatmentIVLocal), + QFUNC(unconsciousPFH), + QFUNC(useItem), + QFUNC(useItems) +]; ADDON = true; diff --git a/addons/medical/dev/watchVariable.sqf b/addons/medical/dev/watchVariable.sqf index dc97952e0c0..5fc0b1a065f 100644 --- a/addons/medical/dev/watchVariable.sqf +++ b/addons/medical/dev/watchVariable.sqf @@ -60,7 +60,7 @@ _return pushBack format ["Hitpoints: [HHed:%1] [HBod: %2]", (_unit getHitPointDamage "HitHead") toFixed 2, (_unit getHitPointDamage "HitBody") toFixed 2]; _return pushBack format ["[HHnd:%1] [HLeg: %2] %3", (_unit getHitPointDamage "HitHands") toFixed 2, (_unit getHitPointDamage "HitLegs") toFixed 2, _limping]; - private _fractures = _unit getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; + private _fractures = GET_FRACTURES(_unit); private _canSprint = if (isSprintAllowed _unit) then {""} else {"[Sprint Blocked]"}; _return pushBack format ["Fractures: %1 %2", _fractures, _canSprint]; @@ -75,7 +75,7 @@ _return pushBack format ["%1 [Time On: %2]", ALL_SELECTIONS select _tPartNum, (CBA_missionTime - _x) toFixed 1]; }; { - _x params ["", "_medClassname", "_medPartNum"]; + _x params ["_medPartNum", "_medClassname"]; if (_medPartNum == _tPartNum) then { _return pushBack format [" - Occluded Med: %1", _medClassname]; }; @@ -154,4 +154,3 @@ // Return: _return joinString "
" }, [40]] call EFUNC(common,watchVariable); - diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 618432a5fcd..a073c9e9ebd 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -2,7 +2,6 @@ /* * Author: Glowbal * Sets a unit in the unconscious state. - * For Public Use * * Arguments: * 0: The unit that will be put in an unconscious state @@ -17,7 +16,7 @@ * [bob, true] call ace_medical_fnc_setUnconscious; * [player, true, 5, true] call ace_medical_fnc_setUnconscious; * - * Public: yes + * Public: Yes */ // only run this after the settings are initialized diff --git a/addons/medical/initSettings.sqf b/addons/medical/initSettings.sqf index f1eb85bc92d..4fc473949fa 100644 --- a/addons/medical/initSettings.sqf +++ b/addons/medical/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), "?"]; +private _categoryArray = [LELSTRING(medical,Category), "?"]; // todo: Check the description is still accurate [ diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 1abe1433931..44bdee2faad 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -2,7 +2,7 @@ #define COMPONENT_BEAUTIFIED Medical Core #include "\z\ace\addons\main\script_mod.hpp" -// #define DEBUG_MODE_FULL +#define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index b56472398e0..cce9a8705ca 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,7 +1,7 @@ - + ACE Medical ACE: медицина ACE Opcje medyczne @@ -440,28 +440,17 @@ 设定当距离超过%1将不能使用治疗动作 設定當距離超過%1將不能使用治療動作 - - This person (%1) is awake and cannot be loaded - Diese Person (%1) ist wach und kann nicht verladen werden - Ta osoba (%1) jest przytomna i nie może zostać załadowana - Esta persona (%1) está despierto y no puede ser cargado - Боец (%1) в сознании и не может быть погружен - Esta pessoa (%1) está acordada e não pode ser carregada - Tato osoba (%1) je vzhůru a nemůže být naložena - Questa persona (%1) è sveglia e non può essere caricata. - %1 est conscient et ne peut être embarqué. - 患者 (%1) は意識があり、積み込めない - 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 - 此人(%1)是清醒且不能被装载 - 此人(%1)是清醒且不能被裝載 - Unconscious Wake Up Chance + Wahrscheinlichkeit aufzuwachen 気絶から覚醒する可能性 + Шанс очнуться при потере сознания Probablity that a unit with stable vitals will wake up from unconscious [Checked every 15 sec] + Wahrscheinlichkeit, dass eine bewusstlose Person mit stabilen Vitalwerten wieder aufwacht [Überprüfung alle 15 Sekunden] 安定状態にある人が覚醒する確率です。(15 秒毎に確認) + Вероятность, что стабилизированный юнит очнется от потери сознания [Проверяется каждые 15 сек] Open lid @@ -472,6 +461,7 @@ 打开盖子 뚜껑 열기 Otwórz pokrywę + Открыть крышку Close lid @@ -482,30 +472,39 @@ 关闭盖子 뚜껑 닫기 Zamknij pokrywę + Закрыть крышку Limping + Хромота Limp when unit has leg wounds...(todo) + Хромота, когда юнит имеет ранения ног... Limp on open wounds + Хромота при открытых ранах Limp on open or bandaged wounds + Хромота при открытых или забинтованых ранах - Fractues + Fractures + Переломы Limp fractures... (todo) + Хромота при переломах... Splints fully heal fractures + Шины полностью лечат перелом Splints heal (but cannot sprint) + Шины вылечивают, но не дают бегать diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 72a41161374..0a2587cd003 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -26,7 +26,7 @@ private _animConfig = if (_isBandage) then { configFile >> "ACE_Medical_Actions" >> "Basic" >> "Morphine"; }; -private _configProperty = "animationCaller"; +private _configProperty = "animationMedic"; if (_isSelfTreatment) then { _configProperty = _configProperty + "Self"; }; diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index a8fcb2cca4b..0230a64b085 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -4,20 +4,26 @@ ACE Medical - AI ACE 医療 - AI + ACE Медицина - ИИ + ACE Sanitäts - KI Medic AI + Sanitäts KI AI 衛生兵 + ИИ Медик AI will respond to injury and unconsciousness + KI reagiert auf Verletzungen und Bewusstlosigkeit AI が負傷者と気絶している人に対して行動するようになります。 + ИИ будет реагировать на травмы и потерю сознания Only Server and HC Nur Server und HC Sólo Server y HC - Нур сервера унд HC + Только сервер и HC サーバーと HC のみ Tylko serwer i HC Seulement sur le server ou le HC diff --git a/addons/medical_blood/initSettings.sqf b/addons/medical_blood/initSettings.sqf index e743002ffa7..2ba5edccbf9 100644 --- a/addons/medical_blood/initSettings.sqf +++ b/addons/medical_blood/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical_blood]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; +private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; [ QGVAR(enabledFor), "LIST", diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 8d8556ca673..f36f8abf31a 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -3,7 +3,9 @@ Bleeding Effect + Blutungseffekt 出血中の効果 + Эффекты кровотечения Only Players @@ -15,6 +17,7 @@ Solo Giocatori 只有玩家 只有玩家 + Только игроки Enable Blood Drops @@ -26,6 +29,7 @@ Abilita Perdite di Sangue 开启血液滴落效果 開啟血液滴落效果 + Разрешить капли крови Enable or disable Blood Drops created on bleeding and taking damage @@ -37,6 +41,7 @@ 开启后, 会让受伤时伤口有血液滴落的效果 開啟後, 會讓受傷時傷口有血液滴落的效果 출혈이나 부상을 입었을 때, 떨어지는 혈액을 활성화 하거나 비활성화 합니다. + Включает или отключает капли крови при кровотечении и получении урона diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf index 87fd6ef42e8..4a05b75e2c4 100644 --- a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf +++ b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf @@ -136,9 +136,9 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra case (_causeFracture && {EGVAR(medical,fractures) > 0} && {_bodyPartNToAdd > 1} && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD}): { TRACE_1("limb fracture",_bodyPartNToAdd); // todo: play sound? - private _fractures = _unit getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; + private _fractures = GET_FRACTURES(_unit); _fractures set [_bodyPartNToAdd, 1]; - _unit setVariable [QEGVAR(medical,fractures), _fractures, true]; + _unit setVariable [VAR_FRACTURES, _fractures, true]; [QEGVAR(medical,fracture), [_unit, _bodyPartNToAdd]] call CBA_fnc_localEvent; // local event for fracture _updateDamageEffects = true; }; diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index 88a1283cf71..0982be17d2d 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical_damage]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; +private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; [ QEGVAR(medical,playerDamageThreshold), "SLIDER", diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 8640a6a42fc..2a1c94c6a43 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -4,7 +4,9 @@ Damage Threshold + Schaden 損傷のしきい値 + Порог повреждения Player Damage diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf index dffe7f2ebc7..6fa09effcc2 100644 --- a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf +++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf @@ -23,7 +23,7 @@ if (!local _unit) exitWith { ERROR("Unit not local or null"); }; private _isLimping = false; if (EGVAR(medical,fractures) > 0) then { - private _fractures = _unit getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; + private _fractures = GET_FRACTURES(_unit); TRACE_1("",_fractures); if (((_fractures select 4) == 1) || {(_fractures select 5) == 1}) then { TRACE_1("limping because of fracture",_fractures); diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index 7f17a19161d..a56e357fe1d 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -2,7 +2,6 @@ // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS - #define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"] #define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] #define ALL_HITPOINTS ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] @@ -97,6 +96,8 @@ #define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0] +#define DEFAULT_FRACTURE_VALUES [0,0,0,0,0,0] + // Triage colors, for consistency across UIs and functions #define TRIAGE_COLOR_NONE 0, 0, 0, 0.9 #define TRIAGE_COLOR_MINIMAL 0, 0.5, 0, 0.9 @@ -110,25 +111,29 @@ #define TRIAGE_TEXT_COLOR_IMMEDIATE 1, 1, 1, 1 #define TRIAGE_TEXT_COLOR_DECEASED 1, 1, 1, 1 +// Medical activity logs +#define MED_LOG_MAX_ENTRIES 8 +#define MED_LOG_VARNAME(type) (format [QEGVAR(medical,log_%1), type]) + // - Unit Variables ---------------------------------------------------- // These variables get stored in object space and used across components // Defined here for easy consistency with GETVAR/SETVAR (also a list for reference) -#define VAR_BLOOD_PRESS QEGVAR(medical,bloodPressure) -#define VAR_BLOOD_VOL QEGVAR(medical,bloodVolume) +#define VAR_BLOOD_PRESS QEGVAR(medical,bloodPressure) +#define VAR_BLOOD_VOL QEGVAR(medical,bloodVolume) #define VAR_WOUND_BLEEDING QEGVAR(medical,woundBleeding) -#define VAR_CRDC_ARRST QEGVAR(medical,inCardiacArrest) -#define VAR_HEART_RATE QEGVAR(medical,heartRate) -#define VAR_PAIN QEGVAR(medical,pain) -#define VAR_PAIN_SUPP QEGVAR(medical,painSuppress) -#define VAR_PERIPH_RES QEGVAR(medical,peripheralResistance) -#define VAR_UNCON "ACE_isUnconscious" +#define VAR_CRDC_ARRST QEGVAR(medical,inCardiacArrest) +#define VAR_HEART_RATE QEGVAR(medical,heartRate) +#define VAR_PAIN QEGVAR(medical,pain) +#define VAR_PAIN_SUPP QEGVAR(medical,painSuppress) +#define VAR_PERIPH_RES QEGVAR(medical,peripheralResistance) +#define VAR_UNCON "ACE_isUnconscious" // These variables track gradual adjustments (from medication, etc.) -#define VAR_MEDICATIONS QEGVAR(medical,medications) +#define VAR_MEDICATIONS QEGVAR(medical,medications) // These variables track the current state of status values above -#define VAR_HEMORRHAGE QEGVAR(medical,hemorrhage) -#define VAR_IN_PAIN QEGVAR(medical,inPain) -#define VAR_TOURNIQUET QEGVAR(medical,tourniquets) - +#define VAR_HEMORRHAGE QEGVAR(medical,hemorrhage) +#define VAR_IN_PAIN QEGVAR(medical,inPain) +#define VAR_TOURNIQUET QEGVAR(medical,tourniquets) +#define VAR_FRACTURES QEGVAR(medical,fractures) // - Unit Functions --------------------------------------------------- // Retrieval macros for common unit values @@ -140,6 +145,7 @@ #define GET_PAIN(unit) (unit getVariable [VAR_PAIN,0]) #define GET_PAIN_SUPPRESS(unit) (unit getVariable [VAR_PAIN_SUPP,0]) #define GET_TOURNIQUETS(unit) (unit getVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES]) +#define GET_FRACTURES(unit) (unit getVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES]) #define IN_CRDC_ARRST(unit) (unit getVariable [VAR_CRDC_ARRST,false]) #define IS_BLEEDING(unit) (GET_WOUND_BLEEDING(unit) > 0) #define IS_IN_PAIN(unit) (unit getVariable [VAR_IN_PAIN,false]) diff --git a/addons/medical_feedback/initSettings.sqf b/addons/medical_feedback/initSettings.sqf index 9dd0e957c40..e22a953f76f 100644 --- a/addons/medical_feedback/initSettings.sqf +++ b/addons/medical_feedback/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical_feedback]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; +private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; [ QGVAR(painEffectType), diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml index 631e005e436..818a535d902 100644 --- a/addons/medical_feedback/stringtable.xml +++ b/addons/medical_feedback/stringtable.xml @@ -4,7 +4,9 @@ Feedback + Feedback フィードバック + Реакция на ранения Enable Screams @@ -55,11 +57,15 @@ White flashing + Weißes blinken 白く点滅 + Белые вспышки Pulsing blur + Wiederkehrende Unschärfe ボケの強弱 + Пульсирующее размытие diff --git a/addons/medical_gui/CfgVehicles.hpp b/addons/medical_gui/CfgVehicles.hpp index 3d11924bf3c..eecae9a3596 100644 --- a/addons/medical_gui/CfgVehicles.hpp +++ b/addons/medical_gui/CfgVehicles.hpp @@ -44,11 +44,11 @@ class CfgVehicles { #include "InteractionBodyParts.hpp" #undef ACTION_CONDITION }; - class ACE_LoadPatient { + class ACE_LoadPatient { displayName = CSTRING(LoadPatient); condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {alive _target} && {vehicle _target == _target}); exceptions[] = {"isNotDragging", "isNotCarrying"}; - statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,actionLoadUnit)); + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,loadUnit)); icon = QPATHTOF(ui\cross.paa); insertChildren = QUOTE(call DEFUNC(medical_treatment,addLoadPatientActions)); }; @@ -56,7 +56,7 @@ class CfgVehicles { displayName = CSTRING(UnloadPatient); condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {vehicle _target != _target} && {vehicle _player == _player}); exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside"}; - statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,actionUnloadUnit)); + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,unloadUnit)); icon = QPATHTOF(ui\cross.paa); }; }; diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf index 25f87f93ce1..ac76d340125 100644 --- a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf @@ -53,7 +53,7 @@ if (isNull _display) then { // Update activity log private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; - private _activityLog = _target getVariable [QEGVAR(medical,logFile_activity_view), []]; + private _activityLog = _target getVariable [MED_LOG_VARNAME("activity"), []]; [_ctrlActivityLog, _activityLog] call FUNC(updateLogList); // Update triage status diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf index 9d24ffd6d39..2a12ede13c3 100644 --- a/addons/medical_gui/functions/fnc_menuPFH.sqf +++ b/addons/medical_gui/functions/fnc_menuPFH.sqf @@ -44,11 +44,11 @@ private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; // Update activity and quick view logs private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; -private _activityLog = GVAR(target) getVariable [QEGVAR(medical,logFile_activity_view), []]; +private _activityLog = GVAR(target) getVariable [MED_LOG_VARNAME("activity"), []]; [_ctrlActivityLog, _activityLog] call FUNC(updateLogList); private _ctrlQuickView = _display displayCtrl IDC_QUICKVIEW; -private _quickView = GVAR(target) getVariable [QEGVAR(medical,logFile_quick_view), []]; +private _quickView = GVAR(target) getVariable [MED_LOG_VARNAME("quick_view"), []]; [_ctrlQuickView, _quickView] call FUNC(updateLogList); // Update triage status diff --git a/addons/medical_gui/functions/fnc_onMenuOpen.sqf b/addons/medical_gui/functions/fnc_onMenuOpen.sqf index be4707918f7..b6c326f5901 100644 --- a/addons/medical_gui/functions/fnc_onMenuOpen.sqf +++ b/addons/medical_gui/functions/fnc_onMenuOpen.sqf @@ -42,3 +42,32 @@ if (GVAR(menuPFH) != -1) exitWith { }; GVAR(menuPFH) = [FUNC(menuPFH), 0, []] call CBA_fnc_addPerFrameHandler; + +// Hide categories if they don't have any actions (airway) +private _list = [ + [IDC_TRIAGE, true], + [IDC_EXAMINE, true], + [IDC_BANDAGE, "bandage"], + [IDC_MEDICATION, "medication"], + [IDC_AIRWAY, "airway"], + [IDC_ADVANCED, "advanced"], + [IDC_DRAG, "drag"], + [IDC_TOGGLE, true] +]; +private _countEnabled = { + _x params ["", "_category"]; + if (_category isEqualType "") then { _x set [1, (GVAR(actions) findIf {_category == _x select 1}) > -1]; }; + _x select 1 +} count _list; +private _offsetX = POS_X(1.5) + 0.5 * (POS_X(12) - POS_X(_countEnabled * 1.5)); +{ + _x params ["_idc", "_enabled"]; + private _ctrl = _display displayCtrl _idc; + if (_enabled) then { + _ctrl ctrlSetPositionX _offsetX; + _ctrl ctrlCommit 0; + _offsetX = _offsetX + POS_W(1.5); + } else { + _ctrl ctrlShow false; + }; +} forEach _list; diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf index 8093286eea4..7f08e9bddfe 100644 --- a/addons/medical_gui/functions/fnc_updateBodyImage.sqf +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -20,7 +20,7 @@ params ["_ctrlGroup", "_target"]; // Get tourniquets, damage, and blood loss for target private _tourniquets = GET_TOURNIQUETS(_target); -private _fractures = _target getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; +private _fractures = GET_FRACTURES(_target); private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]]; private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; @@ -38,18 +38,19 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; private _ctrlTourniquet = _ctrlGroup controlsGroupCtrl _tourniquetIDC; _ctrlTourniquet ctrlShow _hasTourniquet; }; + // Show or hide fractrue/bones if (_fractureIDC != -1) then { private _ctrlBone = _ctrlGroup controlsGroupCtrl _fractureIDC; switch (_fractures select _forEachIndex) do { - case (0): { + case 0: { _ctrlBone ctrlShow false; }; - case (1): { + case 1: { _ctrlBone ctrlShow true; _ctrlBone ctrlSetTextColor [1, 0, 0, 1]; }; - case (-1): { + case -1: { if (EGVAR(medical,fractures) == 2) then { _ctrlBone ctrlShow true; _ctrlBone ctrlSetTextColor [0, 0, 1, 1]; @@ -74,8 +75,8 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; } forEach [ [IDC_BODY_HEAD], [IDC_BODY_TORSO], - [IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B], + [IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B], [IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_T, IDC_BODY_ARMRIGHT_B], - [IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B], + [IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B], [IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B] ]; diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf index 39a8120f368..736be6eba16 100644 --- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -58,10 +58,14 @@ switch (GET_HEMORRHAGE(_target)) do { if (HAS_TOURNIQUET_APPLIED_ON(_target,_selectionN)) then { _entries pushBack [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; }; -switch ((_target getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]) select _selectionN) do { - case (1): {_entries pushBack [localize LSTRING(Status_Fractured), [1, 0, 0, 1]];}; - case (-1): { - if (EGVAR(medical,fractures) == 2) then { // Ignore if the split has no effect + +// Indicate current body part fracture status +switch (GET_FRACTURES(_target) select _selectionN) do { + case 1: { + _entries pushBack [localize LSTRING(Status_Fractured), [1, 0, 0, 1]]; + }; + case -1: { + if (EGVAR(medical,fractures) == 2) then { // Ignore if the splint has no effect _entries pushBack [localize LSTRING(Status_SplintApplied), [1, 1, 1, 1]]; }; }; diff --git a/addons/medical_gui/functions/fnc_updateLogList.sqf b/addons/medical_gui/functions/fnc_updateLogList.sqf index 731b3587964..fb836406989 100644 --- a/addons/medical_gui/functions/fnc_updateLogList.sqf +++ b/addons/medical_gui/functions/fnc_updateLogList.sqf @@ -21,7 +21,7 @@ params ["_ctrl", "_logs"]; lbClear _ctrl; { - _x params ["_message", "_moment", "", "_arguments"]; + _x params ["_message", "_timeStamp", "_arguments"]; // Localize message and arguments if (isLocalized _message) then { @@ -33,5 +33,5 @@ lbClear _ctrl; // Format message with arguments _message = format ([_message] + _arguments); - _ctrl lbAdd format ["%1 %2", _moment, _message]; + _ctrl lbAdd format ["%1 %2", _timeStamp, _message]; } forEach _logs; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index 6066d073afe..245b3fd5ca9 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -2,7 +2,7 @@ QGVAR(enableActions), "LIST", [LSTRING(EnableActions_DisplayName), LSTRING(EnableActions_Description)], - LSTRING(Category), + [ELSTRING(medical,Category), LSTRING(SubCategory)], [[0, 1, 2], [LSTRING(Selections3D), LSTRING(Radial), ELSTRING(common,Disabled)], 0], false ] call CBA_settings_fnc_init; @@ -11,7 +11,7 @@ QGVAR(enableSelfActions), "CHECKBOX", [LSTRING(EnableSelfActions_DisplayName), LSTRING(EnableSelfActions_Description)], - LSTRING(Category), + [ELSTRING(medical,Category), LSTRING(SubCategory)], true, false ] call CBA_settings_fnc_init; @@ -20,7 +20,7 @@ QGVAR(enableMedicalMenu), "LIST", [LSTRING(EnableMedicalMenu_DisplayName), LSTRING(EnableMedicalMenu_Description)], - LSTRING(Category), + [ELSTRING(medical,Category), LSTRING(SubCategory)], [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), ELSTRING(common,VehiclesOnly)], 1], false ] call CBA_settings_fnc_init; @@ -29,7 +29,7 @@ QGVAR(openAfterTreatment), "CHECKBOX", [LSTRING(OpenAfterTreatment_DisplayName), LSTRING(OpenAfterTreatment_Description)], - LSTRING(Category), + [ELSTRING(medical,Category), LSTRING(SubCategory)], true, false ] call CBA_settings_fnc_init; @@ -38,7 +38,7 @@ QGVAR(maxDistance), "SLIDER", [LSTRING(MaxDistance_DisplayName), LSTRING(MaxDistance_Description)], - LSTRING(Category), + [ELSTRING(medical,Category), LSTRING(SubCategory)], [0, 10, 3, 1], false ] call CBA_settings_fnc_init; diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp index c4c7aafcd82..04565dc5b65 100644 --- a/addons/medical_gui/script_component.hpp +++ b/addons/medical_gui/script_component.hpp @@ -69,8 +69,8 @@ #define IDC_BODY_LEGRIGHT_T 6050 #define IDC_BODY_ARMLEFT_B 6055 #define IDC_BODY_ARMRIGHT_B 6060 -#define IDC_BODY_LEGRIGHT_B 6065 -#define IDC_BODY_LEGLEFT_B 6070 +#define IDC_BODY_LEGLEFT_B 6065 +#define IDC_BODY_LEGRIGHT_B 6070 #define IDC_TRIAGE_STATUS 7000 #define IDC_TRIAGE_SELECT 7100 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index 2186c10072d..89fdbade4f7 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -3,15 +3,21 @@ ACE Medical GUI + Sanitätsmenü ACE 医療 GUI + ACE Медицина - Интерфейс Enable Medical Actions + Aktiviere Sanitätsaktionen 医療行為を有効化 + Разрешить Медицинские действия Enables medical actions for the Interaction Menu and selects their style. + Aktiviert die Sanitätsaktionen für das Interaktionsmenü und legt das Aussehen fest インタラクション メニューから選択した表示方式で医療行為をできるようになります。 + Включает медицинские действия для меню взаимодействия и выбирает их стиль. Selections (3D) @@ -47,35 +53,51 @@ Enable Medical Self Actions + Medizinische Selbst-Interaktionen anzeigen 自分への医療行為を有効化 + Разрешить Медицинские действия на себе Enables medical actions for the Self Interaction Menu. + Medizinische Interaktionen bei Selbst-Interaktionen anzeigen セルフ インタラクション メニューで医療行為をできるようになります。 + Включает медицинские действия для меню взаимодействия с собой. Enable Medical Menu + Aktiviere das Sanitätsmenü 医療メニューを有効化 + Разрешить Медицинское меню Enables the use of the Medical Menu through the keybind or interaction menu. + Aktiviere die Nutzung des Sanitätsmenüs durch eine Tastenkombination oder durch das Interaktionsmenü 割り当てられたキーかインタラクション メニューから医療メニューを使えるようになります。 + Позволяет использовать Медицинское меню через связку клавиш или меню взаимодействия. Reopen Medical Menu + Sanitätsmenü wieder öffnen 医療メニューの再使用 + Открывать меню после лечения Reopen the Medical Menu after successful treatment. + Öffne das Sanitätsmenü nach einer Behandlung 治療が成功した後に、再度医療メニューを開きます。 + Открывает Медицинское меню после успешного лечения Maximum Distance + Maximale Entfernung 最大距離 + Макс. дистанция Maximum distance from which the Medical Menu can be opened. + Maximale Entfernung, um das Sanitätsmenü zu öffnen. 治療メニューを開いたままにできる最大距離を決定します。 + Максимальное расстояние, с которого можно открыть Медицинское меню. Medical @@ -788,16 +810,20 @@ Fractured + Перелом Splint Applied + Наложена шина Lost some blood + Hat etwas Blut verloren いくらか失血している + Небольшая кровопотеря Lost a lot of blood @@ -817,11 +843,15 @@ Lost a large amount of blood + Hat eine sehr große Menge Blut verloren かなり酷く大量失血している + Огромная кровопотеря Lost a fatal amount of blood + Hat eine kritische Menge an Blut verloren 致命的な程失血している + Фатальная кровопотеря Tourniquet [CAT] diff --git a/addons/medical_statemachine/initSettings.sqf b/addons/medical_statemachine/initSettings.sqf index 268902a0f1e..34f5b487bb9 100644 --- a/addons/medical_statemachine/initSettings.sqf +++ b/addons/medical_statemachine/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical_statemachine]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; +private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; [ QGVAR(fatalInjuryCondition), "LIST", diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 08c6267cdfd..f9940d30ea4 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -4,43 +4,63 @@ States + Zustände 状態 + Состояния Fatal Injury Player + Tödliche Spielerverletzungen 致命傷プレイヤー + Смертельные ранения игрока Defines when Player can receive a fatal injury + Definiert wann ein Spieler tödliche Verletzungen bekommen kann プレイヤーが致命傷から蘇生できるかどうか決定します + Определяет, когда игрок может получить смертельное ранение Instant death AI + Direkter Tod KI AI の即死 + Мгновенная смерть ИИ Defines if AI will be able to die instantly + Legt fest, ob eine KI direkt sterben kann AI が即死できるかどうか決定します + Определяет, сможет ли ИИ мгновенно умереть Forbid unconscious AI + Verhindere KI-Bewusstlosigkeit AI の気絶を禁止 + Запретить потерю сознания ИИ Defines if AI will be denied to go unconscious and will die instead + Legt fest, ob eine KI bewusstlos wird oder stirbt AI が気絶すると、即時に死亡するかどうか決定します + Определяет, потеряет ли ИИ сознание или вместо этого умрет In Cardiac Arrest + Herzstillstand 心停止中 + При остановке сердца Cardiac Arrest time (seconds) + Zeit bis zum Herzstillstand (Sekunden) 心停止時間 (秒) + Длительность остановки сердца (сек) Defines how long it takes to die from cardiac arrest? + Legt fest, wie lang es dauert, bis man an einem Herzstillstand stirbt 心停止がどのくらい続けば死亡するようにしますか? + Определяет, сколько времени требуется, чтобы умереть от остановки сердца AI Unconsciousness diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf index 95d587778fb..859ea83e80b 100644 --- a/addons/medical_status/functions/fnc_initUnit.sqf +++ b/addons/medical_status/functions/fnc_initUnit.sqf @@ -50,7 +50,7 @@ if (_isRespawn) then { _unit setVariable [QEGVAR(medical,bandagedWounds), [], true]; _unit setVariable [QEGVAR(medical,stitchedWounds), [], true]; _unit setVariable [QEGVAR(medical,isLimping), false, true]; - _unit setVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0], true]; + _unit setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; // - Misc --------------------------------------------------------------------- _unit setVariable [VAR_UNCON, false, true]; @@ -72,13 +72,6 @@ if (_isRespawn) then { // medication _unit setVariable [VAR_MEDICATIONS, [], true]; - - // TODO move to treatment - private _logs = _unit getVariable [QEGVAR(medical,allLogs), []]; - { - _unit setVariable [_x, nil]; - } forEach _logs; - _unit setVariable [QEGVAR(medical,allLogs), [], true]; }; [{ diff --git a/addons/medical_status/initSettings.sqf b/addons/medical_status/initSettings.sqf index 1118973f375..32d6193a7d4 100644 --- a/addons/medical_status/initSettings.sqf +++ b/addons/medical_status/initSettings.sqf @@ -1,6 +1,6 @@ // CBA Settings [ADDON: ace_medical_status]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; +private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; [ QEGVAR(medical,bleedingCoefficient), "SLIDER", diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml index 590f3dc86be..b41d6924ca1 100644 --- a/addons/medical_status/stringtable.xml +++ b/addons/medical_status/stringtable.xml @@ -4,7 +4,9 @@ Status + Zustand 状態 + Статус Bleeding coefficient @@ -72,11 +74,15 @@ IV Transfusion Flow Rate + Transfusions Fließrate IV 輸血の流量 + Скорость внутривенного переливания Effects how quickly IV Bags will have effect + Wie schnell der Effekt der Transfusion eintritt IV による輸血速度を変更できます + Определяет, насколько быстро подействуют эффекты внутривенного переливания diff --git a/addons/medical_treatment/ACE_Medical_Treatment.hpp b/addons/medical_treatment/ACE_Medical_Treatment.hpp index 88a2e46663b..19181287a8b 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment.hpp @@ -582,7 +582,7 @@ class ADDON { timeInSystem = 1800; timeTillMaxEffect = 30; maxDose = 4; - inCompatableMedication[] = {}; + incompatibleMedication[] = {}; viscosityChange = -10; }; class Epinephrine { @@ -593,7 +593,7 @@ class ADDON { timeInSystem = 120; timeTillMaxEffect = 10; maxDose = 10; - inCompatableMedication[] = {}; + incompatibleMedication[] = {}; }; class Adenosine { painReduce = 0; @@ -603,7 +603,7 @@ class ADDON { timeInSystem = 120; timeTillMaxEffect = 15; maxDose = 6; - inCompatableMedication[] = {}; + incompatibleMedication[] = {}; }; class Atropine { painReduce = 0; @@ -613,14 +613,14 @@ class ADDON { timeInSystem = 120; timeTillMaxEffect = 15; maxDose = 6; - inCompatableMedication[] = {}; + incompatibleMedication[] = {}; }; class PainKillers { painReduce = 0.1; timeInSystem = 600; timeTillMaxEffect = 60; maxDose = 10; - inCompatableMedication[] = {}; + incompatibleMedication[] = {}; viscosityChange = 5; }; }; diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index d3cd6dbc0b9..2ba1ceaaa59 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -1,39 +1,46 @@ - -class GVAR(Actions) { - // --- bandages +class GVAR(actions) { + // - Bandages ------------------------------------------------------------- class BasicBandage { displayName = CSTRING(Bandage); displayNameProgress = CSTRING(Bandaging); icon = QPATHTOEF(medical_gui,ui\bandage.paa); category = "bandage"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"All"}; + + consumeItem = 1; + items[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}; + + medicRequired = 0; allowSelfTreatment = 1; - requiredMedic = 0; - treatmentTime = QFUNC(getBandageTime); - treatmentTimeSelfCoef = 1; - items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; + allowedSelections[] = {"All"}; condition = QFUNC(canBandage); - itemConsumed = 1; - callbackSuccess = QFUNC(treatmentBandage); - callbackFailure = ""; + treatmentLocations = TREATMENT_LOCATIONS_ALL; + + treatmentTime = QFUNC(getBandageTime); + treatmentTimeSelfCoef = 1; // todo: this isn't used anywhere, remove? + + callbackStart = ""; callbackProgress = ""; + callbackSuccess = QFUNC(bandage); + callbackFailure = ""; + + animationMedic = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationMedicProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationMedicSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; + animationMedicSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; litter[] = { - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} }; }; class FieldDressing: BasicBandage { displayName = CSTRING(Actions_FieldDressing); items[] = {"ACE_fieldDressing"}; litter[] = { - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} }; }; class PackingBandage: BasicBandage { @@ -41,49 +48,51 @@ class GVAR(Actions) { icon = QPATHTOEF(medical_gui,ui\packing_bandage.paa); items[] = {"ACE_packingBandage"}; litter[] = { - {"All", "", {"ACE_MedicalLitter_packingBandage"}}, - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + {"ACE_MedicalLitter_packingBandage"}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} }; }; class ElasticBandage: BasicBandage { displayName = CSTRING(Actions_ElasticBandage); items[] = {"ACE_elasticBandage"}; litter[] = { - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + {}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} }; }; class QuikClot: BasicBandage { displayName = CSTRING(Actions_QuikClot); items[] = {"ACE_quikclot"}; litter[] = { - {"All", "", {"ACE_MedicalLitter_QuickClot"}}, - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + {"ACE_MedicalLitter_QuickClot"}, + {"ACE_MedicalLitter_clean"}, + {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}} }; }; - // --- tourniquet - class Tourniquet: BasicBandage { + // - Tourniquets ---------------------------------------------------------- + class ApplyTourniquet: BasicBandage { displayName = CSTRING(Apply_Tourniquet); displayNameProgress = CSTRING(Applying_Tourniquet); icon = QPATHTOEF(medical_gui,ui\tourniquet.paa); allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; items[] = {"ACE_tourniquet"}; treatmentTime = 7; - callbackSuccess = QFUNC(treatmentTourniquet); - condition = QUOTE(!([ARR_2(_target,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); + condition = QUOTE(!([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); + callbackSuccess = QFUNC(tourniquet); litter[] = {}; }; - class RemoveTourniquet: Tourniquet { + class RemoveTourniquet: ApplyTourniquet { displayName = CSTRING(Actions_RemoveTourniquet); displayNameProgress = CSTRING(RemovingTourniquet); items[] = {}; - callbackSuccess = QFUNC(treatmentTourniquetRemove); - condition = QUOTE([ARR_2(_target,_bodyPart)] call FUNC(hasTourniquetAppliedTo)); + condition = QUOTE([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo)); + callbackSuccess = QFUNC(tourniquetRemove); }; - // --- splint + + // - Splint --------------------------------------------------------------- class Splint: BasicBandage { displayName = CSTRING(Apply_Splint); displayNameProgress = CSTRING(Applying_Splint); @@ -93,11 +102,11 @@ class GVAR(Actions) { items[] = {"ACE_splint"}; treatmentTime = 7; callbackSuccess = QFUNC(splint); - condition = QFUNC(splintCondition); + condition = QFUNC(canSplint); litter[] = {}; }; - // --- syringes + // - Syringes ------------------------------------------------------------- class Morphine: FieldDressing { displayName = CSTRING(Inject_Morphine); displayNameProgress = CSTRING(Injecting_Morphine); @@ -107,35 +116,35 @@ class GVAR(Actions) { items[] = {"ACE_morphine"}; condition = ""; treatmentTime = 5; - callbackSuccess = QFUNC(treatmentMedication); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; + callbackSuccess = QFUNC(medication); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}}; + litter[] = {{"ACE_MedicalLitter_morphine"}}; }; class Adenosine: Morphine { displayName = CSTRING(Inject_Adenosine); displayNameProgress = CSTRING(Injecting_Adenosine); condition = QGVAR(advancedMedication); items[] = {"ACE_adenosine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_adenosine"}} }; + litter[] = {{"ACE_MedicalLitter_adenosine"}}; }; class Atropine: Morphine { displayName = CSTRING(Inject_Atropine); displayNameProgress = CSTRING(Injecting_Atropine); condition = QGVAR(advancedMedication); items[] = {"ACE_atropine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_atropine"}} }; + litter[] = {{"ACE_MedicalLitter_atropine"}}; }; class Epinephrine: Morphine { displayName = CSTRING(Inject_Epinephrine); displayNameProgress = CSTRING(Injecting_Epinephrine); - requiredMedic = QEGVAR(medical,medicSetting_Epi); + medicRequired = QGVAR(medicEpinephrine); items[] = {"ACE_epinephrine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; - treatmentLocations[] = {QEGVAR(medical,useLocation_Epi)}; + treatmentLocations = QGVAR(locationEpinephrine); + litter[] = {{"ACE_MedicalLitter_epinephrine"}}; }; - // --- iv bags + // - IV Bags -------------------------------------------------------------- class BloodIV: BasicBandage { displayName = CSTRING(Actions_Blood4_1000); displayNameProgress = CSTRING(Transfusing_Blood); @@ -143,12 +152,12 @@ class GVAR(Actions) { allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; allowSelfTreatment = QGVAR(allowSelfIV); category = "advanced"; - requiredMedic = 1; + medicRequired = 1; treatmentTime = 12; items[] = {"ACE_bloodIV"}; condition = ""; - callbackSuccess = QFUNC(treatmentIV); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + callbackSuccess = QFUNC(ivBag); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; litter[] = {}; }; class BloodIV_500: BloodIV { @@ -163,7 +172,7 @@ class GVAR(Actions) { displayName = CSTRING(Actions_Plasma4_1000); displayNameProgress = CSTRING(Transfusing_Plasma); items[] = {"ACE_plasmaIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; }; class PlasmaIV_500: PlasmaIV { displayName = CSTRING(Actions_Plasma4_500); @@ -177,7 +186,7 @@ class GVAR(Actions) { displayName = CSTRING(Actions_Saline4_1000); displayNameProgress = CSTRING(Transfusing_Saline); items[] = {"ACE_salineIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; }; class SalineIV_500: SalineIV { displayName = CSTRING(Actions_Saline4_500); @@ -188,23 +197,23 @@ class GVAR(Actions) { items[] = {"ACE_salineIV_250"}; }; - // --- diagnose + // - Diagnose ------------------------------------------------------------- class Diagnose: BasicBandage { displayName = CSTRING(Actions_Diagnose); displayNameProgress = CSTRING(Actions_Diagnosing); icon = ""; category = "examine"; - treatmentLocations[] = {"All"}; + treatmentLocations = TREATMENT_LOCATIONS_ALL; allowedSelections[] = {"Head", "Body"}; - requiredMedic = 0; + medicRequired = 0; treatmentTime = 2.5; items[] = {}; condition = QUOTE(!GVAR(advancedDiagnose)); - callbackSuccess = QFUNC(actionDiagnose); + callbackSuccess = QFUNC(diagnose); callbackFailure = ""; callbackProgress = ""; - animationCaller = ""; // TODO - itemConsumed = 0; + animationMedic = ""; // TODO + consumeItem = 0; litter[] = {}; }; class CheckPulse: Diagnose { @@ -212,40 +221,38 @@ class GVAR(Actions) { displayNameProgress = CSTRING(Check_Pulse_Content); allowedSelections[] = {"All"}; condition = QGVAR(advancedDiagnose); - callbackSuccess = QFUNC(actionCheckPulse); - animationCallerProne = ""; - animationCallerSelfProne = ""; + callbackSuccess = QFUNC(checkPulse); + animationMedicProne = ""; + animationMedicSelfProne = ""; }; class CheckBloodPressure: CheckPulse { displayName = CSTRING(Actions_CheckBloodPressure); displayNameProgress = CSTRING(Check_Bloodpressure_Content); allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; - callbackSuccess = QFUNC(actionCheckBloodPressure); + callbackSuccess = QFUNC(checkBloodPressure); }; class CheckResponse: CheckPulse { displayName = CSTRING(Check_Response); displayNameProgress = CSTRING(Check_Response_Content); allowedSelections[] = {"Head"}; allowSelfTreatment = 0; - callbackSuccess = QFUNC(actionCheckResponse); + callbackSuccess = QFUNC(checkResponse); }; - // --- misc + // - Misc ----------------------------------------------------------------- class BodyBag: BasicBandage { displayName = CSTRING(PlaceInBodyBag); displayNameProgress = CSTRING(PlacingInBodyBag); icon = QPATHTOEF(medical_gui,ui\bodybag.paa); category = "advanced"; - treatmentLocations[] = {"All"}; + treatmentLocations = TREATMENT_LOCATIONS_ALL; allowSelfTreatment = 0; - requiredMedic = 0; + medicRequired = 0; treatmentTime = 15; items[] = {"ACE_bodyBag"}; - condition = "!alive _target"; - callbackSuccess = QFUNC(actionPlaceInBodyBag); - callbackFailure = ""; - callbackProgress = ""; - itemConsumed = 1; + condition = QUOTE(!alive _patient); + callbackSuccess = QFUNC(placeInBodyBag); + consumeItem = 1; litter[] = {}; }; class CPR: BasicBandage { @@ -253,62 +260,64 @@ class GVAR(Actions) { displayNameProgress = CSTRING(Actions_PerformingCPR); icon = ""; category = "advanced"; - treatmentLocations[] = {"All"}; + treatmentLocations = TREATMENT_LOCATIONS_ALL; allowedSelections[] = {"Body"}; allowSelfTreatment = 0; - requiredMedic = 0; + medicRequired = 0; treatmentTime = 15; items[] = {}; - condition = QUOTE(!(_target call EFUNC(common,isAwake)) && {!(_target getVariable [ARR_2('GVAR(receiveCPR)', false)])}); - callbackSuccess = QFUNC(treatmentCPR); - callbackFailure = QFUNC(treatmentCPR_failure); - callbackProgress = QFUNC(treatmentCPR_progress); - callbackStart = QFUNC(treatmentCPR_start); - animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; + condition = QFUNC(canCPR); + callbackSuccess = QFUNC(cpr); + callbackFailure = QFUNC(cprFailure); + callbackProgress = QFUNC(cprProgress); + callbackStart = QFUNC(cprStart); + animationMedic = "AinvPknlMstpSlayW[wpn]Dnon_medic"; + animationMedicProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; + animationMedicSelf = ""; + animationMedicSelfProne = ""; + consumeItem = 0; litter[] = {}; }; - class SurgicalKit: FieldDressing { displayName = CSTRING(Use_SurgicalKit); displayNameProgress = CSTRING(Stitching); icon = QPATHTOEF(medical_gui,ui\surgical_kit.paa); category = "advanced"; items[] = {"ACE_surgicalKit"}; - treatmentLocations[] = {QEGVAR(medical,useLocation_SurgicalKit)}; + treatmentLocations = QGVAR(locationSurgicalKit); allowSelfTreatment = 0; - requiredMedic = QEGVAR(medical,medicSetting_SurgicalKit); - treatmentTime = QUOTE(count (_target getVariable [ARR_2('EGVAR(medical,bandagedWounds)',[])]) * 5); + medicRequired = QGVAR(medicSurgicalKit); + treatmentTime = QFUNC(getStitchTime); condition = QFUNC(canStitch); callbackSuccess = ""; - callbackProgress = QFUNC(treatmentSurgicalKit_onProgress); - itemConsumed = QEGVAR(medical,consumeItem_SurgicalKit); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }}; + callbackProgress = QFUNC(surgicalKitProgress); + consumeItem = QGVAR(consumeSurgicalKit); + animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = {{"ACE_MedicalLitter_gloves"}}; }; class PersonalAidKit: BasicBandage { displayName = CSTRING(Use_Aid_Kit); displayNameProgress = CSTRING(TreatmentAction); icon = ""; category = "advanced"; - condition = QUOTE(_target call EFUNC(medical_status,isInStableCondition)); + condition = QUOTE(_patient call EFUNC(medical_status,isInStableCondition)); items[] = {"ACE_personalAidKit"}; - treatmentLocations[] = {QEGVAR(medical,useLocation_PAK)}; - requiredMedic = QEGVAR(medical,medicSetting_PAK); - treatmentTime = QUOTE(_target call FUNC(healTime)); - callbackSuccess = QFUNC(treatmentFullHeal); - itemConsumed = QEGVAR(medical,consumeItem_PAK); - animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"}}, - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + treatmentLocations = QGVAR(locationPAK); + medicRequired = QGVAR(medicPAK); + treatmentTime = QFUNC(getHealTime); + callbackSuccess = QFUNC(fullHeal); + consumeItem = QGVAR(consumePAK); + animationMedic = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationMedicProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationMedicSelf = ""; + animationMedicSelfProne = ""; + litter[] = { + {"ACE_MedicalLitter_gloves"}, + {"ACE_MedicalLitter_clean"}, + { + {"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}, + {"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"} + } }; }; }; diff --git a/addons/medical_treatment/CfgEden.hpp b/addons/medical_treatment/Cfg3DEN.hpp similarity index 60% rename from addons/medical_treatment/CfgEden.hpp rename to addons/medical_treatment/Cfg3DEN.hpp index d3c2f6c721b..74e2730c3e4 100644 --- a/addons/medical_treatment/CfgEden.hpp +++ b/addons/medical_treatment/Cfg3DEN.hpp @@ -1,3 +1,10 @@ + +#define GRID_3DEN_W (pixelW * pixelGrid * 0.5) +#define GRID_3DEN_H (pixelH * pixelGrid * 0.5) + +#define DEFAULT_IS_MEDIC (parseNumber (_this getUnitTrait 'medic')) +#define DEFAULT_IS_MEDICAL_VEHICLE (getNumber (configFile >> 'CfgVehicles' >> typeOf _this >> 'attendant') > 0) + class ctrlToolbox; class Cfg3DEN { @@ -9,19 +16,23 @@ class Cfg3DEN { }; }; class GVAR(isMedicControl): Title { - attributeLoad = "(_this controlsGroupCtrl 100) lbSetCurSel (((_value + 1) min 3) max 0);"; - attributeSave = "(lbCurSel (_this controlsGroupCtrl 100)) - 1"; + attributeLoad = QUOTE((_this controlsGroupCtrl 100) lbSetCurSel (0 max (_value + 1) min 3)); + attributeSave = QUOTE(lbCurSel (_this controlsGroupCtrl 100) - 1); class Controls: Controls { - class Title: Title{}; + class Title: Title {}; class Value: ctrlToolbox { idc = 100; - style = "0x02"; - x = "48 * (pixelW * pixelGrid * 0.50)"; - w = "82 * (pixelW * pixelGrid * 0.50)"; - h = "5 * (pixelH * pixelGrid * 0.50)"; + x = 48 * GRID_3DEN_W; + w = 82 * GRID_3DEN_W; + h = 5 * GRID_3DEN_H; rows = 1; columns = 4; - strings[] = {"$STR_3DEN_Attributes_Lock_Default_text", CSTRING(AssignMedicRoles_role_none), CSTRING(AssignMedicRoles_role_medic), CSTRING(AssignMedicRoles_role_doctorShort)}; + strings[] = { + "$STR_3DEN_Attributes_Lock_Default_text", + CSTRING(AssignMedicRoles_role_none), + CSTRING(AssignMedicRoles_role_medic), + CSTRING(AssignMedicRoles_role_doctorShort) + }; }; }; }; @@ -31,36 +42,34 @@ class Cfg3DEN { class ace_attributes { class Attributes { class ace_isMedic { - property = QUOTE(ace_isMedic); - control = QGVAR(isMedicControl); displayName = CSTRING(AssignMedicRoles_role_DisplayName); tooltip = CSTRING(Attributes_isMedic_Description); - expression = QUOTE(if (_value > -1) then {_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)];};); - typeName = "NUMBER"; + property = QUOTE(ace_isMedic); + control = QGVAR(isMedicControl); + expression = QUOTE(if (_value != -1 && {_value != DEFAULT_IS_MEDIC}) then {_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)]}); + defaultValue = QUOTE(DEFAULT_IS_MEDIC); condition = "objectBrain"; - defaultValue = "-1"; + typeName = "NUMBER"; }; class ace_isMedicalVehicle { - property = QUOTE(ace_isMedicalVehicle); - value = 0; - control = "CheckboxNumber"; displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); tooltip = CSTRING(Attributes_isMedicalVehicle_Description); - expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)];); - typeName = "NUMBER"; + property = QUOTE(ace_isMedicalVehicle); + control = "Checkbox"; + expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,isMedicalVehicle),_value,true)]); + defaultValue = QUOTE(DEFAULT_IS_MEDICAL_VEHICLE); condition = "objectVehicle"; - defaultValue = 0; + typeName = "BOOL"; }; class ace_isMedicalFacility { - property = QUOTE(ace_isMedicalFacility); - value = 0; - control = "Checkbox"; displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); tooltip = CSTRING(AssignMedicalFacility_enabled_Description); + property = QUOTE(ace_isMedicalFacility); + control = "Checkbox"; expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,isMedicalFacility),_value,true)];); - typeName = "BOOL"; - condition = "(1 - objectBrain) * (1 - objectVehicle)"; defaultValue = "false"; + condition = "(1 - objectBrain) * (1 - objectVehicle)"; + typeName = "BOOL"; }; }; }; diff --git a/addons/medical_treatment/CfgReplacementItems.hpp b/addons/medical_treatment/CfgReplacementItems.hpp new file mode 100644 index 00000000000..4c5c4f126d1 --- /dev/null +++ b/addons/medical_treatment/CfgReplacementItems.hpp @@ -0,0 +1,17 @@ +class EGVAR(medical,replacementItems) { + FirstAidKit[] = { + {"ACE_fieldDressing", 1}, + {"ACE_packingBandage", 1}, + {"ACE_morphine", 1}, + {"ACE_tourniquet", 1} + }; + Medikit[] = { + {"ACE_fieldDressing", 1}, + {"ACE_packingBandage", 2}, + {"ACE_epinephrine", 1}, + {"ACE_morphine", 1}, + {"ACE_salineIV_250", 1}, + {"ACE_tourniquet", 1} + }; + // todo: add GM medical items +}; diff --git a/addons/medical_treatment/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp index 86e3773cc24..cbc9f8b3bd2 100644 --- a/addons/medical_treatment/CfgWeapons.hpp +++ b/addons/medical_treatment/CfgWeapons.hpp @@ -1,11 +1,11 @@ class CfgWeapons { class ItemCore; + class ACE_ItemCore; class CBA_MiscItem_ItemInfo; class InventoryFirstAidKitItem_Base_F; class MedikitItem; - // ITEMS class FirstAidKit: ItemCore { type = 0; class ItemInfo: InventoryFirstAidKitItem_Base_F { @@ -19,12 +19,11 @@ class CfgWeapons { }; }; - class ACE_ItemCore; class ACE_fieldDressing: ACE_ItemCore { scope = 2; author = ECSTRING(common,ACETeam); model = QPATHTOF(data\bandage.p3d); - picture = QPATHTOF(ui\items\fieldDressing_x_ca.paa); + picture = QPATHTOF(ui\fieldDressing_ca.paa); displayName = CSTRING(Bandage_Basic_Display); descriptionShort = CSTRING(Bandage_Basic_Desc_Short); descriptionUse = CSTRING(Bandage_Basic_Desc_Use); @@ -36,7 +35,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Packing_Bandage_Display); - picture = QPATHTOF(ui\items\packingBandage_x_ca.paa); + picture = QPATHTOF(ui\packingBandage_ca.paa); model = QPATHTOF(data\packingbandage.p3d); descriptionShort = CSTRING(Packing_Bandage_Desc_Short); descriptionUse = CSTRING(Packing_Bandage_Desc_Use); @@ -48,7 +47,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Bandage_Elastic_Display); - picture = QPATHTOF(ui\items\elasticBandage_x_ca.paa); + picture = QPATHTOF(ui\elasticBandage_ca.paa); model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); @@ -60,7 +59,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Tourniquet_Display); - picture = QPATHTOF(ui\items\tourniquet_x_ca.paa); + picture = QPATHTOF(ui\tourniquet_ca.paa); model = QPATHTOF(data\tourniquet.p3d); descriptionShort = CSTRING(Tourniquet_Desc_Short); descriptionUse = CSTRING(Tourniquet_Desc_Use); @@ -72,7 +71,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(splint_Display); - picture = QPATHTOF(ui\items\tourniquet_x_ca.paa); + picture = QPATHTOF(ui\tourniquet_ca.paa); model = QPATHTOF(data\tourniquet.p3d); descriptionShort = CSTRING(splint_Desc_Short); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -83,7 +82,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Morphine_Display); - picture = QPATHTOF(ui\items\morphine_x_ca.paa); + picture = QPATHTOF(ui\morphine_ca.paa); model = QPATHTOF(data\morphine.p3d); descriptionShort = CSTRING(Morphine_Desc_Short); descriptionUse = CSTRING(Morphine_Desc_Use); @@ -95,7 +94,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Adenosine_Display); - picture = QPATHTOF(ui\items\adenosine_x_ca.paa); + picture = QPATHTOF(ui\adenosine_ca.paa); model = QPATHTOF(data\adenosine.p3d); descriptionShort = CSTRING(adenosine_Desc_Short); descriptionUse = CSTRING(adenosine_Desc_Use); @@ -107,7 +106,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Atropine_Display); - picture = QPATHTOF(ui\items\atropine_x_ca.paa); + picture = QPATHTOF(ui\atropine_ca.paa); model = QPATHTOF(data\atropine.p3d); descriptionShort = CSTRING(Atropine_Desc_Short); descriptionUse = CSTRING(Atropine_Desc_Use); @@ -119,7 +118,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Epinephrine_Display); - picture = QPATHTOF(ui\items\epinephrine_x_ca.paa); + picture = QPATHTOF(ui\epinephrine_ca.paa); model = QPATHTOF(data\epinephrine.p3d); descriptionShort = CSTRING(Epinephrine_Desc_Short); descriptionUse = CSTRING(Epinephrine_Desc_Use); @@ -134,8 +133,8 @@ class CfgWeapons { displayName = CSTRING(Plasma_IV); model = QPATHTOF(data\IVBag_1000ml.p3d); hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_1000ml_ca.paa) }; - picture = QPATHTOF(ui\items\plasmaIV_x_ca.paa); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_1000ml_ca.paa)}; + picture = QPATHTOF(ui\plasmaIV_ca.paa); descriptionShort = CSTRING(Plasma_IV_Desc_Short); descriptionUse = CSTRING(Plasma_IV_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -145,7 +144,7 @@ class CfgWeapons { class ACE_plasmaIV_500: ACE_plasmaIV { displayName = CSTRING(Plasma_IV_500); model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_500ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_500ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 5; }; @@ -153,7 +152,7 @@ class CfgWeapons { class ACE_plasmaIV_250: ACE_plasmaIV { displayName = CSTRING(Plasma_IV_250); model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_plasma_250ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_plasma_250ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2.5; }; @@ -163,9 +162,9 @@ class CfgWeapons { author = ECSTRING(common,ACETeam); model = QPATHTOF(data\IVBag_1000ml.p3d); displayName = CSTRING(Blood_IV); - picture = QPATHTOF(ui\items\bloodIV_x_ca.paa); + picture = QPATHTOF(ui\bloodIV_ca.paa); hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_1000ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_1000ml_ca.paa)}; descriptionShort = CSTRING(Blood_IV_Desc_Short); descriptionUse = CSTRING(Blood_IV_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -175,7 +174,7 @@ class CfgWeapons { class ACE_bloodIV_500: ACE_bloodIV { displayName = CSTRING(Blood_IV_500); model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_500ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_500ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 5; }; @@ -183,7 +182,7 @@ class CfgWeapons { class ACE_bloodIV_250: ACE_bloodIV { displayName = CSTRING(Blood_IV_250); model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_blood_250ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_250ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2.5; }; @@ -194,8 +193,8 @@ class CfgWeapons { displayName = CSTRING(Saline_IV); model = QPATHTOF(data\IVBag_1000ml.p3d); hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_1000ml_ca.paa) }; - picture = QPATHTOF(ui\items\salineIV_x_ca.paa); + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_1000ml_ca.paa)}; + picture = QPATHTOF(ui\salineIV_ca.paa); descriptionShort = CSTRING(Saline_IV_Desc_Short); descriptionUse = CSTRING(Saline_IV_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -205,7 +204,7 @@ class CfgWeapons { class ACE_salineIV_500: ACE_salineIV { displayName = CSTRING(Saline_IV_500); model = QPATHTOF(data\IVBag_500ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_500ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_500ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 5; }; @@ -213,7 +212,7 @@ class CfgWeapons { class ACE_salineIV_250: ACE_salineIV { displayName = CSTRING(Saline_IV_250); model = QPATHTOF(data\IVBag_250ml.p3d); - hiddenSelectionsTextures[] = { QPATHTOF(data\IVBag_saline_250ml_ca.paa) }; + hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_saline_250ml_ca.paa)}; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 2.5; }; @@ -223,7 +222,7 @@ class CfgWeapons { author = ECSTRING(common,ACETeam); displayName = CSTRING(QuikClot_Display); model = QPATHTOF(data\QuikClot.p3d); - picture = QPATHTOF(ui\items\quickclot_x_ca.paa); + picture = QPATHTOF(ui\quickclot_ca.paa); descriptionShort = CSTRING(QuikClot_Desc_Short); descriptionUse = CSTRING(QuikClot_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -234,7 +233,7 @@ class CfgWeapons { scope = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(Aid_Kit_Display); - picture = QPATHTOF(ui\items\personal_aid_kit_x_ca.paa); + picture = QPATHTOF(ui\personal_aid_kit_ca.paa); descriptionShort = CSTRING(Aid_Kit_Desc_Short); descriptionUse = CSTRING(Aid_Kit_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -242,11 +241,11 @@ class CfgWeapons { }; }; class ACE_surgicalKit: ACE_ItemCore { - scope=2; + scope = 2; author = ECSTRING(common,ACETeam); displayName= CSTRING(SurgicalKit_Display); model = QPATHTOF(data\surgical_kit.p3d); - picture = QPATHTOF(ui\items\surgicalKit_x_ca.paa); + picture = QPATHTOF(ui\surgicalKit_ca.paa); descriptionShort = CSTRING(SurgicalKit_Desc_Short); descriptionUse = CSTRING(SurgicalKit_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { @@ -254,11 +253,11 @@ class CfgWeapons { }; }; class ACE_bodyBag: ACE_ItemCore { - scope=2; + scope = 2; author = ECSTRING(common,ACETeam); displayName= CSTRING(Bodybag_Display); model = QPATHTOF(data\bodybagItem.p3d); - picture = QPATHTOF(ui\items\bodybag_x_ca.paa); + picture = QPATHTOF(ui\bodybag_ca.paa); descriptionShort = CSTRING(Bodybag_Desc_Short); descriptionUse = CSTRING(Bodybag_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp index 5d0e71ae53e..628003ff620 100644 --- a/addons/medical_treatment/XEH_PREP.hpp +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -1,75 +1,62 @@ - -// actions -PREP(actionCheckBloodPressure); -PREP(actionCheckBloodPressureLocal); -PREP(actionCheckPulse); -PREP(actionCheckPulseLocal); -PREP(actionCheckResponse); -PREP(actionDiagnose); -PREP(actionLoadUnit); -PREP(actionPlaceInBodyBag); -PREP(actionUnloadUnit); PREP(addLoadPatientActions); - -// treaments -PREP(canTreat); -PREP(canTreatCached); -PREP(treatment); -PREP(treatment_failure); -PREP(treatment_success); - -PREP(treatmentBandage); -PREP(treatmentBandageLocal); -PREP(treatmentCPR); -PREP(treatmentCPR_failure); -PREP(treatmentCPR_progress); -PREP(treatmentCPR_start); -PREP(treatmentCPRLocal); -PREP(treatmentFullHeal); -PREP(treatmentFullHealLocal); -PREP(treatmentIV); -PREP(treatmentIVLocal); -PREP(treatmentMedication); -PREP(treatmentMedicationLocal); -PREP(treatmentSurgicalKit_onProgress); -PREP(treatmentTourniquet); -PREP(treatmentTourniquetLocal); -PREP(treatmentTourniquetRemove); - -PREP(splint); -PREP(splintCondition); -PREP(splintLocal); - -// misc PREP(addToLog); PREP(addToTriageCard); +PREP(bandage); +PREP(bandageLocal); PREP(bodyCleanupLoop); PREP(calculateBlood); -PREP(canAccessMedicalEquipment); PREP(canBandage); +PREP(canCPR); +PREP(canSplint); PREP(canStitch); +PREP(canTreat); +PREP(canTreatCached); +PREP(checkBloodPressure); +PREP(checkBloodPressureLocal); +PREP(checkItems); +PREP(checkPulse); +PREP(checkPulseLocal); +PREP(checkResponse); +PREP(cpr); +PREP(cprFailure); +PREP(cprLocal); +PREP(cprProgress); +PREP(cprStart); +PREP(createLitter); +PREP(createLitterServer); +PREP(diagnose); PREP(findMostEffectiveWound); +PREP(fullHeal); +PREP(fullHealLocal); PREP(getBandageTime); +PREP(getHealTime); +PREP(getStitchTime); PREP(getTriageStatus); PREP(handleBandageOpening); +PREP(hasItem); PREP(hasTourniquetAppliedTo); -PREP(healTime); PREP(isInMedicalFacility); PREP(isInMedicalVehicle); PREP(isMedic); PREP(isMedicalVehicle); +PREP(ivBag); +PREP(ivBagLocal); +PREP(litterCleanupLoop); +PREP(loadUnit); +PREP(medication); +PREP(medicationLocal); PREP(onMedicationUsage); -PREP(serverRemoveBody); +PREP(placeInBodyBag); +PREP(removeBody); PREP(setTriageStatus); - -// items -PREP(checkItems); -PREP(hasItem); -PREP(hasItems); +PREP(splint); +PREP(splintLocal); +PREP(surgicalKitProgress); +PREP(tourniquet); +PREP(tourniquetLocal); +PREP(tourniquetRemove); +PREP(treatment); +PREP(treatmentFailure); +PREP(treatmentSuccess); +PREP(unloadUnit); PREP(useItem); -PREP(useItems); - -// litter -PREP(litterCleanupLoop); -PREP(litterCreate); -PREP(litterHandleCreate); diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf index 05d78e97d92..76222dca57a 100644 --- a/addons/medical_treatment/XEH_postInit.sqf +++ b/addons/medical_treatment/XEH_postInit.sqf @@ -1,28 +1,38 @@ #include "script_component.hpp" -[QEGVAR(medical_status,initialized), FUNC(checkItems)] call CBA_fnc_addEventHandler; +[QEGVAR(medical_status,initialized), { + params ["_unit"]; + + // Clear all saved medical logs + { + _unit setVariable [_x, nil, true]; + } forEach (_unit getVariable [QEGVAR(medical,allLogs), []]); + + _unit setVariable [QEGVAR(medical,allLogs), [], true]; + + [_unit] call FUNC(checkItems); +}] call CBA_fnc_addEventHandler; + ["loadout", FUNC(checkItems)] call CBA_fnc_addPlayerEventHandler; -// Handle bodybags and litter on server +// Handle body removal and litter on server if (isServer) then { - [QGVAR(createLitterServer), FUNC(litterHandleCreate)] call CBA_fnc_addEventHandler; - ["ace_placedInBodyBag", FUNC(serverRemoveBody)] call CBA_fnc_addEventHandler; + [QGVAR(createLitterServer), FUNC(createLitterServer)] call CBA_fnc_addEventHandler; + ["ace_placedInBodyBag", FUNC(removeBody)] call CBA_fnc_addEventHandler; }; -// treatment events -[QGVAR(treatmentBandageLocal), FUNC(treatmentBandageLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentTourniquetLocal), FUNC(treatmentTourniquetLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentMedicationLocal), FUNC(treatmentMedicationLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentIVLocal), FUNC(treatmentIVLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentCPRLocal), FUNC(treatmentCPRLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentFullHealLocal), FUNC(treatmentFullHealLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentSplintLocal), FUNC(splintLocal)] call CBA_fnc_addEventHandler; - -// action events -[QGVAR(actionCheckPulseLocal), FUNC(actionCheckPulseLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionCheckBloodPressureLocal), FUNC(actionCheckBloodPressureLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionPlaceInBodyBag), FUNC(actionPlaceInBodyBag)] call CBA_fnc_addEventHandler; - -// log events -[QGVAR(addToMedicalLog), FUNC(addToLog)] call CBA_fnc_addEventHandler; +// Treatment events +[QGVAR(bandageLocal), FUNC(bandageLocal)] call CBA_fnc_addEventHandler; +[QGVAR(checkBloodPressureLocal), FUNC(checkBloodPressureLocal)] call CBA_fnc_addEventHandler; +[QGVAR(checkPulseLocal), FUNC(checkPulseLocal)] call CBA_fnc_addEventHandler; +[QGVAR(cprLocal), FUNC(cprLocal)] call CBA_fnc_addEventHandler; +[QGVAR(fullHealLocal), FUNC(fullHealLocal)] call CBA_fnc_addEventHandler; +[QGVAR(ivBagLocal), FUNC(ivBagLocal)] call CBA_fnc_addEventHandler; +[QGVAR(medicationLocal), FUNC(medicationLocal)] call CBA_fnc_addEventHandler; +[QGVAR(placeInBodyBag), FUNC(placeInBodyBag)] call CBA_fnc_addEventHandler; +[QGVAR(splintLocal), FUNC(splintLocal)] call CBA_fnc_addEventHandler; +[QGVAR(tourniquetLocal), FUNC(tourniquetLocal)] call CBA_fnc_addEventHandler; + +// Logging events +[QGVAR(addToLog), FUNC(addToLog)] call CBA_fnc_addEventHandler; [QGVAR(addToTriageCard), FUNC(addToTriageCard)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_treatment/XEH_preInit.sqf b/addons/medical_treatment/XEH_preInit.sqf index a4ddb9f082f..19c28ab4ab5 100644 --- a/addons/medical_treatment/XEH_preInit.sqf +++ b/addons/medical_treatment/XEH_preInit.sqf @@ -34,4 +34,28 @@ GVAR(animDurations) = [] call CBA_fnc_createNamespace; ["AinvPknlMstpSnonWnonDnon_medic1", 10] ]; +// class names of medical facilities +// global variable so it can be accessed by mission makers +GVAR(facilityClasses) = [ + "TK_GUE_WarfareBFieldhHospital_Base_EP1", + "TK_GUE_WarfareBFieldhHospital_EP1", + "TK_WarfareBFieldhHospital_Base_EP1", + "TK_WarfareBFieldhHospital_EP1", + "US_WarfareBFieldhHospital_Base_EP1", + "US_WarfareBFieldhHospital_EP1", + "MASH_EP1", + "MASH", + "Land_A_Hospital", + "CDF_WarfareBFieldhHospital", + "GUE_WarfareBFieldhHospital", + "INS_WarfareBFieldhHospital", + "RU_WarfareBFieldhHospital", + "USMC_WarfareBFieldhHospital" +]; + +// array of medical items to replace and their ACE equivalents +GVAR(replacementItems) = configProperties [configFile >> QEGVAR(medical,replacementItems), "isArray _x"] apply { + [configName _x, getArray _x] +}; + ADDON = true; diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp index add1dded4ac..8bf07ee41a9 100644 --- a/addons/medical_treatment/config.cpp +++ b/addons/medical_treatment/config.cpp @@ -18,7 +18,8 @@ class CfgPatches { #include "ACE_Medical_Treatment.hpp" #include "ACE_Medical_Treatment_Actions.hpp" #include "ACE_Settings.hpp" -#include "CfgEden.hpp" #include "CfgEventHandlers.hpp" +#include "CfgReplacementItems.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "Cfg3DEN.hpp" diff --git a/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf deleted file mode 100644 index 6c5c17a1518..00000000000 --- a/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the blood pressure of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart"]; - -[QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _bodyPart], _target] call CBA_fnc_targetEvent; - -true diff --git a/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf deleted file mode 100644 index c0a995e3cdb..00000000000 --- a/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf +++ /dev/null @@ -1,57 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the blood pressure of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart"]; - -private _bloodPressure = [0, 0]; - -if (alive _target && {!([_target, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { - _bloodPressure = GET_BLOOD_PRESSURE(_target); -}; - -private _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_6); -private _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_NoBloodpressure); - -_bloodPressure params ["_bloodPressureLow", "_bloodPressureHigh"]; - -if (_bloodPressureHigh > 20) then { - if (_caller call FUNC(isMedic)) then { - _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_1); - _logOutPut = format ["%1/%2", round _bloodPressureHigh, round _bloodPressureLow]; - } else { - if (_bloodPressureHigh > 20) then { - _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_2); - _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_Low); - - if (_bloodPressureHigh > 100) then { - _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_3); - _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_Normal); - - if (_bloodPressureHigh > 160) then { - _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_4); - _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_High); - }; - }; - }; - }; -}; - -[QEGVAR(common,displayTextStructured), [[_bloodPressureOutput, _target call EFUNC(common,getName), round _bloodPressureHigh, round _bloodPressureLow], 1.75, _caller], _caller] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_target, "activity", ELSTRING(medical_treatment,Check_Bloodpressure_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); - [_target, "quick_view", ELSTRING(medical_treatment,Check_Bloodpressure_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf b/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf deleted file mode 100644 index 29afe8a60e5..00000000000 --- a/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the pulse or heart rate of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart"]; - -[QGVAR(actionCheckPulseLocal), [_caller, _target, _bodyPart], _target] call CBA_fnc_targetEvent; - -true diff --git a/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf deleted file mode 100644 index 585ba4c7d8d..00000000000 --- a/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf +++ /dev/null @@ -1,54 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the pulse of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart"]; - -private _heartRate = 0; - -if (alive _target && {!([_target, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { - _heartRate = GET_HEART_RATE(_target); -}; - -private _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_5); -private _logOutPut = ELSTRING(medical_treatment,Check_Pulse_None); - -if (_heartRate > 1.0) then { - if (_caller call FUNC(isMedic)) then { - _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_1); - _logOutPut = format ["%1", round(_heartRate)]; - } else { - // non medical personel will only find a pulse/HR - _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_2); - _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Weak); - - if (_heartRate > 60) then { - if (_heartRate > 100) then { - _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_3); - _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Strong); - } else { - _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_4); - _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Normal); - }; - }; - }; -}; - -[QEGVAR(common,displayTextStructured), [[_heartRateOutput, _target call EFUNC(common,getName), round _heartRate], 1.5, _caller], _caller] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_target, "activity", ELSTRING(medical_treatment,Check_Pulse_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); - [_target, "quick_view", ELSTRING(medical_treatment,Check_Pulse_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical_treatment/functions/fnc_actionCheckResponse.sqf b/addons/medical_treatment/functions/fnc_actionCheckResponse.sqf deleted file mode 100644 index 7bf7cf7c5c9..00000000000 --- a/addons/medical_treatment/functions/fnc_actionCheckResponse.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the response status of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ace_medical_treatment_fnc_actionCheckResponse - * - * Public: No - */ - -params ["_caller", "_target"]; - -private _output = [ELSTRING(medical_treatment,Check_Response_Unresponsive), ELSTRING(medical_treatment,Check_Response_Responsive)] select (_target call EFUNC(common,isAwake)); - -[QEGVAR(common,displayTextStructured), [[_output, _target call EFUNC(common,getName)], 2, _caller], _caller] call CBA_fnc_targetEvent; - -[_target ,"activity", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "quick_view", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical_treatment/functions/fnc_actionDiagnose.sqf b/addons/medical_treatment/functions/fnc_actionDiagnose.sqf deleted file mode 100644 index 6e9eda96101..00000000000 --- a/addons/medical_treatment/functions/fnc_actionDiagnose.sqf +++ /dev/null @@ -1,45 +0,0 @@ -#include "script_component.hpp" -/* -* Author: Glowbal -* Action for diagnosing in basic medical -* -* Arguments: -* 0: The medic -* 1: The patient -* -* Return Value: -* None -* -* Public: No -*/ - -params ["_caller", "_target"]; - -private _genericMessages = [ELSTRING(medical_treatment,diagnoseMessage), _target call EFUNC(common,getName)]; - -if (alive _target) then { - _genericMessages pushBack ELSTRING(medical_treatment,diagnoseAlive); -} else { - _genericMessages pushBack ELSTRING(medical_treatment,diagnoseDead); -}; - -private _hemorrhage = GET_HEMORRHAGE(_target); -if (_hemorrhage > 0) then { - if (_hemorrhage > 1) then { - _genericMessages pushBack ELSTRING(medical_treatment,lostBloodALot); - } else { - _genericMessages pushBack ELSTRING(medical_treatment,lostBlood); - }; -} else { - _genericMessages pushBack ELSTRING(medical_treatment,noBloodloss); -}; - -if (alive _target) then { - if IS_IN_PAIN(_target) then { - _genericMessages pushBack ELSTRING(medical_treatment,inPain); - } else { - _genericMessages pushBack ELSTRING(medical_treatment,noPain); - }; -}; - -[QEGVAR(common,displayTextStructured), [_genericMessages, 3.0, _caller], _caller] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_actionLoadUnit.sqf b/addons/medical_treatment/functions/fnc_actionLoadUnit.sqf deleted file mode 100644 index d4e6b57dc4b..00000000000 --- a/addons/medical_treatment/functions/fnc_actionLoadUnit.sqf +++ /dev/null @@ -1,42 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for loading an unconscious or dead unit in the nearest vehicle, or _vehicle if given. - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: The vehicle (default: objNull) - * - * Return Value: - * Vehicle they are loaded into (objNull on failure) - * - * Example: - * [bob, kevin] call ace_medical_treatment_treatment_fnc_actionLoadUnit - * - * Public: No - */ - -params ["_caller", "_target", ["_vehicle", objNull]]; - -if ([_target] call EFUNC(common,isAwake)) exitWith { - [QEGVAR(common,displayTextStructured), [[ELSTRING(medical,CanNotLoaded), _target call EFUNC(common,getName)], 1.5, _caller], _caller] call CBA_fnc_targetEvent; -}; - -if ([_target] call EFUNC(medical_status,isBeingCarried)) then { - [_caller, _target] call EFUNC(dragging,dropObject_carry); -}; - -if ([_target] call EFUNC(medical_status,isBeingDragged)) then { - [_caller, _target] call EFUNC(dragging,dropObject); -}; - -private _vehicle = [_caller, _target, _vehicle] call EFUNC(common,loadPerson); -if (!isNull _vehicle) then { - private _hint = LSTRING(loadedInto); - private _itemName = [_target, false, true] call EFUNC(common,getName); - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); - [[_hint, _itemName, _vehicleName], 3.0] call EFUNC(common,displayTextStructured); -}; - -_vehicle diff --git a/addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf deleted file mode 100644 index 0069e74e67b..00000000000 --- a/addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf +++ /dev/null @@ -1,51 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Replace a (dead) body by a body bag - * - * Arguments: - * 0: The actor - * 1: The patient - * - * Return Value: - * body bag (will return objNull when run where target is not local) - * - * Example: - * [player, cursorTarget] call ace_medical_treatment_fnc_actionPlaceInBodyBag - * - * Public: No - */ - -params ["_caller", "_target"]; -TRACE_2("params",_caller,_target); - -if (!local _target) exitWith { - TRACE_1("running where local",local _target); - [QGVAR(actionPlaceInBodyBag), [_caller, _target], _target] call CBA_fnc_targetEvent; - objNull -}; - -if (alive _target) then { - TRACE_1("manually killing with setDead",_target); - [_target, true, "buried_alive"] call EFUNC(medical_status,setDead); -}; - -private _position = (getPosASL _target) vectorAdd [0, 0, 0.2]; - -private _headPos = _target modelToWorldVisual (_target selectionPosition "head"); -private _spinePos = _target modelToWorldVisual (_target selectionPosition "Spine3"); -private _dirVect = _headPos vectorFromTo _spinePos; -private _direction = _dirVect call CBA_fnc_vectDir; - -// move the body away now, so it won't physX the bodyBag object (this setPos seems to need to be called where object is local) -_target setPosASL [-5000, -5000, 0]; - -private _bodyBag = createVehicle ["ACE_bodyBagObject", _position, [], 0, "NONE"]; - -// prevent body bag from flipping -_bodyBag setPosASL _position; -_bodyBag setDir _direction; - -["ace_placedInBodyBag", [_target, _bodyBag]] call CBA_fnc_globalEvent; // hide and delete body on server - -_bodyBag diff --git a/addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf b/addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf deleted file mode 100644 index d69b2a7c64a..00000000000 --- a/addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for unloading an unconscious or dead unit from a vechile - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Drag after unload (default: false) - * - * Return Value: - * None - * - * Example: - * [bob, kevin, false] call ace_medical_treatment_fnc_actionUnloadUnit - * - * Public: No - */ - -params ["_caller", "_target", ["_drag", false]]; - -// cannot unload a unit not in a vehicle. -if (vehicle _target == _target) exitWith {WARNING_1("Unit [%1] not in vehicle",_target);}; -if (_target call EFUNC(common,isAwake)) exitWith {WARNING_1("Unit [%1] is awake",_target);}; - -["ace_unloadPersonEvent", [_target, vehicle _target, _caller], _target] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf index 3448793847e..fe97152c92b 100644 --- a/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf +++ b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf @@ -1,16 +1,16 @@ #include "script_component.hpp" /* * Author: 654wak654 - * Adds child actions to the "load patient" action for near vehicles. + * Returns children actions to the "Load Patient" action for nearby vehicles. * * Arguments: * 0: Patient * * Return Value: - * Child actions + * Actions * * Example: - * [kevin] call ace_medical_treatment_fnc_addLoadPatientActions + * [cursorObject] call ace_medical_treatment_fnc_addLoadPatientActions * * Public: No */ @@ -19,7 +19,7 @@ params ["_target"]; private _statement = { params ["_target", "_player", "_vehicle"]; - [_player, _target, _vehicle] call FUNC(actionLoadUnit); + [_player, _target, _vehicle] call FUNC(loadUnit); }; [_target call EFUNC(common,nearestVehiclesFreeSeat), _statement, _target] call EFUNC(interact_menu,createVehiclesActions) diff --git a/addons/medical_treatment/functions/fnc_addToLog.sqf b/addons/medical_treatment/functions/fnc_addToLog.sqf index 077cfc73aba..b250fec9b1c 100644 --- a/addons/medical_treatment/functions/fnc_addToLog.sqf +++ b/addons/medical_treatment/functions/fnc_addToLog.sqf @@ -1,56 +1,45 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Add an entry to the specified log + * Author: Glowbal, mharis001 + * Adds an entry to the specified medical log of the unit. * * Arguments: - * 0: The patient - * 1: The log type - * 2: The message - * 3: The arguments for localization + * 0: Unit + * 1: Log Type + * 2: Message + * 3: Formatting Arguments * * Return Value: * None * * Example: - * [bob, "type", "message", [_args]] call ace_medical_treatment_fnc_addToLog + * [player, "activity", "Message %1", ["Name"]] call ace_medical_treatment_fnc_addToLog * * Public: No */ -params ["_unit", "_type", "_message", "_arguments"]; +params ["_unit", "_logType", "_message", "_arguments"]; if (!local _unit) exitWith { - [QGVAR(addToMedicalLog), _this, _unit] call CBA_fnc_targetEvent; + [QGVAR(addToLog), _this, _unit] call CBA_fnc_targetEvent; }; date params ["", "", "", "_hour", "_minute"]; +private _timeStamp = format ["%1:%2", _hour, [_minute, 2] call CBA_fnc_formatNumber]; -private _moment = format [["%1:%2", "%1:0%2"] select (_minute < 10), _hour, _minute]; -private _logVarName = format [QEGVAR(medical,logFile_%1), _type]; +private _logVarName = MED_LOG_VARNAME(_logType); private _log = _unit getVariable [_logVarName, []]; -if (count _log >= 8) then { - private _newLog = []; - - { - // ensure the first element will not be added - if (_forEachIndex > 0) then { - _newLog pushBack _x; - }; - } forEach _log; - - _log = _newLog; +if (count _log >= MED_LOG_MAX_ENTRIES) then { + _log deleteAt 0; }; -_log pushBack [_message, _moment, _type, _arguments]; - +_log pushBack [_message, _timeStamp, _arguments, _logType]; _unit setVariable [_logVarName, _log, true]; -["ace_medicalLogEntryAdded", [_unit, _type, _message, _arguments]] call CBA_fnc_localEvent; -private _logs = _unit getVariable [QEGVAR(medical,allLogs), []]; +private _allLogs = _unit getVariable [QEGVAR(medical,allLogs), []]; -if !(_logVarName in _logs) then { - _logs pushBack _logVarName; - _unit setVariable [QEGVAR(medical,allLogs), _logs, true]; +if !(_logVarName in _allLogs) then { + _allLogs pushBack _logVarName; + _unit setVariable [QEGVAR(medical,allLogs), _allLogs, true]; }; diff --git a/addons/medical_treatment/functions/fnc_addToTriageCard.sqf b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf index 3d67d3288c8..75cbc76b267 100644 --- a/addons/medical_treatment/functions/fnc_addToTriageCard.sqf +++ b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf @@ -1,46 +1,37 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Add an entry to the triage card + * Author: Glowbal, mharis001 + * Adds an entry to the unit's triage card. * * Arguments: - * 0: The patient - * 1: The new item class name + * 0: Unit + * 1: Item Classname * * Return Value: * None * * Example: - * [bob, "bandage"] call ace_medical_treatment_fnc_addToTriageCard + * [player, "ACE_morphine"] call ace_medical_treatment_fnc_addToTriageCard * * Public: No */ -params ["_unit", "_newItem"]; +params ["_unit", "_item"]; if (!local _unit) exitWith { [QGVAR(addToTriageCard), _this, _unit] call CBA_fnc_targetEvent; }; -private _log = _unit getVariable [QEGVAR(medical,triageCard), []]; -private _inList = false; -private _amount = 1; +private _triageCard = _unit getVariable [QEGVAR(medical,triageCard), []]; +private _index = _triageCard findIf {_x select 0 == _item}; -{ - if (_x select 0 == _newItem) exitWith { - private _info = _log select _forEachIndex; - _info set [1, (_info select 1) + 1]; - _info set [2, CBA_missionTime]; - _log set [_forEachIndex, _info]; - - _amount = _info select 1; - _inList = true; - }; -} forEach _log; - -if (!_inList) then { - _log pushBack [_newItem, 1, CBA_missionTime]; +if (_index == -1) then { + _triageCard pushBack [_item, 1, CBA_missionTime]; +} else { + _triageCard set [_index, [_item, (_triageCard select _index select 1) + 1, CBA_missionTime]]; }; -_unit setVariable [QEGVAR(medical,triageCard), _log, true]; -["ace_triageCardItemAdded", [_unit, _newItem, _amount]] call CBA_fnc_localEvent; +_unit setVariable [QEGVAR(medical,triageCard), _triageCard, true]; + +// todo: add amount of item to event args? +["ace_triageCardItemAdded", [_unit, _item]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_bandage.sqf b/addons/medical_treatment/functions/fnc_bandage.sqf new file mode 100644 index 00000000000..1a7dd4f8186 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_bandage.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Bandages open wounds on the given body part of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head", "FieldDressing"] call ace_medical_treatment_fnc_bandage + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +[_patient, "activity", LSTRING(Activity_bandagedPatient), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(bandageLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf b/addons/medical_treatment/functions/fnc_bandageLocal.sqf similarity index 52% rename from addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf rename to addons/medical_treatment/functions/fnc_bandageLocal.sqf index 94ab425b008..a27eaa511c5 100644 --- a/addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf +++ b/addons/medical_treatment/functions/fnc_bandageLocal.sqf @@ -1,30 +1,33 @@ #include "script_component.hpp" /* * Author: Glowbal - * Handles the bandage of a patient. + * Local callback for bandaging a patient's open wounds. * * Arguments: - * 0: The patient - * 1: Treatment class name - * 2: Body part + * 0: Patient + * 1: Body Part + * 2: Treatment * * Return Value: - * Succesful treatment started + * None + * + * Example: + * [player, "Head", "FieldDressing"] call ace_medical_treatment_fnc_bandageLocal * * Public: No */ -params ["_target", "_bandage", "_bodyPart"]; +params ["_patient", "_bodyPart", "_bandage"]; private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; -if (_partIndex < 0) exitWith { false }; +if (_partIndex < 0) exitWith {false}; -private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; -if (_openWounds isEqualTo []) exitWith { false }; +private _openWounds = _patient getVariable [QEGVAR(medical,openWounds), []]; +if (_openWounds isEqualTo []) exitWith {false}; // Figure out which injury for this bodypart is the best choice to bandage // TODO also use up the remainder on left over injuries -private _targetWound = [_target, _bandage, _partIndex] call FUNC(findMostEffectiveWound); +private _targetWound = [_patient, _bandage, _partIndex] call FUNC(findMostEffectiveWound); _targetWound params ["_wound", "_woundIndex", "_effectiveness"]; // Everything is patched up on this body part already @@ -37,18 +40,18 @@ _amountOf = _amountOf - _impact; _wound set [2, _amountOf]; _openWounds set [_woundIndex, _wound]; -_target setVariable [QEGVAR(medical,openWounds), _openWounds, true]; +_patient setVariable [QEGVAR(medical,openWounds), _openWounds, true]; -[_target] call EFUNC(medical_status,updateWoundBloodLoss); +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); // Handle the reopening of bandaged wounds if (_impact > 0 && {GVAR(advancedBandages) && {GVAR(woundReopening)}}) then { - [_target, _impact, _partIndex, _woundIndex, _wound, _bandage] call FUNC(handleBandageOpening); + [_patient, _impact, _partIndex, _woundIndex, _wound, _bandage] call FUNC(handleBandageOpening); }; // Check if we fixed limping from this treatment -if ((EGVAR(medical,limping) == 1) && {_partIndex > 3} && {_amountOf <= 0} && {_target getVariable [QEGVAR(medical,isLimping), false]}) then { - [_target] call EFUNC(medical_engine,updateDamageEffects); +if ((EGVAR(medical,limping) == 1) && {_partIndex > 3} && {_amountOf <= 0} && {_patient getVariable [QEGVAR(medical,isLimping), false]}) then { + [_patient] call EFUNC(medical_engine,updateDamageEffects); }; true diff --git a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf index a11c9a7a251..eed0020ddf0 100644 --- a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Glowbal, esteldunedain - * Loop that cleans up player bodies that were replaced by bodybags + * Handles cleaning up bodies that were replaced by body bags. * * Arguments: * None @@ -10,23 +10,23 @@ * None * * Example: - * call ace_medical_treatment_fnc_bodyCleanupLoop + * [] call ace_medical_treatment_fnc_bodyCleanupLoop * * Public: No */ { - TRACE_2("body",_x,isPlayer _x); - if ((!isNull _x) && {!isPlayer _x}) then {deleteVehicle _x}; + TRACE_2("Handling body cleanup",_x,isPlayer _x); + if (!isNull _x && {!isPlayer _x}) then {deleteVehicle _x}; } forEach GVAR(bodiesToDelete); // deleteVehicle doesn't have instant results so it won't usualy be filtered until next run GVAR(bodiesToDelete) = GVAR(bodiesToDelete) - [objNull]; -// If no more bodies remain, exit the loop +// Exit the loop if no more bodies remain if (GVAR(bodiesToDelete) isEqualTo []) exitWith { - TRACE_1("array emptied - rem PFEH",GVAR(bodiesToDelete)); + TRACE_1("Ending body cleanup loop",GVAR(bodiesToDelete)); }; -// Schedule the loop to be executed again 20 sec later -[DFUNC(bodyCleanupLoop), [], 20] call CBA_fnc_waitAndExecute; +// Schedule cleanup loop to executed again +[FUNC(litterCleanupLoop), [], BODY_CLEANUP_CHECK_DELAY] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf b/addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf deleted file mode 100644 index 3544022c2b0..00000000000 --- a/addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if caller can access targets medical equipment, based upon accessLevel. - * - * Arguments: - * 0: The caller - * 1: The target - * - * Return Value: - * Can Treat - * - * Example: - * [bob, target] call ace_medical_treatment_fnc_canAccessMedicalEquipment - * - * Public: No - */ - -params ["_caller", "_target"]; - -private _accessLevel = _target getVariable [QGVAR(allowSharedEquipmentAccess), -1]; - -switch (_accessLevel) do { - case 0: { true }; - case 1: { side _target == side _caller }; - case 2: { group _target == group _caller }; - default { false }; -}; diff --git a/addons/medical_treatment/functions/fnc_canBandage.sqf b/addons/medical_treatment/functions/fnc_canBandage.sqf index 58e1246c3c9..a67dbb7873b 100644 --- a/addons/medical_treatment/functions/fnc_canBandage.sqf +++ b/addons/medical_treatment/functions/fnc_canBandage.sqf @@ -5,12 +5,12 @@ * Toggles between showing all or only basic bandage action for advanced setting. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment * - * ReturnValue: + * Return Value: * Can Bandage * * Example: @@ -19,12 +19,12 @@ * Public: No */ -params ["_medic", "_patient", "_bodypart", "_bandage"]; +params ["_medic", "_patient", "_bodyPart", "_bandage"]; // Bandage type and bandage setting XNOR to show only active actions -if ((_bandage == "BasicBandage") isEqualTo GVAR(advancedBandages)) exitWith { false }; +if ((_bandage == "BasicBandage") isEqualTo GVAR(advancedBandages)) exitWith {false}; -private _index = ALL_BODY_PARTS find toLower _bodypart; +private _index = ALL_BODY_PARTS find toLower _bodyPart; private _canBandage = false; { diff --git a/addons/medical_treatment/functions/fnc_canCPR.sqf b/addons/medical_treatment/functions/fnc_canCPR.sqf new file mode 100644 index 00000000000..9da6ec6891d --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canCPR.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Checks if CPR can be performed on the patient. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Can CPR + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_canCPR + * + * Public: No + */ + +params ["", "_patient"]; + +!(_patient call EFUNC(common,isAwake)) && {!(_patient getVariable [QGVAR(isReceivingCPR), false])} diff --git a/addons/medical_treatment/functions/fnc_splintCondition.sqf b/addons/medical_treatment/functions/fnc_canSplint.sqf similarity index 52% rename from addons/medical_treatment/functions/fnc_splintCondition.sqf rename to addons/medical_treatment/functions/fnc_canSplint.sqf index be8f9abe9fb..56551ace02e 100644 --- a/addons/medical_treatment/functions/fnc_splintCondition.sqf +++ b/addons/medical_treatment/functions/fnc_canSplint.sqf @@ -1,18 +1,18 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Can apply a splint to the patient + * Checks if a splint can be applied to the patient. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part + * 0: Medic (not used) + * 1: Patient + * 2: Body Part * * Return Value: - * Nothing + * Can Splint * * Example: - * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_splintCondition + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_canSplint * * Public: No */ @@ -20,6 +20,5 @@ params ["", "_patient", "_bodyPart"]; private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; -private _fractures = _patient getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; -(_fractures select _partIndex) == 1 +(GET_FRACTURES(_patient) select _partIndex) == 1 diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf index d4013d97f1b..738823114f4 100644 --- a/addons/medical_treatment/functions/fnc_canStitch.sqf +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -1,11 +1,11 @@ #include "script_component.hpp" /* * Author: Katalam - * Prevents stitch actions from showing if the body is either fully stitched or has no open wounds. + * Checks if the patient can be stitched. * * Arguments: - * 0: The medic - * 1: The patient + * 0: Medic (not used) + * 1: Patient * * ReturnValue: * Can Stitch diff --git a/addons/medical_treatment/functions/fnc_canTreat.sqf b/addons/medical_treatment/functions/fnc_canTreat.sqf index 26c981a02c9..d8905626c98 100644 --- a/addons/medical_treatment/functions/fnc_canTreat.sqf +++ b/addons/medical_treatment/functions/fnc_canTreat.sqf @@ -1,116 +1,61 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Check if the treatment action can be performed. + * Author: Glowbal, mharis001 + * Checks if the given treatment can be performed. * * Arguments: - * 0: The caller - * 1: The target - * 2: Body part - * 3: Treatment class name + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment * - * ReturnValue: + * Return Value: * Can Treat * * Example: - * [player, cursorTarget, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreat + * [player, cursorObject, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreat * * Public: No */ -params ["_caller", "_target", "_bodyPart", "_className"]; - -if !(_target isKindOf "CAManBase") exitWith {false}; - -private _config = configFile >> QGVAR(Actions) >> _className; - -if !(isClass _config) exitWith {false}; - -// allow self treatment check -private _isSelf = _caller isEqualTo _target; -private _allowSelf = 0; - -if (_isSelf) then { - if (isNumber (_config >> "allowSelfTreatment")) then { - _allowSelf = getNumber (_config >> "allowSelfTreatment"); - } else { - if (isText (_config >> "allowSelfTreatment")) then { - _allowSelf = missionNamespace getVariable [getText (_config >> "allowSelfTreatment"), 0]; +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +private _config = configFile >> QGVAR(actions) >> _classname; + +isClass _config +&& {_patient isKindOf "CAManBase"} +&& {_medic != _patient || {GET_NUMBER_ENTRY(_config >> "allowSelfTreatment") == 1}} +&& {[_medic, GET_NUMBER_ENTRY(_config >> "medicRequired")] call FUNC(isMedic)} +&& { + private _selections = getArray (_config >> "allowedSelections") apply {toLower _x}; + "all" in _selections || {_bodyPart in _selections} +} && { + private _items = getArray (_config >> "items"); + _items isEqualTo [] || {[_medic, _patient, _items] call FUNC(hasItem)} +} && { + GET_FUNCTION(_condition,_config >> "condition"); + + if (_condition isEqualType {}) then { + if (_condition isEqualTo {}) exitWith { + _condition = true; }; - }; -}; - -if (_isSelf && {_allowSelf == 0}) exitWith {false}; - -private _medicRequired = 0; - -if (isNumber (_config >> "requiredMedic")) then { - _medicRequired = getNumber (_config >> "requiredMedic"); -} else { - if (isText (_config >> "requiredMedic")) then { - _medicRequired = missionNamespace getVariable [getText (_config >> "requiredMedic"), 0]; - }; -}; - -if !([_caller, _medicRequired] call FUNC(isMedic)) exitWith {false}; - -// check selection -private _allowedSelections = getArray (_config >> "allowedSelections") apply {toLower _x}; - -if !("all" in _allowedSelections || {(_bodyPart in _allowedSelections)}) exitWith {false}; - -// check item -private _items = getArray (_config >> "items"); - -if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitWith {false}; - -private _condition = true; - -if (isText (_config >> "condition")) then { - _condition = getText (_config >> "condition"); - - if (_condition isEqualTo "") exitWith { - _condition = true; - }; - - if (isNil _condition) then { - _condition = compile _condition; - } else { - _condition = missionNamespace getVariable _condition; - }; - - if !(_condition isEqualType false) then { + _condition = call _condition; }; -}; - -if !(_condition) exitWith {false}; -// check allowed locations -private _locations = getArray (_config >> "treatmentLocations") apply {toLower _x}; - -if ("all" in _locations) then { - _locations = true; -} else { - private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; - private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; - - { - if (_x == "field") exitWith { _locations = true; }; - if (_x == "MedicalFacility" && _medFacility) exitWith { _locations = true; }; - if (_x == "MedicalVehicle" && _medVeh) exitWith { _locations = true; }; - if !(isNil _x) exitWith { - _locations = missionNamespace getVariable _x; - - if !(_locations isEqualType false) then { - if (_locations isEqualTo 0) exitWith { _locations = true; }; //AdvancedMedicalSettings_anywhere - if (_locations isEqualTo 1) exitWith { _locations = call _medVeh; }; //AdvancedMedicalSettings_vehicle - if (_locations isEqualTo 2) exitWith { _locations = call _medFacility; }; //AdvancedMedicalSettings_facility - if (_locations isEqualTo 3) exitWith { _locations = call _medFacility || {call _medVeh}; }; //AdvancedMedicalSettings_vehicleAndFacility - _locations = false; //Disabled - }; + _condition +} && { + switch (GET_NUMBER_ENTRY(_config >> "treatmentLocations")) do { + case TREATMENT_LOCATIONS_ALL: {true}; + case TREATMENT_LOCATIONS_VEHICLES: { + IN_MED_VEHICLE(_medic) || {IN_MED_VEHICLE(_patient)} }; - } forEach _locations; -}; - -_locations + case TREATMENT_LOCATIONS_FACILITIES: { + IN_MED_FACILITY(_medic) || {IN_MED_FACILITY(_patient)} + }; + case TREATMENT_LOCATIONS_VEHICLES_AND_FACILITIES: { + IN_MED_VEHICLE(_medic) || {IN_MED_VEHICLE(_patient)} || {IN_MED_FACILITY(_medic)} || {IN_MED_FACILITY(_patient)} + }; + default {false}; + }; +} diff --git a/addons/medical_treatment/functions/fnc_canTreatCached.sqf b/addons/medical_treatment/functions/fnc_canTreatCached.sqf index 53ad59cdf47..d70f041c174 100644 --- a/addons/medical_treatment/functions/fnc_canTreatCached.sqf +++ b/addons/medical_treatment/functions/fnc_canTreatCached.sqf @@ -1,24 +1,23 @@ #include "script_component.hpp" /* * Author: Glowbal - * Cached Check if the treatment action can be performed. + * Cached check to determine if given treatment can be performed. * * Arguments: - * 0: The caller - * 1: The target - * 2: Selection name - * 3: ACE_Medical_Treatment Classname + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment * * Return Value: * Can Treat * * Example: - * [bob, kevin, "selection", "classname"] call ace_medical_treatment_fnc_canTreatCached + * [player, cursorObject, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreatCached * * Public: No */ -params ["", "_target", "_selection", "_classname"]; +params ["", "_patient", "_bodyPart", "_classname"]; -// parameters, function, namespace, uid -[_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], CAN_TREAT_CONDITION_CACHE_EXPIRY, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); +[_this, FUNC(canTreat), _patient, format [QGVAR(canTreat_%1_%2), _bodyPart, _classname], CAN_TREAT_CONDITION_CACHE_EXPIRY, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf new file mode 100644 index 00000000000..b708b7e50fe --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkBloodPressure.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the blood pressure of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftArm"] call ace_medical_treatment_fnc_checkBloodPressure + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +[QGVAR(checkBloodPressureLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf new file mode 100644 index 00000000000..5da7495f74b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkBloodPressureLocal.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the blood pressure of a patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftArm"] call ace_medical_treatment_fnc_checkBloodPressureLocal + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +private _bloodPressure = [0, 0]; + +if (alive _patient && {!([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _bloodPressure = GET_BLOOD_PRESSURE(_patient); +}; + +private _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_6); +private _logOutput = LSTRING(Check_Bloodpressure_NoBloodpressure); + +_bloodPressure params ["_bloodPressureLow", "_bloodPressureHigh"]; + +if (_bloodPressureHigh > 20) then { + if (_medic call FUNC(isMedic)) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_1); + _logOutput = format ["%1/%2", round _bloodPressureHigh, round _bloodPressureLow]; + } else { + if (_bloodPressureHigh > 20) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_2); + _logOutput = LSTRING(Check_Bloodpressure_Low); + + if (_bloodPressureHigh > 100) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_3); + _logOutput = LSTRING(Check_Bloodpressure_Normal); + + if (_bloodPressureHigh > 160) then { + _bloodPressureOutput = LSTRING(Check_Bloodpressure_Output_4); + _logOutput = LSTRING(Check_Bloodpressure_High); + }; + }; + }; + }; +}; + +[_patient, "quick_view", LSTRING(Check_Bloodpressure_Log), [_medic call EFUNC(common,getName), _logOutput]] call FUNC(addToLog); + +[QEGVAR(common,displayTextStructured), [[_bloodPressureOutput, _patient call EFUNC(common,getName), round _bloodPressureHigh, round _bloodPressureLow], 1.75, _medic], _medic] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkItems.sqf b/addons/medical_treatment/functions/fnc_checkItems.sqf index 41c1720e062..2f4c20175ef 100644 --- a/addons/medical_treatment/functions/fnc_checkItems.sqf +++ b/addons/medical_treatment/functions/fnc_checkItems.sqf @@ -1,38 +1,47 @@ #include "script_component.hpp" /* - * Author: KoffeinFlummi, commy2, SilentSpike - * Replaces vanilla items with ACE ones. + * Author: KoffeinFlummi, commy2, mharis001 + * Handles converting vanilla medical items with ACE equivalents. * * Arguments: - * 0: The unit + * 0: Unit * - * ReturnValue: + * Return Value: * None * + * Example: + * [player] call ace_medical_treatment_fnc_checkItems + * * Public: No */ -if (EGVAR(medical,convertItems) == 2) exitWith {}; +if (GVAR(convertItems) == 2) exitWith {}; params ["_unit"]; -// Item conversions are cached at preStart (compileFinal'd for security) -private _itemHash = call (uiNamespace getVariable QGVAR(replaceItems)); - -private _replaceItem = { - private _itemCount = [_unit, _key] call EFUNC(common,getCountOfItem); - - if (_itemCount > 0) then { - _unit removeItems _key; - - if (EGVAR(medical,convertItems) != 0) exitWith {}; - - { - for "_i" from 1 to ((_x select 1) * _itemCount) do { - _unit addItem (_x select 0); - }; - } forEach _value; - }; +private _fnc_loop = if (GVAR(convertItems) == 0) then { + { + _x params ["_itemToRemove", "_replacementItems"]; + + private _count = [_unit, _itemToRemove] call EFUNC(common,getCountOfItem); + + if (_count > 0) then { + _unit removeItems _itemToRemove; + + { + _x params ["_item", "_amount"]; + + for "_i" from 1 to (_amount * _count) do { + _unit addItem _item; + }; + } forEach _replacementItems; + }; + } +} else { + { + _x params ["_itemToRemove"]; + _unit removeItems _itemToRemove; + } }; -[_itemHash, _replaceItem] call CBA_fnc_hashEachPair; +_fnc_loop forEach GVAR(replacementItems); diff --git a/addons/medical_treatment/functions/fnc_checkPulse.sqf b/addons/medical_treatment/functions/fnc_checkPulse.sqf new file mode 100644 index 00000000000..6c5b628fae6 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkPulse.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the pulse or heart rate of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head"] call ace_medical_treatment_fnc_checkPulse + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +[QGVAR(checkPulseLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf new file mode 100644 index 00000000000..f386fa2c899 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkPulseLocal.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the pulse or heart rate of a patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head"] call ace_medical_treatment_fnc_checkPulseLocal + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +private _heartRate = 0; + +if (alive _patient && {!([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _heartRate = GET_HEART_RATE(_patient); +}; + +private _heartRateOutput = LSTRING(Check_Pulse_Output_5); +private _logOutput = LSTRING(Check_Pulse_None); + +if (_heartRate > 1) then { + if (_medic call FUNC(isMedic)) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_1); + _logOutput = format ["%1", round _heartRate]; + } else { + _heartRateOutput = LSTRING(Check_Pulse_Output_2); + _logOutput = LSTRING(Check_Pulse_Weak); + + if (_heartRate > 60) then { + if (_heartRate > 100) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_3); + _logOutput = LSTRING(Check_Pulse_Strong); + } else { + _heartRateOutput = LSTRING(Check_Pulse_Output_4); + _logOutput = LSTRING(Check_Pulse_Normal); + }; + }; + }; +}; + +[_patient, "quick_view", LSTRING(Check_Pulse_Log), [_medic call EFUNC(common,getName), _logOutput]] call FUNC(addToLog); + +[QEGVAR(common,displayTextStructured), [[_heartRateOutput, _patient call EFUNC(common,getName), round _heartRate], 1.5, _medic], _medic] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_checkResponse.sqf b/addons/medical_treatment/functions/fnc_checkResponse.sqf new file mode 100644 index 00000000000..0fe0bbd60e4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkResponse.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Checks the response status of the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_checkResponse + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select (_patient call EFUNC(common,isAwake)); +[[_output, _patient call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + +[_patient, "quick_view", _output, [[_patient, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical_treatment/functions/fnc_cpr.sqf b/addons/medical_treatment/functions/fnc_cpr.sqf new file mode 100644 index 00000000000..a0732bcbf8e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cpr.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles finishing performing CPR on the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cpr + * + * Public: No + */ + +params ["_medic", "_patient"]; + +_patient setVariable [QGVAR(isReceivingCPR), false, true]; +_patient setVariable [VAR_HEART_RATE, 0, true]; +_patient call FUNC(calculateBlood); + +if (alive _patient && {IN_CRDC_ARRST(_patient)}) then { + [QGVAR(cprLocal), [_medic, _patient], _patient] call CBA_fnc_targetEvent; +}; diff --git a/addons/medical_treatment/functions/fnc_cprFailure.sqf b/addons/medical_treatment/functions/fnc_cprFailure.sqf new file mode 100644 index 00000000000..a19179c5f81 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprFailure.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles failure of the CPR treatment. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprFailure + * + * Public: No + */ + +params ["", "_patient"]; + +if (!(_patient call EFUNC(common,isAwake)) || {IN_CRDC_ARRST(_patient)}) then { + _patient setVariable [VAR_HEART_RATE, 0, true]; +}; + +// Patient is no longer receiving CPR +_patient setVariable [QGVAR(isReceivingCPR), false, true]; + +_patient call FUNC(calculateBlood); diff --git a/addons/medical_treatment/functions/fnc_cprLocal.sqf b/addons/medical_treatment/functions/fnc_cprLocal.sqf new file mode 100644 index 00000000000..da72faba455 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprLocal.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for finishing performing CPR on the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprLocal + * + * Public: No + */ + +params ["_medic", "_patient"]; + +[_patient, "activity", LSTRING(Activity_CPR), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +if (random 1 >= 0.6) then { + [QEGVAR(medical,CPRSucceeded), _patient] call CBA_fnc_localEvent; +}; diff --git a/addons/medical_treatment/functions/fnc_cprProgress.sqf b/addons/medical_treatment/functions/fnc_cprProgress.sqf new file mode 100644 index 00000000000..e595b7ffdd6 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprProgress.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles the progress of the CPR treatment. + * + * Arguments: + * 0: Arguments + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Continue CPR + * + * Example: + * [[player, cursorObject]] call ace_medical_treatment_fnc_cprProgress + * + * Public: No + */ + +params ["_args"]; +_args params ["", "_patient"]; + +// Cancel CPR is patient wakes up +if (_patient getVariable EFUNC(common,isAwake) || {!IN_CRDC_ARRST(_patient)}) exitWith {false}; + +// Calculate blood volume, if there is no pulse nothing happens +_patient call FUNC(calculateBlood); + +true diff --git a/addons/medical_treatment/functions/fnc_cprStart.sqf b/addons/medical_treatment/functions/fnc_cprStart.sqf new file mode 100644 index 00000000000..677e8a516aa --- /dev/null +++ b/addons/medical_treatment/functions/fnc_cprStart.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles starting the CPR treatment. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_cprStart + * + * Public: No + */ + +params ["", "_patient"]; + +// Prevent others from performing CPR +_patient setVariable [QGVAR(isReceivingCPR), true, true]; + +// Create a random pulse based on setting +if (GVAR(cprCreatesPulse) && {GET_HEART_RATE(_patient) == 0}) then { + _patient setVariable [VAR_HEART_RATE, round random [25, 30, 35], true]; +}; + +_patient setVariable [QEGVAR(medical,lastTimeUpdated), CBA_missionTime, true]; diff --git a/addons/medical_treatment/functions/fnc_createLitter.sqf b/addons/medical_treatment/functions/fnc_createLitter.sqf new file mode 100644 index 00000000000..587648de49c --- /dev/null +++ b/addons/medical_treatment/functions/fnc_createLitter.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Creates litter around the patient based on the treatment. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "Head", "BasicBandage"] call ace_medical_fnc_createLitter + * + * Public: No + */ + +// Exit if litter creation is disabled +if (!GVAR(allowLitterCreation)) exitWith {}; + +params ["_medic", "_patient", "_bodyPart", "_classname"]; + +// Don't create litter if medic or patient are inside a vehicle +if (vehicle _medic != _medic || {vehicle _patient != _patient}) exitWith {}; + +// Determine if treated body part is bleeding +private _index = ALL_BODY_PARTS find toLower _bodyPart; +private _isBleeding = (_patient getVariable [QEGVAR(medical,openWounds), []]) findIf { + _x params ["", "_bodyPartN", "_amountOf", "_bleeding"]; + + _bodyPartN == _index && {_amountOf * _bleeding > 0} +} != -1; + +// Get litter config for the treatment +private _litter = getArray (configFile >> QGVAR(actions) >> _classname >> "litter"); +_litter params [["_alwaysLitter", [], [[]]], ["_cleanLitter", [], [[]]], ["_bloodyLitter", [], [[]]]]; + +private _fnc_createLitter = { + params ["_litterOptions"]; + + private _position = getPosASL _patient; + + // For now, don't spawn litter over water to avoid floating litter + // todo: handle carriers over water + if (surfaceIsWater _position) exitWith {}; + + { + if (_x isEqualType []) then { + _x = selectRandom _x; + }; + + // Randomize position XY +/- 1 m + private _position = _position vectorAdd [ + random 2 - 1, + random 2 - 1, + 0 + ]; + + // Create litter on server which will also handle cleanup + [QGVAR(createLitterServer), [_x, _position, random 360]] call CBA_fnc_serverEvent; + } forEach _litterOptions; +}; + +private _conditionalLitter = [_cleanLitter, _bloodyLitter] select _isBleeding; + +[_alwaysLitter] call _fnc_createLitter; +[_conditionalLitter] call _fnc_createLitter; diff --git a/addons/medical_treatment/functions/fnc_createLitterServer.sqf b/addons/medical_treatment/functions/fnc_createLitterServer.sqf new file mode 100644 index 00000000000..5b94c5f1997 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_createLitterServer.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Creates a litter object and handles its cleanup. Only execute on server. + * + * Arguments: + * 0: Litter Class + * 1: Position ASL + * 2: Direction + * + * Return Value: + * None + * + * Example: + * ["Litter_1", [100, 100, 0], 90] call ace_medical_fnc_createLitterServer + * + * Public: No + */ + +params ["_litterClass", "_position", "_direction"]; + +if (isNil QGVAR(litterObjects)) then { + GVAR(litterObjects) = []; + GVAR(litterCleanup) = false; +}; + +private _model = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); +if (_model == "") exitWith {}; + +// createSimpleObject expects a path without the leading slash +if (_model select [0, 1] == "\") then { + _model = _model select [1]; +}; + +private _object = createSimpleObject [_model, [0, 0, 0]]; +_object setPosASL _position; +_object setDir _direction; + +// Set the litter object's position next frame to correct HORRIBLE spacing (fixes #1112) +[{ + params ["_object", "_position"]; + _object setPosASL _position; +}, [_object, _position]] call CBA_fnc_execNextFrame; + +// Delete oldest litter object if max count reached +if (count GVAR(litterObjects) > GVAR(maxLitterObjects)) then { + private _litterToDelete = GVAR(litterObjects) deleteAt 0; + deleteVehicle (_litterToDelete select 0); +}; + +GVAR(litterObjects) pushBack [_object, CBA_missionTime]; + +// Start cleanup loop if not already running and litter lifetime is not forever +if (!GVAR(litterCleanup) && {GVAR(litterCleanupDelay) > 0}) then { + [] call FUNC(litterCleanupLoop); + GVAR(litterCleanup) = true; +}; diff --git a/addons/medical_treatment/functions/fnc_diagnose.sqf b/addons/medical_treatment/functions/fnc_diagnose.sqf new file mode 100644 index 00000000000..531827302db --- /dev/null +++ b/addons/medical_treatment/functions/fnc_diagnose.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Action for diagnosing in basic medical + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_diagnose + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _messages = [LSTRING(diagnoseMessage), _patient call EFUNC(common,getName)]; + +if (alive _patient) then { + _messages pushBack LSTRING(diagnoseAlive); +} else { + _messages pushBack LSTRING(diagnoseDead); +}; + +private _hemorrhage = GET_HEMORRHAGE(_patient); +if (_hemorrhage > 0) then { + if (_hemorrhage > 1) then { + _messages pushBack LSTRING(lostBloodALot); + } else { + _messages pushBack LSTRING(lostBlood); + }; +} else { + _messages pushBack LSTRING(noBloodloss); +}; + +// todo: mirror pain visualization logic of medical_gui? +if (alive _patient) then { + if IS_IN_PAIN(_patient) then { + _messages pushBack LSTRING(inPain); + } else { + _messages pushBack LSTRING(noPain); + }; +}; + +[_messages, 3] call EFUNC(common,displayTextStructured); diff --git a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf index 76221060547..d1a451e3af2 100644 --- a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf +++ b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf @@ -4,8 +4,8 @@ * Finds the wound most effective to bandage on the given bodypart of the patient for the given bandage type. * * Arguments: - * 0: The patient - * 1: Treatment class name + * 0: Patient + * 1: Treatment classname * 2: Body part index * * Return Value: diff --git a/addons/medical_treatment/functions/fnc_fullHeal.sqf b/addons/medical_treatment/functions/fnc_fullHeal.sqf new file mode 100644 index 00000000000..c5027e7dbea --- /dev/null +++ b/addons/medical_treatment/functions/fnc_fullHeal.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Fully heals the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_fullHeal + * + * Public: No + */ + +params ["_medic", "_patient"]; + +[_patient, "activity", LSTRING(Activity_fullHeal), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(fullHealLocal), _patient, _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf new file mode 100644 index 00000000000..75ccb26674d --- /dev/null +++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf @@ -0,0 +1,84 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for fully healing a patient. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_treatment_fnc_fullHealLocal + * + * Public: No + */ + +params ["_patient"]; + +if (!alive _patient) exitWith {}; + +// Treatment conditions would normally limit full heal to non-unconscious units +// However, this may be called externally (through Zeus) +if IN_CRDC_ARRST(_patient) then { + TRACE_1("Exiting cardiac arrest",_patient); + [QEGVAR(medical,CPRSucceeded), _patient] call CBA_fnc_localEvent; +}; + +if IS_UNCONSCIOUS(_patient) then { + TRACE_1("Waking up",_patient); + // Wake patient up first or unconscious variables will be reset + [QEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; +}; + +_patient setVariable [VAR_PAIN, 0, true]; +_patient setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; + +// Tourniquets +_patient setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; +_patient setVariable [QGVAR(occludedMedications), nil, true]; + +// Wounds and Injuries +_patient setVariable [QEGVAR(medical,openWounds), [], true]; +_patient setVariable [QEGVAR(medical,bandagedWounds), [], true]; +_patient setVariable [QEGVAR(medical,stitchedWounds), [], true]; +_patient setVariable [QEGVAR(medical,isLimping), false, true]; +_patient setVariable [VAR_FRACTURES, DEFAULT_FRACTURE_VALUES, true]; + +// Update wound bleeding +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +// Vitals +_patient setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; +_patient setVariable [VAR_BLOOD_PRESS, [80, 120], true]; +_patient setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; + +// IVs +_patient setVariable [QEGVAR(medical,ivBags), nil, true]; + +// Damage storage +_patient setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; +#ifdef DEBUG_TESTRESULTS +_patient setVariable [QEGVAR(medical,bodyPartStatus), [0,0,0,0,0,0], true]; +#endif + +// Generic medical admin +_patient setVariable [VAR_CRDC_ARRST, false, true]; +_patient setVariable [VAR_UNCON, false, true]; +_patient setVariable [VAR_HEMORRHAGE, 0, true]; +_patient setVariable [VAR_IN_PAIN, false, true]; +_patient setVariable [VAR_PAIN_SUPP, 0, true]; + +// Medication +_patient setVariable [VAR_MEDICATIONS, [], true]; + +// Reset triage card since medication is reset +_patient setVariable [QEGVAR(medical,triageCard), [], true]; + +[_patient] call EFUNC(medical_engine,updateDamageEffects); + +// Reset damage +_patient setDamage 0; + +[QEGVAR(medical,FullHeal), _patient] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_getBandageTime.sqf b/addons/medical_treatment/functions/fnc_getBandageTime.sqf index 48fd27fdac8..e56727cfc7a 100644 --- a/addons/medical_treatment/functions/fnc_getBandageTime.sqf +++ b/addons/medical_treatment/functions/fnc_getBandageTime.sqf @@ -4,13 +4,16 @@ * Calculates the time to bandage a wound based on it's size, the patient and the medic. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment * * Return Value: - * Time in seconds + * Treatment Time + * + * Example: + * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_getBandageTime * * Public: No */ @@ -48,4 +51,4 @@ if (_medic == _patient) then { }; // Nobody can bandage instantly -_bandageTime max 1 +_bandageTime max 2 diff --git a/addons/medical_treatment/functions/fnc_getHealTime.sqf b/addons/medical_treatment/functions/fnc_getHealTime.sqf new file mode 100644 index 00000000000..e8e8c302bfc --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getHealTime.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Calculates the PAK treatment time based on the amount of damage to heal. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Treatment Time + * + * Example: + * [player] call ace_medical_treatment_fnc_getHealTime + * + * Public: No + */ + +#define DAMAGE_SCALING_FACTOR 5 + +params ["", "_patient"]; + +private _bodyPartDamage = 0; + +{ + _bodyPartDamage = _bodyPartDamage + _x; +} forEach (_patient getVariable [QEGVAR(medical,bodyPartDamage), []]); + +10 max (((_bodyPartDamage * DAMAGE_SCALING_FACTOR) min 180) * GVAR(timeCoefficientPAK)) diff --git a/addons/medical_treatment/functions/fnc_getStitchTime.sqf b/addons/medical_treatment/functions/fnc_getStitchTime.sqf new file mode 100644 index 00000000000..63e970301bc --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getStitchTime.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Calculates the Surgical Kit treatment time based on the amount of bandaged wounds. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Treatment Time + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_getStitchTime + * + * Public: No + */ + +#define TIME_PER_WOUND 5 + +params ["", "_patient"]; + +count (_patient getVariable [QEGVAR(medical,bandagedWounds), []]) * TIME_PER_WOUND diff --git a/addons/medical_treatment/functions/fnc_getTriageStatus.sqf b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf index de4f78a8534..6db6484b8f2 100644 --- a/addons/medical_treatment/functions/fnc_getTriageStatus.sqf +++ b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf @@ -7,11 +7,11 @@ * 0: Unit * * Return Value: - * Triage info - * 0: Status ID - * 1: Name - * 2: Color - * 3: Text color + * Triage Info + * 0: Status ID + * 1: Name + * 2: Color + * 3: Text Color * * Example: * [player] call ace_medical_treatment_fnc_getTriageStatus diff --git a/addons/medical_treatment/functions/fnc_hasItem.sqf b/addons/medical_treatment/functions/fnc_hasItem.sqf index f6e07b576ec..564e7c4be25 100644 --- a/addons/medical_treatment/functions/fnc_hasItem.sqf +++ b/addons/medical_treatment/functions/fnc_hasItem.sqf @@ -1,44 +1,31 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Check if the item is present between the patient and the medic + * Author: Glowbal, mharis001 + * Checks if one of the given items are present between the medic and patient. + * Does not respect the priority defined by the allowSharedEquipment setting. + * Will check medic first and then patient if shared equipment is allowed. * * Arguments: * 0: Medic * 1: Patient - * 2: Item + * 2: Items * * Return Value: - * Has the items + * Has Item * * Example: - * [bob, patient, "bandage"] call ace_medical_treatment_fnc_hasItem + * [player, cursorObject, ["ACE_fieldDressing"]] call ace_medical_treatment_fnc_hasItems * * Public: No */ -params ["_medic", "_patient", "_item"]; +params ["_medic", "_patient", "_items"]; -if (isNil QEGVAR(medical,setting_allowSharedEquipment)) then { - EGVAR(medical,setting_allowSharedEquipment) = true; -}; - -if (EGVAR(medical,setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - true -}; - -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - true -}; - -private _hasItem = false; +private _fnc_checkItems = { + params ["_unit"]; -if (vehicle _medic != _medic && {vehicle _medic call FUNC(isMedicalVehicle)}) then { - { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {[_x, _item] call EFUNC(common,hasItem)}) exitWith { - _hasItem = true; - }; - } forEach crew vehicle _medic; + private _unitItems = _unit call EFUNC(common,uniqueItems); + _items findIf {_x in _unitItems} != -1 }; -_hasItem +_medic call _fnc_checkItems || {GVAR(allowSharedEquipment) != 2 && {_patient call _fnc_checkItems}} diff --git a/addons/medical_treatment/functions/fnc_hasItems.sqf b/addons/medical_treatment/functions/fnc_hasItems.sqf deleted file mode 100644 index c55ad47e340..00000000000 --- a/addons/medical_treatment/functions/fnc_hasItems.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if all items are present between the patient and the medic. - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Items > - * - * Return Value: - * Has the items - * - * Example: - * [bob, patient, ["bandage", "morphine"]] call ace_medical_treatment_fnc_hasItems - * - * Public: No - */ - -params ["_medic", "_patient", "_items"]; - -private _return = true; - -{ - // handle a one of type use item - if (_x isEqualType [] && {{[_medic, _patient, _x] call FUNC(hasItem)} count _x == 0}) exitWith { - _return = false; - }; - - // handle required item - if (_x isEqualType "" && {!([_medic, _patient, _x] call FUNC(hasItem))}) exitWith { - _return = false; - }; -} forEach _items; - -_return diff --git a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf index d3f573cb55a..c8d2aa8e7bf 100644 --- a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf +++ b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf @@ -1,14 +1,14 @@ #include "script_component.hpp" /* * Author: Glowbal - * Check if unit has a tourniquet applied to the specified bodypart + * Checks if the unit has a tourniquet applied on the specified body part. * * Arguments: - * 0: The Unit + * 0: Unit * 1: Body Part * * Return Value: - * Has tourniquet applied + * Has Tourniquet Been Applied * * Example: * [player, "leftleg"] call ace_medical_treatment_fnc_hasTourniquetAppliedTo @@ -16,8 +16,8 @@ * Public: No */ -params ["_target", "_bodyPart"]; +params ["_unit", "_bodyPart"]; private _index = ALL_BODY_PARTS find toLower _bodyPart; -_index >= 0 && {HAS_TOURNIQUET_APPLIED_ON(_target,_index)} +_index >= 0 && {HAS_TOURNIQUET_APPLIED_ON(_unit,_index)} diff --git a/addons/medical_treatment/functions/fnc_healTime.sqf b/addons/medical_treatment/functions/fnc_healTime.sqf deleted file mode 100644 index 0dcb1f74d2f..00000000000 --- a/addons/medical_treatment/functions/fnc_healTime.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Ruthberg - * Calculates the personal aid kit treatment time based on amount of damage to heal - * - * Arguments: - * unit - * - * Return Value: - * treatment time - * - * Example: - * [_target] call ace_medical_treatment_fnc_healTime - * - * Public: No - */ - -params ["_unit"]; - -private _totalDamage = 0; -private _treatTime = 0; - -{ - _totalDamage = _totalDamage + _x; -} forEach (_unit getVariable [QEGVAR(medical,bodyPartDamage), []]); - -if (EGVAR(medical,PAKTime) > 0) then { - _treatTime = EGVAR(medical,PAKTime); -} else { - _treatTime = 10 max (_totalDamage * 5) min 180; -}; -_treatTime diff --git a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf index a9b01345b8e..fe144ea78a2 100644 --- a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Checks if a unit is in a designated medical facility + * Author: Glowbal, mharis001 + * Checks if the unit is in a medical facility. * * Arguments: - * 0: The Unit + * 0: Unit * * Return Value: - * Is in medical facility + * In Medical Facility * * Example: * [player] call ace_medical_treatment_fnc_isInMedicalFacility @@ -15,49 +15,13 @@ * Public: No */ -params ["_unit"]; - -//Cache the results as this function could be called rapidly -(_unit getVariable [QGVAR(cacheInFacility), [-9, false]]) params ["_expireTime", "_lastResult"]; -if (CBA_missionTime < _expireTime) exitWith {_lastResult}; - -private _eyePos = eyePos _unit; -private _isInBuilding = false; +#define CHECK_OBJECTS(var) ((var) findIf {typeOf _x in GVAR(facilityClasses) || {_x getVariable [QEGVAR(medical,isMedicalFacility), false]}} != -1) -private _medicalFacility = - [ - "TK_GUE_WarfareBFieldhHospital_Base_EP1", - "TK_GUE_WarfareBFieldhHospital_EP1", - "TK_WarfareBFieldhHospital_Base_EP1", - "TK_WarfareBFieldhHospital_EP1", - "US_WarfareBFieldhHospital_Base_EP1", - "US_WarfareBFieldhHospital_EP1", - "MASH_EP1", - "MASH", - "Land_A_Hospital", - "CDF_WarfareBFieldhHospital", - "GUE_WarfareBFieldhHospital", - "INS_WarfareBFieldhHospital", - "RU_WarfareBFieldhHospital", - "USMC_WarfareBFieldhHospital" - ]; - -private _objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select 2)], _unit modelToWorldVisual [0, 0, (_eyePos select 2) +10], _unit]); -{ - if (((typeOf _x) in _medicalFacility) || {_x getVariable [QEGVAR(medical,isMedicalFacility),false]}) exitWith { - _isInBuilding = true; - }; -} forEach _objects; +params ["_unit"]; -if (!_isInBuilding) then { - _objects = _unit nearObjects 7.5; - { - if (((typeOf _x) in _medicalFacility) || {_x getVariable [QEGVAR(medical,isMedicalFacility),false]}) exitWith { - _isInBuilding = true; - }; - } forEach _objects; +private _fnc_check = { + private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2]; + CHECK_OBJECTS(ARR_5(lineIntersectsWith [_position, _position vectorAdd [0, 0, 10], _unit])) || {CHECK_OBJECTS(_unit nearObjects 7.5)} }; -_unit setVariable [QGVAR(cacheInFacility), [CBA_missionTime + IN_MEDICAL_FACILITY_CACHE_EXPIRY, _isInBuilding]]; - -_isInBuilding; +[[], _fnc_check, _unit, QGVAR(inMedicalFacilityCache), IN_MEDICAL_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf index 6c4d8954926..2f76f04f99a 100644 --- a/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" /* * Author: KoffeinFlummi - * Checks if a unit is in a medical vehicle. + * Checks if the unit is in a medical vehicle. * * Arguments: - * 0: unit to be checked + * 0: Unit * * Return Value: - * Is unit in medical vehicle? + * In Medical Vehicle * * Example: * [player] call ace_medical_treatment_fnc_isInMedicalVehicle @@ -19,7 +19,4 @@ params ["_unit"]; private _vehicle = vehicle _unit; -if (_unit == _vehicle) exitWith {false}; -if (_unit in [driver _vehicle, gunner _vehicle, commander _vehicle]) exitWith {false}; - -[_vehicle] call FUNC(isMedicalVehicle); +_unit != _vehicle && {!(_unit in [driver _vehicle, gunner _vehicle, commander _vehicle])} && {[_vehicle] call FUNC(isMedicalVehicle)} diff --git a/addons/medical_treatment/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf index 65bbdcc853b..d109ad24521 100644 --- a/addons/medical_treatment/functions/fnc_isMedic.sqf +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -1,14 +1,15 @@ #include "script_component.hpp" /* * Author: Glowbal, KoffeinFlummi - * Check if a unit is any medical class + * Checks if the unit is a medic of the given level. + * Medic Levels: 0 - None, 1 - Medic, 2 - Doctor * * Arguments: - * 0: The Unit - * 1: Class (default: 1) + * 0: Unit + * 1: Medic Level (default: 1) * * Return Value: - * Is in of medic class + * Is Medic * * Example: * [player] call ace_medical_treatment_fnc_isMedic @@ -18,13 +19,13 @@ params ["_unit", ["_medicN", 1]]; -private _class = _unit getVariable [QEGVAR(medical,medicClass), [0, 1] select (_unit getUnitTrait "medic")]; +private _class = _unit getVariable [QEGVAR(medical,medicClass), parseNumber (_unit getUnitTrait "medic")]; if (_class >= _medicN) exitWith {true}; -if (!EGVAR(medical,increaseTrainingInLocations)) exitWith {false}; +if (!GVAR(locationsBoostTraining)) exitWith {false}; -if (([_unit] call FUNC(isInMedicalVehicle)) || {[_unit] call FUNC(isInMedicalFacility)}) then { - _class = _class + 1; //boost by one: untrained becomes medic, medic becomes doctor +if (IN_MED_VEHICLE(_unit) || {IN_MED_FACILITY(_unit)}) then { + _class = _class + 1; // Boost medical training by one: untrained becomes medic, medic becomes doctor }; _class >= _medicN diff --git a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf index d109a14e87f..4b06ffdb557 100644 --- a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" /* * Author: Glowbal - * Check if vehicle is a medical vehicle + * Checks if the vehicle is a medical vehicle. * * Arguments: - * 0: The Vehicle + * 0: Vehicle * * Return Value: - * Is in of medic class + * Is Medical Vehicle * * Example: * [cursorObject] call ace_medical_treatment_fnc_isMedicalVehicle @@ -17,4 +17,4 @@ params ["_vehicle"]; -(_vehicle getVariable [QEGVAR(medical,medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 +_vehicle getVariable [QEGVAR(medical,isMedicalVehicle), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") > 0] diff --git a/addons/medical_treatment/functions/fnc_ivBag.sqf b/addons/medical_treatment/functions/fnc_ivBag.sqf new file mode 100644 index 00000000000..bfc149564e1 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_ivBag.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Administers an IV bag treatment to the patient. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "BloodIV", objNull, "ACE_bloodIV"] call ace_medical_treatment_fnc_ivBag + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[_patient, _usedItem] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_gaveIV), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(ivBagLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf new file mode 100644 index 00000000000..f2640fb0bfd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Local callback for administering an IV bag to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * 2: Treatment + * + * Return Value: + * None + * + * Example: + * [player, "RightArm", "BloodIV"] call ace_medical_treatment_fnc_ivBagLocal + * + * Public: No + */ + +params ["_patient", "_bodyPart", "_classname"]; + +// Exit if patient has max blood volume +private _bloodVolume = GET_BLOOD_VOLUME(_patient); +if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {}; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +// Get attributes for the used IV +private _defaultConfig = configFile >> QUOTE(ADDON) >> "IV"; +private _ivConfig = _defaultConfig >> _classname; + +private _volume = GET_NUMBER(_ivConfig >> "volume",getNumber (_defaultConfig >> "volume")); +private _type = GET_STRING(_ivConfig >> "type",getText (_defaultConfig >> "type")); + +// Add IV bag to patient's ivBags array +private _ivBags = _patient getVariable [QEGVAR(medical,ivBags), []]; +_ivBags pushBack [_volume, _type, _partIndex]; +_patient setVariable [QEGVAR(medical,ivBags), _ivBags, true]; diff --git a/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf index 20b2cc20ec9..1039edb4c62 100644 --- a/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* - * Author: Glowbal, esteldunedain - * Loop that cleans up litter + * Author: Glowbal, esteldunedain, mharis001 + * Handles cleaning up litter objects that have reached the end of their lifetime. * * Arguments: * None @@ -10,31 +10,28 @@ * None * * Example: - * call ace_medical_treatment_fnc_litterCleanupLoop + * [] call ace_medical_treatment_fnc_litterCleanupLoop * * Public: No */ { - _x params ["_time", "_objects"]; + _x params ["_object", "_timeCreated"]; - // Older elements are always at the begining of the array - if (CBA_missionTime - _time < GVAR(litterCleanUpDelay)) exitWith {}; + // Litter array has older objects at the beginning + // Can exit on first element that still has lifetime remaining + if (CBA_missionTime - _timeCreated < GVAR(litterCleanupDelay)) exitWith {}; - TRACE_2("deleting",_time,_objects); - { - deleteVehicle _x; - } forEach _objects; + deleteVehicle _object; + GVAR(litterObjects) set [_forEachIndex, objNull]; +} forEach GVAR(litterObjects); - GVAR(allCreatedLitter) set [_forEachIndex, objNull]; -} forEach GVAR(allCreatedLitter); +GVAR(litterObjects) = GVAR(litterObjects) - [objNull]; -GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; - -// If no more litter remain, exit the loop -if (GVAR(allCreatedLitter) isEqualTo []) exitWith { - GVAR(litterPFHRunning) = false; +// Exit the loop if no litter objects left +if (GVAR(litterObjects) isEqualTo []) exitWith { + GVAR(litterCleanup) = false; }; -// Schedule the loop to be executed again 30 sec later -[FUNC(litterCleanupLoop), [], 30] call CBA_fnc_waitAndExecute; +// Schedule cleanup loop to executed again +[FUNC(litterCleanupLoop), [], LITTER_CLEANUP_CHECK_DELAY] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_treatment/functions/fnc_litterCreate.sqf b/addons/medical_treatment/functions/fnc_litterCreate.sqf deleted file mode 100644 index 1f48a56a8b8..00000000000 --- a/addons/medical_treatment/functions/fnc_litterCreate.sqf +++ /dev/null @@ -1,98 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Spawns litter for the treatment action on the ground around the target - * - * Arguments: - * 0: The Caller - * 1: The target - * 2: The treatment Selection Name - * 3: The treatment classname - * 4: ? - * 5: Users of Items - * 6: Blood Loss on selection (previously called _previousDamage) - * - * Return Value: - * None - * - * Public: No - */ - -#define MIN_ENTRIES_LITTER_CONFIG 3 - -params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_bloodLossOnSelection"]; -TRACE_6("params",_caller,_target,_selectionName,_className,_usersOfItems,_bloodLossOnSelection); - -// Ensures comptibilty with other possible medical treatment configs -private _previousDamage = _bloodLossOnSelection; - -// Exit if litter is disabled by setting -if !(EGVAR(medical,allowLitterCreation)) exitWith {}; - -// Don't create litter if medic or patient are inside a vehicle -if (vehicle _caller != _caller || {vehicle _target != _target}) exitWith {}; - -private _config = configFile >> QGVAR(Actions) >> _className; -if !(isClass _config) exitWith {TRACE_1("No action config",_className);}; - -if !(isArray (_config >> "litter")) exitWith {TRACE_1("No litter config",_className);}; -private _litter = getArray (_config >> "litter"); - -private _createLitter = { - params ["_unit", "_litterClass"]; - - private _position = getPosASL _unit; - - // @TODO: handle carriers over water - // For now, don't spawn litter if we are over water to avoid floating litter - if (surfaceIsWater _position) exitWith {false}; - - _position = _position vectorAdd [ - random 2 - 1, - random 2 - 1, - 0 - ]; - - private _direction = random 360; - - // Create the litter, and timeout the event based on the cleanup delay - // The cleanup delay for events in MP is handled by the server side - TRACE_3("Creating Litter on server",_litterClass,_position,_direction); - [QGVAR(createLitterServer), [_litterClass, _position, _direction]] call CBA_fnc_serverEvent; - - true -}; - -{ - if (count _x < MIN_ENTRIES_LITTER_CONFIG) then { - WARNING_1("Wrong litter array: %1",_x); - } else { - _x params [ - ["_selection", "", [""]], - ["_litterCondition", "", [""]], - ["_litterOptions", [], [[]]] - ]; - - if (toLower _selection in [toLower _selectionName, "all"]) then { - if (_litterCondition isEqualTo "") then { - _litterCondition = {true}; - } else { - _litterCondition = compile _litterCondition; - }; - - // existing configs seem to use carried over magic variables. we pass them as arguments (_this) anyway - if !([_caller, _target, _selectionName, _className, _usersOfItems, _bloodLossOnSelection] call _litterCondition) exitWith {}; - - // Loop through through the litter options and place the litter - { - if (_x isEqualType "") then { - [_target, _x] call _createLitter; - }; - - if (_x isEqualType [] && {count _x > 0}) then { - [_target, selectRandom _x] call _createLitter; - }; - } foreach _litterOptions; - }; - }; -} foreach _litter; diff --git a/addons/medical_treatment/functions/fnc_litterHandleCreate.sqf b/addons/medical_treatment/functions/fnc_litterHandleCreate.sqf deleted file mode 100644 index 10cbc1f5808..00000000000 --- a/addons/medical_treatment/functions/fnc_litterHandleCreate.sqf +++ /dev/null @@ -1,68 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * handle Litter Create - * - * Arguments: - * 0: Litter Class - * 1: Position - * 2: Unit - * - * Return Value: - * None - * - * Example: - * ["litter", [2, 5, 6], bob] call ace_medical_treatment_fnc_handleCreateLitter - * - * Public: No - */ - -params ["_litterClass", "_position", "_direction"]; -TRACE_3("params",_litterClass,_position,_direction); - -//IGNORE_PRIVATE_WARNING ["_values"]; - -if (isNil QGVAR(allCreatedLitter)) then { - GVAR(allCreatedLitter) = []; - GVAR(litterPFHRunning) = false; -}; - -private _model = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); -if (_model == "") exitWith {TRACE_2("no model",_litterClass,_model)}; - -// createSimpleObject expects a path without the leading slash -if (_model select [0,1] == "\") then { - _model = _model select [1]; -}; - -private _litterObject = createSimpleObject [_model, [0,0,0]]; -TRACE_2("created",_litterClass,_litterObject); - -_litterObject setDir _direction; -_litterObject setPosASL _position; - -// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 -[{ - params ["_object", "_position"]; - - _object setPosASL _position; -}, [_litterObject, _position]] call CBA_fnc_execNextFrame; - -private _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QEGVAR(medical,litterSimulationDetail) >> "_values") select EGVAR(medical,litterSimulationDetail); - -if (count GVAR(allCreatedLitter) > _maxLitterCount) then { - // gank the first litter object, and spawn ours. - private _oldLitter = GVAR(allCreatedLitter) deleteAt 0; - - { - deleteVehicle _x; - } forEach (_oldLitter select 1); -}; - -GVAR(allCreatedLitter) pushBack [CBA_missionTime, [_litterObject]]; - -if (!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { - // Start the litter cleanup loop - GVAR(litterPFHRunning) = true; - call FUNC(litterCleanupLoop); -}; diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf new file mode 100644 index 00000000000..8c65fd88cef --- /dev/null +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Loads an unconscious or dead patient in the given or nearest vehicle. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Vehicle (default: objNull) + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_loadUnit + * + * Public: No + */ + +params ["_medic", "_patient", ["_vehicle", objNull]]; + +if (_patient call EFUNC(common,isAwake)) exitWith { + [[LSTRING(CanNotLoad), _patient call EFUNC(common,getName)]] call EFUNC(common,displayTextStructured); +}; + +if (_patient call EFUNC(medical_status,isBeingCarried)) then { + [_medic, _patient] call EFUNC(dragging,dropObject_carry); +}; + +if (_patient call EFUNC(medical_status,isBeingDragged)) then { + [_medic, _patient] call EFUNC(dragging,dropObject); +}; + +private _vehicle = [_medic, _patient, _vehicle] call EFUNC(common,loadPerson); + +if (!isNull _vehicle) then { + private _patientName = [_patient, false, true] call EFUNC(common,getName); + private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + [[LSTRING(LoadedInto), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); +}; diff --git a/addons/medical_treatment/functions/fnc_medication.sqf b/addons/medical_treatment/functions/fnc_medication.sqf new file mode 100644 index 00000000000..6def70b212b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_medication.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Administers medication to the patient on the given body bodypart. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "Morphine", objNull, "ACE_morphine"] call ace_medical_treatment_fnc_medication + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[_patient, _usedItem] call FUNC(addToTriageCard); +[_patient, "activity", LSTRING(Activity_usedItem), [[_medic, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _usedItem >> "displayName")]] call FUNC(addToLog); + +[QGVAR(medicationLocal), [_patient, _bodyPart, _classname], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_medicationLocal.sqf b/addons/medical_treatment/functions/fnc_medicationLocal.sqf new file mode 100644 index 00000000000..30b64860e69 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_medicationLocal.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Local callback for administering medication to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * 2: Treatment + * + * Return Value: + * None + * + * Example: + * [player, "RightArm", "Morphine"] call ace_medical_treatment_fnc_medicationLocal + * + * Public: No + */ + +// todo: move this macro to script_macros_medical.hpp? +#define MORPHINE_PAIN_SUPPRESSION 0.6 + +params ["_patient", "_bodyPart", "_classname"]; +TRACE_3("medicationLocal",_patient,_bodyPart,_classname); + +// Medication has no effects on dead units +if (!alive _patient) exitWith {}; + +// Exit with basic medication handling if advanced medication not enabled +if (!GVAR(advancedMedication)) exitWith { + switch (_classname) do { + case "Morphine": { + private _painSuppress = GET_PAIN_SUPPRESS(_patient); + _patient setVariable [VAR_PAIN_SUPP, (_painSuppress + MORPHINE_PAIN_SUPPRESSION) min 1, true]; + }; + case "Epinephrine": { + [QEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; + }; + }; +}; +TRACE_1("Running treatmentMedicationLocal with Advanced configuration for", _target); + + +// Handle tourniquet on body part blocking blood flow at injection site +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +if (HAS_TOURNIQUET_APPLIED_ON(_patient,_partIndex)) exitWith { + TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); + private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; + _occludedMedications pushBack [_partIndex, _classname]; + _patient setVariable [QEGVAR(medical,occludedMedications), _occludedMedications, true]; +}; + +// Get adjustment attributes for used medication +private _defaultConfig = configFile >> QUOTE(ADDON) >> "Medication"; +private _medicationConfig = _defaultConfig >> _classname; + +private _painReduce = GET_NUMBER(_medicationConfig >> "painReduce",getNumber (_defaultConfig >> "painReduce")); +private _timeInSystem = GET_NUMBER(_medicationConfig >> "timeInSystem",getNumber (_defaultConfig >> "timeInSystem")); +private _timeTillMaxEffect = GET_NUMBER(_medicationConfig >> "timeTillMaxEffect",getNumber (_defaultConfig >> "timeTillMaxEffect")); +private _maxDose = GET_NUMBER(_medicationConfig >> "maxDose",getNumber (_defaultConfig >> "maxDose")); +private _viscosityChange = GET_NUMBER(_medicationConfig >> "viscosityChange",getNumber (_defaultConfig >> "viscosityChange")); +private _hrIncreaseLow = GET_ARRAY(_medicationConfig >> "hrIncreaseLow",getArray (_defaultConfig >> "hrIncreaseLow")); +private _hrIncreaseNormal = GET_ARRAY(_medicationConfig >> "hrIncreaseNormal",getArray (_defaultConfig >> "hrIncreaseNormal")); +private _hrIncreaseHigh = GET_ARRAY(_medicationConfig >> "hrIncreaseHigh",getArray (_defaultConfig >> "hrIncreaseHigh")); +private _incompatibleMedication = GET_ARRAY(_medicationConfig >> "incompatibleMedication",getArray (_defaultConfig >> "incompatibleMedication")); + +private _heartRate = GET_HEART_RATE(_patient); +private _hrIncrease = [_hrIncreaseLow, _hrIncreaseNormal, _hrIncreaseHigh] select (floor ((0 max _heartRate min 110) / 55)); +_hrIncrease params ["_minIncrease", "_maxIncrease"]; +private _heartRateChange = _minIncrease + random (_maxIncrease - _minIncrease); + +// Adjust the medication effects and add the medication to the list +TRACE_3("adjustments",_heartRateChange,_painReduce,_viscosityChange); +[_patient, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange] call EFUNC(medical_status,addMedicationAdjustment); + +// Check for medication compatiblity +[_patient, _className, _maxDose, _incompatibleMedication] call FUNC(onMedicationUsage); diff --git a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf index 6cbcf48f5aa..9784acb1ab4 100644 --- a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf @@ -18,8 +18,8 @@ * Public: No */ -params ["_target", "_className", "_maxDosage", "_incompatabileMeds"]; -TRACE_4("onMedicationUsage",_target,_className,_maxDosage,_incompatabileMeds); +params ["_target", "_className", "_maxDosage", "_incompatibleMedication"]; +TRACE_4("onMedicationUsage",_target,_className,_maxDosage,_incompatibleMedication); private _fnc_getMedicationCount = { params ["_target", "_medication"]; @@ -51,7 +51,7 @@ if (_currentDose >= floor (_maxDosage + round(random(2))) && {_maxDosage >= 1}) if (_inSystem> _xLimit) then { _overdosedMedications pushBackUnique _xMed; }; -} forEach _incompatabileMeds; +} forEach _incompatibleMedication; if !(_overdosedMedications isEqualTo []) then { private _medicationConfig = (configFile >> "ace_medical_treatment" >> "Medication"); diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf new file mode 100644 index 00000000000..02feb520253 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Places a dead body inside a body bag. + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_placeInBodyBag + * + * Public: No + */ + +params ["", "_patient"]; +TRACE_1("placeInBodyBag",_patient); + +if (!local _patient) exitWith { + TRACE_1("Calling where local",local _patient); + [QGVAR(placeInBodyBag), [nil, _patient], _patient] call CBA_fnc_targetEvent; +}; + +if (alive _patient) then { + TRACE_1("Manually killing with setDead",_patient); + [_patient, "buried_alive"] call EFUNC(medical_status,setDead); +}; + +private _position = (getPosASL _patient) vectorAdd [0, 0, 0.2]; + +private _headPos = _patient modelToWorldVisual (_patient selectionPosition "head"); +private _spinePos = _patient modelToWorldVisual (_patient selectionPosition "Spine3"); +private _direction = (_headPos vectorFromTo _spinePos) call CBA_fnc_vectDir; + +// Move the body away so it won't collide with the body bag object +// This setPosASL seems to need to be called where the unit is local +_patient setPosASL [-5000, -5000, 0]; + +// Create the body bag object, set its position to prevent it from flipping +private _bodyBag = createVehicle ["ACE_bodyBagObject", [0, 0, 0], [], 0, "NONE"]; +_bodyBag setPosASL _position; +_bodyBag setDir _direction; + +// Server will handle hiding and deleting the body +["ace_placedInBodyBag", [_patient, _bodyBag]] call CBA_fnc_globalEvent; diff --git a/addons/medical_treatment/functions/fnc_removeBody.sqf b/addons/medical_treatment/functions/fnc_removeBody.sqf new file mode 100644 index 00000000000..e86d374e8e3 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_removeBody.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Removes a body. Ideally it is deleted the next frame. + * However, player bodies cannot be deleted until they respawn, so it is hidden and deleted later. + * + * Arguments: + * 0: Body + * + * Return Value: + * None + * + * Example: + * [cursorObject] call ace_medical_treatment_fnc_removeBody + * + * Public: No + */ + +params ["_body"]; +TRACE_2("removeBody",_body,isPlayer _body); + +// Hide the body globally +[QEGVAR(common,hideObjectGlobal), [_body, true]] call CBA_fnc_serverEvent; + +// Add body to array of those waiting for deletion +if (isNil QGVAR(bodiesToDelete)) then { + GVAR(bodiesToDelete) = []; +}; + +GVAR(bodiesToDelete) pushBack _body; + +// Start up the body cleanup loop to delete bodies once they are free +if (count GVAR(bodiesToDelete) == 1) then { + [] call FUNC(bodyCleanupLoop); +}; diff --git a/addons/medical_treatment/functions/fnc_serverRemoveBody.sqf b/addons/medical_treatment/functions/fnc_serverRemoveBody.sqf deleted file mode 100644 index aa29cbc982a..00000000000 --- a/addons/medical_treatment/functions/fnc_serverRemoveBody.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Removes corpse. Idealy it is just deleted the next frame, - * but player bodies cannot be deleted until they respawn, so it is hidden and deleted later. - * - * Arguments: - * 0: Mr Body - * - * Return Value: - * None - * - * Example: - * [cursorTarget] call ace_medical_treatment_fnc_serverRemoveBody - * - * Public: No - */ - -params ["_target"]; -TRACE_2("",_target,isPlayer _target); - -// Hide the body globaly -[QEGVAR(common,hideObjectGlobal), [_target, true]] call CBA_fnc_serverEvent; - -if (isNil QGVAR(bodiesToDelete)) then {GVAR(bodiesToDelete) = [];}; -GVAR(bodiesToDelete) pushBack _target; - -// Start up a loop to wait for bodies to be free to delete -if ((count GVAR(bodiesToDelete)) == 1) then { - [] call FUNC(bodyCleanupLoop); -}; - -nil diff --git a/addons/medical_treatment/functions/fnc_splint.sqf b/addons/medical_treatment/functions/fnc_splint.sqf index 4ced63109c8..f7883da86a0 100644 --- a/addons/medical_treatment/functions/fnc_splint.sqf +++ b/addons/medical_treatment/functions/fnc_splint.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Apply a splint to the patient + * Applies a splint to the patient on the given body part. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part + * 0: Medic + * 1: Patient + * 2: Body Part * * Return Value: * Nothing @@ -17,9 +17,7 @@ * Public: No */ -params ["_caller", "_target", "_bodyPart"]; -TRACE_3("splint",_caller,_target,_bodyPart); +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("splint",_medic,_patient,_bodyPart); -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; - -[QGVAR(treatmentSplintLocal), [_caller, _target, _partIndex], _target] call CBA_fnc_targetEvent; +[QGVAR(splintLocal), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_splintLocal.sqf b/addons/medical_treatment/functions/fnc_splintLocal.sqf index 1996e8321ae..4ee190b5a44 100644 --- a/addons/medical_treatment/functions/fnc_splintLocal.sqf +++ b/addons/medical_treatment/functions/fnc_splintLocal.sqf @@ -1,31 +1,32 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Apply a splint to the patient + * Local callback for applying a splint to a patient. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part index + * 0: Medic + * 1: Patient + * 2: Body Part * * Return Value: * Nothing * * Example: - * [player, cursorObject, 4] call ace_medical_treatment_fnc_splintLocal + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_splintLocal * * Public: No */ -params ["_caller", "_target", "_bodyPartNum"]; -TRACE_3("splintLocal",_caller,_target,_bodyPart); +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("splintLocal",_medic,_patient,_bodyPart); -// Place a tourniquet on the bodypart -private _fractures = _target getVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0]]; -_fractures set [_bodyPartNum, -1]; -_target setVariable [QEGVAR(medical,fractures), _fractures, true]; +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +private _fractures = GET_FRACTURES(_patient); +_fractures set [_partIndex, -1]; +_patient setVariable [VAR_FRACTURES, _fractures, true]; // Check if we fixed limping from this treatment -[_target] call EFUNC(medical_engine,updateDamageEffects); +[_patient] call EFUNC(medical_engine,updateDamageEffects); -// toDo: AddToLog: +// todo: add logging diff --git a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf new file mode 100644 index 00000000000..565df32e547 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the surgical kit treatment by periodically closing bandaged wounds. + * + * Arguments: + * 0: Arguments + * 0: Medic (not used) + * 1: Patient + * 1: Elapsed Time + * 2: Total Time + * + * Return Value: + * Continue Treatment + * + * Example: + * [[objNull, player], 5, 10] call ace_medical_treatment_fnc_surgicalKitProgress + * + * Public: No + */ + +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["", "_patient"]; + +private _bandagedWounds = _patient getVariable [QEGVAR(medical,bandagedWounds), []]; +private _stitchedWounds = _patient getVariable [QEGVAR(medical,stitchedWounds), []]; + +// Stop treatment if there are no wounds that can be stitched remaining +if (_bandagedWounds isEqualTo []) exitWith { false }; + +// Check if enough time has elapsed to stitch another wound +if (_totalTime - _elapsedTime <= (count _bandagedWounds - 1) * 5) then { + private _treatedWound = _bandagedWounds deleteAt 0; + _stitchedWounds pushBack _treatedWound; + _patient setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true]; + _patient setVariable [QEGVAR(medical,stitchedWounds), _stitchedWounds, true]; + TRACE_3("stitched",_treatedWound,count _bandagedWounds,count _stitchedWounds); + + // Check if we fixed limping from this treatment + if ((EGVAR(medical,limping) == 2) && {_patient getVariable [QEGVAR(medical,isLimping), false]}) then { + _treatedWound params ["", "_partN"]; + if (_partN > 3) then { // only for LEG wounds + TRACE_3("updating damage effects",_patient,_partN,local _patient); + [QEGVAR(medical_engine,updateDamageEffects), [_patient], _patient] call CBA_fnc_patientEvent; + }; + }; +}; + +true diff --git a/addons/medical_treatment/functions/fnc_tourniquet.sqf b/addons/medical_treatment/functions/fnc_tourniquet.sqf new file mode 100644 index 00000000000..cd1a4c82679 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquet.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Applies a tourniquet to the patient on the given body part. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment (not used) + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg", "", objNull, "ACE_tourniquet"] call ace_medical_treatment_fnc_tourniquet + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "", "", "_usedItem"]; + +// Exit if there is a tourniquet already applied to body part +if ([_patient, _bodyPart] call FUNC(hasTourniquetAppliedTo)) exitWith { + ["There is already a tourniquet on this body part!", 1.5] call EFUNC(common,displayTextStructured); // todo: localize +}; + +[_patient, _usedItem] call FUNC(addToTraigeCard); +[_patient, "activity", LSTRING(Activity_appliedTourniquet), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + +[QGVAR(tourniquetLocal), [_patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf new file mode 100644 index 00000000000..4bc803a8a83 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for applying a tourniquet to a patient. + * + * Arguments: + * 0: Patient + * 1: Body Part + * + * Return Value: + * None + * + * Example: + * [player, "LeftLeg"] call ace_medical_treatment_fnc_tourniquetLocal + * + * Public: No + */ + +params ["_patient", "_bodyPart"]; +TRACE_2("tourniquetLocal",_patient,_bodyPart); + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +private _tourniquets = GET_TOURNIQUETS(_patient); +_tourniquets set [_partIndex, CBA_missionTime]; +_patient setVariable [VAR_TOURNIQUET, _tourniquets, true]; + +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf new file mode 100644 index 00000000000..50f4c084c04 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Removes the tourniquet from the patient on the given body part. + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg"] call ace_medical_treatment_fnc_tourniquetRemove + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; +TRACE_3("tourniquetRemove",_medic,_patient,_bodyPart); + +// Remove tourniquet from body part, exit if no tourniquet applied +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _tourniquets = GET_TOURNIQUETS(_patient); + +if (_tourniquets select _partIndex == 0) exitWith { + [LSTRING(noTourniquetOnBodyPart), 1.5] call EFUNC(common,displayTextStructured); +}; + +_tourniquets set [_partIndex, 0]; +_patient setVariable [VAR_TOURNIQUET, _tourniquets, true]; + +[_patient] call EFUNC(medical_status,updateWoundBloodLoss); + +// Add tourniquet item to medic's inventory +// todo: should there be a setting to select who receives the removed tourniquet? +[_medic, "ACE_tourniquet", true] call EFUNC(common,addToInventory); + +// Handle occluded medications that were blocked due to tourniquet +private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; +private _arrayModified = false; + +{ + _x params ["_bodyPartN", "_medication"]; + + if (_partIndex == _bodyPartN) then { + TRACE_1("delayed medication call after tourniquet removeal",_x); + [QGVAR(medicationLocal), [_patient, _bodyPart, _medication], _patient] call CBA_fnc_targetEvent; + _occludedMedications set [_forEachIndex, []]; + _arrayModified = true; + }; + +} forEach _occludedMedications; + +if (_arrayModified) then { + _occludedMedications = _occludedMedications - [[]]; + _patient setVariable [QEGVAR(medical,occludedMedications), _occludedMedications, true]; +}; diff --git a/addons/medical_treatment/functions/fnc_treatment.sqf b/addons/medical_treatment/functions/fnc_treatment.sqf index b76e6799eef..e75c0ba6ddf 100644 --- a/addons/medical_treatment/functions/fnc_treatment.sqf +++ b/addons/medical_treatment/functions/fnc_treatment.sqf @@ -1,199 +1,146 @@ #include "script_component.hpp" /* - * Author: Glowbal, KoffeinFlummi - * Starts the treatment process + * Author: Glowbal, KoffeinFlummi, mharis001 + * Starts the treatment process. * * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment * * Return Value: - * Succesful treatment started + * Treatment Started + * + * Example: + * [player, cursorObject, "Head", "BasicBandage"] call ace_medical_treatment_fnc_treatment * * Public: No */ -params ["_caller", "_target", "_bodyPart", "_className"]; +params ["_medic", "_patient", "_bodyPart", "_classname"]; -// if the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine +// Delay by a frame if cursor menu is open to prevent progress bar failing if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened), false]) exitWith { - [DFUNC(treatment), _this] call CBA_fnc_execNextFrame; + [FUNC(treatment), _this] call CBA_fnc_execNextFrame; }; -if !([_caller, _target, _bodyPart, _className] call FUNC(canTreat)) exitWith {false}; - -private _config = configFile >> QGVAR(Actions) >> _className; -private _isSelf = _caller isEqualTo _target; +if !(_this call FUNC(canTreat)) exitWith {false}; -// handle items -private _items = getArray (_config >> "items"); +private _config = configFile >> QGVAR(actions) >> _classname; -private _consumeItems = 0; +// Get treatment time from config, exit if treatment time is zero +private _treatmentTime = if (isText (_config >> "treatmentTime")) then { + GET_FUNCTION(_treatmentTime,_config >> "treatmentTime"); -if (isNumber (_config >> "itemConsumed")) then { - _consumeItems = getNumber (_config >> "itemConsumed"); -} else { - if (isText (_config >> "itemConsumed")) then { - _consumeItems = missionNamespace getVariable [getText (_config >> "itemConsumed"), 0]; + if (_treatmentTime isEqualType {}) then { + _treatmentTime = call _treatmentTime; }; -}; - -private _usersOfItems = []; -if (_consumeItems > 0) then { - _usersOfItems = ([_caller, _target, _items] call FUNC(useItems)) select 1; + _treatmentTime +} else { + getNumber (_config >> "treatmentTime"); }; -// parse the config for the progress callback -private _callbackProgress = getText (_config >> "callbackProgress"); +if (_treatmentTime == 0) exitWith {false}; -if (_callbackProgress isEqualTo "") then { - _callbackProgress = "true"; -}; - -if (isNil _callbackProgress) then { - _callbackProgress = compile _callbackProgress; +// Consume one of the treatment items if needed +// Store item user so that used item can be returned on failure +private _userAndItem = if (GET_NUMBER_ENTRY(_config >> "consumeItem") == 1) then { + [_medic, _patient, getArray (_config >> "items")] call FUNC(useItem); } else { - _callbackProgress = missionNamespace getVariable _callbackProgress; + [objNull, ""]; // Treatment does not require items to be consumed }; -// play animation -private _callerAnim = if (_isSelf) then { - getText (_config >> ["animationCallerSelf", "animationCallerSelfProne"] select (stance _caller == "PRONE")); +_userAndItem params ["_itemUser", "_usedItem"]; + +// Get treatment animation for the medic +private _medicAnim = if (_medic isEqualTo _patient) then { + getText (_config >> ["animationMedicSelf", "animationMedicSelfProne"] select (stance _medic == "PRONE")); } else { - getText (_config >> ["animationCaller", "animationCallerProne"] select (stance _caller == "PRONE")); + getText (_config >> ["animationMedic", "animationMedicProne"] select (stance _medic == "PRONE")); }; -_caller setVariable [QGVAR(selectedWeaponOnTreatment), weaponState _caller]; +_medic setVariable [QGVAR(selectedWeaponOnTreatment), weaponState _medic]; -private _wpn = ["non", "rfl", "lnr", "pst"] param [["", primaryWeapon _caller, secondaryWeapon _caller, handgunWeapon _caller] find currentWeapon _caller, "non"]; +// Adjust animation based on the current weapon of the medic +private _wpn = ["non", "rfl", "lnr", "pst"] param [["", primaryWeapon _medic, secondaryWeapon _medic, handgunWeapon _medic] find currentWeapon _medic, "non"]; +_medicAnim = [_medicAnim, "[wpn]", _wpn] call CBA_fnc_replace; -_callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace; - -// this one is missing -if (_callerAnim == "AinvPknlMstpSlayWlnrDnon_medic") then { - _callerAnim = "AinvPknlMstpSlayWlnrDnon_medicOther"; +// This animation is missing, use alternative +if (_medicAnim == "AinvPknlMstpSlayWlnrDnon_medic") then { + _medicAnim = "AinvPknlMstpSlayWlnrDnon_medicOther"; }; -private _animDuration = GVAR(animDurations) getVariable _callerAnim; +// Determine the animation length +private _animDuration = GVAR(animDurations) getVariable _medicAnim; -// these animations have transitions that take a bit longer... -if (weaponLowered _caller) then { +// These animations have transitions that take a bit longer... +if (weaponLowered _medic) then { _animDuration = _animDuration + 0.5; - // fix problems with lowered weapon transitions by raising the weapon first - if (currentWeapon _caller != "" && {_callerAnim != ""}) then { - _caller action ["WeaponInHand", _caller]; + // Fix problems with lowered weapon transitions by raising the weapon first + if (currentWeapon _medic != "" && {_medicAnim != ""}) then { + _medic action ["WeaponInHand", _medic]; }; }; -if (binocular _caller != "" && {binocular _caller == currentWeapon _caller}) then { - _animDuration = _animDuration + 1.0; +if (binocular _medic != "" && {binocular _medic == currentWeapon _medic}) then { + _animDuration = _animDuration + 1; }; -if (vehicle _caller == _caller && {_callerAnim != ""}) then { +// Play treatment animation for medic and determine the ending animation +if (vehicle _medic == _medic && {_medicAnim != ""}) then { private _endInAnim = "AmovP[pos]MstpS[stn]W[wpn]Dnon"; - private _pos = ["knl", "pne"] select (stance _caller == "PRONE"); + private _pos = ["knl", "pne"] select (stance _medic == "PRONE"); private _stn = "non"; if (_wpn != "non") then { - _stn = ["ras", "low"] select (weaponLowered _caller); + _stn = ["ras", "low"] select (weaponLowered _medic); }; _endInAnim = [_endInAnim, "[pos]", _pos] call CBA_fnc_replace; _endInAnim = [_endInAnim, "[stn]", _stn] call CBA_fnc_replace; _endInAnim = [_endInAnim, "[wpn]", _wpn] call CBA_fnc_replace; - TRACE_1("",_endInAnim); - [_caller, _callerAnim] call EFUNC(common,doAnimation); - [_caller, _endInAnim] call EFUNC(common,doAnimation); - _caller setVariable [QGVAR(endInAnim), _endInAnim]; -}; + [_medic, _medicAnim] call EFUNC(common,doAnimation); + [_medic, _endInAnim] call EFUNC(common,doAnimation); + _medic setVariable [QGVAR(endInAnim), _endInAnim]; -// get treatment time from config - also supports variables and code expressions -private _treatmentTime = 0; + // Speed up animation based on treatment time (but cap max to prevent odd animiations/cam shake) + private _animRatio = (_animDuration / _treatmentTime) min 3; + TRACE_3("setAnimSpeedCoef",_animRatio,_animDuration,_treatmentTime); + [QEGVAR(common,setAnimSpeedCoef), [_medic, _animRatio]] call CBA_fnc_globalEvent; -if (isNumber (_config >> "treatmentTime")) then { - _treatmentTime = getNumber (_config >> "treatmentTime"); -} else { - if (isText (_config >> "treatmentTime")) then { - _treatmentTime = getText (_config >> "treatmentTime"); - - if (isNil _treatmentTime) then { - _treatmentTime = compile _treatmentTime; - } else { - _treatmentTime = missionNamespace getVariable _treatmentTime; - }; - - if !(_treatmentTime isEqualType 0) then { - _treatmentTime = call _treatmentTime; - }; + if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) pushBack QUOTE(ADDON); }; }; -TRACE_1("",_treatmentTime); -if (_treatmentTime == 0) exitWith { false }; - -// speed up animation depending on treatment time -if (!isNil "_animDuration") then { - [QEGVAR(common,setAnimSpeedCoef), [_caller, _animDuration / _treatmentTime]] call CBA_fnc_globalEvent; - TRACE_2("",_animDuration,_treatmentTime); -}; - -// play sound +// Play a random treatment sound globally if defined if (isArray (_config >> "sounds")) then { - selectRandom getArray (_config >> "sounds") params ["_file", ["_volume", 1], ["_pitch", 1], ["_distance", 0]]; - TRACE_4("playSound3D",_file,_volume,_pitch,_distance); - playSound3D [ - _file, - objNull, - false, - getPosASL _caller, - _volume, - _pitch, - _distance - ]; + selectRandom getArray (_config >> "sounds") params ["_file", ["_volume", 1], ["_pitch", 1], ["_distance", 10]]; + playSound3D [_file, objNull, false, getPosASL _medic, _volume, _pitch, _distance]; }; -private _startCallback = getText (_config >> "callbackStart"); -if (isNil _startCallback) then { - _startCallback = compile _startCallback; -} else { - _startCallback = missionNamespace getVariable _startCallback; -}; +GET_FUNCTION(_callbackStart,_config >> "callbackStart"); +GET_FUNCTION(_callbackProgress,_config >> "callbackProgress"); -if !(_startCallback isEqualType {}) then { - _startCallback = {TRACE_1("startCallback was NOT code",_startCallback)}; +if (_callbackProgress isEqualTo {}) then { + _callbackProgress = {true}; }; -[_caller, _target, _bodyPart, _className, _items, _usersOfItems] call _startCallback; +[_medic, _patient, _bodyPart, _classname, _itemUser, _usedItem] call _callbackStart; -// start treatment [ _treatmentTime, - [_caller, _target, _bodyPart, _className, _items, _usersOfItems], - DFUNC(treatment_success), - DFUNC(treatment_failure), + [_medic, _patient, _bodyPart, _classname, _itemUser, _usedItem], + FUNC(treatmentSuccess), + FUNC(treatmentFailure), getText (_config >> "displayNameProgress"), _callbackProgress, - ["isnotinside"] + ["isNotInside"] ] call EFUNC(common,progressBar); -// display icon -private _iconDisplayed = getText (_config >> "actionIconPath"); - -if (_iconDisplayed != "") then { - [QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber (_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon); -}; - -// handle display of text/hints -private _displayText = getText (_config >> ["displayTextOther", "displayTextSelf"] select _isSelf); - -if (_displayText != "") then { - [QEGVAR(common,displayTextStructured), [[_displayText, _caller call EFUNC(common,getName), _target call EFUNC(common,getName)], 1.5, _caller], _caller] call CBA_fnc_targetEvent; -}; - true diff --git a/addons/medical_treatment/functions/fnc_treatmentBandage.sqf b/addons/medical_treatment/functions/fnc_treatmentBandage.sqf deleted file mode 100644 index bb4ac5ed9b9..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentBandage.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Bandage treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Item - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart", "_className", "_items"]; - -[_target, "activity", ELSTRING(medical_treatment,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", ELSTRING(medical_treatment,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -[QGVAR(treatmentBandageLocal), [_target, _className, _bodyPart], _target] call CBA_fnc_targetEvent; - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR.sqf deleted file mode 100644 index 69adc04bc6d..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentCPR.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -_target setVariable [VAR_HEART_RATE, 0, true]; -_target setVariable [QGVAR(receiveCPR), false, true]; // CPR finished -[_target] call FUNC(calculateBlood); - -if (alive _target && {IN_CRDC_ARRST(_target)}) then { - [_target, "activity_view", ELSTRING(medical_treatment,Activity_cpr), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); - - [QGVAR(treatmentCPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; -}; - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf deleted file mode 100644 index 58d882d9271..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * local Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target"]; - -if ((random 1) >= 0.6) then { - [QEGVAR(medical,CPRSucceeded), _target] call CBA_fnc_localEvent; -}; - -[_target, "activity", ELSTRING(medical_treatment,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", ELSTRING(medical_treatment,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf deleted file mode 100644 index a09dfccba47..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Zakant - * Handles the failure of the CPR treatment. - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target"]; - -if (!(_target call EFUNC(common,isAwake)) || {IN_CRDC_ARRST(_target)}) then { - _target setVariable [VAR_HEART_RATE, 0, true]; -}; -_target setVariable [QGVAR(receiveCPR), false, true]; -[_target] call FUNC(calculateBlood); diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf deleted file mode 100644 index f03f9708fda..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Zakant - * Handles the progress of the CPR treatment. - * - * Arguments: - * 0: Arguments - * 0: Caller - * 1: Target - * 1: Elapsed Time - * 2: Total Time - * - * Return Value: - * May Treatment continue - * - * Public: No - */ - -params ["_args", "_elapsedTime", "_totalTime"]; -_args params ["_caller", "_target"]; - -// If the patient awakes by mysterious force, no cpr is needed! -if (_target call EFUNC(common,isAwake)) exitWith {false}; -if !IN_CRDC_ARRST(_target) exitWith {false}; - -[_target] call FUNC(calculateBlood); // Calculate blood volume. If their is no pulse, nothing happens! - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf deleted file mode 100644 index 642cd722a02..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf +++ /dev/null @@ -1,23 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Zakant - * Handles the start of the CPR treatment. - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target"]; - -_target setVariable [QGVAR(receiveCPR), true, true]; // Target receives CPR -if (EGVAR(medical,CPRcreatesPulse) && {GET_HEART_RATE(_target) == 0}) then { - _target setVariable [VAR_HEART_RATE, round (30 + random [-5, 0, 5]) , true]; // And we have a (random) pulse -}; - -_target setVariable [QEGVAR(medical,lastTimeUpdated), CBA_missionTime, true]; diff --git a/addons/medical_treatment/functions/fnc_treatmentFailure.sqf b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf new file mode 100644 index 00000000000..f59331fc770 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentFailure.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal, mharis001 + * Handles treatment process failure. + * + * Arguments: + * 0: Arguments + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User + * 5: Used Item + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_medic", "_patient", "_bodyPart", "_classname", "_itemUser", "_usedItem"]; + +// Return used item to user (if used) +if (!isNull _itemUser) then { + [_itemUser, _usedItem] call EFUNC(common,addToInventory); +}; + +// Switch medic to end animation immediately +private _endInAnim = _medic getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _medic != _endInAnim) then { + [_medic, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + + _medic setVariable [QGVAR(endInAnim), nil]; +}; + +// Reset medic animation speed coefficient +[QEGVAR(common,setAnimSpeedCoef), [_medic, 1]] call CBA_fnc_globalEvent; + +if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) deleteAt (EGVAR(advanced_fatigue,setAnimExclusions) find QUOTE(ADDON)); +}; + +// Call treatment specific failure callback +GET_FUNCTION(_callbackFailure,configFile >> QGVAR(actions) >> _classname >> "callbackFailure"); + +_args call _callbackFailure; diff --git a/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf b/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf deleted file mode 100644 index 8499d4f525e..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Full heal treatment - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Item - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target"]; - -[QGVAR(treatmentFullHealLocal), [_target], _target] call CBA_fnc_targetEvent; - -[_target, "activity", ELSTRING(medical_treatment,Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", ELSTRING(medical_treatment,Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf deleted file mode 100644 index 705efc716ea..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf +++ /dev/null @@ -1,76 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles full heal of a patient. - * - * Arguments: - * 0: The patient - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_target"]; - -if (!alive _target) exitWith {}; - -// Treatment conditions would normally limit this to non-unconc units, but treatment event may be called externally (zeus) -if (_target getVariable [QEGVAR(medical,inCardiacArrest), false]) then { - TRACE_1("exiting cardiac arrest",_target); - [QEGVAR(medical,CPRSucceeded), _target] call CBA_fnc_localEvent; -}; -if (_target getVariable ["ACE_isUnconscious",false]) then { - TRACE_1("waking up",_target); // wake up first or unconc variables will be reset - [QEGVAR(medical,WakeUp), _target] call CBA_fnc_localEvent; -}; - - -_target setVariable [VAR_PAIN, 0, true]; -_target setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; - -// tourniquets -_target setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; -_target setVariable [QGVAR(occludedMedications), nil, true]; - -// wounds and injuries -_target setVariable [QEGVAR(medical,openWounds), [], true]; -_target setVariable [QEGVAR(medical,bandagedWounds), [], true]; -_target setVariable [QEGVAR(medical,stitchedWounds), [], true]; -_target setVariable [QEGVAR(medical,isLimping), false, true]; -_target setVariable [QEGVAR(medical,fractures), [0,0,0,0,0,0], true]; - -// - Update wound bleeding -[_target] call EFUNC(medical_status,updateWoundBloodLoss); - -// vitals -_target setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; -_target setVariable [VAR_BLOOD_PRESS, [80, 120], true]; -_target setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; - -// IVs -_target setVariable [QEGVAR(medical,ivBags), nil, true]; - -// damage storage -_target setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; - -// generic medical admin -_target setVariable [VAR_CRDC_ARRST, false, true]; -_target setVariable [VAR_UNCON, false, true]; -_target setVariable [VAR_HEMORRHAGE, 0, true]; -_target setVariable [VAR_IN_PAIN, false, true]; -_target setVariable [VAR_PAIN_SUPP, 0, true]; - -// medication -_target setVariable [VAR_MEDICATIONS, [], true]; - -// Reset triage card since medication is all reset -_target setVariable [QEGVAR(medical,triageCard), [], true]; - -[_target] call EFUNC(medical_engine,updateDamageEffects); - -// Resetting damage -_target setDamage 0; - -[QEGVAR(medical,FullHeal), _target] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_treatmentIV.sqf b/addons/medical_treatment/functions/fnc_treatmentIV.sqf deleted file mode 100644 index e6f6be0e16d..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentIV.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Patient IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Item - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart", "_className", "_items"]; - -if (_items isEqualTo []) exitWith {false}; - -_items params ["_removeItem"]; - -[QGVAR(treatmentIVLocal), [_target, _className, _bodyPart], _target] call CBA_fnc_targetEvent; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", ELSTRING(medical_treatment,Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", ELSTRING(medical_treatment,Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf deleted file mode 100644 index a7c39143138..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf +++ /dev/null @@ -1,48 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment local callback - * - * Arguments: - * 0: The patient - * 1: Treatment class name - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_target", "_treatmentClassname", "_bodyPart"]; - -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; -if (_partIndex < 0) exitWith { false }; - -private _bloodVolume = GET_BLOOD_VOLUME(_target); - -if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {}; - -// Find the proper attributes for the used IV -private _config = configFile >> QUOTE(ADDON) >> "IV"; -private _volumeAdded = getNumber (_config >> "volume"); -private _type = getText (_config >> "type"); - -if (isClass (_config >> _treatmentClassname)) then { - _config = _config >> _treatmentClassname; - - if (isNumber (_config >> "volume")) then { - _volumeAdded = getNumber (_config >> "volume"); - }; - - if (isText (_config >> "type")) then { - _type = getText (_config >> "type"); - }; -} else { - ERROR("IV Treatment Classname not found"); -}; - -private _bloodBags = _target getVariable [QEGVAR(medical,ivBags), []]; -_bloodBags pushBack [_volumeAdded, _type, _partIndex]; - -_target setVariable [QEGVAR(medical,ivBags), _bloodBags, true]; diff --git a/addons/medical_treatment/functions/fnc_treatmentMedication.sqf b/addons/medical_treatment/functions/fnc_treatmentMedication.sqf deleted file mode 100644 index 77fabe5bf85..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentMedication.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Items Used - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart", "_className", "_items"]; -TRACE_5("params",_caller,_target,_bodyPart,_className,_items); - -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; - -[QGVAR(treatmentMedicationLocal), [_target, _className, _partIndex], _target] call CBA_fnc_targetEvent; - -{ - if (_x != "") then { - [_target, _x] call FUNC(addToTriageCard); - [_target, "activity", ELSTRING(medical_treatment,Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - [_target, "activity_view", ELSTRING(medical_treatment,Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - }; -} forEach _items; - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf deleted file mode 100644 index 2732b0f3982..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf +++ /dev/null @@ -1,87 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the medication given to a patient. - * - * Arguments: - * 0: The patient - * 1: Treatment class name - * 2: Injection Site Part Number - * - * Return Value: - * Succesful treatment started - * - * Example: - * [player, "Morphine", 2] call ace_medical_treatment_fnc_treatmentMedicationLocal - * - * Public: No - */ -#define MORPHINE_PAIN_SUPPRESSION 0.6 - -params ["_target", "_className", "_partIndex"]; -TRACE_3("treatmentMedicationLocal",_target,_className,_partIndex); - -if (!alive _target) exitWith {false}; - -if (!GVAR(advancedMedication)) exitWith { - TRACE_1("MedicalSettingAdvancedMedication is:", GVAR(advancedMedication)); - if (_className == "Morphine") exitWith { - private _painSupress = GET_PAIN_SUPPRESS(_target); - _target setVariable [VAR_PAIN_SUPP, (_painSupress + MORPHINE_PAIN_SUPPRESSION) min 1, true]; - }; - if (_className == "Epinephrine") exitWith { - [QEGVAR(medical,WakeUp), _target] call CBA_fnc_localEvent; - }; -}; -TRACE_1("Running treatmentMedicationLocal with Advanced configuration for", _target); - -private _tourniquets = GET_TOURNIQUETS(_target); - -if (_tourniquets select _partIndex > 0) exitWith { - TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); - private _delayedMedications = _target getVariable [QEGVAR(medical,occludedMedications), []]; - - _delayedMedications pushBack _this; - _target setVariable [QEGVAR(medical,occludedMedications), _delayedMedications, true]; - - true -}; - -// Find the proper attributes for the used medication -private _medicationConfig = configFile >> QUOTE(ADDON) >> "Medication"; -private _painReduce = getNumber (_medicationConfig >> "painReduce"); -private _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); -private _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); -private _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); -private _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); -private _timeTillMaxEffect = getNumber (_medicationConfig >> "timeTillMaxEffect"); -private _maxDose = getNumber (_medicationConfig >> "maxDose"); -private _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); -private _inCompatableMedication = []; - -if (isClass (_medicationConfig >> _className)) then { - _medicationConfig = _medicationConfig >> _className; - if (isNumber (_medicationConfig >> "painReduce")) then { _painReduce = getNumber (_medicationConfig >> "painReduce");}; - if (isArray (_medicationConfig >> "hrIncreaseLow")) then { _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); }; - if (isArray (_medicationConfig >> "hrIncreaseNormal")) then { _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); }; - if (isArray (_medicationConfig >> "hrIncreaseHigh")) then { _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); }; - if (isNumber (_medicationConfig >> "timeInSystem")) then { _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); }; - if (isNumber (_medicationConfig >> "timeTillMaxEffect")) then { _timeTillMaxEffect = getNumber (_medicationConfig >> "timeTillMaxEffect"); }; - if (isNumber (_medicationConfig >> "maxDose")) then { _maxDose = getNumber (_medicationConfig >> "maxDose"); }; - if (isArray (_medicationConfig >> "inCompatableMedication")) then { _inCompatableMedication = getArray (_medicationConfig >> "inCompatableMedication"); }; - if (isNumber (_medicationConfig >> "viscosityChange")) then { _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); }; -}; - -private _heartRate = GET_HEART_RATE(_target); -private _hrIncrease = [_hrIncreaseLow, _hrIncreaseNorm, _hrIncreaseHigh] select (floor ((0 max _heartRate min 110) / 55)); -_hrIncrease params ["_minIncrease", "_maxIncrease"]; -private _heartRateChange = _minIncrease + random (_maxIncrease - _minIncrease); - -// Adjust the medication effects and add the medication to the list -TRACE_3("adjustments",_heartRateChange,_painReduce,_viscosityChange); -[_target, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange] call EFUNC(medical_status,addMedicationAdjustment); - -// Check for medication compatiblity -[_target, _className, _maxDose, _inCompatableMedication] call FUNC(onMedicationUsage); - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf new file mode 100644 index 00000000000..07dd5261b3e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentSuccess.sqf @@ -0,0 +1,51 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal, mharis001 + * Handles treatment process success. + * + * Arguments: + * 0: Arguments + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User + * 5: Used Item + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_medic", "_patient", "_bodyPart", "_classname"]; + +// Switch medic to end animation immediately +private _endInAnim = _medic getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _medic != _endInAnim) then { + [_medic, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + + _medic setVariable [QGVAR(endInAnim), nil]; +}; + +// Reset medic animation speed coefficient +[QEGVAR(common,setAnimSpeedCoef), [_medic, 1]] call CBA_fnc_globalEvent; + +if (!isNil QEGVAR(advanced_fatigue,setAnimExclusions)) then { + EGVAR(advanced_fatigue,setAnimExclusions) deleteAt (EGVAR(advanced_fatigue,setAnimExclusions) find QUOTE(ADDON)); +}; + +// Call treatment specific success callback +GET_FUNCTION(_callbackSuccess,configFile >> QGVAR(actions) >> _classname >> "callbackSuccess"); + +_args call _callbackSuccess; + +// Call litter creation handler +_args call FUNC(createLitter); + +// Emit local event for medical API +["ace_treatmentSucceded", [_medic, _patient, _bodyPart, _classname]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf b/addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf deleted file mode 100644 index 66d2373804d..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf +++ /dev/null @@ -1,49 +0,0 @@ -#include "script_component.hpp" -/* - * Author: BaerMitUmlaut - * Handles treatment via surgical kit per frame - * - * Arguments: - * 0: Arguments - * 0: Caller - * 1: Target - * 1: Elapsed Time - * 2: Total Time - * - * Return Value: - * Succesful treatment started - * - * Example: - * [[bob, kevin], 5, 5] call ace_medical_treatment_fnc_treatmentAdvanced_surgicalKit_onProgress - * - * Public: No - */ - -params ["_args", "_elapsedTime", "_totalTime"]; -_args params ["_caller", "_target"]; - -private _bandagedWounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; -private _stitchedWounds = _target getVariable [QEGVAR(medical,stitchedWounds), []]; - -//In case two people stitch up one patient and the last wound has already been closed we can stop already -if (_bandagedWounds isEqualTo []) exitWith { false }; - -//Has enough time elapsed that we can close another wound? -if (_totalTime - _elapsedTime <= (count _bandagedWounds - 1) * 5) then { - private _treatedWound = _bandagedWounds deleteAt 0; - _stitchedWounds pushBack _treatedWound; - _target setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true]; - _target setVariable [QEGVAR(medical,stitchedWounds), _stitchedWounds, true]; - TRACE_3("stitched",_treatedWound,count _bandagedWounds,count _stitchedWounds); - - // Check if we fixed limping from this treatment - if ((EGVAR(medical,limping) == 2) && {_target getVariable [QEGVAR(medical,isLimping), false]}) then { - _treatedWound params ["", "_partN"]; - if (_partN > 3) then { // only for LEG wounds - TRACE_3("updating damage effects",_target,_partN,local _target); - [QEGVAR(medical_engine,updateDamageEffects), [_target], _target] call CBA_fnc_targetEvent; - }; - }; -}; - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf deleted file mode 100644 index 595d55d5899..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * - * Return Value: - * Succesful treatment started - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart", "_className", "_items"]; - -if (count _items == 0) exitWith {false}; - -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; - -private _tourniquets = GET_TOURNIQUETS(_target); - -if (_tourniquets select _partIndex > 0) exitWith { - private _output = "There is already a tourniquet on this body part!"; // TODO localization - [QEGVAR(common,displayTextStructured), [_output, 1.5, _caller], _caller] call CBA_fnc_targetEvent; - false -}; - -private _removeItem = _items select 0; - -[QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _bodyPart], _target] call CBA_fnc_targetEvent; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", ELSTRING(medical_treatment,Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", ELSTRING(medical_treatment,Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf deleted file mode 100644 index a3bd24d381a..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient, local callback. - * - * Arguments: - * 0: The patient - * 1: Item used classname - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_target", "_tourniquetItem", "_bodyPart"]; - -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; - -// Place a tourniquet on the bodypart -private _tourniquets = GET_TOURNIQUETS(_target); - -_tourniquets set [_partIndex, CBA_missionTime]; - -_target setVariable [VAR_TOURNIQUET, _tourniquets, true]; - -[_target] call EFUNC(medical_status,updateWoundBloodLoss); diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf deleted file mode 100644 index 07587135723..00000000000 --- a/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for removing the tourniquet on specified selection - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * - * Return Value: - * None - * - * Public: No - */ - -params ["_caller", "_target", "_bodyPart"]; -TRACE_3("params",_caller,_target,_bodyPart); - -// grab the required data -private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; -private _tourniquets = GET_TOURNIQUETS(_target); - -// Check if there is a tourniquet on this bodypart -if (_tourniquets select _partIndex == 0) exitWith { - [QEGVAR(common,displayTextStructured), [ELSTRING(medical_treatment,noTourniquetOnBodyPart), 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; - -// Removing the tourniquet -_tourniquets set [_partIndex, 0]; -_target setVariable [VAR_TOURNIQUET, _tourniquets, true]; - -[_target] call EFUNC(medical_status,updateWoundBloodLoss); - -// Adding the tourniquet item to the caller -[_caller, "ACE_tourniquet", true] call CBA_fnc_addItem; - -//Handle all injected medications now that blood is flowing -private _delayedMedications = _target getVariable [QEGVAR(medical,occludedMedications), []]; -private _updatedArray = false; -TRACE_2("meds",_partIndex,_delayedMedications); - -{ - _x params ["", "", "_medPartNum"]; - if (_partIndex == _medPartNum) then { - TRACE_1("delayed medication call after tourniquet removeal",_x); - [QGVAR(treatmentMedicationLocal), _x, _target] call CBA_fnc_targetEvent; - _delayedMedications set [_forEachIndex, -1]; - _updatedArray = true; - }; -} forEach _delayedMedications; - -if (_updatedArray) then { - _delayedMedications = _delayedMedications - [-1]; - _target setVariable [QEGVAR(medical,occludedMedications), _delayedMedications, true]; -}; diff --git a/addons/medical_treatment/functions/fnc_treatment_failure.sqf b/addons/medical_treatment/functions/fnc_treatment_failure.sqf deleted file mode 100644 index 8b3114cc663..00000000000 --- a/addons/medical_treatment/functions/fnc_treatment_failure.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment fails - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Items available > - * - * Return Value: - * None - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_bodyPart", "_className", "_items", "_usersOfItems"]; - -// switch to end anim immediately -private _endInAnim = _caller getVariable QGVAR(endInAnim); - -if (!isNil "_endInAnim") then { - if (animationState _caller != _endInAnim) then { - [_caller, _endInAnim, 2] call EFUNC(common,doAnimation); - }; - _caller setVariable [QGVAR(endInAnim), nil]; - TRACE_1("abort",_endInAnim); -}; - -// reset sped up animations -[QEGVAR(common,setAnimSpeedCoef), [_caller, 1]] call CBA_fnc_globalEvent; - -{ - _x params ["_unit", "_item"]; - _unit addItem _item; -} forEach _usersOfItems; - -// Record specific callback -private _config = configFile >> QGVAR(Actions) >> _className; - -private _callback = getText (_config >> "callbackFailure"); - -if (isNil _callback) then { - _callback = compile _callback; -} else { - _callback = missionNamespace getVariable _callback; -}; - -if !(_callback isEqualType {}) then { - _callback = {TRACE_1("callback was NOT code",_callback)}; -}; - -_args call _callback; diff --git a/addons/medical_treatment/functions/fnc_treatment_success.sqf b/addons/medical_treatment/functions/fnc_treatment_success.sqf deleted file mode 100644 index d3329574cb5..00000000000 --- a/addons/medical_treatment/functions/fnc_treatment_success.sqf +++ /dev/null @@ -1,71 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment is completed - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Body part - * 3: Treatment class name - * 4: Items available > - * - * Return Value: - * None - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_bodyPart", "_className", "_items", "_usersOfItems"]; - -// switch to end anim immediately -private _endInAnim = _caller getVariable QGVAR(endInAnim); - -if (!isNil "_endInAnim") then { - if (animationState _caller != _endInAnim) then { - [_caller, _endInAnim, 2] call EFUNC(common,doAnimation); - }; - _caller setVariable [QGVAR(endInAnim), nil]; - TRACE_1("abort",_endInAnim); -}; - -// reset sped up animations -[QEGVAR(common,setAnimSpeedCoef), [_caller, 1]] call CBA_fnc_globalEvent; - -// Record specific callback -private _config = configFile >> QGVAR(Actions) >> _className; - -private _callback = getText (_config >> "callbackSuccess"); - -if (isNil _callback) then { - _callback = compile _callback; -} else { - _callback = missionNamespace getVariable _callback; -}; - -if !(_callback isEqualType {}) then { - _callback = {TRACE_1("callback was NOT code",_callback)}; -}; - -//Get current blood loose on limb (for "bloody" litter) -private _bloodLossOnBodyPart = 0; -private _partIndex = (ALL_BODY_PARTS find toLower _bodyPart) max 0; - -// Add all bleeding from wounds on selection -private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - -{ - _x params ["", "_bodyPartN", "_amountOf", "_percentageOpen"]; - - if (_bodyPartN isEqualTo _partIndex) then { - _bloodLossOnBodyPart = _bloodLossOnBodyPart + (_amountOf * _percentageOpen); - }; -} forEach _openWounds; -TRACE_1("advanced",_bloodLossOnBodyPart); - -_args call _callback; -_args pushBack _bloodLossOnBodyPart; -_args call FUNC(litterCreate); - -["ace_treatmentSucceded", [_caller, _target, _bodyPart, _className]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_unloadUnit.sqf b/addons/medical_treatment/functions/fnc_unloadUnit.sqf new file mode 100644 index 00000000000..ef36e2faa81 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_unloadUnit.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Unloads an unconscious or dead patient from their vehicle. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, bob] call ace_medical_treatment_fnc_unloadUnit + * + * Public: No + */ + +params ["_medic", "_patient"]; + +if (vehicle _patient == _patient) exitWith { + TRACE_1("Unit is not in a vehicle",_patient); +}; + +if (_patient call EFUNC(common,isAwake)) exitWith { + TRACE_1("Unit is awake",_patient); +}; + +["ace_unloadPersonEvent", [_patient, vehicle _patient, _medic], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/functions/fnc_useItem.sqf b/addons/medical_treatment/functions/fnc_useItem.sqf index 6977052209e..a7484639da0 100644 --- a/addons/medical_treatment/functions/fnc_useItem.sqf +++ b/addons/medical_treatment/functions/fnc_useItem.sqf @@ -1,45 +1,38 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Use Equipment if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew + * Author: Glowbal, mharis001 + * Uses one of the treatment items. Respects the priority defined by the allowSharedEquipment setting. * * Arguments: * 0: Medic * 1: Patient - * 2: Item + * 2: Items * - * ReturnValue: - * 0: success - * 1: Unit + * Return Value: + * User and Item + * + * Example: + * [player, cursorObject, ["bandage"]] call ace_medical_treatment_fnc_useItems * * Public: No */ -params ["_medic", "_patient", "_item"]; - -if (isNil QEGVAR(medical,setting_allowSharedEquipment)) then { - EGVAR(medical,setting_allowSharedEquipment) = true; -}; +params ["_medic", "_patient", "_items"]; -if (EGVAR(medical,setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - ["ace_useItem", [_patient, _item], _patient] call CBA_fnc_targetEvent; - [true, _patient] -}; +scopeName "Main"; -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - ["ace_useItem", [_medic, _item], _medic] call CBA_fnc_targetEvent; - [true, _medic] -}; +private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GVAR(allowSharedEquipment); -private _return = [false, objNull]; +{ + private _unit = _x; + private _unitItems = _x call EFUNC(common,uniqueItems); -if (vehicle _medic != _medic && {vehicle _medic call FUNC(isMedicalVehicle)}) then { { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {[_x, _item] call EFUNC(common,hasItem)}) exitWith { - ["ace_useItem", [_x, _item], _x] call CBA_fnc_targetEvent; - _return = [true, _x]; + if (_x in _unitItems) then { + _unit removeItem _x; + [_unit, _x] breakOut "Main"; }; - } forEach crew vehicle _medic; -}; + } forEach _items; +} forEach _useOrder; -_return +[objNull, ""] diff --git a/addons/medical_treatment/functions/fnc_useItems.sqf b/addons/medical_treatment/functions/fnc_useItems.sqf deleted file mode 100644 index 13ccf627b00..00000000000 --- a/addons/medical_treatment/functions/fnc_useItems.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Use Equipment items if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Items > - * - * Return Value: - * 0: success - * 1: Unit - * - * Example: - * [unit, patient, ["bandage"]] call ace_medical_treatment_fnc_useItems - * - * Public: No - */ - -#define HAS_USED_ITEM(itemUsedInfo) (itemUsedInfo select 0) -#define GET_ITEM_USED_BY(itemUsedInfo) (itemUsedInfo select 1) - -params ["_medic", "_patient", "_items"]; - -private _itemsUsedBy = []; - -{ - // handle a one of type use item - if (_x isEqualType []) then { - { - private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - - if (HAS_USED_ITEM(_itemUsedInfo)) exitWith { - _itemsUsedBy pushBack [GET_ITEM_USED_BY(_itemUsedInfo), _x]; - }; - } forEach _x; - }; - - // handle required item - if (_x isEqualType "") then { - private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - - if (HAS_USED_ITEM(_itemUsedInfo)) exitWith { - _itemsUsedBy pushBack [GET_ITEM_USED_BY(_itemUsedInfo), _x]; - }; - }; -} forEach _items; - -[count _items == count _itemsUsedBy, _itemsUsedBy]; diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 6cd3f8c897a..0717c8e88fd 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -1,206 +1,193 @@ -// CBA Settings [ADDON: ace_medical_treatment]: -private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; - -// todo: the strings for all three advanced bandages/medication/diagnose settings are terribly ambigious +// todo: this setting just disables some treatment options, remove? +[ + QGVAR(advancedDiagnose), + "CHECKBOX", + [LSTRING(AdvancedDiagnose_DisplayName), LSTRING(AdvancedDiagnose_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true +] call CBA_settings_fnc_init; -[// todo: I don't like that wound reopening requires this setting to be enabled, they should be independent - QGVAR(advancedBandages), "CHECKBOX", - [LSTRING(advancedBandages_DisplayName), LSTRING(advancedBandages_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QGVAR(advancedBandages), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart +[ + QGVAR(advancedBandages), + "CHECKBOX", + [LSTRING(AdvancedBandages_DisplayName), LSTRING(AdvancedBandages_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true ] call CBA_settings_fnc_init; -[// todo: this setting just disables some treatment options, remove? - QGVAR(advancedDiagnose), "CHECKBOX", - [LSTRING(advancedDiagnose_DisplayName), LSTRING(advancedDiagnose_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QGVAR(advancedDiagnose), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart +// todo: verify that this setting does not require a restart +// todo: this setting requires advanced bandages to be enabled, they should be independent +[ + QGVAR(woundReopening), + "CHECKBOX", + [LSTRING(WoundReopening_DisplayName), LSTRING(WoundReopening_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true ] call CBA_settings_fnc_init; [ - QGVAR(advancedMedication), "CHECKBOX", - [LSTRING(advancedMedication_DisplayName), LSTRING(advancedMedication_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QGVAR(advancedMedication), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(advancedMedication), + "CHECKBOX", + [LSTRING(AdvancedMedication_DisplayName), LSTRING(AdvancedMedication_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true ] call CBA_settings_fnc_init; [ - QGVAR(woundReopening), "CHECKBOX", - [LSTRING(woundReopening_DisplayName), LSTRING(woundReopening_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QGVAR(woundReopening), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(cprCreatesPulse), + "CHECKBOX", + [LSTRING(CPRCreatesPulse_DisplayName), LSTRING(CPRCreatesPulse_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + true, + true ] call CBA_settings_fnc_init; +// todo: should this setting differentiate between medical vehicles and facilities? [ - QGVAR(allowSelfIV), "LIST", // This setting is list because we want number for treatment config - [LSTRING(allowSelfIV_DisplayName), LSTRING(allowSelfIV_Description)], - _categoryArray, - [[0,1],["No","Yes"],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QGVAR(allowSelfIV), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(locationsBoostTraining), + "CHECKBOX", + [LSTRING(LocationsBoostTraining_DisplayName), LSTRING(LocationsBoostTraining_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + false, + true ] call CBA_settings_fnc_init; -// Ported Settings: [ - QEGVAR(medical,convertItems), "LIST", - [LSTRING(convertItems_DisplayName), LSTRING(convertItems_Description)], - _categoryArray, - [[0,1,2],[LELSTRING(common,Enabled),LLSTRING(convertItems_remove),LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,convertItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(allowSelfIV), + "LIST", + [LSTRING(AllowSelfIV_DisplayName), LSTRING(AllowSelfIV_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,allowLitterCreation), "CHECKBOX", - [LSTRING(allowLitterCreation), LSTRING(allowLitterCreation_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QEGVAR(medical,allowLitterCreation), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(allowSharedEquipment), + "LIST", + [LSTRING(AllowSharedEquipment_DisplayName), LSTRING(AllowSharedEquipment_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(AllowSharedEquipment_PriorityPatient), LSTRING(AllowSharedEquipment_PriorityMedic), ELSTRING(common,No)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,CPRcreatesPulse), "CHECKBOX", - [LSTRING(CPRcreatesPulse), LSTRING(CPRcreatesPulse_Description)], - _categoryArray, - true, // default value - true, // isGlobal - {[QEGVAR(medical,CPRcreatesPulse), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(convertItems), + "LIST", + [LSTRING(ConvertItems_DisplayName), LSTRING(ConvertItems_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [ELSTRING(common,Enabled), LSTRING(ConvertItems_RemoveOnly), ELSTRING(common,Disabled)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,litterCleanUpDelay), "SLIDER", - [LSTRING(litterCleanUpDelay), LSTRING(litterCleanUpDelay_Description)], - _categoryArray, - [-1,5000,0,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] - true, // isGlobal - {[QEGVAR(medical,litterCleanUpDelay), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(medicEpinephrine), + "LIST", + [LSTRING(MedicEpinephrine_DisplayName), LSTRING(MedicEpinephrine_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,litterSimulationDetail), "LIST", - [LSTRING(litterSimulationDetail), LSTRING(litterSimulationDetail_Description)], - _categoryArray, - [[0,1,2,3,4],["Off","Low","Medium","High","Ultra"],3], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,litterSimulationDetail), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(locationEpinephrine), + "LIST", + [LSTRING(LocationEpinephrine_DisplayName), LSTRING(LocationEpinephrine_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,increaseTrainingInLocations), "CHECKBOX", - [LSTRING(increaseTrainingInLocations_DisplayName), LSTRING(increaseTrainingInLocations_Description)], - _categoryArray, - false, // default value - true, // isGlobal - {[QEGVAR(medical,increaseTrainingInLocations), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(medicPAK), + "LIST", + [LSTRING(MedicPAK_DisplayName), LSTRING(MedicPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,PAKTime), "SLIDER", - [LSTRING(PAKTime), LSTRING(PAKTime_Description)], - _categoryArray, - [-1,5000,0,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] - true, // isGlobal - {[QEGVAR(medical,PAKTime), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(locationPAK), + "LIST", + [LSTRING(LocationPAK_DisplayName), LSTRING(LocationPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 3], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,medicSetting_Epi), "LIST", - [LSTRING(medicSetting_Epi_DisplayName), LSTRING(medicSetting_Epi_Description)], - _categoryArray, - [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,medicSetting_Epi), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(consumePAK), + "LIST", + [LSTRING(ConsumePAK_DisplayName), LSTRING(ConsumePAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,medicSetting_PAK), "LIST", - [LSTRING(medicSetting_PAK_DisplayName), LSTRING(medicSetting_PAK_Description)], - _categoryArray, - [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,medicSetting_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(timeCoefficientPAK), + "SLIDER", + [LSTRING(TimeCoefficientPAK_DisplayName), LSTRING(TimeCoefficientPAK_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0, 5, 1, 1], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,medicSetting_SurgicalKit), "LIST", - [LSTRING(MedicalSettings_medicSetting_SurgicalKit_DisplayName), LSTRING(MedicalSettings_medicSetting_SurgicalKit_Description)], - _categoryArray, - [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,medicSetting_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(medicSurgicalKit), + "LIST", + [LSTRING(MedicSurgicalKit_DisplayName), LSTRING(MedicSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,consumeItem_PAK), "LIST", - [LSTRING(MedicalSettings_consumeItem_PAK_DisplayName), LSTRING(MedicalSettings_consumeItem_PAK_Description)], - _categoryArray, - [[0,1],["No","Yes"],1], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,consumeItem_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(locationSurgicalKit), + "LIST", + [LSTRING(LocationSurgicalKit_DisplayName), LSTRING(LocationSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 2], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,consumeItem_SurgicalKit), "LIST", - [LSTRING(MedicalSettings_consumeItem_SurgicalKit_DisplayName), LSTRING(MedicalSettings_consumeItem_SurgicalKit_Description)], - _categoryArray, - [[0,1],["No","Yes"],1], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,consumeItem_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(consumeSurgicalKit), + "LIST", + [LSTRING(ConsumeSurgicalKit_DisplayName), LSTRING(ConsumeSurgicalKit_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,useLocation_Epi), "LIST", - [LSTRING(MedicalSettings_useLocation_Epi_DisplayName), LSTRING(MedicalSettings_useLocation_Epi_Description)], - _categoryArray, - [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,useLocation_Epi), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(allowLitterCreation), + "CHECKBOX", + [LSTRING(AllowLitterCreation_DisplayName), LSTRING(AllowLitterCreation_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + true, + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,useLocation_PAK), "LIST", - [LSTRING(MedicalSettings_useLocation_PAK_DisplayName), LSTRING(MedicalSettings_useLocation_PAK_Description)], - _categoryArray, - [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,useLocation_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(maxLitterObjects), + "LIST", + [LSTRING(MaxLitterObjects_DisplayName), LSTRING(MaxLitterObjects_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5], + true ] call CBA_settings_fnc_init; [ - QEGVAR(medical,useLocation_SurgicalKit), "LIST", - [LSTRING(MedicalSettings_useLocation_SurgicalKit_DisplayName), LSTRING(MedicalSettings_useLocation_SurgicalKit_Description)], - _categoryArray, - [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] - true, // isGlobal - {[QEGVAR(medical,useLocation_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, - true // Needs mission restart + QGVAR(litterCleanupDelay), + "SLIDER", + [LSTRING(LitterCleanupDelay_DisplayName), LSTRING(LitterCleanupDelay_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], + [-1, 3600, 600, 0], + true ] call CBA_settings_fnc_init; diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp index 7f746cdcfe2..db401332482 100644 --- a/addons/medical_treatment/script_component.hpp +++ b/addons/medical_treatment/script_component.hpp @@ -2,9 +2,9 @@ #define COMPONENT_BEAUTIFIED Medical Treatment #include "\z\ace\addons\main\script_mod.hpp" -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE -// #define ENABLE_PERFORMANCE_COUNTERS +#define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE +#define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_MEDICAL_TREATMENT #define DEBUG_MODE_FULL @@ -16,3 +16,35 @@ #include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #include "\z\ace\addons\main\script_macros.hpp" + +// Returns a text config entry as compiled code or variable from missionNamespace +#define GET_FUNCTION(var,cfg) \ + private var = getText (cfg); \ + if (isNil var) then { \ + var = compile var; \ + } else { \ + var = missionNamespace getVariable var; \ + } + +// Returns a number config entry with default value of 0 +// If entry is a string, will get the variable from missionNamespace +#define GET_NUMBER_ENTRY(cfg) \ + if (isText (cfg)) then { \ + missionNamespace getVariable [getText (cfg), 0]; \ + } else { \ + getNumber (cfg); \ + } + +// Macros for checking if unit is in medical vehicle or facility +// Defined mostly to make location check in canTreat more readable +#define IN_MED_VEHICLE(unit) (unit call FUNC(isInMedicalVehicle)) +#define IN_MED_FACILITY(unit) (unit call FUNC(isInMedicalFacility)) + +#define TREATMENT_LOCATIONS_ALL 0 +#define TREATMENT_LOCATIONS_VEHICLES 1 +#define TREATMENT_LOCATIONS_FACILITIES 2 +#define TREATMENT_LOCATIONS_VEHICLES_AND_FACILITIES 3 +#define TREATMENT_LOCATIONS_NONE 4 + +#define LITTER_CLEANUP_CHECK_DELAY 30 +#define BODY_CLEANUP_CHECK_DELAY 20 diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 152fb0d67ca..8b021de2678 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -1,389 +1,273 @@ - - - Treatment - 治療 - - - Advanced Bandages - アドバンスド包帯 - - - Enable advanced bandages (required for wound reopening) - アドバンスド包帯を有効化 (アドバンスド負傷が必要です) - - - Advanced Diagnose - アドバンスド診断 - - - Enable advanced diagnose - アドバンスド診断を有効化 - - - Advanced Medication - アドバンスド医薬品 - - - Enable advanced medication - アドバンスド医薬品を有効化 - - - Locations boost training - Místa pro vylepšení zkušeností - Località aumentano addestramento - Örtliche Trainingssteigerung - Ubicación mejora entrenamiento. - Miejsca zwiększają wyszkolenie - Localização melhora treinamento - Le lieu améliore l'efficacité - Места ускоренного обучения - 衛生兵能力を与える場所 - 교육 증가 지역 - 受所在位置影响提升医疗能力 - 受所在位置影響提升醫療能力 - - - Boost medic rating in medical vehicles or near medical facilities [untrained becomes medic, medic becomes doctor] - Zlepšit zkušenosti zdravotníka v medickém vozidle nebo poblíž zdravotního zařízení [nezkušení se stane zdravotníkem, zdravotník se stane doktorem] - Aumenta il rating medico in veicoli medici o vicino strutture mediche [non addestrato diventa medico, medico diventa dottore] - Steigert die medizinische Einstufung eines Soldaten in Sanitätsfarhzeugen oder in der Nähe von Sanitätseinrichtungen [untrainiert wird zu Sanitäter, Sanitäter zu Doktor] - Mejora el entrenamiento médico dentro de vehículos médicos o cerca de instalaciones médicas (no entrenados se convierten en médicos, médicos se convierten en doctores) - Zwiększa poziom wyszkolenia medyków wewnątrz pojazdów medycznych lub w pobliżu budynków medycznych [niedoświadczony zostaje medykiem, medyk zostaje doktorem] - Aumenta a classificação do médico dentro de veículos médicos ou perto de instalações médicas [sem treinamento vira médico, médico vira doutor] - Améliore l'efficacité des soins dans les véhicules ou structures de soins [non formés deviennent médecins, médecins deviennent docteurs] - Улучшает медицинскую подготовку в мед. транспорте и около мед. строений [нетренированные становятся медиками, медики становятся врачами] - 医療車両や医療施設の近くは衛生兵としての能力を与える場所となり、衛生兵の訓練を受けていないのに衛生兵としてなります (未訓練は衛生兵に、衛生兵は医師に) - 의무병의 수준이 주변의 차량이나 의료시설에 따라 증가합니다. [비교육자가 의무병이되고, 의무병이 의사가 됩니다] - 当人员在医疗载具或是医护设施旁进行医疗时, 该员医疗能力将会有所提升 (未受训人员提升为医疗兵, 医疗兵提升为军医) - 當人員在醫療載具或是醫護設施旁進行醫療時, 該員醫療能力將會有所提升 (未受訓人員提升為醫療兵, 醫療兵提升為軍醫) - - - Self IV Transfusion - 自己 IV 輸血 - - - Allows using IV Transfusions on yourself - 自ら IV 輸血することを許可します - - - CPR creates pulse - HLW erzeugt einen Puls - 心肺蘇生による脈 - - - CPR will create a pulse for the patient while performing - HLW erzeugt während der Behandlung beim Patienten einen Puls - 心肺蘇生を行っている間は患者に脈を作ります - - - Enable Advanced wounds - Усложненные раны - Aktywuj zaawansowane rany - Activa heridas avanzadas - Aktiviere erweiterte Wunden - Povolit pokročilé zranění - Ativar ferimentos avançados - Activer les plaies compliquées - Komplex sebek engedélyezése - Abilita ferite Avanzate - アドバンスド負傷を有効化 - 고급 부상 활성화 - 启用进阶伤口系统 - 啟用進階傷口系統 - - - Allow reopening of bandaged wounds? - Будут ли открываться уже перевязанные раны? - Pozwól na otwieranie się zabandażowanych ran? - Permitir la reapertura de las heridas vendadas? - Erlaube das Öffnen von bandagierten Wunden? - Umožnit znovuotevření zavázané rány? - Permitr reabertura de ferimentos enfaixados? - Les plaies peuvent se rouvrir - Visszanyílhatnak a bekötözött sebek? - Permetti la riapertura di ferite bendate? - 包帯で巻かれた傷を再び開くようにしますか? - 붕대가 풀리는것을 활성화합니까? - 启用进阶伤口系统会使已被包扎的伤口有机率裂开 - 啟用進階傷口系統會使已被包紮的傷口有機率裂開 - - - - - Allow Epinephrine - Erlaube Epiniphrin - Permitir Epinefrina - Ograniczenia adrenaliny - Activer l'épinéphrine - Permette epinefrina - Povolit adrenalin - Permitir Epinefrina - Разрешить Адреналин - アドレナリンの許可 - 에피네프린 활성화 - 允许使用肾上腺素 - 允許使用腎上腺素 - - - Who can use Epinephrine? - 誰がアドレナリンを使えるようにしますか? - - - Allow PAK - Использование аптечки - Ustawienie apteczek osobistych - Permitir EPA - Erlaube Erste-Hilfe-Set - Povolit osobní lékárničky (PAK) - Permitir Kit de Primeiros Socorros - Activer la trousse sanitaire - Elsősegélycsomag engedélyezése - Consenti Kit di Pronto Soccorso - 応急処置キットの許可 - 개인응급키트 활성화 - 允许使用个人急救包 - 允許使用個人急救包 - - - Who can use the PAK for full heal? - Кому разрешено выполнять полное лечение с помощью аптечки? - Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? - ¿Quién puede utilizar el EPA para una cura completa? - Wer kann das Erste-Hilfe-Set für eine Endheilung verwenden? - Kdo může použít osobní lékárničku pro plné vyléčení? - Quem pode usar o KPS para cura completa? - Qui peut utilier la trousse sanitaire pour des soins complets? - Ki használhatja az elsősegélycsomagot teljes gyógyításra? - Chi può usare il KPS per cura completa? - 完全に回復できるよう誰しもが応急処置キットを使えるようにしますか? - 완전한 체력회복을 위해 어느 인원이 개인응급키트을 쓸 수 있습니까? (기본 의료 전용) - 谁能够使用个人急救包来达到完整医疗? - 誰能夠使用個人急救包來達到完整醫療? - - - Anyone - Кем угодно - Wszyscy - Nadie - Jeder - Kdokoliv - Qualquer um - Tous - Akárki - Chiunque - だれでも - 모두 - 任何人 - 任何人 - - - Medics only - Только медиками - Tylko medycy - Solo médicos - Nur Sanitäter - Pouze zdravotník - Somente médicos - Infirmiers uniquement - Csak orvosok - Solo medici - 衛生兵のみ - 의무병만 - 只限医疗兵 - 只限醫療兵 - - - Doctors only - Только врачами - Tylko doktorzy - Solo doctores - Nur Ärzte - Pouze doktor - Somente doutores - Médecins uniquement - Csak doktorok - Solo dottori - 医師のみ - 오직 의사만 - 只限军医 - 只限軍醫 - - - Medical facility - В госпитале - Budynki medyczne - Centro médico - Medizinische Einrichtungen - Zdravotnické zařízení - Instalação médica - Dans les structures sanitaires - Orvosi létesítmény - Strutture mediche - 医療施設でのみ - 의료시설 - 医疗设施 - 醫療設施 - - - Vehicles & facility - В транспорте и госпитале - Pojazdy i budynki medyczne - Vehículos y centros - Fahrzeuge & Einrichtungen - Vozidla a zařízení - Veículos e instalações - Dans les véhicules et les structures sanitaires - Járművek & létesítmény - Veicoli e Strutture - 車両 & 施設 - 차량 및 시설 - 医疗载具 & 医疗设施 - 醫療載具 & 醫療設施 - - - Remove PAK on use - Удалять аптечки после использования - Usuń apteczkę po użyciu - Eliminar EPA después del uso - Entf. Erste-Hilfe-Set bei Verwendung - Odebrat osobní lékárničku po použití - Remover o KPS depois do uso - Utilisation unique de la trousse sanitaire - Elsősegélycsomag eltávolítása használatkor - Rimuovi Kit Pronto Soccorso dopo l'uso - 応急処置キットの削除 - 개인응급키트 사용후 사라짐 - 在使用后删除个人急救包 - 在使用後刪除個人急救包 - - - Should PAK be removed on usage? - Нужно ли удалять аптечки после использования? - Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? - El EPA será eliminado después de usarlo - Sollen Erste-Hilfe-Sets bei Verwendung entfernt werden? - Má se osobní lékárnička odstranit po použití? - Deve o KPS ser removido depois do uso? - La trousse sanitaire doit être consommée à l'utilisation? - Eltávolítódjon az elsősegélycsomag használatkor? - Il Kit Pronto Soccorso dev'essere rimosso dopo l'utilizzo? - 応急処置キットを使うと削除しますか? - 개인응급키트를 사용하고 나서 제거합니까? - 要在使用后删除个人急救包吗? - 要在使用後刪除個人急救包嗎? - - - Locations Epinephrine - Orte für Epiniphrin - Ubicaciones epinefrina - Ograniczenia adrenaliny - Utilisation de l'épinéphrine - Ubicazione epinefrina - Oblast k použití adrenalinu - Localizações de Epinefrina - Место использования адреналина - アドレナリンを使える場所 - 에피네프린 사용 장소 - 肾上腺素使用地点 - 腎上腺素使用地點 - - - Where can the Epinephrine be used? - どこでアドレナリンを使用できる場所にしますか? - - - How long should PAK take to apply? - 応急処置キットの使用時間 - - - How long should PAK take to apply? Use 0 for default (based on damage) - 応急処置キットの使用時間を決定しますか? 0 で標準になります (ダメージに比例) - - - - - Enable Litter - Включить мусор - Aktywuj odpadki - Activar restos médicos - Abfälle aktivieren - Povolit odpadky - Ativar lixo médico - Activer les détritus - Szemét engedélyezése - Abilita Barella - 医療廃棄物の表示を有効化 - - - Enable litter being created upon treatment - Включить появление мусора после лечения - Twórz odpadki medyczne podczas leczenia - Activar los restos médicos que se crean en el tratamiento - Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde - Vytváří odpad zdravotnického materiálu pří léčení - Ativar lixo ser criado após tratamento - Activer la création de détrimus au début des traitements - Engedélyezi a szemét keletkezését ellátáskor - Abilita la creazione della barella dopo trattamento - 治療を始めると、医療廃棄物の作成を有効化します - - - Litter Simulation Detail - Detale zużytych medykamentów - Detalle de simulación de basura - Количество мусора от медицины - Dettagli Simulazione Rifiuti - Niveau de simulation des détritus - Abfall-Detaillevel - Hulladékszimuláció részletessége - Detalhe da simulação de sujeira - Počet zobrazených předmětů po použití zdravotnického materiálu - 医療廃棄物を再現する詳細度 - - - Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. - Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. - Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. - Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. - Il numero di rifiuti che verranno creati localmente. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio lato client. - Le niveau de simulation des détritus règle la quantité de déchets qui vont être créés localement chez le client. Des quantitées excessive chez certains clients peuvent causer des chutes de FPS, c'est donc une option client uniquement. - Die Einstellung für das Abfall-Detaillevel stellt die Menge des lokal angezeigten medizinischen Abfalls ein. Zuviel Abfall kann FPS-Einbrüche erzeugen, weswegen diese Einstellung nur clientseitig ist. - A hulladékszimuláció részletessége megszabja a kliens által megjelenített hulladékobjektumok mennyiségét. Súlyos mennyiségek izolált területeken alacsony FPS-t okozhatnak, így ez egy kliensoldali beállítás. - O nível de detalhe de sujeira determina o número de itens que irão aparecer no cliente. Quantidades excessivas em áreas locais podem aumentar o lag do FPS, então esta é uma opção somente para o cliente. - Počet zobrazených předmětů po použití zdravotnického materiálu ovlivňuje počet objektů, které budou zobrazeny klientovi v místě použití zdravotnického materiálu. Vyšší množství objektů může způsobovat poklesy FPS a proto je toto nastavení čistě na klientovi. - 医療廃棄物再現度は各クライアントでローカルに作成される、医療廃棄物への詳細度を決定できます。ローカルで多くのアイテムがあると FPS の低下を引き起こすため、クライアント側のみの設定です。 - - - Life time of litter objects - Время удаления мусора - Długość życia odpadków - Tiempo de vida de los restos médicos - Dauer des angezeigten Abfalls - Životnost pro odpadky - Tempo de vida dos objetos do lixo - Durée d'affichage des détritus - Szemétobjektumok élettartama - Tempo di vita delle barelle - 医療廃棄物の作成限界数を設定 - - - How long should litter objects stay? In seconds. -1 is forever. - Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время. - Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności. - ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. - Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. - Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. - Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. - Combien de temps doivent rester affiché les détritus? En secondes. -1 pour tout le temps - Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent. - Per quanto devono restare le barelle? In secondi. -1 è permanente - 医療廃棄物オブジェクトが表示されつづける時間を設定しますか?-1 は永遠です。 - - - + + Treatment + Behandlung + 治療 + Лечение + + + Litter + + + Advanced Diagnose + Erweiterte Diagnose + アドバンスド診断 + Расширенная Диагностика + + + Enables the Check Pulse, Check Blood Pressure, and Check Response treatment actions instead of the generic Diagnose action. + + + Advanced Bandages + Erweiterte Bandagen + アドバンスド包帯 + Расширенная Перевязка + + + Enables treatment actions for different bandage types instead of the generic Bandage action. + + + Wound Reopening + + + Enables the reopening of bandaged wounds. Requires Advanced Bandages to be enabled. + + + Advanced Medication + Erweiterte Medikamente + アドバンスド医薬品 + Расширенные Лекарства + + + Enables extended, more in-depth medication handling. Also, enables the use of Adenosine and Atropine. + Устанавливает расширенное использование лекарств + + + CPR Creates Pulse + HLW erzeugt einen Puls + 心肺蘇生による脈 + СЛР создаст пульс + + + Controls whether performing CPR creates a pulse for the patient. + + + Locations Boost Training + Místa pro vylepšení zkušeností + Località aumentano addestramento + Örtliche Trainingssteigerung + Ubicación mejora entrenamiento. + Miejsca zwiększają wyszkolenie + Localização melhora treinamento + Le lieu améliore l'efficacité + Места ускоренного обучения + 衛生兵としての能力を与える場所 + 교육 증가 지역 + 受所在位置影响提升医疗能力 + 受所在位置影響提升醫療能力 + + + Boost medical training when in medical vehicles or facilities. Untrained becomes medic, medic becomes doctor. + + + Self IV Transfusion + Eigennutzung von Bluttransfusionen + Внутривенное переливание на себе + + + Enables the use of IV Transfusions on oneself. + Erlaube Bluttransfusionen an sich selbst zu benutzen + Позволяет использовать внутривенные переливания на себе + + + Allow Shared Equipment + + + Controls whether medical equipment can be shared between the patient and the medic. + + + Patient's Equipment First + + + Medic's Equipment First + + + Allow Epinephrine + Erlaube Epiniphrin + Permitir Epinefrina + Ograniczenia adrenaliny + Activer l'épinéphrine + Permette epinefrina + Povolit adrenalin + Permitir Epinefrina + Разрешить Адреналин + アドレナリンの許可 + 에피네프린 활성화 + 允许使用肾上腺素 + 允許使用腎上腺素 + + + Training level required to use Epinephrine. + + + Locations Epinephrine + Orte für Epiniphrin + Ubicaciones epinefrina + Ograniczenia adrenaliny + Utilisation de l'épinéphrine + Ubicazione epinefrina + Oblast k použití adrenalinu + Localizações de Epinefrina + Место использования адреналина + アドレナリンをつかう場所 + 에피네프린 사용 장소 + 肾上腺素使用地点 + 腎上腺素使用地點 + + + Controls where Epinephrine can be used. + + + Allow PAK + Использование аптечки + Ustawienie apteczek osobistych + Permitir EPA + Erlaube Erste-Hilfe-Set + Povolit osobní lékárničky (PAK) + Permitir Kit de Primeiros Socorros + Activer la trousse sanitaire + Elsősegélycsomag engedélyezése + Consenti Kit di Pronto Soccorso + 応急処置キットの許可 + 개인응급키트 활성화 + 允许使用个人急救包 + 允許使用個人急救包 + + + Training level required to use a PAK. + + + Locations PAK + Место использования аптечки + Ograniczenie apteczek osobistych + Ubicaciones del EPA + Orte für Erste-Hilfe-Set + Oblast k použití PAK + Localizações do KPS + Lieu d'utilisation da trousse sanitaire + Elsősegélycsomag helyek + Locazioni Kit Pronto Soccorso + 応急処置キットを使う場所 + 개인응급키트 사용 장소 + 个人急救包使用地点 + 個人急救包使用地點 + + + Controls where a PAK can be used. + + + Consume PAK + + + Controls whether a PAK should be consumed after use. + + + Time Coefficient PAK + + + Modifies how long a PAK takes to apply.\nThe treatment time is based on the total body part damage multiplied by this coefficient, with a minimum of 10 seconds. + + + Allow Surgical Kit + + + Training level required to use a Surgical Kit. + + + Locations Surgical Kit + + + Controls where a Surgical Kit can be used. + + + Consume Surgical Kit + + + Controls whether a Surgical Kit should be consumed after use. + + + Convert Vanilla Items + Standard Arma-Equipment in ACE-Items umwandeln + Конвертировать ванильные медикаменты + + + Controls whether vanilla medical items are converted to ACE Medical items, removed only, or ignored. + Legt fest, ob Standard Medic-Equipment in ACE-Equipment umgewandelt oder entfernt wird + + + Remove Only + + + Enable Litter + Включить мусор + Aktywuj odpadki + Activar restos médicos + Abfälle aktivieren + Povolit odpadky + Ativar lixo médico + Activer les détritus + Szemét engedélyezése + Abilita Barella + 医療廃棄物の表示を有効化 + + + Enables the creation of litter upon treatment. + + + Max Litter Objects + + + Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. + + + Litter Lifetime + + + Controls the lifetime of litter objects, in seconds. -1 is forever. + + + + Anyone + Кем угодно + Wszyscy + Nadie + Jeder + Kdokoliv + Qualquer um + Tous + Akárki + Chiunque + だれでも + 모두 + 任何人 + 任何人 + + + Medics + + + Doctors + + + Medical Facilities + + + Vehicles & Facilities + + + [ACE] Medical Supply Crate (Basic) [ACE] Ящик с медикаментами (базовая медицина) [ACE] Skrzynka z zapasami medycznymi (podstawowa) @@ -399,7 +283,7 @@ [ACE] 医疗补给箱(基本) [ACE] 醫療補給箱(基本) - + [ACE] Medical Supply Crate (Advanced) [ACE] Ящик с медикаментами (усложн. медицина) [ACE] Skrzynka z zapasami medycznymi (zaawansowana) @@ -415,7 +299,7 @@ [ACE] 医疗补给箱(进阶) [ACE] 醫療補給箱(進階) - + Whether or not the object will be a medical vehicle. Czy pojazd ma być pojazdem medycznym? L'oggetto in questione sarà un veicolo medico o meno. @@ -429,7 +313,7 @@ 是否使该载具为医疗载具? 是否使該載具為醫療載具? - + Medical training Wyszkolenie medyczne Addestramento Medico @@ -444,7 +328,7 @@ 医疗训练 醫療訓練 - + Is Medic Является медиком Klasa medyczna @@ -460,7 +344,7 @@ 是医疗兵 是醫療兵 - + This module allows you to assign the medic class to selected units. Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. Dieses Modul legt fest, welche Einheiten Sanitäter sind. @@ -476,7 +360,7 @@ 本模块可让被同步的单位成为医疗兵 本模塊可讓被同步的單位成為醫療兵 - + None Нет Żadna @@ -492,8 +376,8 @@ - - Regular medic + + Regular Medic Обычный медик Zwykły medyk Médico regular @@ -508,7 +392,7 @@ 普通医疗兵 普通醫療兵 - + Is Medical Vehicle Является медицинским транспортом Jest pojazdem medycznym @@ -524,7 +408,7 @@ 是医疗载具 是醫療載具 - + Is Medical Facility Является госпиталем Jest budynkiem medycznym @@ -540,7 +424,7 @@ 是医疗设施 是醫療設施 - + Registers an object as a medical facility Определяет объект в качестве госпиталя Przypisuje danemu obiektowi status budynku medycznego @@ -556,7 +440,7 @@ 指定一个物件作为医疗设施 指定一個物件作為醫療設施 - + Doctor (Only Advanced Medics) Врач (только усложн.) Doktor (tylko zaawansowani medycy) @@ -572,7 +456,7 @@ 军医 (只限进阶医疗系统) 軍醫 (只限進階醫療系統) - + Doctor Врач Doktor @@ -588,7 +472,7 @@ 军医 軍醫 - + Bandage (Basic) Bandage (Einfach) Повязка (обычная) @@ -604,7 +488,7 @@ 基础绷带 基礎繃帶 - + Used to cover a wound Для перевязки ран Utilizado para cubrir una herida @@ -620,7 +504,7 @@ 用于覆盖伤口 用於覆蓋傷口 - + A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. Повязка, накладываемая поверх раны после остановки кровотечения. @@ -636,7 +520,7 @@ 用于覆盖伤口以防止出血, 透过敷料的止血剂来让出血慢慢停止 用於覆蓋傷口以防止出血, 透過敷料的止血劑來讓出血慢慢停止 - + Packing Bandage Mullbinde Тампонирующая повязка @@ -652,7 +536,7 @@ 包扎绷带 包紮繃帶 - + Used to pack medium to large wounds and stem the bleeding Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen Для тампонирования ран среднего и большого размера и остановки кровотечения. @@ -668,7 +552,7 @@ 用于包扎中到大型伤口, 并防止出血 用於包紮中到大型傷口, 並防止出血 - + A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. @@ -684,7 +568,7 @@ 用于包扎中到大型伤口, 并防止出血, 为在大型多处性伤口的选项之一! 用於包紮中到大型傷口, 並防止出血, 為在大型多處性傷口的選項之一! - + Bandage (Elastic) Bandage (Elastisch) Повязка (давящая) @@ -700,7 +584,7 @@ 弹性绷带 彈性繃帶 - + Bandage kit, Elastic Elastische Binde (Kompressionsbinde) Давящая повязка @@ -716,7 +600,7 @@ 弹性绷带 彈性繃帶 - + Allows an even compression and extra support to the injured area. Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области @@ -732,7 +616,7 @@ 可对伤口持续压迫并固定以防止伤口情况变严重 可對傷口持續壓迫並固定以防止傷口情況變嚴重 - + Tourniquet (CAT) Tourniquet [CAT] Жгут @@ -748,7 +632,7 @@ 军用止血带 軍用止血帶 - + Slows down blood loss when bleeding Замедляет кровопотерю при кровотечении Reduce la velocidad de pérdida de sangre @@ -764,7 +648,7 @@ 减缓失血的速度 減緩失血的速度 - + A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. Жгут используется для прижатия сосудов к костным выступам, которое приводит к остановке или значительному уменьшению кровотечения Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre @@ -780,13 +664,15 @@ 用于压迫静脉与动脉的血液流动, 达到减缓失血速度的目的 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 - + Splint + Шина - + Stabilizes a fractured limb + Стабилизирует перелом конечности - + Morphine autoinjector Morphium-Autoinjektor Морфин в пневмошприце @@ -802,7 +688,7 @@ 吗啡自动注射器 嗎啡自動注射器 - + Used to combat moderate to severe pain experiences Wird verwendet um moderate bis starke Schmerzen zu lindern. Для снятия средних и сильных болевых ощущений @@ -818,7 +704,7 @@ 减低中度至重度的疼痛感 減低中度至重度的疼痛感 - + An analgesic used to combat moderate to severe pain experiences. Обезболивающее для снятия средних и сильных болевых ощущений. Analgésico usado para combatir los estados dolorosos de moderados a severos. @@ -834,7 +720,7 @@ 止痛药的一种, 用于减低中度至重度的疼痛感 止痛藥的一種, 用於減低中度至重度的疼痛感 - + Adenosine autoinjector Adenosin-Autoinjektor Asenosina auto-inyectable @@ -849,7 +735,7 @@ 腺苷自动注射器 腺苷自動注射器 - + Used to counter effects of Epinephrine Wird verwendet um die Symptome von Epiniphrin zu lindern Utilizada para contrarrestar los effectos de la Epinefrina @@ -864,7 +750,7 @@ 用来对付肾上腺素的影响 用來對付腎上腺素的影響 - + A drug used to counter the effects of Epinephrine Ein Medikament, das die Symptome von Epiniphrin bekämpft. Medicamento usado para contrarrestar los efectos de la Epinefrina. @@ -879,7 +765,7 @@ 一种药物用于减低肾上腺素的效果 一種藥物用於減低腎上腺素的效果 - + Atropine autoinjector Атропин в пневмошприце Atropina auto-inyectable @@ -895,7 +781,7 @@ 阿托品自动注射器 阿托品自動注射器 - + Used in NBC scenarios Применяется для защиты от ОМП Usado en escenarios NBQ @@ -911,7 +797,7 @@ 使用于核生化污染的情况 使用於核生化汙染的情況 - + A drug used by the Military in NBC scenarios. Препарат, используемый в войсках для защиты от оружия массового поражения. Medicamento usado por militares en escenarios NBQ @@ -927,7 +813,7 @@ 军用神经解毒针, 用来应付核生化污染的情况. 軍用神經解毒針, 用來應付核生化汙染的情況. - + Epinephrine autoinjector Адреналин в пневмошприце Epinefrina auto-inyectable @@ -943,7 +829,7 @@ 肾上腺素自动注射器 腎上腺素自動注射器 - + Increase heart rate and counter effects given by allergic reactions Стимулирует работу сердца и купирует аллергические реакции Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas @@ -959,7 +845,7 @@ 增加心跳速率的一种药物 增加心跳速率的一種藥物 - + A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшенной вероятностью благоприятного исхода. Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. @@ -975,7 +861,7 @@ 俗称强心针, 为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! - + Plasma IV (1000ml) Плазма для в/в вливания (1000 мл) Plasma IV (1000ml) @@ -991,7 +877,7 @@ 血浆 (1000ml) 血漿 (1000ml) - + A volume-expanding blood supplement. Дополнительный препарат, применяемый при возмещении объема крови. Suplemento para expandir el volumen sanguíneo. @@ -1007,7 +893,7 @@ 可快速得到血液补充 可快速得到血液補充 - + A volume-expanding blood supplement. Дополнительный препарат, применяемый при возмещении объема крови. Suplemento para expandir el volumen sanguíneo. @@ -1023,7 +909,7 @@ 可快速得到血液补充 可快速得到血液補充 - + Plasma IV (500ml) Плазма для в/в вливания (500 мл) Plasma IV (500ml) @@ -1039,7 +925,7 @@ 血浆 (500ml) 血漿 (500ml) - + Plasma IV (250ml) Плазма для в/в вливания (250 мл) Plasma IV (250ml) @@ -1055,7 +941,7 @@ 血浆 (250ml) 血漿 (250ml) - + Blood IV (1000ml) Кровь для переливания (1000 мл) Sangre IV (1000ml) @@ -1071,7 +957,7 @@ 血液 (1000ml) 血液 (1000ml) - + Blood IV, for restoring a patients blood (keep cold) Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) @@ -1087,7 +973,7 @@ 血液, 用于补充伤者流失的血液 (需冷藏) 血液, 用於補充傷者流失的血液 (需冷藏) - + O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. @@ -1103,7 +989,7 @@ O型负值注射用血液, 在紧急情况时使用, 用于补充伤者流失的血液 O型負值注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 - + Blood IV (500ml) Кровь для переливания (500 мл) Sangre IV (500ml) @@ -1119,7 +1005,7 @@ 血液 (500ml) 血液 (500ml) - + Blood IV (250ml) Кровь для переливания (250 мл) Sangre IV (250ml) @@ -1135,7 +1021,7 @@ 血液 (250ml) 血液 (250ml) - + Saline IV (1000ml) Физраствор для в/в вливания (1000 мл) Salino IV (1000ml) @@ -1151,7 +1037,7 @@ 生理食盐水 (1000ml) 生理食鹽水 (1000ml) - + Saline IV, for restoring a patients blood Пакет физраствора для возмещения объёма потерянной крови Solución salina intravenosa, para restaurar el volumen sanguíneo @@ -1167,7 +1053,7 @@ 生理食盐水, 用于恢复伤者血液 生理食鹽水, 用於恢復傷者血液 - + A medical volume-replenishing agent introduced into the blood system through an IV infusion. Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. @@ -1183,7 +1069,7 @@ 利用静脉注射进入人体血液系统, 帮助伤者血液恢复 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 - + Saline IV (500ml) Физраствор для в/в вливания (500 мл) Salino IV (500ml) @@ -1199,7 +1085,7 @@ 生理食盐水 (500ml) 生理食鹽水 (500ml) - + Saline IV (250ml) Физраствор для в/в вливания (250 мл) Salino IV (250ml) @@ -1215,7 +1101,7 @@ 生理食盐水 (250ml) 生理食鹽水 (250ml) - + Basic Field Dressing (QuikClot) Первичный перевязочный пакет (QuikClot) Vendaje básico (QuickClot) @@ -1231,7 +1117,7 @@ 基本战地包扎 (止血粉) 基本戰地包紮 (止血粉) - + QuikClot bandage Гемостатический пакет QuikClot Vendaje QuikClot @@ -1247,7 +1133,7 @@ 止血粉绷带 止血粉繃帶 - + Hemostatic bandage with coagulant that stops bleeding. Медицинский коагулянт для экстренной остановки кровотечения Un bandage aidant à coaguler les saignements mineurs à moyens. @@ -1263,7 +1149,7 @@ 包含止血粉成分的止血绷带, 可用于止血 包含止血粉成分的止血繃帶, 可用於止血 - + Personal Aid Kit Аптечка Trousse sanitaire @@ -1279,7 +1165,7 @@ 个人急救包 個人急救包 - + Includes various treatment kit needed for stitching or advanced treatment Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. Incluye material médico para tratamientos avanzados @@ -1295,7 +1181,7 @@ 包含各种医疗套件, 以及进阶伤口系统需要的缝合用品 包含各種醫療套件, 以及進階傷口系統需要的縫合用品 - + Personal Aid Kit for in field stitching or advanced treatment W znacznym stopniu poprawia stan pacjenta Полевая аптчека для продвинутого лечения и зашивания ран @@ -1311,7 +1197,7 @@ 个人急救包可用于战地缝合手术或进阶伤口系统使用 個人急救包可用於戰地縫合手術或進階傷口系統使用 - + Use Personal Aid Kit Erste-Hilfe-Set benutzen Использовать аптечку @@ -1327,7 +1213,7 @@ 使用个人急救包 使用個人急救包 - + Surgical Kit Trousse chirurgicale Хирургический набор @@ -1343,7 +1229,7 @@ 手术包 手術包 - + Surgical Kit for in field advanced medical treatment Trousse chirurgicale pour le traitement sur le terrain Набор для хирургической помощи в полевых условиях @@ -1359,7 +1245,7 @@ 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - + Surgical Kit for in field advanced medical treatment Набор для хирургической помощи в полевых условиях Kit quirúrgico para el tratamiento avanzado en el campo de batalla @@ -1375,7 +1261,7 @@ 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - + Use Surgical Kit Operationsset benutzen Usa kit chirurgico @@ -1391,7 +1277,7 @@ 使用手术包 使用手術包 - + Bodybag Housse mortuaire Мешок для трупов @@ -1407,7 +1293,7 @@ 尸袋 屍袋 - + A bodybag for dead bodies Housse de transport des corps Мешок для упаковки трупов @@ -1423,7 +1309,7 @@ 用来装尸体用 用來裝屍體用 - + A bodybag for dead bodies Housse de transport des corps Мешок для упаковки трупов @@ -1439,7 +1325,7 @@ 用来装尸体用 用來裝屍體用 - + No injuries on this bodypart... Körperteil nicht verletzt... Non ci sono ferite in questa parte del corpo... @@ -1455,7 +1341,7 @@ 此身体部位没有受伤 此身體部位沒有受傷 - + Inject Adenosine Adenosin injizieren Inyectar Adenosina @@ -1470,7 +1356,7 @@ 注射腺苷 注射腺苷 - + Inject Atropine Atropin injizieren Inyectar Atropina @@ -1486,7 +1372,7 @@ 注射阿托品 注射阿托品 - + Inject Epinephrine Epinephrine injizieren Inyectar Epinefrina @@ -1502,7 +1388,7 @@ 注射肾上腺素 注射腎上腺素 - + Inject Morphine Morphin injizieren Inyectar Morfina @@ -1518,7 +1404,7 @@ 注射吗啡 注射嗎啡 - + Transfuse Blood Bluttransfusion Transfundir sangre @@ -1534,7 +1420,7 @@ 输血液 輸血液 - + Transfuse Plasma Plasmatransfusion Transfundir plasma @@ -1550,7 +1436,7 @@ 输血浆 輸血漿 - + Transfuse Saline Salzlösungstransfusion Transfundir salino @@ -1566,7 +1452,7 @@ 注射生理食盐水 注射生理食鹽水 - + Apply Tourniquet Tourniquet anwenden Aplicar torniquete @@ -1582,7 +1468,7 @@ 使用军用止血带 使用軍用止血帶 - + Bandage Verbinden Venda @@ -1598,7 +1484,7 @@ 绷带 繃帶 - + Bandage Head Kopf verbinden Vendar la cabeza @@ -1614,7 +1500,7 @@ 绷带包扎 头部 繃帶包紮 頭部 - + Bandage Torso Torso verbinden Vendar el torso @@ -1630,7 +1516,7 @@ 绷带包扎 身体 繃帶包紮 身體 - + Bandage Left Arm Linken Arm verbinden Vendar el brazo izquierdo @@ -1646,7 +1532,7 @@ 绷带包扎 左手 繃帶包紮 左手 - + Bandage Right Arm Rechten Arm verbinden Vendar el brazo derecho @@ -1662,7 +1548,7 @@ 绷带包扎 右手 繃帶包紮 右手 - + Bandage Left Leg Linkes Bein verbinden Vendar la pierna izquierda @@ -1678,7 +1564,7 @@ 绷带包扎 左脚 繃帶包紮 左腳 - + Bandage Right Leg Rechtes Bein verbinden Vendar la pierna derecha @@ -1694,7 +1580,7 @@ 绷带包扎 右脚 繃帶包紮 右腳 - + Injecting Morphine... Morphin injizieren... Inyectando Morfina... @@ -1710,7 +1596,7 @@ 吗啡注射中... 嗎啡注射中... - + Injecting Epinephrine... Epinephrin injizieren... Inyectando Epinefrina... @@ -1726,7 +1612,7 @@ 肾上腺素注射中... 腎上腺素注射中... - + Injecting Adenosine... Adenosin injizieren... Inyectando Adenosina... @@ -1741,7 +1627,7 @@ 腺苷注射中... 腺苷注射中... - + Injecting Atropine... Atropin injizieren... Inyectando Atropina... @@ -1757,7 +1643,7 @@ 阿托品注射中 ... 阿托品注射中 ... - + Transfusing Blood... Bluttransfusion... Transfusión de sangre... @@ -1773,7 +1659,7 @@ 输血液中 ... 輸血液中 ... - + Transfusing Saline... Salzlösungtransfusion... Transfusión de salino... @@ -1789,7 +1675,7 @@ 施打生理食盐水中 ... 施打生理食鹽水中 ... - + Transfusing Plasma... Plasmatransfusion... Transfusión de plasma... @@ -1805,7 +1691,7 @@ 输血浆中 ... 輸血漿中 ... - + Bandaging... Verbinden... Vendando... @@ -1821,7 +1707,7 @@ 绷带包扎中 ... 繃帶包紮中 ... - + Applying Tourniquet... Setze Tourniquet an... Aplicando torniquete... @@ -1837,7 +1723,7 @@ 使用军用止血带中 ... 使用軍用止血帶中 ... - + Field Dressing Wundverband Compresa de campaña @@ -1853,7 +1739,7 @@ 基础绷带 基礎繃帶 - + Packing Bandage Mullbinde Vendaje compresivo @@ -1869,7 +1755,7 @@ 包扎绷带 包紮繃帶 - + Elastic Bandage Elastischer Verband Vendaje elástico @@ -1885,7 +1771,7 @@ 弹性绷带 彈性繃帶 - + QuikClot QuikClot QuikClot @@ -1901,7 +1787,7 @@ 止血粉 止血粉 - + Check Pulse Puls überprüfen Comprobar pulso @@ -1917,7 +1803,7 @@ 检查脉搏 檢查脈搏 - + Check Blood Pressure Blutdruck überprüfen Comprobar presión arterial @@ -1933,7 +1819,7 @@ 检查血压 檢查血壓 - + No entries on this triage card. Keine Einträge auf der Triagekarte Nessuna voce sulla Triage Card @@ -1949,7 +1835,7 @@ 此检伤分类卡上没有任何资料 此檢傷分類卡上沒有任何資料 - + Tourniquet Tourniquet Torniquete @@ -1965,7 +1851,7 @@ 军用止血带 軍用止血帶 - + Remove Tourniquet Tourniquet entfernen Quitar torniquete @@ -1981,13 +1867,15 @@ 移除军用止血带 移除軍用止血帶 - + Apply Splint + Наложить Шину - + Applying Splint... + Накладывается Шина... - + Diagnose Diagnose Diagnosi @@ -2003,7 +1891,7 @@ 诊断 診斷 - + Diagnosing... Diagnostizieren... Diagnosi in corso... @@ -2019,7 +1907,7 @@ 诊断中... 診斷中... - + CPR HLW RCP @@ -2035,7 +1923,7 @@ 心肺复苏术 心肺復甦術 - + Performing CPR... HLW durchführen... Eseguendo RCP... @@ -2051,7 +1939,7 @@ 进行心肺复苏术中... 進行心肺復甦術中... - + Give Blood IV (1000ml) Bluttransfusion IV (1000ml) Dar Sangre IV (1000ml) @@ -2067,7 +1955,7 @@ 输血液 (1000ml) 輸血液 (1000ml) - + Give Blood IV (500ml) Bluttransfusion IV (500ml) Dar Sangre IV (500ml) @@ -2083,7 +1971,7 @@ 输血液 (500ml) 輸血液 (500ml) - + Give Blood IV (250ml) Bluttransfusion IV (250ml) Dar Sangre IV (250ml) @@ -2099,7 +1987,7 @@ 输血液 (250ml) 輸血液 (250ml) - + Give Plasma IV (1000ml) Plasmatransfusion IV (1000ml) Dar Plasma IV (1000ml) @@ -2115,7 +2003,7 @@ 输血浆 (1000ml) 輸血漿 (1000ml) - + Give Plasma IV (500ml) Plasmatransfusion IV (500ml) Dar Plasma IV (500ml) @@ -2131,7 +2019,7 @@ 输血浆 (500ml) 輸血漿 (500ml) - + Give Plasma IV (250ml) Plasmatransfusion IV (250ml) Dar Plasma IV (250ml) @@ -2147,7 +2035,7 @@ 输血浆 (250ml) 輸血漿 (250ml) - + Give Saline IV (1000ml) Kochsalzlösung IV (1000ml) Dar Salino IV (1000ml) @@ -2163,7 +2051,7 @@ 注射生理食盐水 (1000ml) 注射生理食鹽水 (1000ml) - + Give Saline IV (500ml) Kochsalzlösung IV (500ml) Dar Salino IV (500ml) @@ -2179,7 +2067,7 @@ 注射生理食盐水 (500ml) 注射生理食鹽水 (500ml) - + Give Saline IV (250ml) Kochsalzlösung IV (250ml) Dar Salino IV (250ml) @@ -2195,11 +2083,13 @@ 注射生理食盐水 (250ml) 注射生理食鹽水 (250ml) - + Minimal + Minimal 軽処置群 + Минимально - + Delayed Retrasado Срочная помощь @@ -2215,7 +2105,7 @@ 延后 延後 - + Immediate Inmediato Неотложная помощь @@ -2231,7 +2121,7 @@ 紧急 緊急 - + Deceased Fallecido Труп @@ -2247,7 +2137,7 @@ 死亡 死亡 - + None Ninguno Отсутствует @@ -2263,7 +2153,7 @@ 未分类 未分類 - + Normal breathing Дыхание в норме Respiración normal @@ -2279,7 +2169,7 @@ 呼吸正常 呼吸正常 - + No breathing Keine Atmung Дыхание отсутствует @@ -2295,7 +2185,7 @@ 没有呼吸 沒有呼吸 - + Difficult breathing Дыхание затруднено Dificultad para respirar @@ -2311,7 +2201,7 @@ 呼吸困难 呼吸困難 - + Almost no breathing Beinahe keine Atmung Дыхание очень слабое @@ -2327,12 +2217,13 @@ 快要没呼吸 快要沒呼吸 - + In mild pain Hat leichte Schmerzen 中くらいの痛みがある + Небольшая боль - + In pain Hat Schmerzen Испытывает боль @@ -2348,12 +2239,13 @@ 疼痛中 疼痛中 - + In severe pain Hat starke Schmerzen ひどい痛みがある + Сильная боль - + Tourniquet [CAT] Tourniquet [CAT] Жгут @@ -2369,7 +2261,7 @@ 军用止血带 軍用止血帶 - + Receiving IV [%1ml] Erhalte IV [%1ml] Recibiendo IV [%1ml] @@ -2385,7 +2277,7 @@ 接收静脉注射液中 [%1ml] 接收靜脈注射液中 [%1ml] - + Blood Pressure Tension artérielle Артериальное давление @@ -2401,7 +2293,7 @@ 血压 血壓 - + Checking Blood Pressure.. Prise de la tension... Проверка артериального давления... @@ -2417,7 +2309,7 @@ 检查血压中... 檢查血壓中... - + %1 checked Blood Pressure: %2 %1 kontrollierte Blutdruck: %2 %1 controllata pressione sanguigna: %2 @@ -2433,7 +2325,7 @@ 已由%1确认血压: %2 已由%1確認血壓: %2 - + You checked %1 Vous examinez %1 Вы осмотрели раненого %1 @@ -2449,7 +2341,7 @@ 你已经检查 %1 你已經檢查 %1 - + You find a blood pressure of %2/%3 Vous avez mesuré une tension de %2/%3 Артериальное давление %2/%3 @@ -2465,7 +2357,7 @@ 血压为%2/%3 血壓為%2/%3 - + You find a low blood pressure Tension basse Давление низкое @@ -2481,7 +2373,7 @@ 发现到低血压 發現到低血壓 - + You find a normal blood pressure Tension normale Давление нормальное @@ -2497,7 +2389,7 @@ 发现到正常血压 發現到正常血壓 - + You find a high blood pressure Tension élevée Давление высокое @@ -2513,7 +2405,7 @@ 发现到高血压 發現到高血壓 - + You find no blood pressure Pas de tension Давления нет @@ -2529,7 +2421,7 @@ 量不到血压 量不到血壓 - + You fail to find a blood pressure Vous n'avez pas pu mesurer de tension Артериальное давление не определяется @@ -2545,7 +2437,7 @@ 检查血压的动作失败 檢查血壓的動作失敗 - + Low Niedrig Bassa @@ -2561,7 +2453,7 @@ - + Normal Normal Normale @@ -2577,7 +2469,7 @@ 正常 正常 - + High Hoch Alta @@ -2593,7 +2485,7 @@ - + No Blood Pressure Kein Blutdruck Nessuna Pressione Sanguigna @@ -2609,7 +2501,7 @@ 无血压 無血壓 - + Pulse Пульс Pouls @@ -2625,7 +2517,7 @@ 脉搏 脈搏 - + Checking Heart Rate... Vérification du pouls... Проверка пульса... @@ -2641,7 +2533,7 @@ 检查心跳中... 檢查心跳中... - + You checked %1 Вы осмотрели раненого %1 Vous examinez %1 @@ -2657,7 +2549,7 @@ 你已经检查 %1 你已經檢查 %1 - + %1 checked Heart Rate: %2 %1 kontrollierte Herzfrequenz: %2 %1 Controllata Frequenza Cardiaca: %2 @@ -2673,7 +2565,7 @@ 已由%1确认心跳: %2 已由%1確認心跳: %2 - + None Нет Żadna @@ -2689,7 +2581,7 @@ - + Weak Schwach Lento @@ -2705,7 +2597,7 @@ 微弱 微弱 - + Normal Normal Normale @@ -2721,7 +2613,7 @@ 正常 正常 - + Strong Stark Veloce @@ -2737,7 +2629,7 @@ 过快 過快 - + You find a Heart Rate of %2 %2 battements par minute Пульс %2 уд./мин. @@ -2753,7 +2645,7 @@ 心跳为%2 心跳為%2 - + You find a weak Heart Rate Poulslent Пульс слабый @@ -2769,7 +2661,7 @@ 心跳微弱 心跳微弱 - + You find a strong Heart Rate pouls rapide Пульс учащенный @@ -2785,7 +2677,7 @@ 心跳过快 心跳過快 - + You find a normal Heart Rate pouls normal Пульс в норме @@ -2801,7 +2693,7 @@ 心跳正常 心跳正常 - + You find no Heart Rate pas de pouls Пульс не прощупывается @@ -2817,7 +2709,7 @@ 量不到心跳 量不到心跳 - + Response Conscience Реакция @@ -2833,7 +2725,7 @@ 反应 反應 - + You check response of patient Vous évaluez l'état de conscience Вы проверяете реакцию раненого @@ -2849,7 +2741,7 @@ 检查伤者的反应 檢查傷者的反應 - + %1 is responsive %1 реагирует на раздражители %1 est conscient @@ -2865,7 +2757,7 @@ %1 有反应 %1 有反應 - + %1 is not responsive %1 не реагирует на раздражители %1 est inconscient @@ -2881,7 +2773,7 @@ %1 没有反应 %1 沒有反應 - + You checked %1 Вы осмотрели раненого %1 Vous avez examiné %1 @@ -2897,7 +2789,7 @@ 你已经检查 %1 你已經檢查 %1 - + Patient %1<br/>is %2.<br/>%3.<br/>%4 Il paziente %1<br/>è %2.<br/>%3.<br/>%4 Пациент %1<br/>%2.<br/>%3.<br/>%4 @@ -2913,7 +2805,7 @@ 伤者 %1<br/>is %2.<br/>%3.<br/>%4 傷者 %1<br/>is %2.<br/>%3.<br/>%4 - + alive vivo жив @@ -2929,7 +2821,7 @@ 活着 活著 - + dead morto мёртв @@ -2945,7 +2837,7 @@ 死亡 死亡 - + He's lost some blood Ha perso poco sangue Ha perdido un poco de sangre @@ -2961,7 +2853,7 @@ 他流失一些血液 他流失一些血液 - + He's lost a lot of blood Er hat viel Blut verloren Sok vért vesztett @@ -2977,7 +2869,7 @@ 他流失大量血液 他流失大量血液 - + He hasn't lost blood Non ha perso sangue Нет кровопотери @@ -2993,7 +2885,7 @@ 他并没有失血 他並沒有失血 - + He is in pain Sente dolori Испытывает боль @@ -3009,7 +2901,7 @@ 他感到疼痛 他感到疼痛 - + He is not in pain Non sente dolori Не испытывает боли @@ -3025,7 +2917,7 @@ 他不会疼痛 他不會疼痛 - + Bandaged Pansé Повязка наложена @@ -3041,7 +2933,7 @@ 绷带 繃帶 - + You bandage %1 (%2) Vous pansez %1 (%2) Вы перевязали раненого %1 (%2) @@ -3057,7 +2949,7 @@ 你正在对 %1 (%2) 包扎绷带中 你正在對 %1 (%2) 包紮繃帶中 - + %1 is bandaging you %1 vous panse %1 перевязывает вас @@ -3073,7 +2965,7 @@ %1 正在对你包扎绷带中 %1 正在對你包紮繃帶中 - + You start stitching injuries from %1 (%2) Вы зашиваете ранения от %1 (%2) Du nähst die Wunden von %1 (%2) @@ -3089,7 +2981,7 @@ 你正开始对 %1 (%2) 缝合伤口中 你正開始對 %1 (%2) 縫合傷口中 - + Stitching Наложение швов Suturando @@ -3105,7 +2997,7 @@ 缝合中 縫合中 - + You treat the airway of %1 Вы интубируете раненого %1 Estás intubando a %1 @@ -3121,7 +3013,7 @@ 你治疗 %1 的呼吸道 你治療 %1 的呼吸道 - + Airway Дыхательные пути Vías aéreas @@ -3137,7 +3029,7 @@ 呼吸道 呼吸道 - + %1 is treating your airway %1 проводит вам интубацию %1 traite vos voies respiratoires @@ -3153,7 +3045,7 @@ %1 正在治疗你的呼吸道 %1 正在治療你的呼吸道 - + Drag Ziehen Arrastrar @@ -3169,7 +3061,7 @@ 拖拉 拖拉 - + Carry Tragen Cargar @@ -3185,7 +3077,7 @@ 背起 背起 - + Release Loslassen Soltar @@ -3201,7 +3093,7 @@ 放下 放下 - + Load Patient Into Patient einladen Cargar al paciente en @@ -3217,7 +3109,7 @@ 将伤者放入 將傷者放入 - + Unload Patient Patient ausladen Descargar al paciente @@ -3233,7 +3125,22 @@ 将伤者背出 將傷者背出 - + + This person (%1) is awake and cannot be loaded + Diese Person (%1) ist wach und kann nicht verladen werden + Ta osoba (%1) jest przytomna i nie może zostać załadowana + Esta persona (%1) está despierto y no puede ser cargado + Боец (%1) в сознании и не может быть погружен + Esta pessoa (%1) está acordada e não pode ser carregada + Tato osoba (%1) je vzhůru a nemůže být naložena + Questa persona (%1) è sveglia e non può essere caricata. + %1 est conscient et ne peut être embarqué. + 患者 (%1) は意識があり、積み込めない + 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 + 此人(%1)是清醒且不能被装载 + 此人(%1)是清醒且不能被裝載 + + %1<br/>loaded into<br/>%2 %1<br/>cargado en<br/>%2 %1<br/>chargé dans<br/>%2 @@ -3249,7 +3156,7 @@ %1<br/>裝載至<br/>%2 %1<br/>装载至<br/>%2 - + Place body in bodybag Colocar cuerpo en bolsa para cadáveres Поместить тело в мешок для трупов @@ -3265,7 +3172,7 @@ 将尸体放入尸袋 將屍體放入屍袋 - + Placing body in bodybag... Colocando cuerpo en bolsa para cadáveres... Упаковка тела... @@ -3281,7 +3188,7 @@ 将尸体放入尸袋中... 將屍體放入屍袋中... - + %1 has bandaged patient %1 has vendado al paciente %1 перевязал пациента @@ -3297,7 +3204,7 @@ %1 已包扎伤者 %1 已包紮傷者 - + %1 performed CPR %1 wykonał cykl RKO %1 provádí CPR @@ -3312,7 +3219,7 @@ %1 已执行心肺复苏术 %1 已執行心肺復甦術 - + %1 used %2 %1 usó %2 %1 benutzt %2 @@ -3328,7 +3235,7 @@ %1 已使用 %2 %1 已使用 %2 - + %1 has given an IV %1 провёл переливание %1 ha puesto una IV @@ -3344,7 +3251,7 @@ %1 已经给予静脉注射液 %1 已經給予靜脈注射液 - + %1 applied a tourniquet %1 aplicado torniquete %1 наложил жгут @@ -3360,7 +3267,7 @@ %1 已经绑上止血带 %1 已經綁上止血帶 - + %1 used Personal Aid Kit %1 hat das eigene Erste-Hilfe-Set verwendet %1 użył apteczki @@ -3375,7 +3282,7 @@ %1 已使用了个人急救包 %1 已使用了個人急救包 - + Heavily wounded Schwer verwundet: Ciężko ranny @@ -3391,7 +3298,7 @@ 重伤 重傷 - + Lightly wounded Leicht verwundet: Lekko ranny @@ -3407,7 +3314,7 @@ 轻伤 輕傷 - + Very lightly wounded Sehr leicht verwundet: B. lekko ranny @@ -3423,7 +3330,7 @@ 小伤 小傷 - + Heal fully bandaged hitpoints Lecz w pełni zabandażowane hitpointy Curar miembros totalmente vendados @@ -3454,7 +3361,7 @@ 治疗中... 治療中... - + Removing Tourniquet... Tourniquet entfernen... Zdejmowanie stazy... @@ -3470,6 +3377,7 @@ 移除军用止血带中... 移除軍用止血帶中... +<<<<<<< HEAD Convert vanilla items 標準アイテムを変換 @@ -3562,7 +3470,7 @@ 谁能够使用手术包? 誰能夠使用手術包? - + There is no tourniquet on this body part! An diesem Körperteil befindet sich kein Tourniquet! Na tej części ciała nie ma stazy! @@ -3577,7 +3485,7 @@ 这部位没有止血带! 這部位沒有止血帶! - + When can the PAK be used? Wann kann das Erste-Hilfe-Set verwendet werden? Kdy může být použita osobní lékárnička? @@ -3586,46 +3494,14 @@ Po spełnieniu jakich warunków apteczka osobista może zostać zastosowana na pacjencie? Mikor lehet az elsősegélycsomagot használni? Onde o kit de primeiros socorros pode ser utilizado? - Когда может использоваться аптечка? + Где может использоваться аптечка? Quando può essere usato il Kit Pronto Soccorso? どこでも応急処置キットを使えるようにしますか? 언제 개인응급키트를 사용할 수 있습니까? 何时可以使用个人急救包? 何時可以使用個人急救包? - - Locations Surgical Kit (Adv) - Место использования хирургического набора (усл.) - Ograniczenie zestawu chirurgicznego - Ubicaciones del equipo quirúrgico (Avanzado) - Orte für Operationskästen (erweitert) - Lokace chirurgické soupravy (Pokr.) - Localizações do kit cirúrgico (avançado) - Lieu d'utilisation des trousses chirurgicales - Sebészkészlet (Fejlett) helyei - Località Kit Chirurgico (Avanzato) - 縫合キットを使う場所 (アド) - 봉합키트 사용 장소 (고급) - 手术包使用地点 (进阶伤口) - 手術包使用地點 (進階傷口) - - - Where can the Surgical Kit be used? - Где может использоваться хирургический набор? - Gdzie można korzystać z zestawu chirurgicznego? - Dónde se puede utilizar el equipo quirúrgico - Wo kann der Operationskasten verwendet werden? - Kde může být použita chirurgická souprava? - Onde o kit cirúrgico pode ser utilizado? - Où peut être utilisé les trousses chirurgicales? - Hol lehet a sebészkészletet használni? - Dove può essere usato il Kit Chirurgico? - どこでも縫合キットを使えるようにしますか? - 어디에서 봉합키트를 사용할 수 있게 합니까? - 定义手术包可被使用的地方? - 定義手術包可被使用的地方? - - + Condition Surgical Kit (Adv) Beding. für d. Operationskasten (erw.) Podmínka chirurgické soupravy (Pokr.) @@ -3641,7 +3517,7 @@ 使用手术包的条件 (进阶伤口) 使用手術包的條件 (進階傷口) - + When can the Surgical Kit be used? Wann kann der Operationskasten verwendet werden? Kde může být použita chirurgická souprava? @@ -3650,30 +3526,14 @@ Po spełnieniu jakich warunków zestaw chirurgiczny może zostać zastosowany na pacjencie? Mikor lehet a sebészkészletet használni? Onde o kit cirúrgico pode ser utilizado? - Когда может использоваться хирургический набор? + Где может использоваться хирургический набор? Quando può essere usato il Kit Chirurgico? いつでも縫合キットを使えるようにしますか? 언제 봉합키트를 사용할 수 있습니까? 何时可以使用手术工具包? 何時可以使用手術工具包? - - Where can the PAK be used? - Где может использоваться аптечка? - Gdzie można korzystać z apteczek osobistych? - ¿Dónde se puede utilizar el equipo de primeros auxilios? - Wo kann das Erste-Hilfe-Set verwendet werden? - Kde může být použita osobní lékárnička (PAK)? - Onde o kit de primeiros socorros pode ser utilizado? - Où la trousse sanitaire peut être utilisée ? - Hol lehet az elsősegélycsomagot használni? - Dove può essere usato il Kit Pronto Soccorso? - どこでも応急処置キットを使えるようにしますか? - 어디에서 개인응급키트를 사용할 수 있습니까? - 在哪里可以使用个人急救包? - 在哪裡可以使用個人急救包? - - + Condition PAK Bedingungen für d. Erste-Hilfe-Set Podmínky pro použití osobní lékárničky diff --git a/addons/medical_treatment/ui/items/adenosine_x_ca.paa b/addons/medical_treatment/ui/adenosine_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/adenosine_x_ca.paa rename to addons/medical_treatment/ui/adenosine_ca.paa diff --git a/addons/medical_treatment/ui/items/atropine_x_ca.paa b/addons/medical_treatment/ui/atropine_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/atropine_x_ca.paa rename to addons/medical_treatment/ui/atropine_ca.paa diff --git a/addons/medical_treatment/ui/items/bloodiv_x_ca.paa b/addons/medical_treatment/ui/bloodiv_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/bloodiv_x_ca.paa rename to addons/medical_treatment/ui/bloodiv_ca.paa diff --git a/addons/medical_treatment/ui/items/bodybag_x_ca.paa b/addons/medical_treatment/ui/bodybag_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/bodybag_x_ca.paa rename to addons/medical_treatment/ui/bodybag_ca.paa diff --git a/addons/medical_treatment/ui/items/elasticbandage_x_ca.paa b/addons/medical_treatment/ui/elasticbandage_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/elasticbandage_x_ca.paa rename to addons/medical_treatment/ui/elasticbandage_ca.paa diff --git a/addons/medical_treatment/ui/items/epinephrine_x_ca.paa b/addons/medical_treatment/ui/epinephrine_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/epinephrine_x_ca.paa rename to addons/medical_treatment/ui/epinephrine_ca.paa diff --git a/addons/medical_treatment/ui/items/fielddressing_x_ca.paa b/addons/medical_treatment/ui/fielddressing_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/fielddressing_x_ca.paa rename to addons/medical_treatment/ui/fielddressing_ca.paa diff --git a/addons/medical_treatment/ui/items/morphine_x_ca.paa b/addons/medical_treatment/ui/morphine_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/morphine_x_ca.paa rename to addons/medical_treatment/ui/morphine_ca.paa diff --git a/addons/medical_treatment/ui/items/packingbandage_x_ca.paa b/addons/medical_treatment/ui/packingbandage_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/packingbandage_x_ca.paa rename to addons/medical_treatment/ui/packingbandage_ca.paa diff --git a/addons/medical_treatment/ui/items/personal_aid_kit_x_ca.paa b/addons/medical_treatment/ui/personal_aid_kit_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/personal_aid_kit_x_ca.paa rename to addons/medical_treatment/ui/personal_aid_kit_ca.paa diff --git a/addons/medical_treatment/ui/items/plasmaiv_x_ca.paa b/addons/medical_treatment/ui/plasmaiv_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/plasmaiv_x_ca.paa rename to addons/medical_treatment/ui/plasmaiv_ca.paa diff --git a/addons/medical_treatment/ui/items/quickclot_x_ca.paa b/addons/medical_treatment/ui/quickclot_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/quickclot_x_ca.paa rename to addons/medical_treatment/ui/quickclot_ca.paa diff --git a/addons/medical_treatment/ui/items/salineiv_x_ca.paa b/addons/medical_treatment/ui/salineiv_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/salineiv_x_ca.paa rename to addons/medical_treatment/ui/salineiv_ca.paa diff --git a/addons/medical_treatment/ui/items/surgicalkit_x_ca.paa b/addons/medical_treatment/ui/surgicalkit_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/surgicalkit_x_ca.paa rename to addons/medical_treatment/ui/surgicalkit_ca.paa diff --git a/addons/medical_treatment/ui/items/tourniquet_x_ca.paa b/addons/medical_treatment/ui/tourniquet_ca.paa similarity index 100% rename from addons/medical_treatment/ui/items/tourniquet_x_ca.paa rename to addons/medical_treatment/ui/tourniquet_ca.paa diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index d2808fac0a1..e5fc0347db7 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -503,6 +503,7 @@ MicroDAGR - Precisione del Waypoint MicroDAGR - ウェイポイントの精度 MicroDAGR - Precyzja PT + MicroDAGR - Точность маршрутных точек Controls how precise the waypointdistance can be displayed @@ -510,6 +511,7 @@ Controlla quanto precisamente può essere visualizzato il waypoint a distanza 表示されるウェイポイントの精度を設定します Kontroluje jak precyzyjnie może być wyświetlany dystans PT + Управляет точностью отображения расстояний маршрутных точек 100m @@ -517,6 +519,7 @@ 100m 100m 100m + 100 м 10m @@ -524,6 +527,7 @@ 10m 10m 10m + 10 м 1m @@ -531,6 +535,7 @@ 1m 1m 1m + 1 м Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf index 205ff3d4efd..edc8b5ab191 100644 --- a/addons/missileguidance/functions/fnc_checkLos.sqf +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: jaynus - * Returns whether the seeker object can see the target position with lineIntersect + * Returns whether the seeker object can see the target position with checkVisibility * * Arguments: * 0: Seeker @@ -18,22 +18,5 @@ params ["_seeker", "_target"]; -if ((isNil "_seeker") || {isNil "_target"}) exitWith { - ERROR_2("nil",_seeker,_target); - false -}; - -private _targetPos = getPosASL _target; -private _targetAimPos = aimPos _target; -private _seekerPos = getPosASL _seeker; -private _return = true; - -if (!((terrainIntersectASL [_seekerPos, _targetPos]) && {terrainIntersectASL [_seekerPos, _targetAimPos]})) then { - if (lineIntersects [_seekerPos, _targetPos, _seeker, _target]) then { - _return = false; - }; -} else { - _return = false; -}; - -_return; +private _visibility = [_seeker, "VIEW", _target] checkVisibility [getPosASL _seeker, aimPos _target]; +_visibility > 0.001 diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index a8f77405278..24f846eaeaa 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -74,6 +74,7 @@ Mk6 迫撃砲 Mortier Mk6 Moździerz Mk6 + Миномет Mk6 Mk6 Settings diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index dd75dafe809..02993e83e97 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -538,14 +538,17 @@ Sfocatura nei bordi dello schermo 在荧幕边框旁淡出 在螢幕邊框旁淡出 + Затухание на границе экрана Player tags transparency + Spielernamen Transparenz プレイヤー名札の透明度 玩家名字标签透明度 玩家名稱透明度 Trasparenza Etichette Nome Przezroczystość etykiet gracza + Прозрачность меток игроков diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 3c5e9115f02..827f318e207 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -10,6 +10,7 @@ ACE夜视镜 ACE Vision Nocturne ACE Noktowizja + ACE ПНВ NV Goggles (Gen1) @@ -190,7 +191,7 @@ Nightvision Nachtsicht - Ночное виденье + Ночное видение Visão Noturna Noční vidění Noktowizja @@ -205,7 +206,7 @@ Settings for night vision. Einstellungen für Nachtsichtgeräte. - Настройки ночного виденья + Настройки приборов ночного видения Ajustes para visão noturna. Nastavení nočního vidění Ustawienia noktowizorów @@ -235,7 +236,7 @@ Blocks the usage of night vision goggles whilst aiming down the sight. Blockiert die Nachtsichtbrillen beim Verwenden des Visiers. - Блокирует использование головного ПНВ при прицеливании через прицел. + Блокирует использование головного ПНВ при прицеливании Bloqueia o uso de visão noturna ao utilizar a mira. Zabraňuje používání nokovizoru v režimu zaměřovače. Uniemożliwia korzystanie z gogli noktowizyjnych przy celowaniu. @@ -256,6 +257,7 @@ 夜视镜雾气程度 Épaisseur du brouillard (JVN) Skala Mgły NVG + Степень размытия ПНВ Fog is used to limit visibility. @@ -266,6 +268,7 @@ 透过雾气来缩减夜视镜的可视距离。 Le brouillard est utilisé pour limiter la visibilité Mgła jest wykorzystywana do ograniczenia widoczności. + Туман используется для ограничения видимости NVG Effect Scale @@ -276,6 +279,7 @@ 夜视镜效果程度 Intensité des effets Skala Efektów NVG + Степень эффектов ПНВ Blur and brightness effects [Setting to 0 will disable ALL nightvision effects] @@ -286,6 +290,7 @@ 调整模糊与亮度的效果。[设值为0会关闭所有夜视镜的特殊效果] Effets de flou et de luminosité [Règler cette option sur 0 désactivera TOUS les effets de vision nocturne] Efekty rozmazania i jasności [Ustawienie na 0 wyłączy WSZYSTKIE efekty noktowizji] + Эффекты размытия и яркости [Установка на 0 отключит ВСЕ эффекты ПНВ] Aim Down Sights Blur @@ -296,6 +301,7 @@ Flou de visée Blur durante la mira Rozmazanie podczas celowania z narządów celowniczych + Размытие при опущеном прицеле NVG Noise Scale @@ -306,6 +312,7 @@ Intensité du bruit (JVN) Fattore di Disturbo del NVG Skala Szumu NVG + Степень шума ПНВ Image noise intensity when wearing NVGs @@ -316,24 +323,29 @@ Intensité du bruit de l'image lorsque vous portez des JVN Intensità del disturbo dell'immagine quando i NVG sono equipaggiati Intensywność efektu szumu podczas noszenia gogli noktowizyjnych + Интенсивность шума при использовании ПНВ Shutter Effects + Rolling-Shutter-Effekt シャッター効果 快门效果 快門效果 Effets d'obturateur Effetti lampeggianti Efekt Shutter + Эффекты затвора Rolling shutter effect from muzzle flashes + Rolling-Shutter-Effekt bei Müdungsfeuer 発射炎が作るローリング シャッター効果です 枪械开火时产生瞬间快门效果 槍開火時瞬間產生快門效果 Effets d'obturateur à rideau dû aux flashs du canon Effetto lampeggiante dato dal lampo dello sparo Efekt rolling shutter z błysków wylotowych + Эффект затвора при вспышках выстрелов diff --git a/addons/nlaw/stringtable.xml b/addons/nlaw/stringtable.xml index c9864678876..bd642d49e5e 100644 --- a/addons/nlaw/stringtable.xml +++ b/addons/nlaw/stringtable.xml @@ -10,6 +10,7 @@ 次世代輕型反坦克導彈發射器追蹤目標 (按住) Śledzenie Celu NLAW (Przytrzymaj) NLAW 목표 추적 (누름유지) + NLAW наведение на цель (Удерживать) Direct Attack @@ -20,6 +21,7 @@ 直射模式 Bezpośredni atak 직접 사격 + Прямая атака Overfly Top Attack @@ -30,6 +32,7 @@ 攻頂模式 Atak z góry 탑어택 + Атака сверху diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml index d8aa43d4e2b..99124dbca58 100644 --- a/addons/noradio/stringtable.xml +++ b/addons/noradio/stringtable.xml @@ -9,6 +9,7 @@ 玩家静音 プレイヤーをミュート Wycisz Gracza + Заглушить игрока Mutes the controlled player avatar. @@ -18,6 +19,7 @@ 静音玩家所控制的角色。 プレイヤーに操作されているこのキャラをミュートします。 Wycisza awatar kontrolowany przez gracza + Заглушить контролируемого игрока diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 9ea7e36a06d..e508793c8b6 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -9,6 +9,7 @@ 过热 過熱 Przegrzewanie + Перегрев Display text on jam diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml index 6dca54adcb5..e66a31f608a 100644 --- a/addons/overpressure/stringtable.xml +++ b/addons/overpressure/stringtable.xml @@ -11,6 +11,7 @@ Coefficente Distanza Sovrapressione 高压影响距离系数 高壓影響距離係數 + Коэффициент избыточного давления Scales the overpressure effect [Default: 1] @@ -22,22 +23,27 @@ Scala l'effetto di sovrapressione [Predefinito: 1] 高压影响的范围 [预设: 1] 高壓影響的範圍 [預設: 1] + Степень зависимости избыточного давления от расстояния [По умолчанию: 1] Backblast range + Rückstoßbereich 後方噴射の範囲 向后喷射的范围 後方尾焰的範圍 Raggio della fiammata [lanciarazzi] Zasięg backblast'u + Дальность реактивной струи Backblast angle + Rückstoßwinkel 後方噴射の角度 向后喷射的角度 後方尾焰的角度 Angolo della fiammata [lanciarazzi] Kąt backblast'u + Угол реактивной струи diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index facea0a4eda..2f5ceb4096f 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -105,6 +105,7 @@ 隱藏自由落體高度計 隐藏自由落体高度计 Schowaj wysokościomierz podczas swobodnego opadania + Убрать высотомер при падении Hides the altitude and speed shown while free falling or parachuting. @@ -114,6 +115,7 @@ 在自由落體時或開傘下隱藏自由落體高度計 在自由落体时或开伞下隐藏自由落体高度计。 Chowa wysokość i prędkość pokazywaną podczas swobodnego opadania lub spadania ze spadochronem. + Скрывает показания высоты и скорости при свободном падении или прыжках с парашютом. diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index a1949e816c2..a24650d5438 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -11,6 +11,7 @@ AUSRÜSTUNG DES FLUGGERÄTS ÉQUIPEMENTS DE L'AÉRONEF WYPOSAŻENIE POJAZDU POWIETRZNEGO + СНАРЯЖЕНИЕ САМОЛЕТА Loadouts for %1 @@ -22,6 +23,7 @@ Ausrüstung für %1 Équipements pour %1 Wyposażenia dla %1 + Оснащение %1 Configure Pylons @@ -33,6 +35,7 @@ Konfiguriere Außenlaststationen Configurer les pylônes Konfiguruj Pylony + Настройка Пилонов ACE Pylons @@ -44,6 +47,7 @@ ACE Außenlaststationen ACE Pylônes Pylony ACE + ACE Пилоны <empty> @@ -55,6 +59,7 @@ <leer> <vide> <puste> + <пусто> Pylons that are colored red will have to be manually rearmed. @@ -66,6 +71,7 @@ Außenlaststationen, die rot markiert sind, müssen manuell aufmunitioniert werden. Les pylônes colorés en rouge devront être réarmés manuellement. Pylony, które są w kolorze czerwonym muszą być manualnie dozbrojone. + Пилоны, окрашенные красным, должны быть переоборудованы вручную %1 is already configuring this aircraft! @@ -77,6 +83,7 @@ %1 konfiguriert dieses Fluggerät bereits! %1 est déjà en train de configurer cet aéronef ! %1 już konfiguruje ten pojazd! + %1 уже настраивает эту авиатехнику! Replacing pylon %1 out of %2... @@ -88,6 +95,7 @@ Ersetze Außenlaststation %1 von insgesamt %2 Remplacement du pylône %1 sur %2 ... Wymiana pylonów %1 z %2... + Замена пилона %1 из %2... Stopped at pylon %1! @@ -99,6 +107,7 @@ Gestoppt bei Außenlaststation %1 Arrêté au pylône %1 ! Zatrzymano na pylonie %1! + Остановлено на пилоне %1! Vehicle too far @@ -110,6 +119,7 @@ Fahrzeug zu weit entfernt Véhicule trop éloigné Pojazd za daleko + Техника слишком далеко Enable Pylons Menu for Zeus @@ -117,8 +127,10 @@ 啟用派龍架選單給宙斯 Abilita Menù Piloni da Zeus Zeus でパイロン メニューを有効化 + Aktiviert Außenlaststationsmenü im Zeus Activer le menu des pylônes (Zeus) Aktywuj Menu Pylonów dla Zeus'a + Активировать Меню пилонов для Зевса Enables use of the zeus module. @@ -126,8 +138,10 @@ 允啟使用宙斯模塊 Abilita l'uso dal modulo di Zeus Zeus モジュールでパイロン メニューを利用できます。 + Aktiviert die Nutzung im Zeus Autorise l'utilisation des modules Zeus Aktywuj wykorzystanie modułu zeus'a. + Позволяет использовать модуль Зевса Enable Pylons Menu from Ammo Trucks @@ -135,8 +149,10 @@ 啟用從彈藥卡車使用派龍架選單 Abilita Menù Piloni da mezzi rifornimento munizioni 弾薬トラックからパイロン メニューを有効化 + Aktiviert Außenlaststationsmenü von Munitionstransportern Activer le menu des pylônes (camion de munitions) Aktywuj Menu Pylonów dla Ciężarówek z amunicją + Меню пилонов из грузовика боеприпасов Enables use of pylons menu from ammo trucks. @@ -144,8 +160,10 @@ 允許從彈藥卡車使用派龍架選單 Abilita l'uso del Menù Piloni da mezzi rifornimento munizioni 弾薬給弾トラックからパイロン メニューを利用できます。 + Aktiviert die Nutzung von Außenlaststationsmenü von Munitionstransportern. Autorise l'utilisation du menu des pylônes depuis les camions de munitions. Aktywuj wykorzystanie menu pylonów z ciężarówek z amunicją. + Позволяет использовать меню пилонов из грузовика с боеприпасами This aircraft doesn't have pylons @@ -153,8 +171,10 @@ 這架飛機沒有派龍架 Questo aereo non ha piloni 航空機にパイロンがありません + Dieses Flugzeug hat keine Außenlaststationen Cet aéronef n'a pas de pylônes Ten pojazd nie posiada pylonów + Эта авиатехника не имеет пилонов Configure pylons module is disabled for zeus @@ -162,8 +182,10 @@ 宙斯模塊的派龍架設定已被禁用 Il modulo per configurare i piloni da Zeus è disabilitato Zeus のパイロン モジュールを無効化 + Die Konfiguration für das Außenlaststationen ist im Zeus deaktiviert La configuration de pylônes est désactivé pour Zeus Konfiguracja modułu pylonów jest wyłączona dla zeus'a + Модуль Настройка пилонов отключен для Zeus Rearm New Pylons @@ -175,6 +197,7 @@ Neue Außenlaststationen. aufmunitionieren Réarmer les nouveaux pylônes Dozbrój Nowe Pylony + Перевооружать новые пилоны Automatically rearm new pylons from the nearest rearm vehicle. @@ -186,6 +209,7 @@ Neue Außenlaststationen. automatisch vom nächsten Munitionsfahrzeug aufmunitionieren Réarmer automatiquement tout les nouveau pylônes depuis le véhicule de munitions le plus proche. Automatycznie dozbrajaj nowe pylony z najbliższego pojazdu dozbrajania. + Автоматически перевооружать новые пилоны из ближайшей техники с боеприпасами Time Per Pylon @@ -197,6 +221,7 @@ Zeit pro Außenlaststation Durée par pylône Czas na Pylon + Время на пилон The time it takes to replace each pylon (in seconds). @@ -208,6 +233,7 @@ Die benötigte Zeit, um einzelne Außenlaststationen zu ersetzen (in Sekunden). Le temps nécessaire pour remplacer chaque pylône (en secondes). Czas, jaki trwa wymiana każdego z pylonów (w sekundach). + Время для замены каждого пилона (в секундах) Search Distance @@ -219,6 +245,7 @@ Suchdistanz Distance de recherche Dystans Szukania + Дальность поиска The distance an aircraft needs to be from a rearm vehicle. @@ -230,6 +257,7 @@ Die Distanz, die ein Fahrzeug von einem Munitionsfahrzeug entfernt sein darf. La distance à laquelle un aéronef doit être d'un véhicule de munitions. Dystans, w jakim pojazd musi być od pojazdu dozbrajania. + Дальность от авиатехники до грузовика (пункта) с боеприпасами Require Engineer @@ -241,6 +269,7 @@ Benötigt Pionier Requiert ingénieur Wymaga Mechanika + Требуется Инженер Require an engineer. @@ -252,6 +281,7 @@ Benötigt einen Pionier. Requiert un ingénieur. Wymaga mechanika. + Требуется роль Инженера Require Toolkit @@ -263,6 +293,7 @@ Benötigt Werkzeugkasten Requiert trousse à outils Wymaga Narzędzi + Требуется Набор инструментов Require a toolkit in inventory. @@ -274,6 +305,7 @@ Benötigt einen Werkzeugkasten im Inventar. Requiert une trousse à outils dans l'inventaire. Wymaga narzędzi w ekwipunku. + Требуется наличие Набора инструментов в инвентаре diff --git a/addons/quickmount/stringtable.xml b/addons/quickmount/stringtable.xml index ab1bf15e67f..e6496fd86a1 100644 --- a/addons/quickmount/stringtable.xml +++ b/addons/quickmount/stringtable.xml @@ -10,6 +10,7 @@ 快速搭乘 Szybkie wsiadanie 빠른 탑승 + Быстрая посадка Vehicle quick mount @@ -20,6 +21,7 @@ 快速搭乘载具 快速搭乘載具 빠른 차량 탑승 + Быстрая посадка в технику Quickly enter the vehicle you are directly looking at. @@ -30,6 +32,7 @@ 快速進入你正在看的載具之中 Szybko wsiądź do pojazdu, na który patrzysz. 빠르게 당신이 보고 있는 가까운 차량에 탑승합니다. + Позволяет быстро сесть в технику, на которую вы смотрите Vehicle Full @@ -40,6 +43,7 @@ 載具已滿 Pojazd pełny 만차 + Мест нет Distance @@ -50,6 +54,7 @@ 距離 Odległość 거리 + Дистанция Maximum distance to check for vehicles. @@ -60,6 +65,7 @@ 最大可檢查載具的距離 Maksymalna odległość do pojazdu. 탑승 가능한 차량과의 거리 + Максимальная дистанция для техники Vehicle Locked @@ -70,6 +76,7 @@ 載具已上鎖 Pojazd zablokowany 차량 잠김 + Техника закрыта Maximum Speed (km/h) @@ -80,6 +87,7 @@ 最高速度 (公里/小時) Maksymalna prędkość (km/h) 최대 속도 (km/h) + Макс. скорость (км/ч) Maximum vehicle speed (km/h) allowed for player entry @@ -90,6 +98,7 @@ 設置玩家能在最高多少的速度之下進入載具 Maksymalna prędkość pojazdu (km/h) pozwalająca graczowi wsiąść. 플레이어가 탑승 가능한 목표 차량의 최대 속도 + Макс. скорость техники для посадки игрока (км/ч) Prioritize Seat @@ -100,6 +109,7 @@ 優先座位 Priorytet zajmowanych pozycji 좌석 우선순위 지정 + Приоритет мест Seat priority on entry @@ -110,9 +120,11 @@ 優先想進入哪個座位 Priorytet pozycji w pojeździe 탑승할 좌석의 우선순위를 지정합니다. + Приоритет мест при посадке Change seat + Sitz wechseln Пересесть 席の変更 Zmień zajmowaną pozycję diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 7d893e87c70..19358ae018b 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -120,7 +120,7 @@ Poste de tir Mini-Spike (AA) Mini-Spike Odpalovač (AA) Wyrzutnia Mini-Spike (AA) - Mini-Spike Пусковое устройство (ВВ) + Mini-Spike Пусковое устройство (ПВО) Lança-mísseis Mini-Spike (AA) Mini-Spike rakétarendszer (Repülő-elhárító) Lanciatore Mini-Spike (AA) @@ -665,6 +665,7 @@ KamAZ MRL KamAZ MRL KamAZ MRL + КамАЗ РСЗО Karatel @@ -1278,6 +1279,7 @@ Mini Granata V40 V40 小型手榴弾 Mini-granat V40 + V40 Мини-граната M83 Smoke Grenade (White) @@ -1591,7 +1593,7 @@ Mini-Spike (AA) Mini-Spike (Repülő-elhárító) Mini-Spike (AA) - Mini-Spike (AA) + Mini-Spike (ПВО) Mini-Spike (AA) Mini-Spike (AA) ミニスパイク (対空) @@ -1607,7 +1609,7 @@ Mini-Spike (AC) Mini-Spike (Tankelhárító) Mini-Spike (AT) - Mini-Spike (AT) + Mini-Spike (ПТ) Mini-Spike (AT) Mini-Spike (AT) ミニスパイク (対地) @@ -1630,7 +1632,7 @@ Metis-M (Brown) Metis-M (Braun) Metis-M (Brun) - Метис-М (Кори́чневый) + Метис-М (Коричневый) "麥士蒂索人"-M型反坦克導彈(棕色) "麦士蒂索人"-M型反坦克导弹(棕色) Metis-M (Marrone) @@ -2648,6 +2650,7 @@ ジープ ラングラー (SPG-9) Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) + Jeep Wrangler (СПГ-9) Jeep Wrangler (LMG) @@ -2657,6 +2660,7 @@ ジープ ラングラー (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) + Jeep Wrangler (Пулемет) Cessna TTx @@ -2729,7 +2733,7 @@ QBZ-95-1 (zielony hex) QBZ-95-1 (Zelený Hex) QBZ-95-1 (Hex Verte) - QBZ-95-1 (Зелёный Hex) + QBZ-95-1 (Зелёный Гекс) QBZ-95-1 (Verde Hex) QBZ-95-1 (Zöld Hex) QBZ-95-1 (Hex Verde) @@ -2745,7 +2749,7 @@ QBZ-95-1 (hex) QBZ-95-1 (Hex) QBZ-95-1 (Hex) - QBZ-95-1 (Hex) + QBZ-95-1 (Гекс) QBZ-95-1 (Hex) QBZ-95-1 (Hex) QBZ-95-1 (Hex) @@ -2777,7 +2781,7 @@ QBZ-95-1 GL (zielony hex) QBZ-95-1 GL (Zelený Hex) QBZ-95-1 GL (Hex Verte) - QBZ-95-1 GL (Зелёный Hex) + QBZ-95-1 GL (Зелёный Гекс) QBZ-95-1 GL (Verde Hex) QBZ-95-1 GL (Zöld Hex) QBZ-95-1 GL (Hex Verde) @@ -2793,7 +2797,7 @@ QBZ-95-1 GL (hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) - QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Гекс) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) QBZ-95-1 GL (Hex) @@ -2825,7 +2829,7 @@ QBZ-95-1 LSW (zielony hex) QBZ-95-1 LSW (Zelený Hex) QBZ-95-1 LSW (Hex Verte) - QBZ-95-1 LSW (Зелёный Hex) + QBZ-95-1 LSW (Зелёный Гекс) QBZ-95-1 LSW (Verde Hex) QBZ-95-1 LSW (Zöld Hex) QBZ-95-1 LSW (Hex Verde) @@ -2841,7 +2845,7 @@ QBZ-95-1 LSW (hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) - QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Гекс) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) QBZ-95-1 LSW (Hex) @@ -2873,7 +2877,7 @@ QBU-88 (zielony hex) QBU-88 (Zelený Hex) QBU-88 (Hex Verte) - QBU-88 (Зелёный Hex) + QBU-88 (Зелёный Гекс) QBU-88 (Verde Hex) QBU-88 (Zöld Hex) QBU-88 (Hex Verde) @@ -2889,7 +2893,7 @@ QBU-88 (hex) QBU-88 (Hex) QBU-88 (Hex) - QBU-88 (Hex) + QBU-88 (Гекс) QBU-88 (Hex) QBU-88 (Hex) QBU-88 (Hex) @@ -2905,7 +2909,7 @@ GM6 Lynx (Zielony hex) GM6 Lynx (Zelený Hex) GM6 Lynx (Hex Verte) - GM6 Lynx (Зелёный Hex) + GM6 Lynx (Зелёный Гекс) GM6 Lynx (Verde Hex) GM6 Lynx (Zöld Hex) GM6 Lynx (Hex Verde) @@ -3161,7 +3165,7 @@ RPG-32 (zielony hex) RPG-32 (Zelený Hex) RPG-32 (Hex Verte) - RPG-32 (Зелёный Hex) + RPG-32 (Зелёный Гекс) RPG-32 (Verde Hex) RPG-32 (Zöld Hex) RPG-32 (Hex Verde) @@ -3210,6 +3214,7 @@ "北极星"先进布署越野车 (XM312重机枪) Polaris DAGOR (XM312) Polaris DAGOR (XM312) + Polaris DAGOR (XM312) Polaris DAGOR (Mini-Spike AT) @@ -3219,6 +3224,7 @@ Polaris DAGOR (Mini-Spike AT) ポラリス DAGOR (ミニスパイク対戦) Polaris DAGOR (Mini-Spike AT) + Polaris DAGOR (ПТ Mini-Spike) Polaris DAGOR @@ -3228,6 +3234,7 @@ "北极星"先进布署越野车 Polaris DAGOR Polaris DAGOR + Polaris DAGOR Polaris DAGOR (light) @@ -3237,6 +3244,7 @@ "北极星"先进布署越野车 (轻型) Polaris DAGOR (leggero) Polaris DAGOR (light) + Polaris DAGOR (легкий) LSV Mk. II (M134) @@ -3246,6 +3254,7 @@ LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) + LSV Mk. II (M134) LSV Mk. II (Metis-M) @@ -3255,6 +3264,7 @@ LSV Mk. II (メチス-M) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) + LSV Mk. II (Метис-M) LSV Mk. II @@ -3264,6 +3274,7 @@ LSV Mk. II LSV Mk. II LSV Mk. II + LSV Mk. II Rooikat 120 @@ -3273,6 +3284,7 @@ ルーイカット 120 Rooikat 120 Rooikat 120 + Rooikat 120 Rooikat 120 UP @@ -3282,6 +3294,7 @@ ルーイカット 120 UP Rooikat 120 UP Rooikat 120 UP + Rooikat 120 UP T-14 Armata @@ -3311,6 +3324,7 @@ ウィーゼル 2 オゼロット (対空) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) + Wiesel 2 Ozelot (ПВО) Wiesel 2 (ATGM) @@ -3320,6 +3334,7 @@ ウィーゼル 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) + Wiesel 2 (ПТ) Wiesel 2 (MK20) @@ -3329,6 +3344,7 @@ ウィーゼル 2 (MK20) Wiesel 2 (MK20) Wiesel 2 (MK20) + Wiesel 2 (MK20) Wiesel 2 RFCV (Radar) @@ -3338,6 +3354,7 @@ ウィーゼル 2 (レーダー) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) + Wiesel 2 RFCV (Радар) Leupold Mark 4 HAMR @@ -3347,6 +3364,7 @@ Leupold Mark 4 HAMR Leupold Mark 4 HAMR Leupold Mark 4 HAMR + Leupold Mark 4 HAMR Leupold Mark 4 HAMR (Khaki) @@ -3356,6 +3374,7 @@ Leupold Mark 4 HAMR (カーキ) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Khaki) + Leupold Mark 4 HAMR (Хаки) ELCAN SpecterOS (Tan) @@ -3365,6 +3384,7 @@ ELCAN SpecterOS (タン) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) + ELCAN SpecterOS (Бронза) ELCAN SpecterOS (Black) @@ -3374,6 +3394,7 @@ ELCAN SpecterOS (ブラック) ELCAN SpecterOS (Nero) ELCAN SpecterOS (Czarny) + ELCAN SpecterOS (Черный) ELCAN SpecterOS (Green Hex) @@ -3382,6 +3403,7 @@ ELCAN SpecterOS (緑ヘックス) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Zielony Hex) + ELCAN SpecterOS (Зеленый Гекс) SIG BRAVO4 / ROMEO3 (Black) @@ -3391,6 +3413,7 @@ SIG BRAVO4 / ROMEO3 (ブラック) SIG BRAVO4 / ROMEO3 (Nero) SIG BRAVO4 / ROMEO3 (Czarny) + SIG BRAVO4 / ROMEO3 (Черный) SIG BRAVO4 / ROMEO3 (Khaki) @@ -3400,6 +3423,7 @@ SIG BRAVO4 / ROMEO3 (カーキ) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Khaki) + SIG BRAVO4 / ROMEO3 (Хаки) SIG BRAVO4 / ROMEO3 (Sand) @@ -3409,6 +3433,7 @@ SIG BRAVO4 / ROMEO3 (サンド) SIG BRAVO4 / ROMEO3 (Sabbia) SIG BRAVO4 / ROMEO3 (Piasek) + SIG BRAVO4 / ROMEO3 (Песочный) Nightforce NXS @@ -3417,6 +3442,7 @@ Nightforce NXS Nightforce NXS Nightforce NXS + Nightforce NXS Nightforce NXS (Green Hex) @@ -3425,6 +3451,7 @@ Nightforce NXS (緑ヘックス) Nightforce NXS (Verde Hex) Nightforce NXS (Zielony Hex) + Nightforce NXS (Зеленый Гекс) Nightforce NXS (Jungle) @@ -3434,6 +3461,7 @@ Nightforce NXS (ジャングル) Nightforce NXS (Giungla) Nightforce NXS (Dżungla) + Nightforce NXS (Джунгли) US Optics MR-10 (Black) @@ -3442,6 +3470,7 @@ US Optics MR-10 (ブラック) US Optics MR-10 (Czarny) Ottica US MR-10 (nera) + US Optics MR-10 (Черный) US Optics MR-10 (Khaki) @@ -3450,6 +3479,7 @@ US Optics MR-10 (カーキ) US Optics MR-10 (Khaki) Ottica US MR-10 (cachi) + US Optics MR-10 (Хаки) US Optics MR-10 (Sand) @@ -3458,6 +3488,7 @@ US Optics MR-10 (サンド) US Optics MR-10 (Piasek) Ottica US MR-10 (sabbia) + US Optics MR-10 (Песочный) KAHLES Helia (Black) @@ -3466,6 +3497,7 @@ KAHLES ヘリア (ブラック) KAHLES Helia (Czarny) KAHLES Helia (nero) + KAHLES Helia (Черный) KAHLES Helia (Hex) @@ -3474,6 +3506,7 @@ KAHLES ヘリア (ヘックス) KAHLES Helia (Hex) KAHLES Helia (esagonale) + KAHLES Helia (Гекс) KAHLES Helia (Old) @@ -3482,6 +3515,7 @@ KAHLES ヘリア (使い古し) KAHLES Helia (Stary) KAHLES Helia (vecchio) + KAHLES Helia (Старый) KAHLES Helia (Tan) @@ -3490,6 +3524,7 @@ KAHLES Helia (タン) KAHLES Helia (Tan) KAHLES Helia (marroncino) + KAHLES Helia (Бронза) Burris XTR II @@ -3498,6 +3533,7 @@ Burris XTR II Burris XTR II Burris XTR II + Burris XTR II Burris XTR II (Green Hex) @@ -3506,6 +3542,7 @@ Burris XTR II (緑ヘックス) Burris XTR II (Green Hex) Burris XTR II (Zielony Hex) + Burris XTR II (Зеленый Гекс) EOTech XPS3 (Tan) @@ -3515,6 +3552,7 @@ EOTech XPS3 (タン) EOTech XPS3 (Tan) EOTech XPS3 (Tan) + EOTech XPS3 (Бронза) EOTech XPS3 (Black) @@ -3524,6 +3562,7 @@ EOTech XPS3 (ブラック) EOTech XPS3 (Black) EOTech XPS3 (Czarny) + EOTech XPS3 (Черный) EOTech XPS3 (Khaki) @@ -3533,6 +3572,7 @@ EOTech XPS3 (カーキ) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) + EOTech XPS3 (Хаки) EOTech XPS3 SMG (Tan) @@ -3542,6 +3582,7 @@ EOTech XPS3 SMG (タン) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) + EOTech XPS3 SMG (Бронза) EOTech XPS3 SMG (Black) @@ -3551,6 +3592,7 @@ EOTech XPS3 SMG (ブラック) EOTech XPS3 SMG (Nero) EOTech XPS3 SMG (Czarny) + EOTech XPS3 SMG (Черный) EOTech XPS3 SMG (Khaki) @@ -3560,6 +3602,7 @@ EOTech XPS3 SMG (カーキ) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) + EOTech XPS3 SMG (Хаки) IOR-Valdada Pitbull 2 @@ -3568,6 +3611,7 @@ IOR-Valdada ピットブル 2 IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 + IOR-Valdada Pitbull 2 Burris FastFire 2 @@ -3576,6 +3620,7 @@ Burris ファストファイア 2 Burris FastFire 2 Burris FastFire 2 + Burris FastFire 2 C-More Railway (Red) @@ -3585,6 +3630,7 @@ C-More レイルウェイ (赤) C-More Railway (Rosso) C-More Railway (Czerwony) + C-More Railway (Красный) C-More Railway (Green) @@ -3594,6 +3640,7 @@ C-More レイルウェイ (緑) C-More Railway (Verde) C-More Railway (Zielony) + C-More Railway (Зеленый) C-More Railway SMG (Red) @@ -3603,6 +3650,7 @@ C-More レイルウェイ SMG (赤) C-More Railway SMG (Rosso) C-More Railway SMG (Czerwony) + C-More Railway SMG (Красный) C-More Railway SMG (Green) @@ -3612,6 +3660,7 @@ C-More レイルウェイ SMG (緑) C-More Railway SMG (Verde) C-More Railway SMG (Zielony) + C-More Railway SMG (Зеленый) P90 TR (Black) diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 31210642f45..7cbe3f4f51f 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -10,6 +10,7 @@ 再武装 Réarmement Dozbrajanie + Перевооружение Rearm Settings @@ -45,7 +46,7 @@ Rearm Amount Aufmunitioniermenge Szybkość dozbrajania - Количество вооружения + Степень перевооружения Quantidade de rearme Rychlost přezbrojení Ammontare Riarmo @@ -60,7 +61,7 @@ How fast should a vehicle be rearmed? Wie schnell soll ein Fahrzeug aufmunitioniert werden? Jak szybko pojazd zostanie dozbrajania? - Как быстро техника должна перевооружаться? + Насколько быстро должна перевооружаться техника? Quão rápido o veículo deve ser rearmado? Jak rychle bude vozidlo přezbrojeno? Quanto velocemente dovrebbe essere riarmato un veicolo? @@ -75,7 +76,7 @@ Entire Vehicle Gesamtes Fahrzeug Cały pojazd - Полностью техника + Техника полностью Todo o veículo Celé vozidlo Tutto il Veicolo @@ -90,7 +91,7 @@ Entire Magazine Gesamtes Magazin Cały magazynek - Полный магазин + Магазин полностью Todo o carregador Celý zásobník Tutto il Caricatore @@ -105,7 +106,7 @@ Amount based on caliber Kaliberbasierte Anzahl Ilość zależna od kalibru - Количество зависит от калибра + В зависимости от калибра Quantidade baseada no calibre Rychlost závisí na ráži Ammontare basato sul calibro @@ -126,6 +127,7 @@ Zapas amunicji 탄약 보급 Approvisionnement en munitions + Запас боеприпасов How much ammunition does an ammo truck carry? @@ -137,6 +139,7 @@ Ile amunicji przewozi ciężarówka? 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있음? Quelle quantité de munitions un camion doit-il transporter ? + Какой боезапас перевозит грузовик с боеприпасами? Unlimited ammo supply @@ -148,6 +151,7 @@ Nielimitowany zapas amunicji 무한의 탄약 Approvisionnement en munitions illimité + Неограниченный боезапас Limited ammo supply based on caliber @@ -159,6 +163,7 @@ Zapas amunicji zależny od kalibru 구경에 따라 제한된 탄약 Approvisionnement en munitions limité basé sur le calibre. + Ограниченный боезапас в зависимости от калибра Only specific Magazines @@ -170,6 +175,7 @@ Tylko konkretne magazynki 특정 탄약만 Seulement des chargeurs spécifiques + Только определенные магазины Check remaining ammunition @@ -181,6 +187,7 @@ Sprawdź ilość amunicji 남은 탄약 확인 Vérifier les munitions restantes + Проверить остаток БК Checking remaining ammunition... @@ -192,6 +199,7 @@ Sprawdzanie ilości amunicji... 남은 탄약 확인중... Vérification des munitions restantes... + Проверка остатка боекомплекта... There is ammunition worth %1 points left. @@ -203,6 +211,7 @@ Pozostało %1 punktów amunicji. 여기에는 최소 %1 포인트의 탄약이 남았습니다. Il reste des munitions d'une valeur de %1 points. + Остаток единиц БК: %1 The following ammunition is left:%1 @@ -214,6 +223,7 @@ Pozostała amunicja: %1 다음의 탄약이 남음 : %1 Il reste les munitions suivantes %1 + Оставшийся боекомплект: %1 There is no ammunition left. @@ -225,6 +235,7 @@ Brak amunicji w zapasie. 여기에는 탄약이 남지 않았습니다. Il n'y a plus de munitions + Запас боекомплекта пуст Rearm @@ -591,6 +602,7 @@ 再武装用カーゴ Ładunek Dozbrajający Rifornimento Munizioni + Боеприпасы для перевооружения The cargo for rearming (-1 disable) @@ -598,6 +610,7 @@ カーゴからの再武装 (-1 で無効化) Ładunek do dozbrajania (-1 wyłączy) Il rifornimento delle munizioni (-1 per disabilitarlo) + Объем боеприпасов для перевооружения (-1 для отмены) diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index 19a22dc390a..293c37b2d72 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -280,6 +280,7 @@ 无法开启燃料喷嘴 주유기를 켤 수 없습니다. Nie można włączyć dyszy paliwowej + Не удалось включить топливный пистолет %1 Liters fueled @@ -441,6 +442,7 @@ 加油軟管長度 Długość węża paliwowego 주유기 호스 길이 + Длина заправочного шланга Fuel Cargo Volume diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 467721b8f5f..c1ac98892f8 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -1137,6 +1137,7 @@ 只有維修專精兵 Tylko zaawansowani mechanicy 고급 정비공만 + Только продвинутые инженеры Allow Wheel @@ -1463,6 +1464,7 @@ 專精 Zaaw. mechanik 고급 정비공 + Продв. Инженер Assign one or multiple units as an engineer @@ -1832,6 +1834,7 @@ 備用履帶 备用履带 Zapasowe Gąsienice + Запасные траки Number of spare tracks in cargo. @@ -1841,6 +1844,7 @@ 設定載具在貨艙內攜帶的備用履帶數量 设定载具在货舱内携带的备用履带数量。 Liczba zapasowych gąsienic w ładunku. + Количество запасных траков в грузовом отсеке Spare Wheels @@ -1850,6 +1854,7 @@ 備用輪胎 备用轮胎 Zapasowe Koła + Запасные колеса Number of spare wheels in cargo. @@ -1859,22 +1864,27 @@ 設定載具在貨艙內攜帶的備用輪胎數量 设定载具在货舱内携带的备用轮胎数量。 Liczba zapasowych kół w ładunku. + Количество запасных колес в грузовом отсеке Auto shut off engine on repair + Motor automatisch ausschalten 修理時にエンジン自動停止 维修时自动关闭发动机。 維修時自動關閉引擎 Motore spento automaticamente durante la riparazione Automatycznie wyłącz silnik podczas napraw + Автоотключение двигателя при ремонте Automatically shut off the engine when doing repairs. + Schaltet den Motor automatisch aus, sobald das Fahrzeug repariert wird. 修理時にエンジンを自動で停止します。 修理时自动关闭发动机。 維修時自動關閉引擎 Spegne automaticamente il motore quando si fanno riparazioni. Automatycznie wyłącz silnik podczas napraw. + Автоматически отключать двигатель при выполнении ремонта diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index d87b6efa7c6..210ccf520d3 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -3,11 +3,13 @@ Respawn + Wiedereinstieg Riapparizione 重生 重生 リスポン Odrodzenie + Возрождение Deploy in 5 seconds... @@ -283,11 +285,13 @@ Body remove timer + Zeit bis Körper entfernt werden Timer rimozione corpo 屍體移除計時器 尸体移除计时器 死体削除タイマー Czas usunięcia ciała + Время удаления трупов This module enables you to configure ACE functionality specific to respawns. diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 2c6030801f7..b437f82d994 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -11,6 +11,7 @@ Mirini 瞄准镜 瞄準鏡 + Прицелы Enable ACE Scope adjustment @@ -22,6 +23,7 @@ Abilita Regolazione mirino ACE 开启ACE瞄准镜归零调节 開啟ACE瞄準鏡歸零調節 + Включить настройку прицелов ACE Enable adjustment turrets on high powered scopes @@ -33,6 +35,7 @@ Abilita la regolazione delle torrette nei mirini a lunga gittata 开启高倍率瞄准镜归零调节 開啟高倍率瞄準鏡歸零調節 + Включает регулировочные барабанчики ввода поправок на прицелах с высокой кратностью Force adjustment turrets @@ -44,6 +47,7 @@ Forza la regolazione delle torrette 强制使用归零调节 強制使用歸零調節 + Включить регулировку ненастроенных прицелов Force usage of adjustmet turrets on high powered scopes @@ -55,6 +59,7 @@ Forza l'uso della regolazione nei mirini a lunga gittata 强制为高倍率瞄准镜开启归零调节 強制為高倍率瞄準鏡開啟歸零調節 + Принудительно использовать барабанчики ввода поправок для ненастроенных прицелов с высокой кратностью Correct zeroing @@ -66,6 +71,7 @@ Correggi azzeramento 修正归零 修正歸零 + Корректировать пристрелку Corrects the zeroing of all small arms sights @@ -77,6 +83,7 @@ Corregge l'azzeramento di tutti i mirini di bassa portata 为所有小口径武器修正归零 為所有小口徑武器修正歸零 + Позволяет корректировать пристрелку для всех прицелов стрелкового оружия Overwrite zero distance @@ -88,6 +95,7 @@ Sovrascrivi la distanza zero 覆写归零距离 覆寫歸零距離 + Перезаписать дальность пристрелки Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes @@ -99,6 +107,7 @@ Usa le impostazioni di "defaultZeroRange" (Portata Zero Predefinita) per sovrascrivere la portata zero dei mirini a lunga gittata 使用'defaultZeroRange'来为高倍率瞄准镜覆写预设归零距离 使用'defaultZeroRange'來為高倍率瞄準鏡覆寫預設歸零距離 + Использует настройку 'defaultZeroRange' для перенастройки дальности пристрелки прицелов с высокой кратностью Default zero distance @@ -110,6 +119,7 @@ Distanza zero predefinita 预设归零距离 預設歸零距離 + Дальность пристрелки по умолчанию High powered scopes will be zeroed at this distance @@ -121,6 +131,7 @@ I mirini a lunga gittata verranno azzerrati a questa distanza 高倍率瞄准镜将归零在这个距离上 高倍率瞄準鏡將歸零在這個距離上 + Дальность, на которую будут пристреляны прицелы с высокой кратностью Reference temperature @@ -132,6 +143,7 @@ Temperatura di riferimento 参考温度 參考溫度 + Референсная температура Temperature at which the scope was zeroed @@ -143,6 +155,7 @@ Temperatura a cui è stato azzerato il mirino 武器参考多少温度来进行归零. 武器參考多少溫度來進行歸零. + Температура, при которой выполнена пристрелка прицела Reference barometric pressure @@ -154,6 +167,7 @@ Pressione barometrica di riferimento 参考大气压力 參考大氣壓力 + Референсное давление Barometric pressure at which the scope was zeroed @@ -165,6 +179,7 @@ Pressione barometrica a cui è stato azzerato il mirino 武器参考多少大气压力来进行归零。 武器參考多少大氣壓力來進行歸零。 + Давление, при котором выполнена пристрелка прицела Reference humidity @@ -176,6 +191,7 @@ Umidità di riferimento 参考湿度 參考濕度 + Референсная влажность Humidity at which the scope was zeroed @@ -187,6 +203,7 @@ Umidità a cui è stato azzerato il mirino 武器参考多少湿度来进行归零。 武器參考多少濕度來進行歸零。 + Влажность, при которой выполнена пристрелка прицела Deduce pressure from altitude @@ -198,6 +215,7 @@ Ricava la pressione dall'altitudine 高度影响大气压力 高度影響大氣壓力 + Просчитать давление из высоты Deduce the barometric pressure from the terrain altitude @@ -209,6 +227,7 @@ Ricava la pressione barometrica dall'altitudine del terreno 在不同高度上会有不同的大气压力 在不同高度上會有不同的大氣壓力 + Давление определяется по высоте Use legacy UI @@ -219,6 +238,7 @@ 昔の UI を使用 기존 UI 사용 Wykorzystaj legacy UI + Использовать устаревший интерфейс Displays elevation and windage with signed numbers @@ -229,6 +249,7 @@ 印付きの数字で仰角と横風を表示 기존의 부호가 있는 숫자로 표고와 폭을 표시합니다. Wyświetla elewację i tarcie powietrza poprzez podpisane liczby + Отображает горизонтальные и вертикальные поправки с подписанными числами Simplified zeroing @@ -239,6 +260,7 @@ 簡單歸零 简单归零 Uproszczone zerowanie + Упрощенная пристрелка Replicates the vanilla zeroing system for riflescopes. @@ -249,12 +271,13 @@ 使用原版的歸零系統來取代ACE複雜的歸零模擬。 使用原版的归零系统来取代ACE复杂的归零模拟。 Replikuje system zerowania, dla celowników karabinowych, z domyślnej gry. + Использует ванильную систему прицеливания для прицелов Minor adjustment up Kleine Korrektur hoch Zerowanie powoli w górę - Малая корректировка ВВЕРХ + Малая поправка ВВЕРХ Ajuste menor arriba Regola leggermente alzata in alto Hausse + @@ -270,7 +293,7 @@ Minor adjustment down Kleine Korrektur runter Zerowanie powoli w dół - Малая корректировка ВНИЗ + Малая поправка ВНИЗ Ajuste menor abajo Regola leggermente alzata in basso Hausse - @@ -286,7 +309,7 @@ Minor adjustment right Kleine Korrektur rechts Zerowanie powoli w prawo - Малая корректировка ВПРАВО + Малая поправка ВПРАВО Ajuste menor derecha Regola leggermente il tiro a destra Dérive + @@ -302,7 +325,7 @@ Minor adjustment left Kleine Korrektur links Zerowanie powoli w lewo - Малая корректировка ВЛЕВО + Малая поправка ВЛЕВО Ajuste menor izquierda Regola leggermete il tiro a sinistra Dérive - @@ -318,7 +341,7 @@ Major adjustment up Große Korrektur hoch Zerowanie w górę - Большая корректировка ВВЕРХ + Большая поправка ВВЕРХ Ajuste mayor arriba Regola l'alzata in alto Hausse +++ @@ -334,7 +357,7 @@ Major adjustment down Große Korrektur runter Zerowanie w dół - Большая корректировка ВНИЗ + Большая поправка ВНИЗ Ajuste mayor abajo Regola l'alzata in basso Hausse - - - @@ -350,7 +373,7 @@ Major adjustment right Große Korrektur rechts Zerowanie w prawo - Большая корректировка ВПРАВО + Большая поправка ВПРАВО Ajuste mayor derecha Regola il tiro a destra Dérive +++ @@ -366,7 +389,7 @@ Major adjustment left Große Korrektur links Zerowanie w lewo - Большая корректировка ВЛЕВО + Большая поправка ВЛЕВО Ajuste mayor izquierda Regola il tiro a sinistra Dérive - - - @@ -382,7 +405,7 @@ Set zero adjustment Nullung durchführen Ustaw wyzerowanie - Сбросить корректировку + Установить дальность пристрелки Establecer ajuste a cero Imposta i valori dell'azzeramento RAZ corrections @@ -403,6 +426,7 @@ 重設歸零 重设归零 Zresetuj wyzerowanie + Сбросить дальность пристрелки This module adds windage and elevation adjustment turrets on high power rifle scopes. @@ -414,6 +438,7 @@ Questo modulo aggiunge lo spostamento dell'aria e la regolazione dell'elevazione delle torrette in mirini a lunga gittata 此模块可为高倍率瞄准镜新增归零风偏,距离用的调整纽。 此模塊可為高倍率瞄準鏡新增歸零風偏,距離用的調整紐。 + Этот модуль добавляет барабанчики ввода горизонтальных и вертикальных поправок для прицелов с высокой кратностью %1D @@ -425,6 +450,7 @@ %1D %1D %1D + %1D %1L @@ -436,6 +462,7 @@ %1L %1L %1L + %1L %1R @@ -447,20 +474,25 @@ %1R %1R %1R + %1R Horizontal limits + Horizontale Grenzen 水平限制 水平制限 Limite orrizontale Limit poziomy + Лимит по горизонтали Vertical limits + Vertikale Grenzen 垂直限制 垂直制限 Limite verticale Limit pionowy + Лимит по вертикали diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 7f37e06b01c..31157155d59 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -169,6 +169,7 @@ 設定名稱 设定名称 이름 설정 + Установить имя Name that will be used for main interaction entry (to distinguish multiple slideshows). Default: "Slides" @@ -180,6 +181,7 @@ 設定該幻燈片的標題名稱 (用來區分多個不同標題的幻燈片) 預設名稱: "幻燈片" 设定该幻灯片的标题名称 (用来区分多个不同标题的幻灯片) 预设名称: "幻灯片" 상위 상호작용 이름 (여러개의 슬라이드 쇼를 구분하기 위해 사용됨) 기본: "Slides" + Имя, которое будет использоваться для основных взаимодействий (для различения нескольких слайдов). По умолчанию: «Slides» Slide Duration diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 01ad0f210c4..8ca9afd2e39 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -11,6 +11,7 @@ 관전자 Spectateur Obserwator + Зритель ACE Spectator @@ -22,6 +23,7 @@ ACE 旁觀者 Obserwator ACE ACE 관전자 + ACE Зритель Configure how the spectator system will operate by default. @@ -48,6 +50,7 @@ AI 활성 IA Activée SI Aktywowane + Разрешить для ИИ Make AI viewable in spectator @@ -59,6 +62,7 @@ 관전자가 AI를 관전 할 수 있습니다. Rends les IA visibles en spectateur Spraw, aby SI było widoczne jako obserwator + Сделать ИИ видимыми в режиме зрителя Camera modes @@ -182,9 +186,11 @@ Max Follow Distance + Макс. дистанция следования Maximum distance the follow camera can be from the target + Максимальная дистанция от камеры слежения до цели @@ -273,6 +279,7 @@ 아이콘 Icônes Ikony + Иконки Projectiles @@ -284,6 +291,7 @@ 발사체 Projectiles Pociski + Осколки Next Unit @@ -325,6 +333,7 @@ 보기 모드 Mode de vision Tryb Wizji + Режим видения Slow Speed @@ -336,6 +345,7 @@ 느린 속도 Vitesse lente Wolna Prędkość + Замедление diff --git a/addons/spottingscope/CfgOpticsEffect.hpp b/addons/spottingscope/CfgOpticsEffect.hpp new file mode 100644 index 00000000000..2b9542ba9c0 --- /dev/null +++ b/addons/spottingscope/CfgOpticsEffect.hpp @@ -0,0 +1,7 @@ +class CfgOpticsEffect { + class GVAR(OpticsRadBlur1) { + type = "radialblur"; + params[] = {0.01,0.01,0.18,0.36}; + priority = 950; + }; +}; diff --git a/addons/spottingscope/CfgVehicles.hpp b/addons/spottingscope/CfgVehicles.hpp index d961f0d36b9..660a3d6749a 100644 --- a/addons/spottingscope/CfgVehicles.hpp +++ b/addons/spottingscope/CfgVehicles.hpp @@ -27,23 +27,16 @@ class CfgVehicles { class LandVehicle; class StaticWeapon: LandVehicle { - class Turrets; - class ACE_Actions { - class ACE_MainActions; - }; - }; - - class StaticATWeapon: StaticWeapon { - class Turrets: Turrets { + class Turrets { class MainTurret; }; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions {}; + class ACE_Actions { + class ACE_MainActions; }; }; - class ACE_SpottingScopeObject: StaticATWeapon { + class ACE_SpottingScopeObject: StaticWeapon { EGVAR(dragging,canDrag) = 1; EGVAR(dragging,dragPosition)[] = {0,1,0}; EGVAR(dragging,dragDirection) = 0; @@ -68,6 +61,8 @@ class CfgVehicles { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers_base {}; }; + CBA_ScriptedOpticClass = "ACE_SpottingScopeOptic"; + author = ECSTRING(common,ACETeam); scope = 1; side = 1; @@ -84,6 +79,7 @@ class CfgVehicles { accuracy = 0.12; cost = 10000; icon = "\A3\Static_F_Gamma\data\UI\map_StaticTurret_AT_CA.paa"; + attenuationEffectType = ""; class SpeechVariants { class Default { @@ -123,15 +119,15 @@ class CfgVehicles { initAngleY = 0; minAngleY = -100; maxAngleY = 100; - minFov = 0.0025; - maxFov = 0.05; - initFov= 0.05; + minFov = "0.25/35"; // real one is 15x-45x, but max mag in game is 37x + maxFov = "0.25/5"; + initFov= "0.25/5"; }; weapons[] = {}; magazines[] = {}; gunnerOpticsColor[] = {1,1,1,1}; - gunnerOpticsModel = "\A3\Weapons_F\empty"; + gunnerOpticsModel = "\A3\Weapons_F\empty.p3d"; gunnerOpticsEffect[] = {"OpticsCHAbera1","OpticsBlur2"}; gunnerOutOpticsShowCursor = 0; gunnerOpticsShowCursor = 0; @@ -140,7 +136,7 @@ class CfgVehicles { gunnerGetOutAction = "PlayerProne"; gunnerForceOptics = 0; ejectDeadGunner = 0; - turretInfoType = QGVAR(RscUnitInfo); + turretInfoType = "CBA_ScriptedOptic_zooming"; opticsDisablePeripherialVision = 1; }; }; diff --git a/addons/spottingscope/CfgWeapons.hpp b/addons/spottingscope/CfgWeapons.hpp index 9548b30aee9..29499206024 100644 --- a/addons/spottingscope/CfgWeapons.hpp +++ b/addons/spottingscope/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class ACE_ItemCore; class CBA_MiscItem_ItemInfo; @@ -15,4 +14,31 @@ class CfgWeapons { mass = 40; }; }; + + class ItemCore; + class ACE_SpottingScopeOptic: ItemCore { + scope = 1; + + class CBA_ScriptedOptic { + minMagnificationReticleScale[] = {5,1}; + maxMagnificationReticleScale[] = {25,5}; + + reticleDetailTextures[] = { + // start at > this magnification, reticleTexture, reticleTextureSize, reticleTextureNight (optional) + {0, PATHTOF(data\ace_spottingscope_reticle_b1_ca.paa), 1, PATHTOF(data\ace_spottingscope_reticle_b1_ca.paa)}, + {9, PATHTOF(data\ace_spottingscope_reticle_b2_ca.paa), 1/2, PATHTOF(data\ace_spottingscope_reticle_b2_ca.paa)}, + {14, PATHTOF(data\ace_spottingscope_reticle_b3_ca.paa), 1/3, PATHTOF(data\ace_spottingscope_reticle_b3_ca.paa)}, + {19, PATHTOF(data\ace_spottingscope_reticle_b4_ca.paa), 1/4, PATHTOF(data\ace_spottingscope_reticle_b4_ca.paa)}, + {24, PATHTOF(data\ace_spottingscope_reticle_b5_ca.paa), 1/5, PATHTOF(data\ace_spottingscope_reticle_b5_ca.paa)} + }; + fadeReticleInterval[] = {10.5,9.5}; + + bodyTexture = QPATHTOF(data\ace_spottingscope_body_co.paa); + //bodyTextureNight = QPATHTOF(data\ace_spottingscope_body_co.paa); + bodyTextureSize = 1.5; + reticleSafezoneSize = 1; + hidePeripheralVision = 1; + opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + }; + }; }; diff --git a/addons/spottingscope/RscInGameUI.hpp b/addons/spottingscope/RscInGameUI.hpp deleted file mode 100644 index bf4f086dd7b..00000000000 --- a/addons/spottingscope/RscInGameUI.hpp +++ /dev/null @@ -1,56 +0,0 @@ - -class RscOpticsValue; -class RscMapControl; -class RscText; -class RscPicture; - -class RscInGameUI { - class RscUnitInfo; - class GVAR(RscUnitInfo): RscUnitInfo { - onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); {((_this select 0) displayCtrl _x) ctrlShow false} forEach [ARR_4(IDC_RETICLE,IDC_BODY,IDC_BLACK_LEFT,IDC_BLACK_RIGHT)]); - controls[] = {"CA_FOVMode","ScriptedReticleHelper","trippleHeadLeft","trippleHeadRight","Reticle","Body"}; // don't change this order - - class CA_FOVMode: RscOpticsValue { // idea by Taosenai. Apparently this can be used via isNil check to determine wheter the scope or the kolimator is used - idc = 154; - w = 0; - h = 0; - }; - - class ScriptedReticleHelper: RscMapControl { - onDraw = QUOTE(ctrlParent (_this select 0) call FUNC(animateReticle)); - idc = -1; - w = 0; - h = 0; - }; - - class Reticle: RscPicture { - idc = IDC_RETICLE; - text = QPATHTOF(rsc\spotting_scope_reticle_co.paa); - x = POS_X; - y = POS_Y; - w = POS_W; - h = POS_H; - }; - - class Body: Reticle { - idc = IDC_BODY; - text = QPATHTOF(rsc\spotting_scope_body_co.paa); - }; - - //These are just black side panels to cover the areas that the optics p3d doesn't cover - //It will ONLY effect tripple head users as (safezoneX == safeZoneXAbs) for everyone else - class trippleHeadLeft: RscText { - idc = IDC_BLACK_LEFT; - x = "safeZoneXAbs"; - Y = "safezoneY"; - w = QUOTE(POS_X_BASE(SIZEX) - safeZoneXAbs); - h = "safeZoneH"; - colorBackground[] = {0,0,0,1}; - }; - - class trippleHeadRight: trippleHeadLeft { - idc = IDC_BLACK_RIGHT; - x = QUOTE(safeZoneXAbs + safeZoneWAbs - (POS_X_BASE(SIZEX) - safeZoneXABS)); - }; - }; -}; diff --git a/addons/spottingscope/XEH_PREP.hpp b/addons/spottingscope/XEH_PREP.hpp index 98398723604..75bc471556f 100644 --- a/addons/spottingscope/XEH_PREP.hpp +++ b/addons/spottingscope/XEH_PREP.hpp @@ -1,4 +1,2 @@ - PREP(pickup); PREP(place); -PREP(animateReticle); diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf index e80d5e4ef9f..13d220d9591 100644 --- a/addons/spottingscope/XEH_preInit.sqf +++ b/addons/spottingscope/XEH_preInit.sqf @@ -16,4 +16,12 @@ PREP_RECOMPILE_END; _tube addTorque (vectorNormalized [1 - random 2, 1 - random 2, 1 - random 2] vectorMultiply 4); }] call CBA_fnc_addClassEventHandler; +["ACE_SpottingScopeObject", "GetOut", { + params ["_vehicle", "", "_unit"]; + + if (local _unit) then { + _unit setDir getDir _vehicle; + }; +}] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/spottingscope/config.cpp b/addons/spottingscope/config.cpp index 5e8576eb598..c7a0b8a8c95 100644 --- a/addons/spottingscope/config.cpp +++ b/addons/spottingscope/config.cpp @@ -18,5 +18,8 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "CfgMoves.hpp" +#include "CfgOpticsEffect.hpp" -#include "RscInGameUI.hpp" +class CBA_PIPItems { + GVAR(enable) = "-"; +}; diff --git a/addons/spottingscope/rsc/spotting_scope_body_co.paa b/addons/spottingscope/data/ace_spottingscope_body_co.paa similarity index 100% rename from addons/spottingscope/rsc/spotting_scope_body_co.paa rename to addons/spottingscope/data/ace_spottingscope_body_co.paa diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa new file mode 100644 index 00000000000..01fb142cf16 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a1_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa new file mode 100644 index 00000000000..332c5e9630e Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a1_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa new file mode 100644 index 00000000000..5c2c5cedf74 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a2_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa new file mode 100644 index 00000000000..d95f44fad44 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a2_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa new file mode 100644 index 00000000000..815d283700b Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a3_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa new file mode 100644 index 00000000000..e018ceb7e28 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a3_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa new file mode 100644 index 00000000000..5a0ce5dd4ab Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a4_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa new file mode 100644 index 00000000000..129571c875d Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a4_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa new file mode 100644 index 00000000000..990a1299d4e Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a5_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa new file mode 100644 index 00000000000..614946f358c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_a5_night_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa new file mode 100644 index 00000000000..dc938d7376c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b1_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa new file mode 100644 index 00000000000..dee69b091f2 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b2_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa new file mode 100644 index 00000000000..a7eec0cf63a Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b3_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa new file mode 100644 index 00000000000..b0978523f8c Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b4_ca.paa differ diff --git a/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa b/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa new file mode 100644 index 00000000000..40837aa44c3 Binary files /dev/null and b/addons/spottingscope/data/ace_spottingscope_reticle_b5_ca.paa differ diff --git a/addons/spottingscope/functions/fnc_animateReticle.sqf b/addons/spottingscope/functions/fnc_animateReticle.sqf deleted file mode 100644 index adca733814e..00000000000 --- a/addons/spottingscope/functions/fnc_animateReticle.sqf +++ /dev/null @@ -1,47 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Animate scripted reticle of spotting scope. - * - * Arguments: - * 0: Reticles RSC info display - * - * Return Value: - * None - * - * Example: - * [DISPLAY] call ace_spottingscope_fnc_animateReticle - * - * Public: No - */ - -disableSerialization; - -params ["_display"]; -uinamespace setVariable [QGVAR(dlgSpottingScope), _display]; - -private _ctrlReticle = _display displayCtrl IDC_RETICLE; -private _ctrlBody = _display displayCtrl IDC_BODY; -private _ctrlBlackLeft = _display displayCtrl IDC_BLACK_LEFT; -private _ctrlBlackRight = _display displayCtrl IDC_BLACK_RIGHT; - -// check if optics are used -// hide all controls otherwise -private _isUsingOptic = ctrlShown (_display displayCtrl 154); - -_ctrlReticle ctrlShow _isUsingOptic; -_ctrlBody ctrlShow _isUsingOptic; -_ctrlBlackLeft ctrlShow _isUsingOptic; -_ctrlBlackRight ctrlShow _isUsingOptic; - -// animate reticle -private _zoom = ([] call EFUNC(common,getZoom)) * MAGIC_SCOPE_NUMBER; - -_ctrlReticle ctrlSetPosition [ - POS_X_BASE(_zoom), - POS_Y_BASE(_zoom), - POS_W_BASE(_zoom), - POS_H_BASE(_zoom) -]; - -_ctrlReticle ctrlCommit 0; diff --git a/addons/spottingscope/rsc/spotting_scope_reticle_co.paa b/addons/spottingscope/rsc/spotting_scope_reticle_co.paa deleted file mode 100644 index a2d299d9379..00000000000 Binary files a/addons/spottingscope/rsc/spotting_scope_reticle_co.paa and /dev/null differ diff --git a/addons/spottingscope/script_component.hpp b/addons/spottingscope/script_component.hpp index 14e78672856..6b2d95abbd5 100644 --- a/addons/spottingscope/script_component.hpp +++ b/addons/spottingscope/script_component.hpp @@ -16,14 +16,6 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define IDC_RETICLE 10000 -#define IDC_BODY 10001 -#define IDC_BLACK_LEFT 10002 -#define IDC_BLACK_RIGHT 10003 - -#define MAGIC_SCOPE_NUMBER 0.0235 -//#define MAGIC_SCOPE_NUMBER (uiNamespace getVariable ['magic', 1]) - #define POS_X_BASE(size) safezoneX + 0.5 * safezoneW - 0.5 * (size) / (getResolution select 5) #define POS_Y_BASE(size) safezoneY + 0.5 * safezoneH - 0.5 * (size) / (getResolution select 5) * 4/3 #define POS_W_BASE(size) (size) / (getResolution select 5) diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 539a755bc41..2eff66308e9 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -10,6 +10,7 @@ 병력 전환 Einheitenwechsel Przełącz Jednostki + Переключение юнитов Switched unit diff --git a/addons/vector/CfgOpticsEffect.hpp b/addons/vector/CfgOpticsEffect.hpp new file mode 100644 index 00000000000..2b9542ba9c0 --- /dev/null +++ b/addons/vector/CfgOpticsEffect.hpp @@ -0,0 +1,7 @@ +class CfgOpticsEffect { + class GVAR(OpticsRadBlur1) { + type = "radialblur"; + params[] = {0.01,0.01,0.18,0.36}; + priority = 950; + }; +}; diff --git a/addons/vector/CfgVehicles.hpp b/addons/vector/CfgVehicles.hpp index 23aa8d7412f..3854ea675aa 100644 --- a/addons/vector/CfgVehicles.hpp +++ b/addons/vector/CfgVehicles.hpp @@ -5,16 +5,36 @@ class CfgVehicles { scope = 2; scopeCurator = 2; displayName = CSTRING(VectorName); + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; vehicleClass = "Items"; + model = "\A3\Weapons_F\DummyBinoc.p3d"; + class TransportItems { MACRO_ADDITEM(ACE_Vector,1); }; }; + class ACE_Item_VectorDay: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(VectorDayName); + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_InventoryItems"; + vehicleClass = "Items"; + model = "\A3\Weapons_F\DummyBinoc.p3d"; + + class TransportItems { + MACRO_ADDITEM(ACE_VectorDay,1); + }; + }; + class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { class TransportItems { - MACRO_ADDITEM(ACE_Vector,6); + MACRO_ADDITEM(ACE_Vector,3); + MACRO_ADDITEM(ACE_VectorDay,3); }; }; }; diff --git a/addons/vector/CfgWeapons.hpp b/addons/vector/CfgWeapons.hpp index cc2cf985f66..5ffe99eea9e 100644 --- a/addons/vector/CfgWeapons.hpp +++ b/addons/vector/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class Binocular; class ACE_Vector: Binocular { @@ -6,13 +5,24 @@ class CfgWeapons { displayName = CSTRING(VectorName); descriptionShort = CSTRING(VectorDescription); model = QPATHTOF(ace_vector.p3d); - modelOptics = QPATHTOF(ace_vector_optics.p3d); picture = QPATHTOF(UI\ace_vector_x_ca.paa); visionMode[] = {"Normal","NVG"}; - opticsZoomMax = 0.06621; - opticsZoomMin = 0.06621; + opticsZoomMax = 0.25/7; + opticsZoomMin = 0.25/7; + modelOptics = "\A3\Weapons_F\empty.p3d"; + + class CBA_ScriptedOptic { + reticleTexture = QPATHTOF(data\reticles\ace_vector_reticle_ca.paa); + reticleTextureSize = 1.026; + bodyTexture = QPATHTOF(data\reticles\ace_vector_body_co.paa); + bodyTextureSize = 1.25; + reticleSafezoneSize = 1; + hidePeripheralVision = 1; + opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + }; weaponInfoType = "ACE_RscOptics_vector"; }; + class ACE_VectorDay: ACE_Vector { author = ECSTRING(common,ACETeam); displayName = CSTRING(VectorDayName); diff --git a/addons/vector/RscInGameUI.hpp b/addons/vector/RscInGameUI.hpp index 704dd4838c9..7e2f7057650 100644 --- a/addons/vector/RscInGameUI.hpp +++ b/addons/vector/RscInGameUI.hpp @@ -1,163 +1,138 @@ - class RscText; class RscPicture; - -//class ScrollBar; -class RscControlsGroup { - class VScrollbar;//: ScrollBar {}; - class HScrollbar;//: ScrollBar {}; -}; +class RscControlsGroupNoScrollbars; class RscInGameUI { - class RscUnitInfo; - class ACE_RscOptics_vector: RscUnitInfo { - onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable ['ACE_dlgVector', _this select 0];"; - onUnload = "[""onUnload"",_this,""RscUnitInfo"",'IGUI'] call (uinamespace getvariable 'BIS_fnc_initDisplay')"; - idd = 300; - controls[] = {"CA_Distance","CA_Heading","CA_OpticsPitch","CA_Elev","CA_OpticsZoom","CA_VisionMode","ACE_ScriptedDisplayControlsGroup"}; + class RscWeaponZeroing; + class CBA_ScriptedOptic: RscWeaponZeroing { + class CA_Zeroing; + }; + + class ACE_RscOptics_vector: CBA_ScriptedOptic { + controls[] = { + "CA_FOVMode","ScopeBlack","Reticle","BodyNight","BodyDay","TrippleHeadLeft","TrippleHeadRight","CA_Zeroing","Magnification","ActiveDisplayHelper", + "CA_Distance","CA_Heading","CA_OpticsPitch","CA_Elev","CA_OpticsZoom","CA_VisionMode","ACE_ScriptedDisplayControlsGroup" + }; class CA_Distance: RscText { - idc = 151; // distance + idc = 151; // distance w = 0; h = 0; }; - class CA_Heading: RscText { - idc = 156; // azimuth + idc = 156; // azimuth w = 0; h = 0; }; - class CA_OpticsPitch: RscText { - idc = 182; // inclination + idc = 182; // inclination w = 0; h = 0; }; - class CA_Elev: RscText { - idc = 175; // inclination, more accurate + idc = 175; // inclination, more accurate w = 0; h = 0; }; - class CA_OpticsZoom: RscText { - idc = 180; // some kind of zoom + idc = 180; // some kind of zoom w = 0; h = 0; }; - class CA_VisionMode: RscText { - idc = 179; // ??? + idc = 179; // ??? w = 0; h = 0; }; + class CA_Zeroing: CA_Zeroing { + onLoad = "(_this select 0) ctrlShow false"; + }; - class ACE_ScriptedDisplayControlsGroup: RscControlsGroup { + class ACE_ScriptedDisplayControlsGroup: RscControlsGroupNoScrollbars { + onLoad = "uiNamespace setVariable ['ACE_dlgVector', ctrlParent (_this select 0)];"; idc = 170; - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; - - class VScrollbar: VScrollbar { - width = 0; - }; - - class HScrollbar: HScrollbar { - height = 0; - }; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; class controls { class Center: RscPicture { - idc = 1301; - text = ""; + idc = IDC_CENTER; colorText[] = {1,0,0,0.5}; - x = 0.488 * safezoneW /*+ safezoneX*/; - y = 0.4783 * safezoneH /*+ safezoneY*/; - w = 0.4 / 16 * safezoneW; - h = 0.4 / 9 * safezoneH; + x = "0.5 - (0.8 / 16 * safezoneW)/2 - safezoneX"; + y = "0.5 - (0.8 / 9 * safezoneH)/2 - safezoneY"; + w = "0.8 / 16 * safezoneW"; + h = "0.8 / 9 * safezoneH"; }; - class Crosshair: Center { - idc = 1302; - x = 0.4848 * safezoneW /*+ safezoneX*/; - y = 0.4732 * safezoneH /*+ safezoneY*/; - w = 0.5 / 16 * safezoneW; - h = 0.5 / 9 * safezoneH; + idc = IDC_CROSSHAIR; + x = "0.5 - (0.7 / 16 * safezoneW)/2 - safezoneX"; + y = "0.5 - (0.7 / 9 * safezoneH)/2 - safezoneY"; + w = "0.7 / 16 * safezoneW"; + h = "0.7 / 9 * safezoneH"; }; class Digit0: Center { - idc = 1310; - x = (0.54 + 0 * 0.02) * safezoneW /*+ safezoneX*/; - y = 0.54 * safezoneH /*+ safezoneY*/; - w = 0.5 / 16 * safezoneW; - h = 0.5 / 9 * safezoneH; + idc = IDC_DIGIT_0; + x = "(0.54 + 0 * 0.02) * safezoneW"; + y = "0.54 * safezoneH"; + w = "0.5 / 16 * safezoneW"; + h = "0.5 / 9 * safezoneH"; }; - class Digit1: Digit0 { - idc = 1311; - x = (0.54 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_1; + x = "(0.54 + 1 * 0.02) * safezoneW"; }; - class Digit2: Digit0 { - idc = 1312; - x = (0.54 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_2; + x = "(0.54 + 2 * 0.02) * safezoneW"; }; - class Digit3: Digit0 { - idc = 1313; - x = (0.54 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_3; + x = "(0.54 + 3 * 0.02) * safezoneW"; }; - class Digit4: Digit0 { - idc = 1314; - x = (0.54 + 4 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_4; + x = "(0.54 + 4 * 0.02) * safezoneW"; }; - class Digit5: Digit0 { - idc = 1315; - x = (0.35 + 0 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_5; + x = "(0.35 + 0 * 0.02) * safezoneW"; }; - class Digit6: Digit0 { - idc = 1316; - x = (0.35 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_6; + x = "(0.35 + 1 * 0.02) * safezoneW"; }; - class Digit7: Digit0 { - idc = 1317; - x = (0.35 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_7; + x = "(0.35 + 2 * 0.02) * safezoneW"; }; - class Digit8: Digit0 { - idc = 1318; - x = (0.35 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_8; + x = "(0.35 + 3 * 0.02) * safezoneW"; }; - class Digit9: Digit0 { - idc = 1319; - x = (0.35 + 4 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_9; + x = "(0.35 + 4 * 0.02) * safezoneW"; }; class DigitE1: Digit0 { - idc = 1321; - x = (0.39 + 0 * 0.02) * safezoneW /*+ safezoneX*/; - y = 0.42 * safezoneH /*+ safezoneY*/; + idc = IDC_DIGIT_E1; + x = "(0.39 + 0 * 0.02) * safezoneW"; + y = "0.42 * safezoneH"; }; - class DigitE2: DigitE1 { - idc = 1322; - x = (0.39 + 1 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E2; + x = "(0.39 + 1 * 0.02) * safezoneW"; }; - class DigitE3: DigitE1 { - idc = 1323; - x = (0.39 + 2 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E3; + x = "(0.39 + 2 * 0.02) * safezoneW"; }; - class DigitE4: DigitE1 { - idc = 1324; - x = (0.39 + 3 * 0.02) * safezoneW /*+ safezoneX*/; + idc = IDC_DIGIT_E4; + x = "(0.39 + 3 * 0.02) * safezoneW"; }; }; }; diff --git a/addons/vector/XEH_PREP.hpp b/addons/vector/XEH_PREP.hpp index f03d99ed838..1f259e3ff9c 100644 --- a/addons/vector/XEH_PREP.hpp +++ b/addons/vector/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(clearDisplay); PREP(convertToTexturesDegree); PREP(convertToTexturesDistance); diff --git a/addons/vector/ace_vector_optics.p3d b/addons/vector/ace_vector_optics.p3d deleted file mode 100644 index 15cfb1c9101..00000000000 Binary files a/addons/vector/ace_vector_optics.p3d and /dev/null differ diff --git a/addons/vector/config.cpp b/addons/vector/config.cpp index cf6f235a5ee..10371047e62 100644 --- a/addons/vector/config.cpp +++ b/addons/vector/config.cpp @@ -3,8 +3,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {"ACE_Item_Vector"}; - weapons[] = {"ACE_Vector", "ACE_VectorDay"}; + units[] = {"ACE_Item_Vector","ACE_Item_VectorDay"}; + weapons[] = {"ACE_Vector","ACE_VectorDay"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); @@ -15,8 +15,11 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" - #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" - +#include "CfgOpticsEffect.hpp" #include "RscInGameUI.hpp" + +class CBA_PIPItems { + GVAR(enable) = "-"; +}; diff --git a/addons/vector/data/reticles/ace_vector_body_co.paa b/addons/vector/data/reticles/ace_vector_body_co.paa new file mode 100644 index 00000000000..71e1984c6e5 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_body_co.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle.paa b/addons/vector/data/reticles/ace_vector_reticle.paa deleted file mode 100644 index 425dbb85b2e..00000000000 Binary files a/addons/vector/data/reticles/ace_vector_reticle.paa and /dev/null differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa new file mode 100644 index 00000000000..255d8fa3389 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_1_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa new file mode 100644 index 00000000000..98ab3d04baa Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_2_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa new file mode 100644 index 00000000000..85d4e6940d2 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_3_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa new file mode 100644 index 00000000000..85a38b41456 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_4_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa new file mode 100644 index 00000000000..ff4f89edd48 Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_5_ca.paa differ diff --git a/addons/vector/data/reticles/ace_vector_reticle_ca.paa b/addons/vector/data/reticles/ace_vector_reticle_ca.paa new file mode 100644 index 00000000000..4db7c71ff6f Binary files /dev/null and b/addons/vector/data/reticles/ace_vector_reticle_ca.paa differ diff --git a/addons/vector/functions/fnc_adjustBrightness.sqf b/addons/vector/functions/fnc_adjustBrightness.sqf index 2cf2d5a9232..cfe7f119a8b 100644 --- a/addons/vector/functions/fnc_adjustBrightness.sqf +++ b/addons/vector/functions/fnc_adjustBrightness.sqf @@ -20,22 +20,22 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); private _color = [[1,0,0,0.5], [1,0,0,1]] select (_this select 0); -(_dlgVector displayCtrl 1301) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1302) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1310) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1311) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1312) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1313) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1314) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1315) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1316) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1317) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1318) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1319) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1321) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1322) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1323) ctrlSetTextColor _color; -(_dlgVector displayCtrl 1324) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_CENTER) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_CROSSHAIR) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetTextColor _color; +(_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetTextColor _color; GVAR(illuminate) = _this select 0; diff --git a/addons/vector/functions/fnc_clearDisplay.sqf b/addons/vector/functions/fnc_clearDisplay.sqf index 8d4578a2da4..1f723dd2f8b 100644 --- a/addons/vector/functions/fnc_clearDisplay.sqf +++ b/addons/vector/functions/fnc_clearDisplay.sqf @@ -20,18 +20,18 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); switch (_this select 0) do { case ("azimuth"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; case ("distance"): { - (_dlgVector displayCtrl 1310) ctrlSetText ""; - (_dlgVector displayCtrl 1311) ctrlSetText ""; - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; }; diff --git a/addons/vector/functions/fnc_getRelativeHeightLength.sqf b/addons/vector/functions/fnc_getRelativeHeightLength.sqf index 2bd6e4795cb..1049ba84b67 100644 --- a/addons/vector/functions/fnc_getRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_getRelativeHeightLength.sqf @@ -15,24 +15,20 @@ * Public: No */ -private _distanceP1 = GVAR(pData) select 0; -private _directionP1 = GVAR(pData) select 1; -private _azimuthP1 = _directionP1 select 0; -private _inclinationP1 = _directionP1 select 1; +GVAR(pData) params ["_distanceP1", "_directionP1"]; +_directionP1 params ["_azimuthP1", "_inclinationP1"]; private _distanceP2 = call FUNC(getDistance); private _directionP2 = call FUNC(getDirection); -private _azimuthP2 = _directionP2 select 0; -private _inclinationP2 = _directionP2 select 1; - -private _azimuth = abs (_azimuthP1 - _azimuthP2); -private _inclination = abs (_inclinationP1 - _inclinationP2); -private _height = sqrt (_distanceP1 ^ 2 + _distanceP2 ^ 2 - 2 * _distanceP1 * _distanceP2 * cos _inclination); -private _length = sqrt (_distanceP1 ^ 2 + _distanceP2 ^ 2 - 2 * _distanceP1 * _distanceP2 * cos _azimuth); - -if (_inclination < 0) then {_height = -1 * _height}; +_directionP2 params ["_azimuthP2", "_inclinationP2"]; if (_distanceP1 < -999 || {_distanceP2 < -999}) exitWith { [-1000, -1000] // return }; +private _position1 = [_distanceP1, _azimuthP1, _inclinationP1] call CBA_fnc_polar2vect; +private _position2 = [_distanceP2, _azimuthP2, _inclinationP2] call CBA_fnc_polar2vect; + +private _length = _position1 distance2D _position2; +private _height = abs ((_position1 vectorDiff _position2) select 2); + [_height, _length] diff --git a/addons/vector/functions/fnc_illuminate.sqf b/addons/vector/functions/fnc_illuminate.sqf index 999fc5c29a5..0c91da0ac03 100644 --- a/addons/vector/functions/fnc_illuminate.sqf +++ b/addons/vector/functions/fnc_illuminate.sqf @@ -20,31 +20,28 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); if (_this select 0) then { { - if (ctrlIDC _x != 170) then { - private _string = ctrlText _x; - private _index = _string find ".paa"; + private _control = _dlgVector displayCtrl _x; + private _string = ctrlText _control; + private _index = _string find ".paa"; - if (_index != -1 && {_string find "_illum.paa" == -1}) then { - _string = toArray _string; - _string resize _index; + if (_index != -1 && {_string find "_illum.paa" == -1}) then { + _string = toArray _string; + _string resize _index; - _x ctrlSetText format ["%1_illum.paa", toString _string]; - }; + _control ctrlSetText format ["%1_illum.paa", toString _string]; }; - } forEach allControls _dlgVector; + } forEach ILLUM_CONTROLS; } else { { - if (ctrlIDC _x != 170) then { - private _string = ctrlText _x; - private _index = _string find "_illum.paa"; + private _control = _dlgVector displayCtrl _x; + private _string = ctrlText _control; + private _index = _string find "_illum.paa"; - if (_index != -1) then { - _string = toArray _string; - _string resize _index; - - _x ctrlSetText format ["%1.paa", toString _string]; - }; + if (_index != -1) then { + _string = toArray _string; + _string resize _index; + _control ctrlSetText format ["%1.paa", toString _string]; }; - } forEach allControls _dlgVector; + } forEach ILLUM_CONTROLS; }; diff --git a/addons/vector/functions/fnc_showAzimuth.sqf b/addons/vector/functions/fnc_showAzimuth.sqf index 4a0854f3d50..e07f093b5d3 100644 --- a/addons/vector/functions/fnc_showAzimuth.sqf +++ b/addons/vector/functions/fnc_showAzimuth.sqf @@ -22,9 +22,9 @@ private _direction = call FUNC(getDirection); private _digits = _direction call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showAzimuthInclination.sqf b/addons/vector/functions/fnc_showAzimuthInclination.sqf index 15e206fbbd6..e7769a3e7b7 100644 --- a/addons/vector/functions/fnc_showAzimuthInclination.sqf +++ b/addons/vector/functions/fnc_showAzimuthInclination.sqf @@ -23,17 +23,17 @@ private _direction = call FUNC(getDirection); // azimuth private _digits = [_direction select 0] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); // inclination _digits = [_direction select 1] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showCenter.sqf b/addons/vector/functions/fnc_showCenter.sqf index fef128240f6..d9e3542fac8 100644 --- a/addons/vector/functions/fnc_showCenter.sqf +++ b/addons/vector/functions/fnc_showCenter.sqf @@ -15,6 +15,6 @@ * Public: No */ -((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1301) ctrlSetText (["", QPATHTOF(rsc\vector_center.paa)] select (_this select 0)); +((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl IDC_CENTER) ctrlSetText (["", QPATHTOF(rsc\vector_center.paa)] select (_this select 0)); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showDistance.sqf b/addons/vector/functions/fnc_showDistance.sqf index 447622355ce..3009d5ea5d3 100644 --- a/addons/vector/functions/fnc_showDistance.sqf +++ b/addons/vector/functions/fnc_showDistance.sqf @@ -22,9 +22,9 @@ private _distance = call FUNC(getDistance); private _digits = [_distance] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showFallOfShot.sqf b/addons/vector/functions/fnc_showFallOfShot.sqf index 3df9fa83578..ac03fc6bbfa 100644 --- a/addons/vector/functions/fnc_showFallOfShot.sqf +++ b/addons/vector/functions/fnc_showFallOfShot.sqf @@ -26,37 +26,37 @@ if !(_this select 0) then { // of ordinate private _digits = [_fosData, 1] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1310) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1311) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 4); // of abscissa _digits = [_fosData, 0] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1319) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText (_digits select 4); } else { // applicate private _digits = [_fosData, 2] call FUNC(convertToTexturesFOS); - (_dlgVector displayCtrl 1310) ctrlSetText (_digits select 0); - (_dlgVector displayCtrl 1311) ctrlSetText (_digits select 1); - (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 2); - (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 3); - (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 4); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText (_digits select 0); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 1); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 2); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 3); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 4); // nothing - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; diff --git a/addons/vector/functions/fnc_showHeightDistance.sqf b/addons/vector/functions/fnc_showHeightDistance.sqf index 7c8c0cc02e5..ce4e3011a95 100644 --- a/addons/vector/functions/fnc_showHeightDistance.sqf +++ b/addons/vector/functions/fnc_showHeightDistance.sqf @@ -23,17 +23,17 @@ private _heightDistance = call FUNC(getHeightDistance); // height private _digits = [_heightDistance select 0] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); // non-slope distance _digits = [_heightDistance select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showP1.sqf b/addons/vector/functions/fnc_showP1.sqf index 2d587e03d11..4cb25adfaa0 100644 --- a/addons/vector/functions/fnc_showP1.sqf +++ b/addons/vector/functions/fnc_showP1.sqf @@ -19,15 +19,15 @@ disableSerialization; private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); if (_this select 0) then { - (_dlgVector displayCtrl 1321) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1322) ctrlSetText QPATHTOF(rsc\vector_minus.paa); - (_dlgVector displayCtrl 1323) ctrlSetText QPATHTOF(rsc\vector_p.paa); - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText QPATHTOF(rsc\vector_minus.paa); + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText QPATHTOF(rsc\vector_p.paa); + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; } else { - (_dlgVector displayCtrl 1321) ctrlSetText ""; - (_dlgVector displayCtrl 1322) ctrlSetText ""; - (_dlgVector displayCtrl 1323) ctrlSetText ""; - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; }; [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf index 82f1f7eaf66..74365cc6c7a 100644 --- a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf @@ -23,17 +23,17 @@ private _azimuthDistance = call FUNC(getRelativeAzimuthDistance); // relative azimuth private _digits = [_azimuthDistance select 0] call FUNC(convertToTexturesDegree); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); // relative non-slope distance _digits = [_azimuthDistance select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeDistance.sqf b/addons/vector/functions/fnc_showRelativeDistance.sqf index 0bd4d23ec0d..b8ddd9f04f3 100644 --- a/addons/vector/functions/fnc_showRelativeDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeDistance.sqf @@ -23,7 +23,7 @@ private _distance = call FUNC(getRelativeDistance); // relative slope distance private _digits = [_distance] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); diff --git a/addons/vector/functions/fnc_showRelativeHeightLength.sqf b/addons/vector/functions/fnc_showRelativeHeightLength.sqf index fe9823e1708..1fb9ddcb2fb 100644 --- a/addons/vector/functions/fnc_showRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_showRelativeHeightLength.sqf @@ -23,17 +23,17 @@ private _heightLength = call FUNC(getRelativeHeightLength); // height private _digits = [_heightLength select 0] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText (_digits select 3); // length _digits = [_heightLength select 1] call FUNC(convertToTexturesDistance); -(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0); -(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); -(_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); -(_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); +(_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText (_digits select 0); +(_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText (_digits select 1); +(_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText (_digits select 2); +(_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText (_digits select 3); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showReticle.sqf b/addons/vector/functions/fnc_showReticle.sqf index 5fd1729c4f3..fabf3cad153 100644 --- a/addons/vector/functions/fnc_showReticle.sqf +++ b/addons/vector/functions/fnc_showReticle.sqf @@ -15,6 +15,6 @@ * Public: No */ -((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1302) ctrlSetText (["", QPATHTOF(rsc\vector_crosshair.paa)] select (_this select 0)); +((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl IDC_CROSSHAIR) ctrlSetText (["", QPATHTOF(rsc\vector_crosshair.paa)] select (_this select 0)); [GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showText.sqf b/addons/vector/functions/fnc_showText.sqf index a8556e7a583..23f44810827 100644 --- a/addons/vector/functions/fnc_showText.sqf +++ b/addons/vector/functions/fnc_showText.sqf @@ -20,149 +20,149 @@ private _dlgVector = GETUVAR(ACE_dlgVector,displayNull); switch (_this select 0) do { case ("config"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_c.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_g.paa); - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_c.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_g.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("settings"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("nigt"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_g.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_g.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); }; case ("eret"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_r.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_r.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_t.paa); }; case ("on"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("off"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("deg"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_3.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_6.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_0.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_degree.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_3.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_6.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_degree.paa); }; case ("mil"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText QPATHTOF(rsc\vector_6.paa); - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_4.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_0.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText QPATHTOF(rsc\vector_6.paa); + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_4.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_0.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_0.paa); }; case ("meter"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_minus.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_minus.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("feet"): { - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_e.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_e.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("stor"): { - (_dlgVector displayCtrl 1321) ctrlSetText QPATHTOF(rsc\vector_5.paa); - (_dlgVector displayCtrl 1322) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1323) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1324) ctrlSetText QPATHTOF(rsc\vector_r.paa); + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText QPATHTOF(rsc\vector_5.paa); + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText QPATHTOF(rsc\vector_r.paa); }; case ("old_config"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_d.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_c.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_f.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_d.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_c.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_f.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("old_settings"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText QPATHTOF(rsc\vector_o.paa); - (_dlgVector displayCtrl 1318) ctrlSetText QPATHTOF(rsc\vector_1.paa); - (_dlgVector displayCtrl 1319) ctrlSetText QPATHTOF(rsc\vector_d.paa); - (_dlgVector displayCtrl 1310) ctrlSetText QPATHTOF(rsc\vector_u.paa); - (_dlgVector displayCtrl 1311) ctrlSetText QPATHTOF(rsc\vector_n.paa); - (_dlgVector displayCtrl 1312) ctrlSetText QPATHTOF(rsc\vector_i.paa); - (_dlgVector displayCtrl 1313) ctrlSetText QPATHTOF(rsc\vector_t.paa); - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText QPATHTOF(rsc\vector_o.paa); + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText QPATHTOF(rsc\vector_1.paa); + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText QPATHTOF(rsc\vector_d.paa); + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText QPATHTOF(rsc\vector_u.paa); + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText QPATHTOF(rsc\vector_n.paa); + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText QPATHTOF(rsc\vector_i.paa); + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText QPATHTOF(rsc\vector_t.paa); + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("clear_left"): { - (_dlgVector displayCtrl 1315) ctrlSetText ""; - (_dlgVector displayCtrl 1316) ctrlSetText ""; - (_dlgVector displayCtrl 1317) ctrlSetText ""; - (_dlgVector displayCtrl 1318) ctrlSetText ""; - (_dlgVector displayCtrl 1319) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_5) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_6) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_7) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_8) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_9) ctrlSetText ""; }; case ("clear_right"): { - (_dlgVector displayCtrl 1310) ctrlSetText ""; - (_dlgVector displayCtrl 1311) ctrlSetText ""; - (_dlgVector displayCtrl 1312) ctrlSetText ""; - (_dlgVector displayCtrl 1313) ctrlSetText ""; - (_dlgVector displayCtrl 1314) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_0) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_4) ctrlSetText ""; }; case ("clear_stor"): { - (_dlgVector displayCtrl 1321) ctrlSetText ""; - (_dlgVector displayCtrl 1322) ctrlSetText ""; - (_dlgVector displayCtrl 1323) ctrlSetText ""; - (_dlgVector displayCtrl 1324) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E1) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E2) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E3) ctrlSetText ""; + (_dlgVector displayCtrl IDC_DIGIT_E4) ctrlSetText ""; }; }; diff --git a/addons/vector/initKeybinds.sqf b/addons/vector/initKeybinds.sqf index 5b099235da8..7d815619936 100644 --- a/addons/vector/initKeybinds.sqf +++ b/addons/vector/initKeybinds.sqf @@ -1,11 +1,8 @@ -// by commy2 - -["ACE3 Equipment", QGVAR(AzimuthKey), localize LSTRING(AzimuthKey), -{ +["ACE3 Equipment", QGVAR(AzimuthKey), localize LSTRING(AzimuthKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(((currentWeapon ACE_player) isKindOf ["ACE_Vector", configFile >> "CfgWeapons"]) && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player isKindOf ["ACE_Vector", configFile >> "CfgWeapons"] && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey1,false)) exitWith {false}; @@ -14,8 +11,7 @@ // Statement ["azimuth"] call FUNC(onKeyDown); false -}, -{ +}, { // prevent holding down GVAR(isDownStateKey1) = false; @@ -25,16 +21,13 @@ // Statement ["azimuth"] call FUNC(onKeyUp); false -}, -[15, [false, false, false]], false, 0] call CBA_fnc_addKeybind; //Tab Key - +}, [DIK_TAB, [false, false, false]], false, 0] call CBA_fnc_addKeybind; -["ACE3 Equipment", QGVAR(DistanceKey), localize LSTRING(DistanceKey), -{ +["ACE3 Equipment", QGVAR(DistanceKey), localize LSTRING(DistanceKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(((currentWeapon ACE_player) isKindOf ["ACE_Vector", configFile >> "CfgWeapons"]) && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player isKindOf ["ACE_Vector", configFile >> "CfgWeapons"] && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey2,false)) exitWith {false}; @@ -43,8 +36,7 @@ // Statement ["distance"] call FUNC(onKeyDown); false -}, -{ +}, { // prevent holding down GVAR(isDownStateKey2) = false; @@ -54,5 +46,4 @@ // Statement ["distance"] call FUNC(onKeyUp); false -}, -[19, [false, false, false]], false] call CBA_fnc_addKeybind; //R Key +}, [DIK_R, [false, false, false]], false, 0] call CBA_fnc_addKeybind; diff --git a/addons/vector/script_component.hpp b/addons/vector/script_component.hpp index 15787b140fa..0c3646f1ff4 100644 --- a/addons/vector/script_component.hpp +++ b/addons/vector/script_component.hpp @@ -15,3 +15,31 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +#define IDC_CENTER 1301 +#define IDC_CROSSHAIR 1302 + +#define IDC_DIGIT_0 1310 +#define IDC_DIGIT_1 1311 +#define IDC_DIGIT_2 1312 +#define IDC_DIGIT_3 1313 +#define IDC_DIGIT_4 1314 +#define IDC_DIGIT_5 1315 +#define IDC_DIGIT_6 1316 +#define IDC_DIGIT_7 1317 +#define IDC_DIGIT_8 1318 +#define IDC_DIGIT_9 1319 + +#define IDC_DIGIT_E1 1321 +#define IDC_DIGIT_E2 1322 +#define IDC_DIGIT_E3 1323 +#define IDC_DIGIT_E4 1324 + +#define ILLUM_CONTROLS [\ + IDC_CENTER, IDC_CROSSHAIR,\ + IDC_DIGIT_0, IDC_DIGIT_1, IDC_DIGIT_2, IDC_DIGIT_3, IDC_DIGIT_4,\ + IDC_DIGIT_5, IDC_DIGIT_6, IDC_DIGIT_7, IDC_DIGIT_8, IDC_DIGIT_9,\ + IDC_DIGIT_E1, IDC_DIGIT_E2, IDC_DIGIT_E3, IDC_DIGIT_E4\ +] diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 738e4904543..1f345868511 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -10,6 +10,7 @@ ACE 차량 잠금 ACE Fahrzeugsperre ACE Zamknięcie Pojazdu + ACE Блокировка транспорта Unlock Vehicle diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index b9ab8e76135..d286cd38f08 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -35,9 +35,11 @@ Speed Limit + Geschwindigkeitsbegrenzung Limite di velocità 速度制限 Ograniczenie prędkości + Ограничение скорости Speed Limiter @@ -46,7 +48,7 @@ Ogranicznik prędkości Omezovač rychlosti Limiteur de vitesse - Ограничение скорости + Ограничитель скорости Sebességkorlátozó Limitador de Velocidade Limitatore di Velocità @@ -57,35 +59,43 @@ Increase Speed Limit + Maximale Geschwindigkeit erhöhen Aumenta limite di velocità 速度制限を増やす Zwiększ ograniczenie prędkości + Увеличить ограничение скорости Decrease Speed Limit + Maximale Geschwindigkeit verringern Diminuisce limite di velocità 速度制限を減らす Zmniejsz ograniczenie prędkości + Уменьшить ограничение скорости Disable automatic engine shut-off Motor nach Verlassen laufen lassen エンジン自動停止を無効化 + Убрать автовыключение двигателя Prevent the automatic shut-off of the engine when exiting vehicles. Verhindere das automatische Abschalten des Motors beim Verlassen des Fahrzeugs. 車両から降りた時のエンジンの自動停止を防ぎます。 + Запрещает автоматическое выключение двигателя при выходе из транспорта Hide Eject Action Abspringen-Aktion verstecken Ukryj akcję Wyskocz + Убрать действие 'Выпрыгнуть' Hides the Eject entry from the action menu. Requires a game restart. Versteckt den Abspringen-Eintrag aus dem Aktionsmenü. Benötigt Neustart des Spiels. Usuwa akcję Wyskocz z menu akcji. Wymaga restartu gry. + Убирает действие 'Выпрыгнуть' из меню. (Требует перезагрузки) diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 5148114b0f0..d1f3ce670f7 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -371,12 +371,14 @@ Toggle Collision Lights + Kollisionslichter an/ausschalten Attiva Luci di Collisione 충돌 표시등 토글 切換碰撞燈 切换碰撞灯 衝突防止灯を切り替え Przełącz światła kolizyjne + Вкл/Выкл Бортовые огни diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index c5cf4d4a379..2c0859ef50c 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -90,6 +90,7 @@ 気温や湿度、大気圧によって既存の天候を拡張します。 온도, 습도 및 기압에 따라 기존 날씨를 확장합니다. Poszerza istniejącą pogodę o temperaturę, wilgotność i ciśnienie powietrza. + Расширяет текущие возможности погоды с учетом температуры, влажности и давления Update Interval @@ -132,6 +133,7 @@ 風シミュレーション (マップを基に) 바람 시뮬레이션 (지도 기반) Symulacja Wiatru (bazowana na mapie) + Симуляция ветра (на основе местности) Enables the map based wind simulation (overwrites vanilla wind) @@ -142,6 +144,7 @@ マップを基にした風シミュレーションを有効化 (標準の風を上書き) 지도 기반의 바람 시뮬레이션을 활성화합니다 (바닐라 바람을 덮음) Aktywuje symulację wiatru bazującą na mapie (nadpisuje wind z domyślnej wersji gry) + Включает симуляцию ветра на основе текущей местности (переписывает ванильный ветер) diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 0df5016f7dc..390f10ffb26 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -6,9 +6,11 @@ Zeus 宙斯 宙斯 + Zeus Zeus 제우스 Zeus + Зевс Zeus Settings @@ -273,20 +275,25 @@ Aggiorna Oggetti Modificabili 更新可编辑的物件 更新可編輯的物件 + Обновить редактируемые объекты Editing Mode 編輯模式 Modalità per editare + Bearbeitungsmodus 編集モード Tryb Edytowania + Режим редактирования Add or remove editable objects from Zeus 新增或移除可編輯物件給宙斯 + Aktiviere oder deaktiviere zu bearbeitende Objekte von Zeus Agguingi o rimuovi oggetti che Zeus può modificare Zeus から編集可能オブジェクトの追加と削除をする Dodaj lub usuń edytowalne obiekty z Zeus'a + Добавить или удалить редактируемые объекты от Зевса Add Objects @@ -294,6 +301,7 @@ Aggiungi Oggetti オブジェクト追加 Dodaj obiekty + Добавить объекты Remove Objects @@ -305,6 +313,7 @@ Rimuovi Oggetti 移除物件 移除物件 + Удалить объекты All Curators @@ -316,6 +325,7 @@ Tutti i Moderatori 所有编辑者 所有編輯者 + Все кураторы Apply changes to all curators @@ -327,18 +337,23 @@ Applica i cambiamenti a tutti i moderatori 确认变更给所有编辑者 確認變更給所有編輯者 + Применить изменения ко всем кураторам Additional Objects + Zusätzliche Objekte Oggetti aggiuntivi オブジェクト増加 Dodatkowe obiekty + Доп. объекты Additional objects to include in the action regardless of Task Radius + Zusätzliche Objekte unabhängig vom Aufgabenradius einbeziehen Oggetti aggiuntivi da includere nell'azione indipendentemente dal Raggio di Attività タスク範囲に関係無くオブジェクトを更に増加させます Dodatkowe obiekty do uwzględnienia w akcji niezależnie od zasięgu zadania + Дополнительные объекты для включения в действие, независимо от радиуса выполнения задачи Global AI Skill @@ -561,6 +576,7 @@ Aggiungi/Rimuovi FRIES 增加/移除快速垂降进场撤离系统 增加/移除快速垂降進場撤離系統 + Добавить/Удалить FRIES %1 is not fastrope compatible. @@ -572,6 +588,7 @@ %1 non è compatibile con il fastrope. %1无法使用快速绳降系统 %1無法使用快速繩降系統 + %1 несовместим с быстрым спуском Unable to remove FRIES, ropes are deployed. @@ -583,6 +600,7 @@ Impossibile rimuovere le FRIES, le corde sono ancora dispiegate 无法移除快速绳降系统,因为绳索已被释放出来 無法移除快速繩降系統,因為繩索已被釋放出來 + Невозможно удалить FRIES, канаты развернуты. Teleport Players @@ -746,6 +764,7 @@ Attivatore Simulazione 切换模拟 切換模擬 + Вкл/Выкл симуляцию Add Spare Wheel @@ -945,21 +964,27 @@ None + Keiner Niente Żadne なし + Нет Players + Spieler Giocatori Gracze プレイヤー + Игроки Players and AI + Spieler und KI's Giocati e AI Gracze i SI プレイヤーと AI + Игроки и ИИ Add Objects to Curator @@ -1006,10 +1031,12 @@ Select cargo to unload + Ladung zum ausladen auswählen 選擇要卸載的貨物 Scegli il carico da scaricare 選択したカーゴを降ろす Wybierz ładunek do wyładowania + Выберите груз для выгрузки Task Radius @@ -1058,6 +1085,7 @@ 火力壓制 Ogień zaporowy 엄호사격 + Огонь на подавление Add Full Arsenal @@ -1069,6 +1097,7 @@ 增加完整的虛擬軍火庫到物件上 Dodaj Wirtualny Arsenał 아스날 놓기 + Добавить весь Арсенал Remove Arsenal @@ -1080,6 +1109,7 @@ 移除物件上的虛擬軍火庫 Usuń Wirtualny Arsenał 아스날 제거 + Убрать Арсенал Load into Cargo @@ -1090,6 +1120,7 @@ 装载到货物中 화물 싣기 Załaduj do ładunku + Загрузить в отсек Toggle NVGs @@ -1101,6 +1132,7 @@ 切换夜视镜 야시경 토글 Przełącz NVG + Вкл/Выкл ПНВ NVG Equipment @@ -1112,6 +1144,7 @@ 夜视镜装备 야시경 장비 Ekwipunek NVG + Приборы ночного видения Add or remove NVGs from units @@ -1123,22 +1156,27 @@ 增加或移除单位的夜视镜 야시경 추가/제거 Dodaj lub usuń noktowizję z jednostek + Добавить/Убрать ПНВ у юнитов Toggle Target + Ziel umschalten 目標を切り替え 切换目标 切換目標 Scambia obiettivo Przełącz cel + Кому переключить Units affected by the toggle + Betroffene Spieler beim umschalten ユニットは切り替えに影響を受けます 被选单位受切换影响 受切換所影響的單位 Unità influenzate dallo scambio Jednostki pod wpływem przełączenia + Юниты, к которым применяется переключение Selected Group @@ -1150,6 +1188,7 @@ 选择小队 그룹 선택 Wybrana grupa + Выбранная группа Toggle Flashlights @@ -1161,6 +1200,7 @@ 切换手电筒 손전등 토글 Przełącz latarki + Вкл/Выкл Фонари Flashlights @@ -1172,6 +1212,7 @@ 手电筒 손전등 Latarki + Фонари Add Gear @@ -1183,9 +1224,11 @@ 增加装备 장비 추가 Dodaj wyposażenie + Добавить снаряжение Garrison Group + Gebäude besetzen Garnir zone 歩哨グループ Proteggi gruppo @@ -1193,9 +1236,11 @@ 布置驻军 그룹 주둔 Rozmieść grupę w garnizonie + Разместить группу в здании Fill from top to bottom + Von oben nach unten befüllen Remplir de haut en bas 上から下まで占拠 Riempi dall'alto al basso @@ -1203,9 +1248,11 @@ 由上而下进行填满 위에서부터 채우기 Wypełnij od góry do dołu + Занять здание сверху до низу Fill buildings from the highest position first + Gebäude von der höchsten Position zuerst befüllen Remplir les bâtiments par la position la plus haute d'abord 建物を最も高い位置から占拠していきます Riempi gli edifici dalla posizione più alta prima @@ -1213,9 +1260,11 @@ 从建筑物的最高点开始布置卫哨 건물의 높은 위치부터 먼저 채움 Wypełnij budynki zaczynając od najwyższej pozycji + Занять здание начиная с верхних позиций Building filling mode + Gebäude befüllen Mode de remplissage de bâtiment 建物占拠モード Modalità riempimento edifici @@ -1223,9 +1272,11 @@ 驻军填充建筑物模式 건물 채우기 모드 Tryb wypełniania budynków + Режим заполнения здания Even filling + Gleichmäßig befüllen Remplissage égal 均一に占拠 Riempimento uguale @@ -1233,9 +1284,11 @@ 平均分配 평균 채우기 Równe wypełnienie + Равномерно Building by building + Gebäude nach Gebäude Bâtiment par bâtiment 建物から建物へ Edificio per edificio @@ -1243,9 +1296,11 @@ 一栋填满后再换下一栋 건물에서 건물로 Budynek za budynkiem + Здание за зданием Random filling + Zufällig füllen Remplir au hasard ランダムに占拠 Riempimento casuale @@ -1253,9 +1308,11 @@ 随机分配 무작위 채우기 Losowe wypełnienie + Случайно Teleport + Teleportieren Téléporter テレポート Teletrasporto @@ -1263,9 +1320,11 @@ 传送 순간이동 Teleport + Телепорт Un-garrison Group + Garnisionsgruppe auflösen Dégarnir zone 非歩哨グループ Non proteggere gruppo @@ -1273,6 +1332,7 @@ 解除驻军驻守状态 주둔해제 Cofnij rozmieszczenie grupu w garnizonie + Вывести группу из здания No players found @@ -1484,22 +1544,27 @@ Add full ACE Arsenal + Vollständiges ACE Arsenal hinzufügen< ACE 武器庫を追加 添加ACE模式军火库 增加完整的ACE軍火庫 Aggiungi l'arsenale ACE completo Dodaj pełny arsenał ACE + Добавить полный ACE Арсенал Remove ACE Arsenal + ACE Arsenal entfernen< ACE 武器庫を削除 删除ACE模式军火库 移除ACE軍火庫 Rimuovi l'arsenale ACE Usuń arsenał ACE + Убрать ACE Арсенал Create Zeus + Zeus erstellen< Создать Зевса Zeus を作る Stwórz Zeus'a @@ -1507,6 +1572,7 @@ Delete Zeus + Zeus löschen< Удалить Зевса Zeus を消す Usuń Zeus'a @@ -1514,6 +1580,7 @@ "%1" menu + "%1" Menü< Меню "%1" "%1" メニュー "%1" menu @@ -1521,13 +1588,17 @@ Paradrop Cargo + Paradrop Ladung< カーゴを空中投下 Zrzut ładunku (cargo) + Десантировать груз No cargo loaded + Keine Ladung geladen カーゴは未積載 Niczego nie załadowano do cargo + Грузовой отсек пуст diff --git a/docs/src/package-lock.json b/docs/src/package-lock.json index e68f8ff2169..dd0491e67c2 100644 --- a/docs/src/package-lock.json +++ b/docs/src/package-lock.json @@ -1394,9 +1394,9 @@ "dev": true }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "eventemitter2": { @@ -2093,9 +2093,9 @@ "optional": true }, "grunt": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz", - "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", + "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", "dev": true, "requires": { "coffeescript": "~1.10.0", @@ -2109,7 +2109,7 @@ "grunt-legacy-log": "~2.0.0", "grunt-legacy-util": "~1.1.1", "iconv-lite": "~0.4.13", - "js-yaml": "~3.5.2", + "js-yaml": "~3.13.0", "minimatch": "~3.0.2", "mkdirp": "~0.5.1", "nopt": "~3.0.6", @@ -2128,15 +2128,6 @@ "nopt": "~3.0.6", "resolve": "~1.1.0" } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } } } }, @@ -2302,9 +2293,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2887,13 +2878,13 @@ } }, "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "json-buffer": { @@ -3806,6 +3797,31 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -4270,17 +4286,10 @@ "util.promisify": "~1.0.0" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "optional": true - }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "optional": true, "requires": { diff --git a/docs/src/package.json b/docs/src/package.json index 8e98082823e..cd6f1d4d0ba 100644 --- a/docs/src/package.json +++ b/docs/src/package.json @@ -5,7 +5,7 @@ "lodash": "^4.17.11" }, "devDependencies": { - "grunt": "^1.0.3", + "grunt": "^1.0.4", "grunt-contrib-concat": "^1.0.1", "grunt-contrib-imagemin": "^3.1.0", "grunt-contrib-uglify": "^4.0.0", diff --git a/docs/wiki/framework/gunbag-framework.md b/docs/wiki/framework/gunbag-framework.md new file mode 100644 index 00000000000..a3df099abe1 --- /dev/null +++ b/docs/wiki/framework/gunbag-framework.md @@ -0,0 +1,39 @@ +--- +layout: wiki +title: Gunbag Framework +description: Explains how to set up gunbags +group: framework +parent: wiki +order: 7 +mod: ace +version: + major: 3 + minor: 13 + patch: 0 +--- + +## 1. Overview + +ACE Gunbag provides a framework that allows users to enable putting a gun inside a backpack. + + +## 2. Config Values + +The `ace_gunbag` config entry needs to be set to `1` to enable a backpack to be a gunbag. + +```cpp +class Bag_Base; +class ace_gunbag: Bag_Base { + author = "Ir0n1E"; + scope = 2; + displayName = CSTRING(Displayname); + model = QPATHTOF(data\ace_gunbag.p3d); + picture = QPATHTOF(ui\gunbag_ca.paa); + icon = QPATHTOF(ui\gunbag_icon_ca.paa); + hiddenSelections[] = {"Camo", "insignia"}; + hiddenSelectionsTextures[] = {QPATHTOF(data\gunbag_co.paa)}; + maximumLoad = 80; + mass = 11; + ace_gunbag = 1; +}; +``` diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp index ee2540e2340..d72f5b0a394 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -136,17 +136,18 @@ class CfgAmmo { ACE_muzzleVelocities[] = {875, 910, 930, 945}; ACE_barrelLengths[] = {330.2, 406.4, 508.0, 609.6}; }; - class rhs_ammo_46x30_FMJ: rhs_ammo_556x45_M855A1_Ball { // RUAG Ammotec - ACE_caliber = 4.65; + class rhs_ammo_46x30_FMJ: rhs_ammo_556x45_M855A1_Ball { // RUAG Ammotec: https://www.heckler-koch.com/en/products/military/submachine-guns/mp7a1/mp7a2/ammunition.html + ACE_caliber = 4.65; // https://bobp.cip-bobp.org/uploads/tdcc/tab-i/4-6-x-30-en.pdf ACE_bulletLength = 21; ACE_bulletMass = 2.6; ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[] = {0.171}; + ACE_ballisticCoefficients[] = {0.089}; ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {620}; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {621}; // at 21°C, 620 m/s at 15°C according with the 4.6x30 FMJ magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.002635; // default RHS value -0.0027667 }; class rhs_ammo_46x30_JHP: rhs_ammo_46x30_FMJ { // RUAG Ammotec ACE_caliber = 4.65; @@ -157,8 +158,9 @@ class CfgAmmo { ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {690}; + ACE_muzzleVelocities[] = {691}; // at 21°C, 690 m/s at 15°C according with the 4.6x30 JHP magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.003723; // default RHS value -0.00348301 }; class rhs_ammo_46x30_AP: rhs_ammo_46x30_FMJ { // RUAG Ammotec ACE_caliber = 4.65; @@ -169,8 +171,9 @@ class CfgAmmo { ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {680}; + ACE_muzzleVelocities[] = {681}; // at 21°C, 680 m/s at 15°C according with the 4.6x30 AP magazine initSpeed ACE_barrelLengths[] = {180}; + airFriction = -0.003045; // default RHS value -0.00266241 }; class rhs_ammo_45ACP_MHP: BulletBase { // B_45ACP_Ball (ballistics/CfgAmmo.hpp) ACE_caliber = 11.481; diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp index 1f692792f08..454c09a98cf 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -1,6 +1,21 @@ class cfgMagazines { class CA_Magazine; class VehicleMagazine; + class rhsusf_mag_40Rnd_46x30_AP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 680; // according with the ACE_muzzleVelocities at 15°C, default RHS value 680.1 + }; + class rhsusf_mag_40Rnd_46x30_FMJ: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 620; // default RHS value according with the ACE_muzzleVelocities at 15°C + lastRoundsTracer = 0; + picture = "\rhsusf\addons\rhsusf_weapons2\glock17g4\data\rhs_mag1_glock17g4_ca.paa"; + tracersEvery = 0; + }; + class rhsusf_mag_40Rnd_46x30_JHP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 690; // according with the ACE_muzzleVelocities at 15°C, default RHS value 620 + }; class rhs_mag_30Rnd_556x45_M855A1_Stanag; class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index b9029d5c553..f108c93fdac 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -119,9 +119,11 @@ class CfgWeapons { }; class SMG_02_base_F; class rhsusf_weap_MP7A1_base_f: SMG_02_base_F { + ACE_barrelLength = 180; + ACE_barrelTwist = 160; + ACE_IronSightBaseAngle = -0.286479; // 5 mRad POA = POI at the default discreteDistance 100 m, SMG_02_base_F default value 0.434847 + ACE_RailBaseAngle = 0; // SMG_02_base_F default value 0.0217724 ACE_RailHeightAboveBore = 5; - ACE_barrelTwist = 160.0; - ACE_barrelLength = 180.0; }; // RHS pistols class hgun_ACPC2_F; diff --git a/optionals/tracers/CfgAmmo.hpp b/optionals/tracers/CfgAmmo.hpp index c74d6ac7087..9da774a4fb6 100644 --- a/optionals/tracers/CfgAmmo.hpp +++ b/optionals/tracers/CfgAmmo.hpp @@ -88,7 +88,7 @@ class CfgAmmo { class B_338_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red class B_338_NM_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red - class ACE_338_NM_Ball_red : B_338_NM_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; + class ACE_338_NM_Ball_green : B_338_NM_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; class ACE_338_NM_Ball_yellow : B_338_NM_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; class B_127x54_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green diff --git a/optionals/tracers/CfgMagazines.hpp b/optionals/tracers/CfgMagazines.hpp index a8d822696e5..bd2919631aa 100644 --- a/optionals/tracers/CfgMagazines.hpp +++ b/optionals/tracers/CfgMagazines.hpp @@ -224,22 +224,22 @@ class CfgMagazines { // 9.3x64 class 150Rnd_93x64_Mag; class ACE_150Rnd_93x64_Mag_red : 150Rnd_93x64_Mag { - ammo = "ACE_93x64_tracer_red"; + ammo = "ACE_93x64_Ball_tracer_red"; STRINGS(150Rnd_93x64_Mag_red); }; class ACE_150Rnd_93x64_Mag_yellow : 150Rnd_93x64_Mag { - ammo = "ACE_93x64_tracer_yellow"; + ammo = "ACE_93x64_Ball_tracer_yellow"; STRINGS(150Rnd_93x64_Mag_yellow); }; // .338 NM class 130Rnd_338_Mag; class ACE_130Rnd_338_Mag_green : 130Rnd_338_Mag { - ammo = "ACE_338_NM_tracer_green"; + ammo = "ACE_338_NM_Ball_green"; STRINGS(130Rnd_338_Mag_green); }; class ACE_130Rnd_338_Mag_yellow : 130Rnd_338_Mag { - ammo = "ACE_338_NM_tracer_yellow"; + ammo = "ACE_338_NM_Ball_yellow"; STRINGS(130Rnd_338_Mag_yellow); }; }; diff --git a/optionals/tracers/stringtable.xml b/optionals/tracers/stringtable.xml index acaaa600819..83726c9c16f 100644 --- a/optionals/tracers/stringtable.xml +++ b/optionals/tracers/stringtable.xml @@ -1,258 +1,321 @@ - + 5.56 mm 150Rnd Reload Tracer (Green) Mag 150 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Magazin + Магазин 150 патр. 5.56 мм с послед. трас. (Зеленый) 5.56 mm 150Rnd Reload Tracer (Yellow) Mag 150 Schuss 5,56 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 150 патр. 5.56 мм с послед. трас. (Желтый) 5.56 mm 150Rnd Tracer (Green) Mag 150 Schuss 5,56 mm Leuchtspur (Grün) Magazin + Магазин 150 патр. 5.56 мм трассирующих (Зеленый) Caliber: 5.56x45 mm Tracer - Green<br />Rounds: 150<br />Used in: SPAR-16S Kaliber: 5,56x45 mm Leuchtspur - grün<br />Schuss: 150<br />Verwendet in: SPAR-16S + Калибр: 5.56x45 мм, трассер Зеленый<br />Патронов: 150<br />Используется в: SPAR-16S 5.56 mm 150Rnd Tracer (Yellow) Mag 150 Schuss 5,56 mm Leuchtspur (Gelb) Magazin + Магазин 150 патр. 5.56 мм трассирующих (Желтый) Caliber: 5.56x45 mm Tracer - Yellow<br />Rounds: 150<br />Used in: SPAR-16S Kaliber: 5,56x45 mm Leuchtspur - gelb<br />Schuss: 150<br />Verwendet in: SPAR-16S + Калибр: 5.56x45 мм, трассер Желтый<br />Патронов: 150<br />Используется в: SPAR-16S 5.56 mm 200Rnd Reload Tracer (Green) Box 200 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Kasten + Короб 200 патр. 5.56 мм с послед. трас. (Зеленый) 5.56 mm 200Rnd Tracer (Green) Box 200 Schuss 5,56 mm Nachlade-Leuchtspur (Grün) Kasten + Короб 200 патр. 5.56 мм трассирующих (Зеленый) Caliber: 5.56x45 mm Tracer - Green<br />Rounds: 200<br />Used in: LIM-85 Kaliber: 5,56x45 mm Leuchtspur - grün<br />Schuss: 200<br />Verwendet in: LIM-85 + Калибр: 5.56x45 мм, трассер Зеленый<br />Патронов: 200<br />Используется в: LIM-85 5.8 mm 30Rnd Reload Tracer (Red) Mag 30 Schuss 5,8 mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 30 патр. 5.8 мм с послед. трас. (Красный) 5.8 mm 30Rnd Reload Tracer (Yellow) Mag 30 Schuss 5,8 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 5.8 мм с послед. трас. (Желтый) 5.8 mm 30Rnd Tracer (Red) Mag 30 Schuss 5,8 mm Leuchtspur (Rot) Magazin + Магазин 30 патр. 5.8 мм трассирующих (Красный) Caliber: 5.8x42 mm Tracer - Red<br />Rounds: 30<br />Used in: CAR-95, CAR-95 GL Kaliber: 5,8x42 mm Leuchtspur - rot<br />Schuss: 30<br />Verwendet in: CAR-95, CAR-95 GL + Калибр: 5.8x42 мм, трассер Красный<br />Патронов: 150<br />Используется в: CAR-95, CAR-95 GL 5.8 mm 30Rnd Tracer (Yellow) Mag 30 Schuss 5,8 mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 5.8 мм трассирующих (Желтый) Caliber: 5.8x42 mm Tracer - Yellow<br />Rounds: 30<br />Used in: CAR-95, CAR-95 GL Kaliber: 5,8x42 mm Leuchtspur - gelb<br />Schuss: 30<br />Verwendet in: CAR-95, CAR-95 GL + Калибр: 5.8x42 мм, трассер Желтый<br />Патронов: 30<br />Используется в: CAR-95, CAR-95 GL 5.8 mm 100Rnd Reload Tracer (Red) Mag 100 Schuss 5,8 mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 100 патр. 5.8 мм с послед. трас. (Красный) 5.8 mm 100Rnd Reload Tracer (Yellow) Mag 100 Schuss 5,8 mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 100 патр. 5.8 мм с послед. трас. (Желтый) 5.8 mm 100Rnd Tracer (Red) Mag 100 Schuss 5,8 mm Leuchtspur (Rot) Magazin + Магазин 100 патр. 5.8 мм трассирующих (Красный) Caliber: 5.8x42 mm Tracer - Red<br />Rounds: 100<br />Used in: CAR-95-1 Kaliber: 5,8x42 mm Leuchtspur - rot<br />Schuss: 100<br />Verwendet in: CAR-95-1 + Калибр: 5.8x42 мм, трассер Красный<br />Патронов: 100<br />Используется в: CAR-95, CAR-95 GL 5.8 mm 100Rnd Tracer (Yellow) Mag 100 Schuss 5,8 mm Leuchtspur (Gelb) Magazin + Магазин 100 патр. 5.8 мм трассирующих (Желтый) Caliber: 5.8x42 mm Tracer - Yellow<br />Rounds: 100<br />Used in: CAR-95-1 Kaliber: 5,8x42 mm Leuchtspur - gelb<br />Schuss: 100<br />Verwendet in: CAR-95-1 + Калибр: 5.8x42 мм, трассер Желтый<br />Патронов: 100<br />Используется в: CAR-95, CAR-95 GL 6.5mm 30Rnd Reload Tracer (Green) Mag 30 Schuss 6.5mm Nachlade-Leuchtspur (Grün) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Зеленый) Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6.5x39 mm Nachlade-Leuchtspur - Grün<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL 6.5mm 30Rnd Reload Tracer (Yellow) Mag 30 Schuss 6.5mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Желтый) Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6.5x39 mm Nachlade-Leuchtspur - Gelb<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL 6.5mm 30Rnd Tracer (Green) Mag 30 Schuss 6.5mm Leuchtspur (Grün) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Зеленый) Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL 6.5mm 30Rnd Tracer (Yellow) Mag 30 Schuss 6.5mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Желтый) Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6.5x39 mm Leuchtspur - Gelb<br />Patronen: 30<br />Verwendet in: MX/C/M/SW/3GL + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 30<br />Используется в: MX/C/M/SW/3GL 6.5mm 100Rnd Mixed Mag (Green) 100 Schuss 6.5mm Magazin gemischt (grün) + Магазин 100 патр. 6.5 мм TE4 (Зеленый) 6.5mm 100Rnd Mixed Mag (Yellow) 100 Schuss 6.5mm Magazin gemischt (gelb) + Магазин 100 патр. 6.5 мм TE4 (Желтый) 6.5mm 100Rnd Mag Tracer (Green) 100 Schuss 6.5mm Magazin Leuchtspur (Grün) + Магазин 100 патр. 6.5 мм трассирующих (Зеленый) Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 100<br />Used in: MX SW Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 100<br />Verwendet in: MX SW + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 100<br />Используется в: MX SW 6.5mm 100Rnd Mag Tracer (Yellow) 100 Schuss 6.5mm Magazin Leuchtspur (Gelb) + Магазин 100 патр. 6.5 мм трассирующих (Желтый) Caliber: 6.5x39 mm Tracer - Yellow<br />Rounds: 100<br />Used in: MX SW Kaliber: 6.5x39 mm Leuchtspur - Gelb<br />Patronen: 100<br />Verwendet in: MX SW + Калибр: 6.5x39 мм, трассер Желтый<br />Патронов: 100<br />Используется в: MX SW 6.5mm 30Rnd Reload Tracer (Red) Mag 30 Schuss 6.5mm Nachlade-Leuchtspur (Rot) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Красный) 6.5mm 30Rnd Reload Tracer (Yellow) Mag 30 Schuss 6.5mm Nachlade-Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм с послед. трас. (Желтый) 6.5mm 30Rnd Tracer (Red) Mag 30 Schuss 6.5mm Leuchtspur (Rot) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Красный) Caliber: 6.5x39 mm Tracer (Red) - Caseless<br />Rounds: 30<br />Used in: Katiba, Type 115 Kaliber: 6,5x39mm Leuchtspur (Rot) ‒ hülsenlos<br />Patronen: 30<br />Eingesetzt von: Katiba, Typ 115 + Калибр: 6.5x39 мм, трассер Красный безгильзовый<br />Патронов: 30<br />Используется в: Katiba, Type 115 6.5mm 30Rnd Tracer (Yellow) Mag 30 Schuss 6.5mm Leuchtspur (Gelb) Magazin + Магазин 30 патр. 6.5 мм трассирующих (Желтый) Caliber: 6.5x39 mm Tracer (Yellow) - Caseless<br />Rounds: 30<br />Used in: Katiba, Type 115 Kaliber: 6,5x39mm Leuchtspur (Rot) ‒ hülsenlos<br />Patronen: 30<br />Eingesetzt von: Katiba, Typ 115 + Калибр: 6.5x39 мм, трассер Желтый безгильзовый<br />Патронов: 30<br />Используется в: Katiba, Type 115 6.5 mm 200Rnd Belt Case Mixed (Green) 6,5 mm 200-Schuss-Gurtkiste Gemischt (grün) + Короб 200 патр. 6.5 мм TE4 (Зеленый) Caliber: 6.5x39 mm Mixed - Green<br />Rounds: 200<br />Used in: Mk200 Kaliber: 6.5x39 mm Gemischt - Grün<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер каждый 4 Зеленый<br />Патронов: 200<br />Используется в: Mk200 6.5 mm 200Rnd Belt Case Mixed (Red) 6,5 mm 200-Schuss-Gurtkiste Gemischt (grün) + Короб 200 патр. 6.5 мм TE4 (Красный) Caliber: 6.5x39 mm Mixed - Red<br />Rounds: 200<br />Used in: Mk200 Kaliber: 6.5x39 mm Mixed - Rot<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер каждый 4 Красный<br />Патронов: 200<br />Используется в: Mk200 6.5 mm 200Rnd Belt Case Tracer (Green) 6,5 mm 200-Schuss-Gurtkiste Leuchtspur (grün) + Короб 200 патр. 6.5 мм трассирующих (Зеленый) Caliber: 6.5x39 mm Tracer - Green<br />Rounds: 200<br />Used in: Mk200 Kaliber: 6.5x39 mm Leuchtspur - Grün<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер Зеленый<br />Патронов: 200<br />Используется в: Mk200 6.5 mm 200Rnd Belt Case Tracer (Red) 6,5 mm 200-Schuss-Gurtkiste Leuchtspur (rot) + Короб 200 патр. 6.5 мм трассирующих (Красный) Caliber: 6.5x39 mm Tracer - Red<br />Rounds: 200<br />Used in: Mk200 Kaliber: 6.5x39 mm Leuchtspur - Rot<br />Patronen: 200<br />Verwendet in: Mk200 + Калибр: 6.5x39 мм, трассер Красный<br />Патронов: 200<br />Используется в: Mk200 7.62 mm 20Rnd Tracer (Green) Mag 7,62 mm 20-Schuss-Magazin Leuchtspur (Grün) + Магазин 20 патр. 7.62 мм трассирующих (Зеленый) Caliber: 7.62x51 mm NATO Tracer - Green<br />Rounds: 20<br />Used in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 Kaliber: 7,62x51 mm NATO Leuchtspur - grün<br />Patronen: 20<br />Eingesetzt von: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Калибр: 7.62x51 mm NATO, трассер Зеленый<br />Патронов: 20<br />Используется в: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 7.62 mm 20Rnd Tracer (Yellow) Mag 7,62 mm 20-Schuss-Magazin Leuchtspur (Gelb) + Магазин 20 патр. 7.62 мм трассирующих (Желтый) Caliber: 7.62x51 mm NATO Tracer - Yellow<br />Rounds: 20<br />Used in: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 Kaliber: 7,62x51 mm NATO Leuchtspur - gelb<br />Patronen: 20<br />Eingesetzt von: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 + Калибр: 7.62x51 mm NATO, трассер Желтый<br />Патронов: 20<br />Используется в: Mk18 ABR, Mk-I EMR, Mk14, SPAR-17 7.62mm 150Rnd Box Mixed (Red) 7.62mm 150 Schuss Kiste Gemischt (rot) + Короб 150 патр. 7.62 мм TE4 (Красный) 7.62mm 150Rnd Box Mixed (Yellow) 7.62mm 150 Schuss Kiste Gemischt (gelb) + Короб 150 патр. 7.62 мм TE4 (Желтый) 7.62mm 150Rnd Box Tracer (Red) 7.62mm 150 Schuss Kiste Leuchtspur (rot) + Короб 150 патр. 7.62 мм трассирующих (Красный) Caliber: 7.62x54 mm Tracer - Red<br />Rounds: 150<br />Used in: Zafir Kaliber: 7.62x54 mm Leuchtspur - Rot<br />Patronen: 150<br />Verwendet in: Zafir + Калибр: 7.62x51 mm NATO, трассер Красный<br />Патронов: 150<br />Используется в: Zafir 7.62mm 150Rnd Box Tracer (Yellow) 7.62mm 150 Schuss Kiste Leuchtspur (Rot) + Короб 150 патр. 7.62 мм трассирующих (Желтый) Caliber: 7.62x54 mm Tracer - Yellow<br />Rounds: 150<br />Used in: Zafir Kaliber: 7.62x54 mm Leuchtspur - Gelb<br />Patronen: 150<br />Verwendet in: Zafir + Калибр: 7.62x51 mm NATO, трассер Желтый<br />Патронов: 150<br />Используется в: Zafir 9.3mm 150Rnd Belt Mixed (Yellow) 9.3mm 150 Schuss Gurt gemischt (Gelb) + Лента 150 патр. 9.3 мм TE4 (Желтый) 9.3mm 150Rnd Belt Mixed (Red) 9.3mm 150 Schuss Gurt gemischt (Rot) + Лента 150 патр. 9.3 мм TE4 (Красный) .338 NM 130Rnd Belt Mixed (Yellow) .338 NM 130 Schuss Gurt gemischt (gelb) + Лента 130 патр. .338 NM TE4 (Желтый) .338 NM 130Rnd Belt Mixed (Green) .338 NM 130 Schuss Gurt gemischt (grün) + Лента 130 патр. .338 NM TE4 (Зеленый)