diff --git a/squad-server/index.js b/squad-server/index.js index 43a68b56..7d41d8e3 100644 --- a/squad-server/index.js +++ b/squad-server/index.js @@ -10,6 +10,8 @@ import { Layers } from './layers/index.js'; import LogParser from './log-parser/index.js'; import Rcon from './rcon.js'; +import SoldierLookup from './lookup/soldier-lookup.js'; + import { SQUADJS_VERSION } from './utils/constants.js'; import fetchAdminLists from './utils/admin-lists.js'; @@ -302,6 +304,12 @@ export default class SquadServer extends EventEmitter { delete data.playerSuffix; this.emit('PLAYER_POSSESS', data); + + let match = data.possessClassname.match(/(?:BP_Soldier_|Default__BP_Soldier_)([a-zA-Z]+)_[a-zA-Z0-9]+/); + if (match) { + if (data.player) data.player.teamName = SoldierLookup[match[1]]; + this.emit('PLAYER_SOLDIER_POSSESS', data); + } }); this.logParser.on('PLAYER_UNPOSSESS', async (data) => { @@ -318,6 +326,11 @@ export default class SquadServer extends EventEmitter { this.logParser.on('TICK_RATE', (data) => { this.emit('TICK_RATE', data); + }); + + this.logParser.on('VEHICLE_DAMAGED', (data) => { + this.emit('VEHICLE_DAMAGED', data); + if (data.healthRemaining <= 0) this.emit('VEHICLE_DESTROYED', data); }); } diff --git a/squad-server/log-parser/index.js b/squad-server/log-parser/index.js index 7f492c49..6e7f12b6 100644 --- a/squad-server/log-parser/index.js +++ b/squad-server/log-parser/index.js @@ -16,6 +16,7 @@ import RoundTickets from './round-tickets.js'; import RoundWinner from './round-winner.js'; import ServerTickRate from './server-tick-rate.js'; import PlayerJoinSucceeded from './player-join-succeeded.js'; +import VehicleDamaged from './vehicle-damaged.js'; export default class SquadLogParser extends LogParser { constructor(options) { super('SquadGame.log', options); @@ -38,7 +39,8 @@ export default class SquadLogParser extends LogParser { RoundTickets, RoundWinner, ServerTickRate, - PlayerJoinSucceeded + PlayerJoinSucceeded, + VehicleDamaged ]; } } diff --git a/squad-server/log-parser/lookup/vehicles-lookup.js b/squad-server/log-parser/lookup/vehicles-lookup.js new file mode 100644 index 00000000..7f80499c --- /dev/null +++ b/squad-server/log-parser/lookup/vehicles-lookup.js @@ -0,0 +1,484 @@ +export default { + "BP_2A6_Desert": ["CAF"], + "BP_2A6_Desert_Cage": ["CAF"], + "BP_2A6_Woodland": ["CAF"], + "BP_2A6_Woodland_Cage": ["CAF"], + "BP_50Cal_M1151": ["USA"], + "BP_50Cal_M1151_USMC_Woodland": ["USMC"], + "BP_50Cal_M1151_Woodland": ["USA"], + "BP_AAVP7A1": ["USMC"], + "BP_AAVP7A1_Logi": ["USMC"], + "BP_AAVP7A1_Woodland": ["USMC"], + "BP_AAVP7A1_Woodland_Logi": ["USMC"], + "BP_ACV-15": ["TLF"], + "BP_ACV-15_Desert": ["TLF"], + "BP_ACV-15_M2": ["TLF"], + "BP_ACV-15_M2_Desert": ["TLF"], + "BP_ACV-15_MG3": ["TLF"], + "BP_ACV-15_MG3_Desert": ["TLF"], + "BP_Armored_Technical2Seater_Camo_DSHK": ["IMF"], + "BP_Armored_Technical2Seater_Camo_M2": ["IMF"], + "BP_Armored_Technical2Seater_Camo_SPG9": ["IMF"], + "BP_Armored_Ural_375_Logi_MIL": ["IMF"], + "BP_Armored_Ural_375_MIL": ["IMF"], + "BP_ASLAV": ["ADF"], + "BP_Aussie_Util_Truck": ["ADF"], + "BP_Aussie_Util_Truck_Logi": ["ADF"], + "BP_AUS_M1A1": ["ADF"], + "BP_BFV": ["USA"], + "BP_BFV_Woodland": ["USA"], + "BP_BM21Grad_INS": ["INS"], + "BP_BM21Grad_MIL": ["IMF"], + "BP_BMD1M": ["RAF"], + "BP_BMD1M_Desert": ["RAF"], + "BP_BMD4M": ["RAF"], + "BP_BMD4M_Desert": ["RAF"], + "BP_BMP1AM": ["RGF"], + "BP_BMP1AM_Desert": ["RGF"], + "BP_BMP1_INS": ["INS"], + "BP_BMP1_INS_ZU23": ["INS"], + "BP_BMP1_MEA": ["MEA"], + "BP_BMP1_MIL": ["IMF"], + "BP_BMP1_MIL_ZU23": ["IMF"], + "BP_BMP2": ["RGF"], + "BP_BMP2M": ["RGF"], + "BP_BMP2M_Desert": ["RGF"], + "BP_BMP2_Desert": ["RGF"], + "BP_BMP2_IMF": ["IMF"], + "BP_BMP2_MEA": ["MEA"], + "BP_BMP3M": ["RGF"], + "BP_BMP3M_Desert": ["RGF"], + "BP_BRDM-2": ["IMF"], + "BP_BRDM-2_Insurgents": ["INS"], + "BP_BRDM-2_MEA": ["MEA"], + "BP_BRDM-2_MEA_Spandrel": ["MEA"], + "BP_BRDM-2_MIL": ["IMF"], + "BP_BRDM-2_RUS": ["RGF"], + "BP_BRDM-2_RUS_Desert": ["RGF"], + "BP_BRDM-2_Spandrel": ["IMF"], + "BP_BRDM-2_Spandrel_INS": ["INS"], + "BP_BRDM-2_Spandrel_RUS": ["RGF"], + "BP_BRDM-2_Spandrel_RUS_Desert": ["RGF"], + "BP_Brit_Util_Truck": ["BAF"], + "BP_Brit_Util_Truck_Logi": ["BAF"], + "BP_Brit_Util_Truck_Logi_Woodland": ["BAF"], + "BP_Brit_Util_Truck_Woodland": ["BAF"], + "BP_BTR-DG_Logistics": ["RAF"], + "BP_BTR-DG_Logistics_Desert": ["RAF"], + "BP_BTR-D_Kord": ["RAF"], + "BP_BTR-D_Kord_Desert": ["RAF"], + "BP_BTR-D_PKM": ["RAF"], + "BP_BTR-D_PKM_Desert": ["RAF"], + "BP_BTR-D_Transport": ["RAF"], + "BP_BTR-D_Transport_Desert": ["RAF"], + "BP_BTR-ZD": ["RAF"], + "BP_BTR-ZD_Desert": ["RAF"], + "BP_BTR80_INS": ["INS"], + "BP_BTR80_Militia": ["IMF"], + "BP_BTR80_RUS": ["RGF", "MEA", "INS", "IMF"], + "BP_BTR80_RUS_Desert": ["RGF", "MEA", "INS", "IMF"], + "BP_BTR82A_RUS": ["RGF", "RAF"], + "BP_BTR82A_RUS_Desert": ["RGF", "RAF"], + "BP_BTRMDM_Bowgun": ["RAF"], + "BP_BTRMDM_Bowgun_Desert": ["RAF"], + "BP_BTRMDM_PKT_RWS": ["RAF"], + "BP_BTRMDM_PKT_RWS_Desert": ["RAF"], + "BP_BTRMDM_PKT_RWS_Parent": ["RAF"], + "BP_BTRMDM_Transport": ["RAF"], + "BP_BTRMDM_Transport_Desert": ["RAF"], + "BP_CAF_Util_Desert": ["CAF"], + "BP_CAF_Util_Desert_Logi": ["CAF"], + "BP_CAF_Util_Woodland": ["CAF"], + "BP_CAF_Util_Woodland_Logi": ["CAF"], + "BP_CH146": ["CAF"], + "BP_CH146_CAS": ["CAF"], + "BP_CH146_Desert": ["CAF"], + "BP_CH146_Desert_CAS": ["CAF"], + "BP_CH146_Raven": ["WPMC"], + "BP_CH178": ["CAF"], + "BP_Cobra2_M2": ["TLF"], + "BP_Cobra2_M2_Desert": ["TLF"], + "BP_Cobra2_MG3": ["TLF"], + "BP_Cobra2_MG3_Desert": ["TLF"], + "BP_Cobra2_RWS_M2": ["TLF"], + "BP_Cobra2_RWS_M2_Desert": ["TLF"], + "BP_Cobra2_RWS_MG3": ["TLF"], + "BP_Cobra2_RWS_MG3_Desert": ["TLF"], + "BP_CPV_M134": ["WPMC"], + "BP_CPV_M134_Blue": ["WPMC"], + "BP_CPV_M134_Red": ["WPMC"], + "BP_CPV_Transport": ["WPMC"], + "BP_CPV_Transport_Blue": ["WPMC"], + "BP_CPV_Transport_Red": ["WPMC"], + "BP_CSK131_HJ-8ATGM": ["PLA", "PLANMC"], + "BP_CSK131_HJ-8ATGM": ["PLA", "PLANMC"], + "BP_CSK131_HJ-8ATGM_Naval": ["PLA", "PLANMC"], + "BP_CSK131_HJ8ATGM_Desert": ["PLA", "PLANMC"], + "BP_CSK131_QJY88": ["PLA", "PLANMC"], + "BP_CSK131_QJY88_Desert": ["PLA", "PLANMC"], + "BP_CSK131_QJY88_Naval": ["PLA", "PLANMC"], + "BP_CSK131_QJZ89": ["PLA", "PLANMC"], + "BP_CSK131_QJZ89_Desert": ["PLA", "PLANMC"], + "BP_CSK131_QJZ89_Naval": ["PLA", "PLANMC"], + "BP_CSK131_RWS": ["PLA", "PLANMC"], + "BP_CSK131_RWS_Desert": ["PLA", "PLANMC"], + "BP_CSK131_RWS_Naval": ["PLA", "PLANMC"], + "BP_CTM131": ["PLA", "PLANMC"], + "BP_CTM131.BP_CTM131": ["PLA", "PLANMC"], + "BP_CTM131_Desert": ["PLA", "PLANMC"], + "BP_CTM131_Logistic": ["PLA", "PLANMC"], + "BP_CTM131_Logistic_Desert": ["PLA", "PLANMC"], + "BP_CTM131_Logistic_Naval": ["PLA", "PLANMC"], + "BP_CTM131_Naval": ["PLA", "PLANMC"], + "BP_CTM131_QJZ89": ["PLA", "PLANMC"], + "BP_CTM131_QJZ89_Desert": ["PLA", "PLANMC"], + "BP_CTM131_QJZ89_Naval": ["PLA", "PLANMC"], + "BP_FV107": ["BAF"], + "BP_FV107_Woodland": ["BAF"], + "BP_FV4034": ["BAF"], + "BP_FV4034_woodland": ["BAF"], + "BP_FV4034_Woodland": ["BAF"], + "BP_FV432": ["BAF"], + "BP_FV432_RWS": ["BAF"], + "BP_FV432_RWS_M2": ["BAF"], + "BP_FV432_RWS_M2_Woodland": ["BAF"], + "BP_FV432_RWS_Woodland": ["BAF"], + "BP_FV432_woodland": ["BAF"], + "BP_FV510": ["BAF"], + "BP_FV510UA": ["BAF"], + "BP_FV510UA_CTAS40": ["BAF"], + "BP_FV510UA_CTAS40_Woodland": ["BAF"], + "BP_FV510UA_Woodland": ["BAF"], + "BP_FV510_Woodland": ["BAF"], + "BP_Kamaz_5350": ["RGF", "RAF"], + "BP_Kamaz_5350_Desert": ["RGF", "RAF"], + "BP_Kamaz_5350_Logi": ["RGF", "RAF"], + "BP_Kamaz_5350_Logi_Desert": ["RGF"], + "BP_LAV25": ["USMC"], + "BP_LAV25_Woodland": ["USMC"], + "BP_LAV2_Coyote": ["CAF"], + "BP_LAV2_Coyote_Woodland": ["CAF"], + "BP_LAV6_Desert": ["CAF"], + "BP_LAV6_Woodland": ["CAF"], + "BP_LAV_RWS_C6": ["CAF"], + "BP_LAV_RWS_C6_Desert": ["CAF"], + "BP_LAV_RWS_M2": ["CAF"], + "BP_LAV_RWS_M2_Desert": ["CAF"], + "BP_Loach": ["WPMC"], + "BP_Loach_CAS": ["WPMC"], + "BP_Loach_CAS_Large": ["WPMC"], + "BP_Loach_CAS_SingleLarge": ["WPMC"], + "BP_Loach_CAS_Small": ["WPMC"], + "BP_LPPV": ["BAF"], + "BP_LPPV_M2RWS": ["BAF"], + "BP_LPPV_M2RWS_Woodland": ["BAF"], + "BP_LPPV_Woodland": ["BAF"], + "BP_LUVW": ["CAF"], + "BP_LUVW_C6": ["CAF"], + "BP_LUVW_C6_Desert": ["CAF"], + "BP_LUVW_Desert": ["CAF"], + "BP_LUVW_Logi": ["CAF"], + "BP_LUVW_Logi_Desert": ["CAF"], + "BP_LUVW_M2": ["CAF"], + "BP_LUVW_M2_Desert": ["CAF"], + "BP_M-Gator_Logistics": ["CAF"], + "BP_M-Gator_Logistics_ARID": ["CAF"], + "BP_M-Gator_Transport": ["CAF"], + "BP_M-Gator_Transport_ARID": ["CAF"], + "BP_M1064A3_M121": ["USA"], + "BP_M1064A3_M121_Desert": ["USA", "TLF"], + "BP_M1064A3_M121_Desert": ["USA"], + "BP_M1064_M121_TLF": ["TLF"], + "BP_M1064_M121_TLF_Desert": ["TLF"], + "BP_M1117": ["WPMC"], + "BP_M1126": ["USA"], + "BP_M1126_M240": ["USA"], + "BP_M1126_M240_Woodland": ["USA"], + "BP_M1126_Woodland": ["USA"], + "BP_M1128": ["USA"], + "BP_M1128_Woodland": ["USA"], + "BP_M113A2T_Logistics_TLF": ["TLF"], + "BP_M113A2T_Logistics_TLF_Desert": ["TLF"], + "BP_M113A2T_M2_TLF": ["TLF"], + "BP_M113A2T_M2_TLF_Desert": ["TLF"], + "BP_M113A2T_MK19_TLF": ["TLF"], + "BP_M113A2T_MK19_TLF_Desert": ["TLF"], + "BP_M113A3_C6": ["USA"], + "BP_M113A3_C6_Desert": ["USA"], + "BP_M113A3_CAF_C6": ["CAF"], + "BP_M113A3_CAF_C6_Desert": ["CAF"], + "BP_M113A3_CAF_M2": ["CAF"], + "BP_M113A3_CAF_M2_Desert": ["CAF"], + "BP_M113A3_CAF_TLAV": ["CAF"], + "BP_M113A3_CAF_TLAV_Desert": ["CAF"], + "BP_M113A3_Logistics": ["CAF", "USA", "WPMC"], + "BP_M113A3_Logistics_Desert": ["CAF", "USA", "WPMC"], + "BP_M113A3_M2": ["USA"], + "BP_M113A3_M2_Desert": ["USA"], + "BP_M113A3_M2_Desert_Cage": ["USA"], + "BP_M113A3_MK19": ["USA"], + "BP_M113A3_MK19_Desert": ["USA"], + "BP_M113A3_MK19_Desert_Cage": ["USA"], + "BP_M113A3_MSV_WPMC": ["WPMC"], + "BP_M113A3_TLAV": ["USA"], + "BP_M113A3_TLAV_Desert": ["USA"], + "BP_M113A3_WPMC_M2": ["WPMC"], + "BP_M1151": ["USMC"], + "BP_M1151_CROWS": ["USMC"], + "BP_M1151_CROWS_Woodland": ["USMC"], + "BP_M1151_Light": ["USMC"], + "BP_M1151_Light_M240": ["USA", "USMC"], + "BP_M1151_Light_M240_Woodland": ["USA", "USMC"], + "BP_M1151_Light_Mk19": ["USA"], + "BP_M1151_Light_Mk19_Woodland": ["USA"], + "BP_M1151_Light_TOW": ["USA", "USMC"], + "BP_M1151_Light_TOW_Woodland": ["USA", "USMC"], + "BP_M1151_Light_Woodland": ["USMC"], + "BP_M1151_M240": ["USA", "USMC"], + "BP_M1151_M240_Woodland": ["USA", "USMC"], + "BP_M1151_M240_WPMC": ["WPMC"], + "BP_M1151_Mk19": ["USA"], + "BP_M1151_Mk19_Woodland": ["USA"], + "BP_M1151_Technical": ["INS"], + "BP_M1151_TOW": ["USA", "USMC"], + "BP_M1151_TOW_Woodland": ["USA", "USMC"], + "BP_M1151_TOW_WPMC": ["WPMC"], + "BP_M1151_Woodland": ["USMC"], + "BP_M1151_WPMC": ["WPMC"], + "BP_M1A1_USMC": ["USMC"], + "BP_M1A1_USMC_Woodland": ["USMC"], + "BP_M1A2": ["USA"], + "BP_M1A2_Woodland": ["USA"], + "BP_M60T": ["TLF"], + "BP_M60T_Desert": ["TLF"], + "BP_M60T_WPMC": ["WPMC"], + "BP_M7A3_IFV": ["USA"], + "BP_M7A3_IFV_Woodland": ["USA"], + "BP_MATV": ["USA"], + "BP_MATV_CROWS": ["USA"], + "BP_MATV_CROWS_M240": ["USA"], + "BP_MATV_CROWS_M240_Woodland": ["USA"], + "BP_MATV_CROWS_Woodland": ["USA"], + "BP_MATV_M240": ["USA"], + "BP_MATV_M240_Woodland": ["USA"], + "BP_MATV_Mk19": ["USA"], + "BP_MATV_Mk19_USMC": ["USMC"], + "BP_MATV_Mk19_USMC_Woodland": ["USMC"], + "BP_MATV_Mk19_Woodland": ["USA"], + "BP_MATV_TOW": ["USA"], + "BP_MATV_TOW_Woodland": ["USA"], + "BP_MATV_USMC": ["USMC"], + "BP_MATV_USMC_CROWS": ["USMC"], + "BP_MATV_USMC_CROWS_Woodland": ["USMC"], + "BP_MATV_USMC_TOW": ["USMC"], + "BP_MATV_USMC_TOW_Woodland": ["USMC"], + "BP_MATV_USMC_Woodland": ["USMC"], + "BP_MATV_Woodland": ["USA"], + "BP_MI17_MEA": ["MEA"], + "BP_MI8": ["RGF"], + "BP_MI8_CAS": ["RGF", "RAF"], + "BP_MI8_VDV": ["RAF"], + "BP_minsk": ["IMF", "INS"], + "BP_Minsk_black": ["IMF", "INS"], + "BP_Minsk_blue": ["IMF", "INS"], + "BP_Minsk_green": ["IMF", "INS"], + "BP_MRH90_CAS": ["ADF"], + "BP_MRH90_Mag58": ["ADF"], + "BP_MTLBM_6MA_MEA": ["MEA"], + "BP_MTLBM_6MA_RUS": ["RGF"], + "BP_MTLBM_6MA_RUS_Desert": ["RGF"], + "BP_MTLBM_6MB_MIL": ["IMF"], + "BP_MTLBM_6MB_RUS": ["RGF"], + "BP_MTLBM_6MB_RUS_Desert": ["RGF"], + "BP_MTLB_INS": ["INS"], + "BP_MTLB_LOGI_IMF": ["IMF"], + "BP_MTLB_LOGI_INS": ["INS"], + "BP_MTLB_LOGI_MEA": ["MEA"], + "BP_MTLB_LOGI_RUS": ["RGF", "RAF"], + "BP_MTLB_LOGI_RUS_Desert": ["RGF", "RAF"], + "BP_MTLB_RGF": ["RGF"], + "BP_MTLB_RGF_Desert": ["RGF"], + "BP_MTLB_turret_NSV_MEA": ["MEA"], + "BP_MTLB_VMK_MEA": ["MEA"], + "BP_MTLB_VMK_MIL": ["IMF"], + "BP_MTLB_VMK_RUS": ["RGF"], + "BP_MTLB_VMK_RUS_Desert": ["RGF"], + "BP_MTLB_ZU23_INS": ["INS"], + "BP_MTLB_ZU23_MIL": ["IMF"], + "BP_PARS3": ["TLF"], + "BP_PARS3_Desert": ["TLF"], + "BP_PARS3_M2": ["TLF"], + "BP_PARS3_M2_Desert": ["TLF"], + "BP_PARS3_MG3": ["TLF"], + "BP_PARS3_MG3_Desert": ["TLF"], + "BP_PARS3_MK19": ["TLF"], + "BP_PARS3_MK19_Desert": ["TLF"], + "BP_PMV_Mag58": ["ADF"], + "BP_PMV_Mag58x3": ["ADF"], + "BP_PMV_RWS": ["ADF"], + "BP_QJZ89_RWS": ["PLA", "PLANMC"], + "BP_QJZ89_RWS_Desert": ["PLA", "PLANMC"], + "BP_QJZ89_RWS_Naval": ["PLA", "PLANMC"], + "BP_Quadbike_Desert": ["USA", "USMC", "WPMC"], + "BP_Quadbike_Woodland": ["USA", "USMC", "WPMC"], + "BP_RHIB_DSHK": ["INS", "IMF"], + "BP_RHIB_Logistics": ["ADF", "BAF", "CAF", "USA", "USMC", "RGF", "PLA", "PLANMC", "IMF", "INS", "MEA"], + "BP_RHIB_MEA_MG3": ["MEA", "TLF"], + "BP_RHIB_PKM": ["INS", "IMF"], + "BP_RHIB_QJY88": ["PLA", "PLANMC"], + "BP_RHIB_QJZ89": ["PLA", "PLANMC"], + "BP_RHIB_RUS_NSV": ["RGF", "RAF", "MEA"], + "BP_RHIB_RUS_PKP": ["RGF", "RAF"], + "BP_RHIB_TLF_M2HB": ["TLF"], + "BP_RHIB_Transport": ["ADF", "BAF", "CAF", "USA", "USMC", "RGF", "PLA", "PLANMC", "IMF", "INS", "MEA"], + "BP_RHIB_US_M134": ["WPMC"], + "BP_RHIB_US_M2": ["ADF", "BAF", "CAF", "USA", "USMC", "WPMC", "TLF"], + "BP_RHIB_US_M240": ["ADF", "BAF", "CAF", "USA", "USMC"], + "BP_RHIB_US_Mk19": ["USA", "USMC", "WPMC"], + "BP_SA330": ["BAF"], + "BP_Safir": ["MEA"], + "BP_Safir_Kord": ["MEA"], + "BP_Safir_Kornet": ["MEA"], + "BP_Safir_MG3": ["MEA"], + "BP_Sprut": ["RAF"], + "BP_Sprut_Desert": ["RAF"], + "BP_T62": ["INS"], + "BP_T62_MEA": ["MEA"], + "BP_T62_MIL": ["IMF"], + "BP_T72AV_MEA": ["MEA"], + "BP_T72B3": ["RGF", "RAF"], + "BP_T72B3_Desert": ["RGF", "RAF"], + "BP_T90A": ["RGF"], + "BP_T90A_Desert": ["RGF"], + "BP_TAPV_C16": ["CAF"], + "BP_TAPV_C16_Desert": ["CAF"], + "BP_Technical2Seater_Camo_DSHK": ["IMF"], + "BP_Technical2Seater_Camo_Kornet": ["IMF"], + "BP_Technical2Seater_Camo_M2": ["IMF"], + "BP_Technical2Seater_Camo_SPG9": ["IMF"], + "BP_Technical2Seater_Camo_UB32": ["IMF"], + "BP_Technical2Seater_Camo_ZU23": ["IMF"], + "BP_Technical2Seater_Generic": ["IMF"], + "BP_Technical2Seater_M134_Black": ["WPMC"], + "BP_Technical2Seater_M134_Grey": ["WPMC"], + "BP_Technical2Seater_M134_Tan": ["WPMC"], + "BP_Technical2Seater_M2_Black": ["WPMC"], + "BP_Technical2Seater_M2_Grey": ["WPMC"], + "BP_Technical2Seater_M2_Tan": ["WPMC"], + "BP_Technical2Seater_Mortar_Black": ["WPMC"], + "BP_Technical2Seater_Mortar_Grey": ["WPMC"], + "BP_Technical2Seater_Mortar_Tan": ["WPMC"], + "BP_Technical2Seater_White_BMP1": ["INS"], + "BP_Technical2Seater_White_Dshk": ["INS"], + "BP_Technical2Seater_White_Kornet": ["INS"], + "BP_Technical2Seater_White_M134": ["INS"], + "BP_Technical2Seater_White_M2": ["INS"], + "BP_Technical2Seater_White_Mortar": ["INS"], + "BP_Technical2Seater_White_SPG9": ["INS"], + "BP_Technical2Seater_White_UB32": ["INS"], + "BP_Technical2Seater_White_ZU23": ["INS"], + "BP_Technical4Seater_Logi": ["INS"], + "BP_Technical4Seater_Logi_Black": ["WPMC"], + "BP_Technical4Seater_Logi_Camo": ["IMF"], + "BP_Technical4Seater_Logi_Grey": ["WPMC"], + "BP_Technical4Seater_Logi_Tan": ["WPMC"], + "BP_Technical4Seater_M134_Black": ["WPMC"], + "BP_Technical4Seater_M134_Grey": ["WPMC"], + "BP_Technical4Seater_M134_Tan": ["WPMC"], + "BP_Technical4Seater_Transport": ["INS"], + "BP_Technical4Seater_Transport_Black": ["WPMC"], + "BP_Technical4Seater_Transport_Grey": ["WPMC"], + "BP_Technical4Seater_Transport_Tan": ["WPMC"], + "BP_Technical_Dshk_INS": ["INS"], + "BP_Technical_Dshk_INS_Armoured": ["INS"], + "BP_Technical_Dshk_MIL": ["IMF"], + "BP_Technical_Dshk_Shielded_INS": ["INS"], + "BP_Technical_Dshk_Shielded_MIL": ["IMF"], + "BP_Technical_Logi_INS": ["INS"], + "BP_Technical_Logi_MIL": ["IMF"], + "BP_Technical_M2_INS": ["INS"], + "BP_Technical_SPG9_INS": ["INS"], + "BP_Technical_SPG9_INS_Armoured": ["INS"], + "BP_Technical_SPG9_MIL": ["IMF"], + "BP_Technical_Transport_INS": ["INS"], + "BP_Technical_Transport_MIL": ["IMF"], + "BP_Technical_UB32_INS": ["INS"], + "BP_Technical_UB32_MIL": ["IMF"], + "BP_Tigr": ["RGF", "IMF"], + "BP_Tigr_Desert": ["RGF"], + "BP_Tigr_MIL": ["IMF"], + "BP_Tigr_RWS": ["RGF"], + "BP_Tigr_RWS_Desert": ["RGF"], + "BP_TLF_Util_Truck": ["TLF"], + "BP_TLF_Util_Truck_Desert": ["TLF"], + "BP_TLF_Util_Truck_Logi": ["TLF"], + "BP_TLF_Util_Truck_Logi_Desert": ["TLF"], + "BP_UH1H": ["TLF", "USMC"], + "BP_UH1H_Desert": ["TLF", "USMC"], + "BP_UH1Y": ["TLF", "USMC"], + "BP_UH1Y_CAS": ["TLF", "USMC"], + "BP_UH60": ["USA"], + "BP_UH60_AUS": ["ADF"], + "BP_UH60_CAS": ["USA", "ADF", "TLF"], + "BP_UH60_M134": ["WPMC"], + "BP_UH60_TLF_PKM": ["TLF"], + "BP_Ural_375": ["RGF"], + "BP_Ural_375_Desert": ["RGF"], + "BP_Ural_375_Green": ["RGF"], + "BP_Ural_375_INS": ["INS"], + "BP_Ural_375_Logi_Desert": ["RGF"], + "BP_Ural_375_Logi_Green": ["RGF"], + "BP_Ural_375_Logi_INS": ["INS"], + "BP_Ural_375_Logi_MIL": ["IMF"], + "BP_Ural_375_Logi_Mil": ["IMF"], + "BP_Ural_375_MIL": ["IMF"], + "BP_Ural_375_Mil": ["IMF"], + "BP_Ural_375_ZU23": ["INS"], + "BP_Ural_375_ZU23_MIL": ["IMF"], + "BP_Ural_4320": ["MEA"], + "BP_Ural_4320_Desert": ["MEA"], + "BP_Ural_4320_logi": ["MEA"], + "BP_Ural_4320_logi_Desert": ["MEA"], + "BP_Ural_4320_logi_MEA": ["MEA"], + "BP_Ural_4320_MEA": ["MEA"], + "BP_USMC_Util_Desert": ["USMC"], + "BP_USMC_Util_Desert_Logi": ["USMC"], + "BP_US_Util_Desert": ["USA"], + "BP_US_Util_Desert_Logi": ["USA"], + "BP_US_Util_USMC_Desert": ["USMC"], + "BP_US_Util_USMC_Desert_Logi": ["USMC"], + "BP_US_Util_USMC_Woodland": ["USMC"], + "BP_US_Util_USMC_Woodland_Logi": ["USMC"], + "BP_US_Util_Woodland": ["USA"], + "BP_US_Util_Woodland_Logi": ["USA"], + "BP_WPMC_Util_Black": ["WPMC"], + "BP_WPMC_Util_Black_Logi": ["WPMC"], + "BP_Z8G": ["PLA", "PLANMC"], + "BP_Z8J": ["PLA", "PLANMC"], + "BP_Z8J_CAS": ["PLA", "PLANMC"], + "BP_ZBD04A": ["PLA", "PLANMC"], + "BP_ZBD04A_Desert": ["PLA", "PLANMC"], + "BP_ZBD05": ["PLA", "PLANMC"], + "BP_ZBD05_HJ73C": ["PLA", "PLANMC"], + "BP_ZBD05_HJ73C_Woodland": ["PLA", "PLANMC"], + "BP_ZBD05_Woodland": ["PLA", "PLANMC"], + "BP_ZBL08": ["PLA", "PLANMC"], + "BP_ZBL08_Desert": ["PLA", "PLANMC"], + "BP_ZBL08_HJ73C": ["PLA", "PLANMC"], + "BP_ZBL08_HJ73C_Desert": ["PLA", "PLANMC"], + "BP_ZBL08_HJ73C_Naval": ["PLA", "PLANMC"], + "BP_ZBL08_Naval": ["PLA", "PLANMC"], + "BP_ZSD05_Logi": ["PLA", "PLANMC"], + "BP_ZSD05_Logi_Woodland": ["PLA", "PLANMC"], + "BP_ZSD05_QJZ-89": ["PLA", "PLANMC"], + "BP_ZSD05_QJZ-89_Woodland": ["PLA", "PLANMC"], + "BP_ZSL10_QJZ-89": ["PLA", "PLANMC"], + "BP_ZSL10_QJZ-89_Desert": ["PLA", "PLANMC"], + "BP_ZSL10_QJZ-89_Naval": ["PLA", "PLANMC"], + "BP_ZTD05": ["PLA", "PLANMC"], + "BP_ZTD05_WoodLand": ["PLA", "PLANMC"], + "BP_ZTZ99": ["PLA", "PLANMC"], + "BP_ZTZ99_Desert": ["PLA", "PLANMC"], + "BP_ZTZ99_Desert_wCage": ["PLA", "PLANMC"], + "BP_ZTZ99_wCage": ["PLA", "PLANMC"] +} \ No newline at end of file diff --git a/squad-server/log-parser/vehicle-damaged.js b/squad-server/log-parser/vehicle-damaged.js new file mode 100644 index 00000000..2f0a8a1d --- /dev/null +++ b/squad-server/log-parser/vehicle-damaged.js @@ -0,0 +1,23 @@ +import VehiclesLookup from './lookup/vehicles-lookup.js'; + +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquadTrace: \[DedicatedServer](?:ASQVehicleSeat::)?TraceAndMessageClient\(\): ([A-z0-9_]+)_C_[0-9]+: ([0-9.]+) damage taken by causer ([A-z0-9_]+)_C_[0-9]+ instigator \(Online Ids: (.+)\) EOS: ([A-z0-9_]+) steam: ([0-9]+) health remaining (-?[0-9.]+)/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + vehicle: args[3], + damage: parseFloat(args[4]), + weapon: args[5], + attackerName: args[6], + attackerEOSID: args[7], + attackerSteamID: args[8], + healthRemaining: parseFloat(args[9]), + vehicleTeams: VehiclesLookup[args[3]] + }; + + logParser.emit('VEHICLE_DAMAGED', data); + } +}; diff --git a/squad-server/lookup/soldier-lookup.js b/squad-server/lookup/soldier-lookup.js new file mode 100644 index 00000000..5cd9058e --- /dev/null +++ b/squad-server/lookup/soldier-lookup.js @@ -0,0 +1,17 @@ +export default { + "ADF": "ADF", + "CAF": "CAF", + "BAF": "BAF", + "INS": "INS", + "MEA": "MEA", + "IMF": "IMF", + "PLA": "PLA", + "PLANMC": "PLANMC", + "RU": "RGF", + "TestTeam": "TestTeam", + "TLF": "TLF", + "USA": "USA", + "USMC": "USMC", + "VDV": "RAF", + "WPMC": "WPMC" +} \ No newline at end of file diff --git a/squad-server/plugins/db-log.js b/squad-server/plugins/db-log.js index f9eacca4..3f80afe8 100644 --- a/squad-server/plugins/db-log.js +++ b/squad-server/plugins/db-log.js @@ -2,6 +2,8 @@ import Sequelize from 'sequelize'; import BasePlugin from './base-plugin.js'; +import FactionSides from './lookup/factions-lookup.js'; + const { DataTypes, QueryTypes } = Sequelize; export default class DBLog extends BasePlugin { @@ -336,6 +338,43 @@ export default class DBLog extends BasePlugin { collate: 'utf8mb4_unicode_ci' } ); + + this.createModel( + 'VehicleDestroy', + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + time: { + type: DataTypes.DATE, + notNull: true + }, + damageTime: { + type: DataTypes.DATE + }, + vehicleName: { + type: DataTypes.STRING + }, + vehicleTeams: { + type: DataTypes.STRING + }, + attackerName: { + type: DataTypes.STRING + }, + attackerTeams: { + type: DataTypes.STRING + }, + teamkill: { + type: DataTypes.BOOLEAN + } + }, + { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci' + } + ); this.models.Server.hasMany(this.models.TickRate, { foreignKey: { name: 'server', allowNull: false }, @@ -366,6 +405,11 @@ export default class DBLog extends BasePlugin { foreignKey: { name: 'server', allowNull: false }, onDelete: 'CASCADE' }); + + this.models.Server.hasMany(this.models.VehicleDestroy, { + foreignKey: { name: 'server', allowNull: false }, + onDelete: 'CASCADE' + }); this.models.Player.hasMany(this.models.Wound, { sourceKey: 'steamID', @@ -409,6 +453,12 @@ export default class DBLog extends BasePlugin { onDelete: 'CASCADE' }); + this.models.Player.hasMany(this.models.VehicleDestroy, { + sourceKey: 'steamID', + foreignKey: { name: 'attacker' }, + onDelete: 'CASCADE' + }); + this.models.Match.hasMany(this.models.TickRate, { foreignKey: { name: 'match' }, onDelete: 'CASCADE' @@ -433,6 +483,11 @@ export default class DBLog extends BasePlugin { foreignKey: { name: 'match' }, onDelete: 'CASCADE' }); + + this.models.Match.hasMany(this.models.VehicleDestroy, { + foreignKey: { name: 'match' }, + onDelete: 'CASCADE' + }); this.onTickRate = this.onTickRate.bind(this); this.onUpdatedA2SInformation = this.onUpdatedA2SInformation.bind(this); @@ -443,6 +498,7 @@ export default class DBLog extends BasePlugin { this.onPlayerRevived = this.onPlayerRevived.bind(this); this.migrateSteamUsersIntoPlayers = this.migrateSteamUsersIntoPlayers.bind(this); this.dropAllForeignKeys = this.dropAllForeignKeys.bind(this); + this.onVehicleDestroy = this.onVehicleDestroy.bind(this); } createModel(name, schema) { @@ -461,6 +517,7 @@ export default class DBLog extends BasePlugin { await this.models.Wound.sync(); await this.models.Death.sync(); await this.models.Revive.sync(); + await this.models.VehicleDestroy.sync(); } async mount() { @@ -482,6 +539,7 @@ export default class DBLog extends BasePlugin { this.server.on('PLAYER_WOUNDED', this.onPlayerWounded); this.server.on('PLAYER_DIED', this.onPlayerDied); this.server.on('PLAYER_REVIVED', this.onPlayerRevived); + this.server.on('VEHICLE_DESTROYED', this.onVehicleDestroy); } async unmount() { @@ -492,6 +550,7 @@ export default class DBLog extends BasePlugin { this.server.removeEventListener('PLAYER_WOUNDED', this.onPlayerWounded); this.server.removeEventListener('PLAYER_DIED', this.onPlayerDied); this.server.removeEventListener('PLAYER_REVIVED', this.onPlayerRevived); + this.server.removeEventListener('VEHICLE_DESTROYED', this.onVehicleDestroy); } async onTickRate(info) { @@ -672,6 +731,46 @@ export default class DBLog extends BasePlugin { reviverSquadID: info.reviver ? info.reviver.squadID : null }); } + + async onVehicleDestroy(info) { + if (!info) return; + const player = this.server.players[this.server.players.findIndex(entry => entry.eosID === info.attackerEOSID)]; + const vehicleTeamsCheck = info.vehicleTeams; + const isTeamkill = (() => { + if (!(player && player.teamName && vehicleTeamsCheck?.length)) return null; + const playerSide = FactionSides[player.teamName]; + if (!playerSide || !vehicleTeamsCheck) return null; + const vehicleSide = []; + if (!typeof vehicleTeamsCheck[Symbol.iterator] === 'function') return null; + for (const vehTeam of vehicleTeamsCheck) { + const vehSide = FactionSides[vehTeam]; + if (vehSide && !vehicleSide.includes(vehSide)) vehicleSide.push(vehSide); + } + if (vehicleSide.includes(playerSide)) return 1.0 / vehicleSide.length > 0.5; // teamkill confidence + else return false; // not in team list + })(); + if (player) await this.models.Player.upsert( + { + eosID: player.eosID, + steamID: player.steamID, + lastName: player.name + }, + { + conflictFields: ['steamID'] + }); + await this.models.VehicleDestroy.create({ + server: this.options.overrideServerID || this.server.id, + match: this.match ? this.match.id : null, + time: info.time, + damageTime: info.time, + vehicleName: info.vehicle ? info.vehicle : null, + vehicleTeams: Array.isArray(vehicleTeamsCheck) && vehicleTeamsCheck.length > 0 ? JSON.stringify(vehicleTeamsCheck) : null, + attacker: player ? player.steamID : null, + attackerName: player ? player.name : null, + attackerTeams: player ? player.teamName : null, + teamkill: isTeamkill + }); + } async onPlayerConnected(info) { await this.models.Player.upsert( diff --git a/squad-server/plugins/lookup/factions-lookup.js b/squad-server/plugins/lookup/factions-lookup.js new file mode 100644 index 00000000..00ea9067 --- /dev/null +++ b/squad-server/plugins/lookup/factions-lookup.js @@ -0,0 +1,16 @@ +export default { + "ADF": "BLUFOR", + "CAF": "BLUFOR", + "BAF": "BLUFOR", + "INS": "INS", + "MEA": "MEATLF", + "IMF": "IMF", + "PLA": "PAC", + "PLANMC": "PAC", + "RGF": "RU", + "TLF": "MEATLF", + "USA": "BLUFOR", + "USMC": "BLUFOR", + "RAF": "RU", + "WPMC": "WPMC" +} \ No newline at end of file diff --git a/squad-server/plugins/socket-io-api.js b/squad-server/plugins/socket-io-api.js index 64a09a35..68af0172 100644 --- a/squad-server/plugins/socket-io-api.js +++ b/squad-server/plugins/socket-io-api.js @@ -30,7 +30,10 @@ const eventsToBroadcast = [ 'PLAYER_WARNED', 'PLAYER_KICKED', 'PLAYER_BANNED', - 'SQUAD_CREATED' + 'SQUAD_CREATED', + 'VEHICLE_DAMAGED', + 'VEHICLE_DESTROYED', + 'PLAYER_POSSESS_SOLDIER' ]; export default class SocketIOAPI extends BasePlugin {