Merge pull request #612 from XLabsProject/develop

Release v2.1.2
This commit is contained in:
Maurice Heumann 2023-02-13 05:55:27 +01:00 committed by GitHub
commit ad0301d770
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 2178 additions and 447 deletions

5
.gitmodules vendored
View File

@ -47,4 +47,7 @@
[submodule "deps/gsc-tool"]
path = deps/gsc-tool
url = https://github.com/xensik/gsc-tool.git
branch = xlabs
branch = dev
[submodule "deps/fmt"]
path = deps/fmt
url = https://github.com/fmtlib/fmt.git

View File

@ -0,0 +1,228 @@
version 7
// Entitlement ID Ranges
// 0 - 299 ???
// 300 - 399 Clan Entitlements
// 400 - 599 ???
// 600 - 699 Clan War Entitlements
// 700 - 799 Generic Elite Entitlements
// Number of keys to read from the key archive
keys_to_read 16
// unlocks in game - type, key index, bit, name, payload...
unlock 0 0 600 //clan wars demon_skull_p
unlock 0 1 601 //clan wars dead_ninja_p
unlock 0 2 602 //clan wars mummy_p
unlock 0 3 603 //clan wars skull_bow_p
unlock 0 4 604 //clan wars cyclops_skull_p
unlock 0 5 605 //clan wars dead_gnome_p
unlock 0 6 606 //clan wars gold_grill_p
unlock 0 7 607 //clan wars pirate_skull_p
unlock 0 8 608 //clan wars gargoyle_p
unlock 0 9 609 //clan wars vulture_p
unlock 0 10 610 //clan wars warrior_mask_p
unlock 0 11 611 //clan wars yeti_p
unlock 0 12 612 //clan wars dead_owl_p
unlock 0 13 613 //clan wars money_bags_p
unlock 0 14 614 //clan wars injured_octopus_p
unlock 0 15 615 //clan wars hotdog_p
unlock 0 16 616 //clan wars crab_p
unlock 0 17 617 //clan wars angry_robot_p
unlock 0 18 618 //clan wars triangle_dot_ret
unlock 0 19 619 //clan wars gold_chain_emb
unlock 0 20 620 //clan wars wing_emb
unlock 0 21 621 //clan wars brass_knuck_emb
unlock 0 22 622 //clan wars ninja_emb
unlock 0 25 623 //clan wars reaper head
unlock 0 26 624 //clan wars merc head
unlock 0 27 625 //clan wars body
unlock 0 28 460 //clan wars diamond division reticle
unlock 0 29 401 //clan wars diamond division camo
unlock 0 30 627 //clan wars diamond division assassin head
unlock 0 31 626 //clan wars diamond division savage head
unlock 0 32 628 //clan wars diamond division body
unlock 3 0 700 //Download the mobile app
unlock 3 1 701 //Founder Skull
unlock 3 4 500 //NEVERSOFT
unlock 3 3 501 //IW
unlock 3 5 502 //RAVEN
unlock 3 7 503 //HIGH_MOON
unlock 3 6 504 //BEACHHEAD
unlock 13 0 209 //monster beast patch
unlock 13 2 210 //monster beast playercard
unlock 13 1 211 //monster viper patch
unlock 13 3 212 //monster viper playercard
unlock 13 4 216 //riley / classic ghost head
unlock 13 30 217 //watcher patch
unlock 13 31 213 //federation patch
unlock 13 32 215 //into the deep patch
unlock 13 33 214 //no man's land patch
//Platform Unlocks
platform 200 255161 //team leader head
platform 201 255161 //team leader playercard
platform 202 255161 //team leader patch
platform 403 255161 //team leader camo
platform 451 255161 //team leader reticle
platform 200 255160 //team leader head
platform 201 255160 //team leader playercard
platform 202 255160 //team leader patch
platform 403 255160 //team leader camo
platform 451 255160 //team leader reticle
platform 206 255162 //insignia playercard
platform 205 255162 //insignia patch
platform 216 255165 //classic ghost character
platform 213 255167 //federation patch
platform 214 255168 //no mans land patch
platform 215 255169 //into the deep patch
platform 207 255163 //digital hardened patch
platform 208 255163 //digital hardened playercard
platform 217 255166 //Steam Patch - The Watcher
platform 222 268100 //festive playercard
platform 221 268100 //festive patch
platform 410 268100 //festive camo
platform 453 268100 //festive reticle
platform 550 268101 //wolf
platform 551 277670 //extra slots
platform 552 277671 // hero character - elias
platform 553 277672 // hero character - hesh
platform 554 277673 // hero character - merrick
platform 555 277674 // hero character - keegan
platform 556 277675 // hero character - price
platform 557 281343 // Hazmat character
platform 558 281340 // Makarov Legend Pack
platform 559 281342 // Rorke Character
platform 560 281341 // Zakhaev Character
platform 561 286632 // Soap Legend Pack
platform 562 286633 // Extinction Squad
platform 563 286634 // TF141
platform 490 277676 // Personalization pack 1 - Ducky
platform 491 277677 // Personalization pack 2 - Blood
platform 492 277678 // Personalization pack 3 - Inferno
platform 493 277679 // Personalization pack 4 - Kittens
platform 494 281344 // Personalization pack 5
platform 495 281345 // Personalization pack 6
platform 496 281346 // Personalization pack 7
platform 497 281347 // Personalization pack 8
platform 498 286630 // Personalization pack 9
platform 499 286631 // Personalization pack 10
platform 510 295430 // Personalization pack 11
platform 511 295431 // Personalization pack 12
platform 512 295432 // Personalization pack 13
platform 513 295433 // Personalization pack 14
platform 515 295434 // Personalization pack 15
platform 516 295435 // Personalization pack 16
platform 517 295439 // Personalization pack 17
platform 518 295440 // Personalization pack 18
platform 519 301111 // Personalization pack 19
platform 520 301112 // Personalization pack 20
platform 521 301113 // Personalization pack 21
platform 522 301114 // Personalization pack 22
platform 523 301110 // Personalization pack Flags
platform 564 295436 // Spectrum Character
platform 565 295437 // Astronaut Character
platform 566 295438 // Resistance Squad
platform 567 309870 // Bluntforce Character
platform 568 309871 // Inferno Character
platform 569 309872 // Bling Character
platform 480 259250 //dlc gun 1
platform 480 301116 //dlc gun 1
platform 481 259250 //dlc gun 1
platform 481 301116 //dlc gun 1
platform 482 259251 //Ripper from Devastation
platform 482 255161 //Ripper from Season Pass
platform 482 301115 //Ripper from mDLC
//Clan Entitlements - ID 300 - 399 - type, bit, entitlement id
clan 0 300
clan 0 301
clan 1 302
clan 2 303
clan 3 304
clan 3 305
clan 3 306
clan 4 307
clan 4 308
clan 4 309
clan 5 310
clan 5 311
clan 6 312
clan 7 313
clan 8 314
clan 8 315
clan 8 316
clan 9 317
clan 10 318
clan 10 319
clan 10 320
clan 10 321
clan 10 322
clan 11 323
clan 12 324
clan 13 325
clan 13 326
clan 13 327
clan 13 328
clan 13 329
clan 14 330
clan 15 331
clan 15 332
clan 15 333
clan 16 334
clan 16 335
clan 16 336
clan 16 337
clan 16 338
clan 17 339
clan 18 340
clan 19 341
clan 19 342
clan 19 343
clan 19 344
clan 20 345
clan 20 346
clan 21 347
clan 21 348
clan 21 349
clan 22 350
clan 23 351
clan 24 352
clan 25 353
clan 26 354
clan 26 355
clan 26 356
clan 26 357
clan 27 358
//Clan Level Challenges - type, required level, challenge id
clanlevelchallenge 23 ch_cam_clan_02 // Kiss of Death Camo
//Clan War Challenges - type, key index, bit offset, challenge id
entitlementchallenge 0 18 ch_ret_clan // clan wars reticle - Triad
entitlementchallenge 0 24 ch_cam_clan_01 // clan wars camo - Body Count

BIN
data/dw/ffotd-1.22.1.ff Normal file

Binary file not shown.

1050
data/dw/lootConfig_tu22.csv Normal file

File diff suppressed because it is too large Load Diff

1
data/dw/mm.cfg Normal file
View File

@ -0,0 +1 @@
XX 0 D150 0 G5 4 F 6 H 60 S 30 B 20 M49152 40 M14336 0 P50 8 P75 16 P100 24 P120 32 P150

BIN
data/dw/playlists_tu22.aggr Normal file

Binary file not shown.

172
data/dw/social_tu22.cfg Normal file
View File

@ -0,0 +1,172 @@
// increment this version number when making changes to the social config
set social_config_version 40
set userGroup_max_retry_time 10000
set elite_clan_active 0
set elite_clan_remote_view_active 0
set elite_clan_emblem_upload_active 0
set dw_presence_active 1
set dw_presence_put_rate 60000
set dw_presence_get_rate 120000
#ifdef MP
set live_qosec_lastupdatems 5000
//set enableServerReporting 1
//set iotd_active 1 // DO NOT TURN ON: it doesn't work on PC
set ca_do_mlc 1
set dsping_dc_0 "101,New,40.54,-74.47,108.61.88.37:10000,108.61.89.108:40000,108.61.89.116:40000,108.61.87.84:40000"
set dsping_dc_1 "102,Chi,41.88,-87.63,108.61.238.217:40000,108.61.238.138:40000,108.61.238.133:40000,108.61.238.130:40000"
set dsping_dc_2 "103,Dal,32.78,-96.8,108.61.239.113:40000,108.61.239.173:40000,108.61.239.177:40000,108.61.239.180:40000"
set dsping_dc_3 "104,Sea,47.61,-122.33,108.61.233.124:40000,108.61.233.100:40000,108.61.233.106:40000,108.61.233.105:40000"
set dsping_dc_4 "105,Los,34.05,-118.24,108.61.234.129:40000,108.61.234.204:40000,108.61.234.187:40000,108.61.234.130:40000"
set dsping_dc_5 "106,Atl,33.75,-84.39,108.61.236.109:40000,108.61.236.153:40000,108.61.236.152:40000,108.61.236.112:40000"
set dsping_dc_6 "107,Ams,52.37,4.9,173.199.64.6:40000,173.199.109.10:40000,173.199.64.13:40000,173.199.64.14:40000"
set dsping_dc_7 "108,Lon,51.51,-0.12,108.61.230.120:10000,108.61.230.152:40000,108.61.230.145:40000,108.61.230.143:40000"
set dsping_dc_8 "109,Fra,50.11,8.68,173.199.105.18:40000,195.122.135.238:40000,195.122.135.97:40000,195.122.135.232:40000"
set dsping_dc_9 "111,Tam,27.7,-82.58,4.79.145.108:40000,4.79.145.111:40000,4.79.145.110:40000,4.79.145.189:40000"
set dsping_dc_10 "112,San,37.34,-121.89,108.61.235.179:40000,108.61.235.112:40000,108.61.235.114:40000,108.61.235.100:40000"
set dsping_dc_11 "113,St.,38.63,-90.2,108.61.232.122:40000,108.61.232.110:40000,108.61.232.109:40000,108.61.232.111:40000"
set dsping_dc_12 "115,Mon,45.51,-73.55,108.61.231.117:40000,108.61.231.106:40000,108.61.231.114:40000,108.61.231.119:40000"
set dsping_dc_13 "119,Syd,-33.87,151.21,108.61.227.109:40000,108.61.227.115:40000,108.61.227.101:40000,108.61.227.107:40000"
set dsping_dc_14 "121,Den,56.04,9.93,108.61.106.30:40000,108.61.106.31:40000"
set dsping_dc_15 "124,Par,48.86,2.35,108.61.237.152:40000,108.61.237.150:40000,108.61.237.200:40000,108.61.237.154:40000"
set dsping_dc_16 "125,Tok,35.69,139.69,173.199.82.235:40000,173.199.82.237:40000,173.199.82.239:40000,173.199.82.246:40000"
set dsping_dc_17 "126,Mos,55.76,37.62,173.199.67.29:40000,173.199.67.32:40000,173.199.67.27:40000"
set dsping_dc_18 "127,War,52.23,21.01,173.199.83.237:40000,173.199.83.227:40000,173.199.83.236:40000,173.199.83.234:40000"
set dsping_dc_19 "129,Mad,40.42,-3.7,93.93.65.202:40000,93.93.65.203:40000,93.93.65.201:40000,93.93.65.200:40000"
set dsping_dc_20 "130,Sao,-23.55,-46.64,189.1.174.20:40000,189.1.174.184:40000"
set dsping_dc_21 "131,Cap,-33.92,18.42,197.84.209.11:40000,197.84.209.12:40000"
set dsping_dc_22 "132,Joh,-26.2,28.05,197.80.212.5:40000,197.80.212.7:40000"
set dsping_dc_23 "133,Mil,45.47,9.19, 108.61.102.20:40000,108.61.102.27:40000"
set ds_pingclient_maxpings 10
set ds_pingclient_minpings 4
set ds_pingclient_maxpings_per_tick 1
set ds_serverConnectTimeout 3000
set ds_listenServerConnectTimeout 10000
set ds_serverAcquireTimeout 2000
set ds_introRequestTimeout 2000
set ds_serverListExpiryPeriod 60000
set ds_serverAcquisitionPeriod 7000
set max_party_share_ds_pings 8
set dc_lobbymerge 1
set s_avg_max_weighting 0
#endif
//set motd_store_link 1 // Ghost has this line active, not referenced in code
set mm_skill_lower_bucket 806
set mm_skill_upper_bucket 1051
set mm_feed_performance 1
#ifdef MP
set past_title_data_active 0
set past_title_data_read_failure_interval_hours 72
set past_title_data_read_success_interval_hours 192
#endif
set mm_skill_enforcement 0
set mm_use_onboarding_skill 1
set mm_bucket_option 1 // isolate onboarding pool
set comscore_active 1
#ifdef MP
set enable_emblemAppDownload 0
set marketing_active 0
set emblems_active 0
set selfie_active 0
#endif
set enable_video_options_preload_shader_controls 1
// ChurnScore
set churnscore_scaling_param1 818.1
set churnscore_scaling_param2 6288.3
set churnscore_scoring_param1 3.53478575181172
set churnscore_scoring_multiplier_totalkillscap -0.527447816986428
set churnscore_scoring_multiplier_gameperformance -0.32373506559784
set churnscore_scoring_multiplier_daysbetweentitles 0.00058954962393
set churnscore_scoring_multiplier_previoustitlematches -0.00003043977270
set churnscore_scoring_multiplier_currenttitlematches -0.00112090114056
set churnscore_scoring_multiplier_dayssincelaunch 0
set churnscore_scoring_multiplier_disconnectflag 1.02002532365439
set churnscore_scoring_multiplier_spflag -0.06442491477533
set churnscore_scoring_multiplier_timesincelastmatch 5.94629549261903E-07
// RedeemCoupons
set inventory_taskRedeemCouponTimeout 10.0 // in sec
set inventory_fullRedeemCouponTimeout 15000 // in ms
set inventory_handleRedeemCouponErrorAsSuccess 1
set inventory_handleRedeemCouponErrorCode 8045
set inventory_ignoreOldPushNotifications 1
set inventory_maxRewardRollsClaimed 35
// DLC
set inventory_exchangeRetryMax 1
set useCPMarkerForCPOwnership 1
set earlyAccessDLC 3
set inventory_handleRedeemCouponErrorAsSuccess 1
set inventory_handleRedeemCouponErrorCode 8045
set inventory_ignoreOldPushNotifications 1
set igs_version 10
set igs_config_dw_filename "winStoreConfig_tu22.csv"
set armory_contentpacks_enabled 5
set msg_field_delta2 0 // matched in socialds
// DAILY Challenges
set dailychallenge_killswitch 1727554559 // all enabled
set dailychallenge_killswitch2 2041 // all enabled
// Ranked Play
set rankedPlaylistLockoutDuration 900
set rankedPlayEndMatchKeepLobby 1
set scr_game_season 10 // matched in socialds
set zombiesAllowSoloPause 1
set csdRewardRanks32 537395200
set csdRewardRanks64 128
//Skill-Based Matchmaking Control
set mm_skill_param_xi 1.0341387
set mm_skill_param_lambda 0.1631656
set mm_skill_param_gamma -0.02225907
set mm_skill_param_delta 0.8303422
set prestige30EasterEggEnabled 1
set enableS1TUSpawnSightTraces 1 // matched in socialds
//Special Base Weapon Killswitch
set baseWeaponsKillswitch "" // matched in socialds
// Loot Config
set lootConfig_dw_enabled 1
set lootConfig_dw_filename "lootConfig_tu22.csv"
set lootConfig_redeem_xp "500,1000,2000,4000,3000"
set lootConfig_redeem_codpoint "500,1000,2000,4000,3000"
set codPointStore_enabled 0
set codPointStore_dw_filename "codPointStoreConfig_tu22.csv"
// must match socialds
set bg_customization_gearSetBonusEnabled 1
set bg_customization_gearSetBonusXP .05
set bg_customization_gearSetKillswitch_1 16777215
set bg_customization_gearSetKillswitch_2 16777215
set bg_customization_gearSetKillswitch_3 16646143
set bg_customization_gearSetKillswitch_4 12582399
set bg_customization_gearSetKillswitch_5 16777215
//Redeem 50 Duplicate
set lui_loot_duplicateredemption 0

View File

@ -0,0 +1,206 @@
#Game Language to offerids mapping
#english,EN
#french,FR
#frenchcan,FR
#german,DE-LV
#austrian,DE-FV
#italian,IT
#spanish,ES
#british,EN
#russian,RU
#polish,PL
#korean,EN
#japanese,EN-JA
#fulljap,JA
#visibility refer to igsProductVisibility_e
# 0 - Visible Always
# 1 - Hide Always ( Hide in store and in Front End )
# 2 - Visible for season pass holders ( Hide in store if player does not own season pass )
# 3 - Visible for non season pass holders ( Hide in store if player owns season pass )
# 4 - Hide in CAC / CAO ( Show in Store,Hide in Front End )
# 5 - Early Access ( Hide in the store,Show in Front End )
version,version_id,10
#type = product,UID,Product ID,Image Name,dlcName,category,#Language List separated by space delimiter,#visibility,#productgroup,#seenIndex,#name
product,product_1,317660,img_store_season_pass,seasonpass,seasonpass,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0,,,# Season Pass
product,product_2,318791,img_store_mappacks_havok,dlc2,mappacks,all,0,,,# Havoc
product,product_3,318792,img_store_mappacks_ascendance,dlc3,mappacks,all,0,,32,# Ascendance
product,product_4,318793,img_store_mappacks_supremacy,dlc4,mappacks,all,0,,,# Supremacy
product,product_5,318794,img_store_mappacks_reckoning,dlc5,mappacks,all,0,,,# Reckoning
# MDLC 2.5 - Standard Packs
product,product_137,343596,img_store_personpacks_ice,mdlc62,personpacks,all,0,,34,# Ice Pack
product,product_138,343597,img_store_personpacks_disco,mdlc63,personpacks,all,0,,35,# Disco Pack
product,product_139,343598,img_store_personpacks_cards,mdlc64,personpacks,all,0,,36,# Cards Pack
product,product_140,343599,img_store_personpacks_jackpot,mdlc65,personpacks,all,0,,37,# Jackpot Pack
product,product_141,343590,img_store_personpacks_blackout,mdlc66,personpacks,all,1,,38,# BLOPS3 Pack
# MDLC 2 - Standard Packs
product,product_6,343591,img_store_personpacks_tiki,mdlc34,personpacks,all,0,,,# Tiki
product,product_7,343592,img_store_personpacks_gasfire,mdlc35,personpacks,all,0,,,# Gas Fire
product,product_8,343593,img_store_personpacks_leaf,mdlc36,personpacks,all,0,,,# Leaf
product,product_9,343594,img_store_personpacks_psych,mdlc37,personpacks,all,0,,,# Psychadelic
product,product_10,331060,img_store_personpacks_magma,mdlc7,personpacks,all,0,,,# Magma
product,product_11,331061,img_store_personpacks_lightning,mdlc8,personpacks,all,0,,,# Lightning
product,product_12,331062,img_store_personpacks_hide,mdlc9,personpacks,all,0,,,# Hide
product,product_13,331063,img_store_personpacks_nanotech,mdlc10,personpacks,all,0,,,# Nanotech
# MDLC 2.5 Premium Personalization Packs
product,product_136,343590,img_store_personpacks_premium_blackout,mdlc61,PREMPERSONPACKS,all,1,,33,# BLOPS3 Prem Pack
# MDLC 2 - Premium Personalization Packs
product,product_14,343596,img_store_personpacks_premium_tiki,mdlc38,prempersonpacks,all,1,,,# Premium Tiki
product,product_15,343597,img_store_personpacks_premium_gasfire,mdlc39,prempersonpacks,all,1,,,# Premium Gas Fire
product,product_16,343598,img_store_personpacks_premium_leaf,mdlc40,prempersonpacks,all,1,,,# Premium Leaf
product,product_17,343599,img_store_personpacks_premium_psych,mdlc41,prempersonpacks,all,1,,,# Premium Psychadelic
product,product_18,343600,img_store_personpacks_premium_cod_champs,mdlc42,prempersonpacks,all,0,,,# Premium Cod Champs
product,product_19,331064,img_store_personpacks_premium_magma,mdlc11,prempersonpacks,all,0,,,# Premium Magma
product,product_20,331065,img_store_personpacks_premium_lightning,mdlc12,prempersonpacks,all,0,,,# Premium Lightning
product,product_21,331066,img_store_personpacks_premium_hide,mdlc13,prempersonpacks,all,0,,,# Premium Hide
product,product_22,331067,img_store_personpacks_premium_nanotech,mdlc14,prempersonpacks,all,0,,,# Premium Nanotech
# MDLC 2 - Exo Packs
product,product_23,343601,img_store_operatorpacks_cowboy,mdlc101,operatorpacks,all,1,,,# Cowboy
product,product_24,343602,img_store_operatorpacks_surfer,mdlc43,operatorpacks,all,1,,,# Surfer
product,product_25,343604,img_store_operatorpacks_octopus,mdlc45,operatorpacks,all,1,,,# Octopus
# MDLC 2 - Lady Gear Exo Packs
product,product_26,345600,img_store_operatorpacks_rose_camo,mdlc59,OPERATORPACKS,all,1,,,# Rose Camo / Passionate
product,product_27,345601,img_store_operatorpacks_white_blue,mdlc60,OPERATORPACKS,all,1,,,# White Blue / Tenacious
product,product_28,5f3f93ca-03ab-4fdd-aa00-63f17fb08d79,img_store_operatorpacks_steam_punk,mdlc15,operatorpacks,all,0,,,# Steam Punk
product,product_29,beb1715c-5825-4ae3-844d-1f72231f9306,img_store_operatorpacks_panda,mdlc16,operatorpacks,all,0,,,# Panda
product,product_30,05e1b887-e323-4aaf-b95b-12e9512f76aa,img_store_operatorpacks_bali_mask,mdlc17,operatorpacks,all,0,,,#Bali Mask
product,product_31,33c64260-e212-4794-8abe-9810f04471e7,img_store_operatorpacks_classic_biker,mdlc18,operatorpacks,all,0,,,#Classic Biker
# MDLC 2 - Flags
product,product_32,334460,img_store_flag_packs_argentinia,mdlc46,flagpacks,all,1,,,# Argentina Flag
product,product_33,343605,img_store_flag_packs_austria,mdlc47,flagpacks,all,1,,,# Austria Flag
product,product_34,333086,img_store_flag_packs_brazil,mdlc26,flagpacks,all,1,,,# Brazil Flag
product,product_35,343606,img_store_flag_packs_columbia,mdlc48,flagpacks,all,1,,,# Columbia Flag
product,product_36,343607,img_store_flag_packs_ireland,mdlc49,flagpacks,all,1,,,# Ireland Flag
product,product_37,343608,img_store_flag_packs_new_zealand,mdlc50,flagpacks,all,1,,,# New Zealand Flag
product,product_38,343609,img_store_flag_packs_portugal,mdlc51,flagpacks,all,1,,,# Portugal Flag
product,product_39,331072,img_store_flag_packs_usa,mdlc19,flagpacks,all,0,,,# USA Flag
product,product_40,333080,img_store_flag_packs_uk,mdlc20,flagpacks,all,0,,,# UK Flag
product,product_41,333081,img_store_flag_packs_canada,mdlc21,flagpacks,all,0,,,# Canada Flag
product,product_42,333082,img_store_flag_packs_france,mdlc22,flagpacks,all,0,,,# France Flag
product,product_43,333083,img_store_flag_packs_germany,mdlc23,flagpacks,all,0,,,# Germany Flag
product,product_44,333084,img_store_flag_packs_australia,mdlc24,flagpacks,all,0,,,# Australia Flag
product,product_45,333087,img_store_flag_packs_italy,mdlc27,flagpacks,all,0,,,# Italy Flag
product,product_46,333088,img_store_flag_packs_spain,mdlc28,flagpacks,all,0,,,# Spain Flag
product,product_47,334220,img_store_flag_packs_netherlands,mdlc29,flagpacks,all,0,,,# Netherlands Flag
product,product_48,334221,img_store_flag_packs_japan,mdlc30,flagpacks,all,0,,,# Japan Flag
product,product_49,343610,img_store_cac_slots,mdlc52,otheritems,all,0,,,# Create A Class Slots
product,product_50,343612,img_store_armory_slots1,mdlc54,otheritems,all,0,armoryslots,,# Armory Slots
product,product_51,343613,img_store_armory_slots2,mdlc55,otheritems,all,0,armoryslots,,# Armory Slots
product,product_52,343614,img_store_armory_slots3,mdlc56,otheritems,all,0,armoryslots,,# Armory Slots
product,product_53,343615,img_store_armory_slots4,mdlc57,otheritems,all,0,armoryslots,,# Armory Slots
product,product_54,343616,img_store_armory_slots5,mdlc58,otheritems,all,0,armoryslots,,# Armory Slots
product,product_55,318790,img_store_mappacks_atlas_gorge,dlc1,otheritems,all,0,,,# Atlas Gorge
product,product_56,00000,img_store_supplydrops_1,supdrp61,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_57,76a554fb-c4b4-4a3e-b913-dcd0c61de638,img_store_supplydrops_1,supdrp62,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_58,ed37f45c-1d3c-451c-87c3-0bb46ca51fa6,img_store_supplydrops_1,supdrp63,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_59,518865ed-dfae-4d8a-836e-e0e5dc2c3d08,img_store_supplydrops_1,supdrp64,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_60,3b9f4478-900d-43f9-b4b1-eb1f901ce961,img_store_supplydrops_1,supdrp65,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_61,f20bfb05-cca9-4a61-971b-c6c620b928b0,img_store_supplydrops_1,supdrp66,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_62,a75ee2b8-42f6-46b1-a45f-db6e64a98872,img_store_supplydrops_1,supdrp67,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_63,20f97f87-52a7-461e-8b78-9a54080bd400,img_store_supplydrops_1,supdrp68,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_64,f03ad620-bc8a-4f4f-a3b0-3630347b8a30,img_store_supplydrops_1,supdrp69,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_65,ebe31b71-f8cc-4f0d-9915-6a13d53af74b,img_store_supplydrops_1,supdrp70,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
product,product_111,b05003d8-bf77-4d04-a0cc-d8a36425b813,img_store_supplydrops_1,supdrp72,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
product,product_112,2b7b516c-8e7e-45b7-92fd-dc2040c08d6e,img_store_supplydrops_1,supdrp73,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
product,product_113,5de14218-1543-4fc5-ae89-eb4037109234,img_store_supplydrops_1,supdrp74,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
product,product_114,3404d799-4341-46de-95ea-c6bdd47c8e39,img_store_supplydrops_1,supdrp75,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
product,product_115,3f05faaf-a59b-4807-ad58-0bd28f520cc9,img_store_supplydrops_1,supdrp76,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
product,product_66,6031ecd6-a183-4c71-9022-9685dde26ebd,img_store_supplydrops_3,supdrp91,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_67,6aebd756-0b60-4ad4-8639-d27db2ae79e0,img_store_supplydrops_3,supdrp92,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_68,93a0c86c-c7af-464c-88d7-6e0519d482f4,img_store_supplydrops_3,supdrp93,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_69,6ca3fa67-8844-4128-89e0-8d4b7b8c5e3a,img_store_supplydrops_3,supdrp94,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_70,55c76436-50d8-401e-8761-b9ceeb18c7c4,img_store_supplydrops_3,supdrp95,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_71,844742d6-baa0-4079-892e-649a45564b56,img_store_supplydrops_3,supdrp96,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_72,605fb575-1482-4e0f-8934-165e290d26ca,img_store_supplydrops_3,supdrp97,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_73,64d0e219-b602-4906-b714-895d020bae2a,img_store_supplydrops_3,supdrp98,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_74,fc0e23af-fc91-4711-b3ca-a45c3ab03049,img_store_supplydrops_3,supdrp99,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_75,e9886801-697b-4b40-93bd-6f9b37b6102b,img_store_supplydrops_3,supdrp100,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
product,product_116,3c32e23a-514d-487c-9733-c9c8ec6fd55b,img_store_supplydrops_3,supdrp77,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
product,product_117,906884d7-2864-4cd2-b725-1129c111abab,img_store_supplydrops_3,supdrp78,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
product,product_118,28e9c053-da80-4f8a-b1b3-26cf9e6cad59,img_store_supplydrops_3,supdrp79,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
product,product_119,13668620-fb95-4e3b-b15b-05ca33cb90dc,img_store_supplydrops_3,supdrp80,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
product,product_120,e9e772ce-aeb5-4831-9672-f2ab1c0459f5,img_store_supplydrops_3,supdrp81,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
product,product_76,156f40b5-3683-4c26-a6d0-f2358701df53,img_store_supplydrops_5,supdrp71,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_77,3ec7cec9-91ff-4931-8785-e7092495c5cb,img_store_supplydrops_5,supdrp72,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_78,29af6a13-c4ce-469c-aee1-82bdcef9307f,img_store_supplydrops_5,supdrp73,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_79,92334032-5350-4319-ad0b-a5dac31e491f,img_store_supplydrops_5,supdrp74,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_80,9974b492-3253-4873-97cc-68a47117f09f,img_store_supplydrops_5,supdrp75,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_81,d3a71cec-ceb3-452a-baa1-97ce8360cee8,img_store_supplydrops_5,supdrp76,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_82,93e9ba95-0738-4302-9880-33774f4e4b2a,img_store_supplydrops_5,supdrp77,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_83,5998caba-5f9f-475c-bc45-a4f2d9386105,img_store_supplydrops_5,supdrp78,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_84,5afa84ac-abe3-4db9-917e-29933134d4be,img_store_supplydrops_5,supdrp79,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_85,4f7350d9-90aa-4f91-a974-8fe399280d7c,img_store_supplydrops_5,supdrp80,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
product,product_121,19938ec4-0047-4d17-8002-97c6584413fa,img_store_supplydrops_5,supdrp82,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
product,product_122,e2bb0ca8-66cc-4658-a34c-0c80babdb0df,img_store_supplydrops_5,supdrp83,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
product,product_123,411f8663-77fd-4821-8eef-8e213ba1f4ed,img_store_supplydrops_5,supdrp84,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
product,product_124,2a9140a1-946b-4a07-a790-6f7d4ee541d7,img_store_supplydrops_5,supdrp85,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
product,product_125,af7f50e7-dc1b-4b14-b78d-61ae560b2a00,img_store_supplydrops_5,supdrp86,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
product,product_86,5de0f259-b94b-40a9-a2ea-dba2f95f8b87,img_store_supplydrops_10,supdrp81,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_87,89f452a5-5c6f-4d8e-a203-35de25a73805,img_store_supplydrops_10,supdrp82,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_88,c503ee82-39c2-4a0e-93fe-e9acfc846a81,img_store_supplydrops_10,supdrp83,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_89,e2c670f6-567b-4bd1-ae36-c2f039e22add,img_store_supplydrops_10,supdrp84,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_90,b38a63b5-2c14-445f-a9d7-31ad59b4fe5c,img_store_supplydrops_10,supdrp85,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_91,8c448893-0809-4c4f-be73-fa574be15333,img_store_supplydrops_10,supdrp86,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_92,82a96d7b-859b-46a9-a7c7-ba082558066b,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_93,9bc7070b-4a5a-4d39-9957-734eafd3f8e0,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_94,dda9be88-d5cc-4827-aecf-40e9598f4adb,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_95,4067a17b-23c7-4999-a514-8ed9041e8a02,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
product,product_126,10cd1171-2eb4-4dcb-a281-372b747319f6,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
product,product_127,8706ff47-4cc7-4957-a4f3-d9589be39d78,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
product,product_128,ff9063ee-79ef-4b4a-8e22-df83f700e292,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
product,product_129,31cdd8b7-2c6a-414b-8e02-a2d7f6f64f12,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
product,product_130,de53b351-a6ab-4089-a30b-0396f6fad455,img_store_supplydrops_10,supdrp91,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
# Consumable Supply Drops
product,product_96,c5f202f9-3386-4d8b-9f5f-fc4f16f78ed3,img_store_supplydrops_1,supdrp46,supplydrops_v2,all,1,,26,# Consumable Supply Drops 1
product,product_97,0463b195-81cb-43c8-87a4-814043492ac1,img_store_supplydrops_3,supdrp50,supplydrops_v2,all,1,,27,# Consumable Supply Drops 3
product,product_98,ef8577d9-0cab-433d-8955-8dd96089218e,img_store_supplydrops_5,supdrp47,supplydrops_v2,all,1,,28,# Consumable Supply Drops 5
product,product_99,4b49d2af-d9ed-4f4a-8aa1-0fc3c2e70f87,img_store_supplydrops_10,supdrp48,supplydrops_v2,all,1,,29,# Consumable Supply Drops 10
product,product_100,ca0012ef-1206-4173-8979-d2d4f3d66a57,img_store_supplydrops_20,supdrp71,supplydrops_v2,all,1,,31,# Consumable Supply Drops 20
# More Durable Supply Drops
product,product_101,48a1c3f1-c47f-4752-95c8-658630e29cd1,img_store_supplydrops_20,supdrp61,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_102,e0556d68-6bbf-4fce-affb-28c4eec8eb25,img_store_supplydrops_20,supdrp62,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_103,d627860d-bf3a-4972-9eb5-51a68bf4eb44,img_store_supplydrops_20,supdrp63,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_104,641bb491-7dda-42c9-850f-a9d6774236a0,img_store_supplydrops_20,supdrp64,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_105,c53a24c9-c07b-468d-bbc5-1d57ccdfd82c,img_store_supplydrops_20,supdrp65,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_106,fcc7f36b-3158-4129-a13d-8437924eb9ee,img_store_supplydrops_20,supdrp66,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_107,a21a0bda-abed-47a2-9d97-40bede8bfd7b,img_store_supplydrops_20,supdrp67,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_108,c7492ab3-7a7c-46d7-8efd-2a6ecd844dd7,img_store_supplydrops_20,supdrp68,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_109,e6a955fb-c723-42f7-b391-615dce049592,img_store_supplydrops_20,supdrp69,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_110,a4f8bf5c-4af4-4f4b-9996-e0816475ff6b,img_store_supplydrops_20,supdrp70,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_131,0b917713-e3a1-406b-9a61-dd1afa2212f5,img_store_supplydrops_20,supdrp92,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_132,69377444-37e1-4b99-8008-376a1da8d886,img_store_supplydrops_20,supdrp93,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_133,c3ae1aee-1445-4601-9577-033496317972,img_store_supplydrops_20,supdrp94,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_134,7d66fdd5-ebac-4893-be48-439867faccda,img_store_supplydrops_20,supdrp95,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
product,product_135,466f1cd8-ce9e-4ee8-ad7b-79d9e8c4e57b,img_store_supplydrops_20,supdrp96,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
#MDLC 4 OHM Standalone
product,product_142,343595,img_store_ohm,mdlc70,OTHERITEMS,all,0,,,#OHM Standalone Pack
#type = category,UID,category ID,title,Language List separated by space delimiter,visibility (0-show,1-hide)
category,category_1,1,seasonpass,LUA_MENU_STORE_SEASON_PASS,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0
category,category_2,2,mappacks,LUA_MENU_STORE_MAP_PACKS,all,0
category,category_3,3,prempersonpacks,LUA_MENU_STORE_PREMIUM_PERSONALIZATION_PACKS,all,0
category,category_4,4,personpacks,LUA_MENU_STORE_PERSONALIZATION_PACKS,all,0
category,category_5,5,operatorpacks,LUA_MENU_STORE_PREMIUM_EXO_PACKS,all,0
category,category_6,6,flagpacks,LUA_MENU_STORE_EXO_PACKS,all,0
category,category_7,7,supplydrops,LUA_MENU_STORE_SUPPLYDROPS,all,1
category,category_8,8,otheritems,LUA_MENU_STORE_ADDITIONAL_ITEMS,all,0
1 #Game Language to offerids mapping
2 #english,EN
3 #french,FR
4 #frenchcan,FR
5 #german,DE-LV
6 #austrian,DE-FV
7 #italian,IT
8 #spanish,ES
9 #british,EN
10 #russian,RU
11 #polish,PL
12 #korean,EN
13 #japanese,EN-JA
14 #fulljap,JA
15 #visibility refer to igsProductVisibility_e
16 # 0 - Visible Always
17 # 1 - Hide Always ( Hide in store and in Front End )
18 # 2 - Visible for season pass holders ( Hide in store if player does not own season pass )
19 # 3 - Visible for non season pass holders ( Hide in store if player owns season pass )
20 # 4 - Hide in CAC / CAO ( Show in Store,Hide in Front End )
21 # 5 - Early Access ( Hide in the store,Show in Front End )
22 version,version_id,10
23 #type = product,UID,Product ID,Image Name,dlcName,category,#Language List separated by space delimiter,#visibility,#productgroup,#seenIndex,#name
24 product,product_1,317660,img_store_season_pass,seasonpass,seasonpass,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0,,,# Season Pass
25 product,product_2,318791,img_store_mappacks_havok,dlc2,mappacks,all,0,,,# Havoc
26 product,product_3,318792,img_store_mappacks_ascendance,dlc3,mappacks,all,0,,32,# Ascendance
27 product,product_4,318793,img_store_mappacks_supremacy,dlc4,mappacks,all,0,,,# Supremacy
28 product,product_5,318794,img_store_mappacks_reckoning,dlc5,mappacks,all,0,,,# Reckoning
29 # MDLC 2.5 - Standard Packs
30 product,product_137,343596,img_store_personpacks_ice,mdlc62,personpacks,all,0,,34,# Ice Pack
31 product,product_138,343597,img_store_personpacks_disco,mdlc63,personpacks,all,0,,35,# Disco Pack
32 product,product_139,343598,img_store_personpacks_cards,mdlc64,personpacks,all,0,,36,# Cards Pack
33 product,product_140,343599,img_store_personpacks_jackpot,mdlc65,personpacks,all,0,,37,# Jackpot Pack
34 product,product_141,343590,img_store_personpacks_blackout,mdlc66,personpacks,all,1,,38,# BLOPS3 Pack
35 # MDLC 2 - Standard Packs
36 product,product_6,343591,img_store_personpacks_tiki,mdlc34,personpacks,all,0,,,# Tiki
37 product,product_7,343592,img_store_personpacks_gasfire,mdlc35,personpacks,all,0,,,# Gas Fire
38 product,product_8,343593,img_store_personpacks_leaf,mdlc36,personpacks,all,0,,,# Leaf
39 product,product_9,343594,img_store_personpacks_psych,mdlc37,personpacks,all,0,,,# Psychadelic
40 product,product_10,331060,img_store_personpacks_magma,mdlc7,personpacks,all,0,,,# Magma
41 product,product_11,331061,img_store_personpacks_lightning,mdlc8,personpacks,all,0,,,# Lightning
42 product,product_12,331062,img_store_personpacks_hide,mdlc9,personpacks,all,0,,,# Hide
43 product,product_13,331063,img_store_personpacks_nanotech,mdlc10,personpacks,all,0,,,# Nanotech
44 # MDLC 2.5 Premium Personalization Packs
45 product,product_136,343590,img_store_personpacks_premium_blackout,mdlc61,PREMPERSONPACKS,all,1,,33,# BLOPS3 Prem Pack
46 # MDLC 2 - Premium Personalization Packs
47 product,product_14,343596,img_store_personpacks_premium_tiki,mdlc38,prempersonpacks,all,1,,,# Premium Tiki
48 product,product_15,343597,img_store_personpacks_premium_gasfire,mdlc39,prempersonpacks,all,1,,,# Premium Gas Fire
49 product,product_16,343598,img_store_personpacks_premium_leaf,mdlc40,prempersonpacks,all,1,,,# Premium Leaf
50 product,product_17,343599,img_store_personpacks_premium_psych,mdlc41,prempersonpacks,all,1,,,# Premium Psychadelic
51 product,product_18,343600,img_store_personpacks_premium_cod_champs,mdlc42,prempersonpacks,all,0,,,# Premium Cod Champs
52 product,product_19,331064,img_store_personpacks_premium_magma,mdlc11,prempersonpacks,all,0,,,# Premium Magma
53 product,product_20,331065,img_store_personpacks_premium_lightning,mdlc12,prempersonpacks,all,0,,,# Premium Lightning
54 product,product_21,331066,img_store_personpacks_premium_hide,mdlc13,prempersonpacks,all,0,,,# Premium Hide
55 product,product_22,331067,img_store_personpacks_premium_nanotech,mdlc14,prempersonpacks,all,0,,,# Premium Nanotech
56 # MDLC 2 - Exo Packs
57 product,product_23,343601,img_store_operatorpacks_cowboy,mdlc101,operatorpacks,all,1,,,# Cowboy
58 product,product_24,343602,img_store_operatorpacks_surfer,mdlc43,operatorpacks,all,1,,,# Surfer
59 product,product_25,343604,img_store_operatorpacks_octopus,mdlc45,operatorpacks,all,1,,,# Octopus
60 # MDLC 2 - Lady Gear Exo Packs
61 product,product_26,345600,img_store_operatorpacks_rose_camo,mdlc59,OPERATORPACKS,all,1,,,# Rose Camo / Passionate
62 product,product_27,345601,img_store_operatorpacks_white_blue,mdlc60,OPERATORPACKS,all,1,,,# White Blue / Tenacious
63 product,product_28,5f3f93ca-03ab-4fdd-aa00-63f17fb08d79,img_store_operatorpacks_steam_punk,mdlc15,operatorpacks,all,0,,,# Steam Punk
64 product,product_29,beb1715c-5825-4ae3-844d-1f72231f9306,img_store_operatorpacks_panda,mdlc16,operatorpacks,all,0,,,# Panda
65 product,product_30,05e1b887-e323-4aaf-b95b-12e9512f76aa,img_store_operatorpacks_bali_mask,mdlc17,operatorpacks,all,0,,,#Bali Mask
66 product,product_31,33c64260-e212-4794-8abe-9810f04471e7,img_store_operatorpacks_classic_biker,mdlc18,operatorpacks,all,0,,,#Classic Biker
67 # MDLC 2 - Flags
68 product,product_32,334460,img_store_flag_packs_argentinia,mdlc46,flagpacks,all,1,,,# Argentina Flag
69 product,product_33,343605,img_store_flag_packs_austria,mdlc47,flagpacks,all,1,,,# Austria Flag
70 product,product_34,333086,img_store_flag_packs_brazil,mdlc26,flagpacks,all,1,,,# Brazil Flag
71 product,product_35,343606,img_store_flag_packs_columbia,mdlc48,flagpacks,all,1,,,# Columbia Flag
72 product,product_36,343607,img_store_flag_packs_ireland,mdlc49,flagpacks,all,1,,,# Ireland Flag
73 product,product_37,343608,img_store_flag_packs_new_zealand,mdlc50,flagpacks,all,1,,,# New Zealand Flag
74 product,product_38,343609,img_store_flag_packs_portugal,mdlc51,flagpacks,all,1,,,# Portugal Flag
75 product,product_39,331072,img_store_flag_packs_usa,mdlc19,flagpacks,all,0,,,# USA Flag
76 product,product_40,333080,img_store_flag_packs_uk,mdlc20,flagpacks,all,0,,,# UK Flag
77 product,product_41,333081,img_store_flag_packs_canada,mdlc21,flagpacks,all,0,,,# Canada Flag
78 product,product_42,333082,img_store_flag_packs_france,mdlc22,flagpacks,all,0,,,# France Flag
79 product,product_43,333083,img_store_flag_packs_germany,mdlc23,flagpacks,all,0,,,# Germany Flag
80 product,product_44,333084,img_store_flag_packs_australia,mdlc24,flagpacks,all,0,,,# Australia Flag
81 product,product_45,333087,img_store_flag_packs_italy,mdlc27,flagpacks,all,0,,,# Italy Flag
82 product,product_46,333088,img_store_flag_packs_spain,mdlc28,flagpacks,all,0,,,# Spain Flag
83 product,product_47,334220,img_store_flag_packs_netherlands,mdlc29,flagpacks,all,0,,,# Netherlands Flag
84 product,product_48,334221,img_store_flag_packs_japan,mdlc30,flagpacks,all,0,,,# Japan Flag
85 product,product_49,343610,img_store_cac_slots,mdlc52,otheritems,all,0,,,# Create A Class Slots
86 product,product_50,343612,img_store_armory_slots1,mdlc54,otheritems,all,0,armoryslots,,# Armory Slots
87 product,product_51,343613,img_store_armory_slots2,mdlc55,otheritems,all,0,armoryslots,,# Armory Slots
88 product,product_52,343614,img_store_armory_slots3,mdlc56,otheritems,all,0,armoryslots,,# Armory Slots
89 product,product_53,343615,img_store_armory_slots4,mdlc57,otheritems,all,0,armoryslots,,# Armory Slots
90 product,product_54,343616,img_store_armory_slots5,mdlc58,otheritems,all,0,armoryslots,,# Armory Slots
91 product,product_55,318790,img_store_mappacks_atlas_gorge,dlc1,otheritems,all,0,,,# Atlas Gorge
92 product,product_56,00000,img_store_supplydrops_1,supdrp61,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
93 product,product_57,76a554fb-c4b4-4a3e-b913-dcd0c61de638,img_store_supplydrops_1,supdrp62,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
94 product,product_58,ed37f45c-1d3c-451c-87c3-0bb46ca51fa6,img_store_supplydrops_1,supdrp63,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
95 product,product_59,518865ed-dfae-4d8a-836e-e0e5dc2c3d08,img_store_supplydrops_1,supdrp64,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
96 product,product_60,3b9f4478-900d-43f9-b4b1-eb1f901ce961,img_store_supplydrops_1,supdrp65,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
97 product,product_61,f20bfb05-cca9-4a61-971b-c6c620b928b0,img_store_supplydrops_1,supdrp66,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
98 product,product_62,a75ee2b8-42f6-46b1-a45f-db6e64a98872,img_store_supplydrops_1,supdrp67,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
99 product,product_63,20f97f87-52a7-461e-8b78-9a54080bd400,img_store_supplydrops_1,supdrp68,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
100 product,product_64,f03ad620-bc8a-4f4f-a3b0-3630347b8a30,img_store_supplydrops_1,supdrp69,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
101 product,product_65,ebe31b71-f8cc-4f0d-9915-6a13d53af74b,img_store_supplydrops_1,supdrp70,supplydrops,all,1,supplydrops_1,,# Supply Drops 1
102 product,product_111,b05003d8-bf77-4d04-a0cc-d8a36425b813,img_store_supplydrops_1,supdrp72,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
103 product,product_112,2b7b516c-8e7e-45b7-92fd-dc2040c08d6e,img_store_supplydrops_1,supdrp73,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
104 product,product_113,5de14218-1543-4fc5-ae89-eb4037109234,img_store_supplydrops_1,supdrp74,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
105 product,product_114,3404d799-4341-46de-95ea-c6bdd47c8e39,img_store_supplydrops_1,supdrp75,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
106 product,product_115,3f05faaf-a59b-4807-ad58-0bd28f520cc9,img_store_supplydrops_1,supdrp76,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1
107 product,product_66,6031ecd6-a183-4c71-9022-9685dde26ebd,img_store_supplydrops_3,supdrp91,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
108 product,product_67,6aebd756-0b60-4ad4-8639-d27db2ae79e0,img_store_supplydrops_3,supdrp92,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
109 product,product_68,93a0c86c-c7af-464c-88d7-6e0519d482f4,img_store_supplydrops_3,supdrp93,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
110 product,product_69,6ca3fa67-8844-4128-89e0-8d4b7b8c5e3a,img_store_supplydrops_3,supdrp94,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
111 product,product_70,55c76436-50d8-401e-8761-b9ceeb18c7c4,img_store_supplydrops_3,supdrp95,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
112 product,product_71,844742d6-baa0-4079-892e-649a45564b56,img_store_supplydrops_3,supdrp96,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
113 product,product_72,605fb575-1482-4e0f-8934-165e290d26ca,img_store_supplydrops_3,supdrp97,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
114 product,product_73,64d0e219-b602-4906-b714-895d020bae2a,img_store_supplydrops_3,supdrp98,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
115 product,product_74,fc0e23af-fc91-4711-b3ca-a45c3ab03049,img_store_supplydrops_3,supdrp99,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
116 product,product_75,e9886801-697b-4b40-93bd-6f9b37b6102b,img_store_supplydrops_3,supdrp100,supplydrops,all,1,supplydrops_3,,# Supply Drops 3
117 product,product_116,3c32e23a-514d-487c-9733-c9c8ec6fd55b,img_store_supplydrops_3,supdrp77,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
118 product,product_117,906884d7-2864-4cd2-b725-1129c111abab,img_store_supplydrops_3,supdrp78,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
119 product,product_118,28e9c053-da80-4f8a-b1b3-26cf9e6cad59,img_store_supplydrops_3,supdrp79,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
120 product,product_119,13668620-fb95-4e3b-b15b-05ca33cb90dc,img_store_supplydrops_3,supdrp80,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
121 product,product_120,e9e772ce-aeb5-4831-9672-f2ab1c0459f5,img_store_supplydrops_3,supdrp81,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3
122 product,product_76,156f40b5-3683-4c26-a6d0-f2358701df53,img_store_supplydrops_5,supdrp71,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
123 product,product_77,3ec7cec9-91ff-4931-8785-e7092495c5cb,img_store_supplydrops_5,supdrp72,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
124 product,product_78,29af6a13-c4ce-469c-aee1-82bdcef9307f,img_store_supplydrops_5,supdrp73,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
125 product,product_79,92334032-5350-4319-ad0b-a5dac31e491f,img_store_supplydrops_5,supdrp74,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
126 product,product_80,9974b492-3253-4873-97cc-68a47117f09f,img_store_supplydrops_5,supdrp75,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
127 product,product_81,d3a71cec-ceb3-452a-baa1-97ce8360cee8,img_store_supplydrops_5,supdrp76,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
128 product,product_82,93e9ba95-0738-4302-9880-33774f4e4b2a,img_store_supplydrops_5,supdrp77,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
129 product,product_83,5998caba-5f9f-475c-bc45-a4f2d9386105,img_store_supplydrops_5,supdrp78,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
130 product,product_84,5afa84ac-abe3-4db9-917e-29933134d4be,img_store_supplydrops_5,supdrp79,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
131 product,product_85,4f7350d9-90aa-4f91-a974-8fe399280d7c,img_store_supplydrops_5,supdrp80,supplydrops,all,1,supplydrops_5,,# Supply Drops 5
132 product,product_121,19938ec4-0047-4d17-8002-97c6584413fa,img_store_supplydrops_5,supdrp82,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
133 product,product_122,e2bb0ca8-66cc-4658-a34c-0c80babdb0df,img_store_supplydrops_5,supdrp83,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
134 product,product_123,411f8663-77fd-4821-8eef-8e213ba1f4ed,img_store_supplydrops_5,supdrp84,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
135 product,product_124,2a9140a1-946b-4a07-a790-6f7d4ee541d7,img_store_supplydrops_5,supdrp85,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
136 product,product_125,af7f50e7-dc1b-4b14-b78d-61ae560b2a00,img_store_supplydrops_5,supdrp86,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5
137 product,product_86,5de0f259-b94b-40a9-a2ea-dba2f95f8b87,img_store_supplydrops_10,supdrp81,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
138 product,product_87,89f452a5-5c6f-4d8e-a203-35de25a73805,img_store_supplydrops_10,supdrp82,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
139 product,product_88,c503ee82-39c2-4a0e-93fe-e9acfc846a81,img_store_supplydrops_10,supdrp83,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
140 product,product_89,e2c670f6-567b-4bd1-ae36-c2f039e22add,img_store_supplydrops_10,supdrp84,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
141 product,product_90,b38a63b5-2c14-445f-a9d7-31ad59b4fe5c,img_store_supplydrops_10,supdrp85,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
142 product,product_91,8c448893-0809-4c4f-be73-fa574be15333,img_store_supplydrops_10,supdrp86,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
143 product,product_92,82a96d7b-859b-46a9-a7c7-ba082558066b,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
144 product,product_93,9bc7070b-4a5a-4d39-9957-734eafd3f8e0,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
145 product,product_94,dda9be88-d5cc-4827-aecf-40e9598f4adb,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
146 product,product_95,4067a17b-23c7-4999-a514-8ed9041e8a02,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,,# Supply Drops 10
147 product,product_126,10cd1171-2eb4-4dcb-a281-372b747319f6,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
148 product,product_127,8706ff47-4cc7-4957-a4f3-d9589be39d78,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
149 product,product_128,ff9063ee-79ef-4b4a-8e22-df83f700e292,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
150 product,product_129,31cdd8b7-2c6a-414b-8e02-a2d7f6f64f12,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
151 product,product_130,de53b351-a6ab-4089-a30b-0396f6fad455,img_store_supplydrops_10,supdrp91,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10
152 # Consumable Supply Drops
153 product,product_96,c5f202f9-3386-4d8b-9f5f-fc4f16f78ed3,img_store_supplydrops_1,supdrp46,supplydrops_v2,all,1,,26,# Consumable Supply Drops 1
154 product,product_97,0463b195-81cb-43c8-87a4-814043492ac1,img_store_supplydrops_3,supdrp50,supplydrops_v2,all,1,,27,# Consumable Supply Drops 3
155 product,product_98,ef8577d9-0cab-433d-8955-8dd96089218e,img_store_supplydrops_5,supdrp47,supplydrops_v2,all,1,,28,# Consumable Supply Drops 5
156 product,product_99,4b49d2af-d9ed-4f4a-8aa1-0fc3c2e70f87,img_store_supplydrops_10,supdrp48,supplydrops_v2,all,1,,29,# Consumable Supply Drops 10
157 product,product_100,ca0012ef-1206-4173-8979-d2d4f3d66a57,img_store_supplydrops_20,supdrp71,supplydrops_v2,all,1,,31,# Consumable Supply Drops 20
158 # More Durable Supply Drops
159 product,product_101,48a1c3f1-c47f-4752-95c8-658630e29cd1,img_store_supplydrops_20,supdrp61,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
160 product,product_102,e0556d68-6bbf-4fce-affb-28c4eec8eb25,img_store_supplydrops_20,supdrp62,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
161 product,product_103,d627860d-bf3a-4972-9eb5-51a68bf4eb44,img_store_supplydrops_20,supdrp63,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
162 product,product_104,641bb491-7dda-42c9-850f-a9d6774236a0,img_store_supplydrops_20,supdrp64,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
163 product,product_105,c53a24c9-c07b-468d-bbc5-1d57ccdfd82c,img_store_supplydrops_20,supdrp65,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
164 product,product_106,fcc7f36b-3158-4129-a13d-8437924eb9ee,img_store_supplydrops_20,supdrp66,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
165 product,product_107,a21a0bda-abed-47a2-9d97-40bede8bfd7b,img_store_supplydrops_20,supdrp67,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
166 product,product_108,c7492ab3-7a7c-46d7-8efd-2a6ecd844dd7,img_store_supplydrops_20,supdrp68,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
167 product,product_109,e6a955fb-c723-42f7-b391-615dce049592,img_store_supplydrops_20,supdrp69,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
168 product,product_110,a4f8bf5c-4af4-4f4b-9996-e0816475ff6b,img_store_supplydrops_20,supdrp70,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
169 product,product_131,0b917713-e3a1-406b-9a61-dd1afa2212f5,img_store_supplydrops_20,supdrp92,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
170 product,product_132,69377444-37e1-4b99-8008-376a1da8d886,img_store_supplydrops_20,supdrp93,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
171 product,product_133,c3ae1aee-1445-4601-9577-033496317972,img_store_supplydrops_20,supdrp94,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
172 product,product_134,7d66fdd5-ebac-4893-be48-439867faccda,img_store_supplydrops_20,supdrp95,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
173 product,product_135,466f1cd8-ce9e-4ee8-ad7b-79d9e8c4e57b,img_store_supplydrops_20,supdrp96,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20
174 #MDLC 4 OHM Standalone
175 product,product_142,343595,img_store_ohm,mdlc70,OTHERITEMS,all,0,,,#OHM Standalone Pack
176 #type = category,UID,category ID,title,Language List separated by space delimiter,visibility (0-show,1-hide)
177 category,category_1,1,seasonpass,LUA_MENU_STORE_SEASON_PASS,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0
178 category,category_2,2,mappacks,LUA_MENU_STORE_MAP_PACKS,all,0
179 category,category_3,3,prempersonpacks,LUA_MENU_STORE_PREMIUM_PERSONALIZATION_PACKS,all,0
180 category,category_4,4,personpacks,LUA_MENU_STORE_PERSONALIZATION_PACKS,all,0
181 category,category_5,5,operatorpacks,LUA_MENU_STORE_PREMIUM_EXO_PACKS,all,0
182 category,category_6,6,flagpacks,LUA_MENU_STORE_EXO_PACKS,all,0
183 category,category_7,7,supplydrops,LUA_MENU_STORE_SUPPLYDROPS,all,1
184 category,category_8,8,otheritems,LUA_MENU_STORE_ADDITIONAL_ITEMS,all,0

View File

@ -1,5 +1,5 @@
// S1 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
// Dumped by https://github.com/xensik/gsc-tool
isswitchingteams()
{
@ -104,7 +104,7 @@ handlesuicidedeath( var_0, var_1 )
[[ level.onsuicidedeath ]]( self );
if ( isdefined( self.friendlydamage ) )
self iclientprintlnbold( &"MP_FRIENDLY_FIRE_WILL_NOT" );
self iprintlnbold( &"MP_FRIENDLY_FIRE_WILL_NOT" );
self.pers["suicideSpawnDelay"] = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "suicidespawndelay" );
}
@ -303,7 +303,7 @@ isplayerweapon( var_0 )
if ( weaponclass( var_0 ) == "turret" )
return 0;
if ( objective_current( var_0 ) == "primary" || objective_current( var_0 ) == "altmode" )
if ( weaponinventorytype( var_0 ) == "primary" || weaponinventorytype( var_0 ) == "altmode" )
return 1;
return 0;
@ -326,7 +326,7 @@ callback_playergrenadesuicide( var_0, var_1, var_2, var_3, var_4, var_5, var_6,
var_8 = 1;
if ( var_8 )
var_0 startlaststand();
var_0 laststanddie();
[[ level.callbackplayerlaststand ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, 0 );
}
@ -393,9 +393,9 @@ playerkilled_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, v
if ( isdefined( common_scripts\utility::getfx( "exo_knife_blood" ) ) )
{
if ( isdefined( var_7 ) && isdefined( var_6 ) && isdefined( gethitloctag( var_7 ) ) )
announcement( var_2 gettagorigin( gethitloctag( var_7 ) ), var_6 );
playimpactheadfatalfx( var_2 gettagorigin( gethitloctag( var_7 ) ), var_6 );
else
announcement( var_2 gettagorigin( "j_neck" ), anglestoforward( var_2 gettagangles( "j_neck" ) ) );
playimpactheadfatalfx( var_2 gettagorigin( "j_neck" ), anglestoforward( var_2 gettagangles( "j_neck" ) ) );
}
}
@ -581,7 +581,7 @@ playerkilled_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, v
}
if ( !maps\mp\_utility::practiceroundgame() )
canspawn( var_2, var_1, var_5, var_4 );
obituary( var_2, var_1, var_5, var_4 );
var_24 = 0;
var_2 logprintplayerdeath( self.lifeid, var_1, var_3, var_4, var_5, var_13, var_7 );
@ -613,7 +613,7 @@ playerkilled_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, v
else
{
if ( var_4 == "MOD_GRENADE" && var_0 == var_1 || var_4 == "MOD_IMPACT" || var_4 == "MOD_GRENADE_SPLASH" || var_4 == "MOD_EXPLOSIVE" )
addattacker( var_2, var_1, var_0, var_5, var_3, ( 0.0, 0.0, 0.0 ), var_6, var_7, var_8, var_4 );
addattacker( var_2, var_1, var_0, var_5, var_3, ( 0, 0, 0 ), var_6, var_7, var_8, var_4 );
var_24 = 1;
@ -1313,9 +1313,9 @@ dofinalkillcam()
case "sentry_minigun_mp":
var_3 maps\mp\gametypes\_missions::processchallenge( "ch_absentee" );
break;
case "ac130_25mm_mp":
case "ac130_105mm_mp":
case "ac130_40mm_mp":
case "ac130_105mm_mp":
case "ac130_25mm_mp":
var_3 maps\mp\gametypes\_missions::processchallenge( "ch_deathfromabove" );
break;
case "remotemissile_projectile_mp":
@ -1387,32 +1387,32 @@ getkillcamentity( var_0, var_1, var_2 )
{
case "boost_slam_mp":
return var_1;
case "bomb_site_mp":
case "bouncingbetty_mp":
case "explosive_drone_mp":
case "orbital_carepackage_pod_mp":
case "orbital_carepackage_droppod_mp":
case "artillery_mp":
case "stealth_bomb_mp":
case "agent_mp":
case "refraction_turret_mp":
case "orbital_carepackage_pod_plane_mp":
case "remotemissile_projectile_cluster_child_mp":
case "iw5_dlcgun12loot6_mp":
case "remotemissile_projectile_cluster_child_mp":
case "orbital_carepackage_pod_plane_mp":
case "refraction_turret_mp":
case "agent_mp":
case "stealth_bomb_mp":
case "artillery_mp":
case "orbital_carepackage_droppod_mp":
case "orbital_carepackage_pod_mp":
case "explosive_drone_mp":
case "bouncingbetty_mp":
case "bomb_site_mp":
return var_1.killcament;
case "killstreak_laser2_mp":
if ( isdefined( var_1.samturret ) && isdefined( var_1.samturret.killcament ) )
return var_1.samturret.killcament;
break;
case "ball_drone_gun_mp":
case "ball_drone_projectile_mp":
case "ball_drone_gun_mp":
if ( isplayer( var_0 ) && isdefined( var_0.balldrone ) && isdefined( var_0.balldrone.turret ) && isdefined( var_0.balldrone.turret.killcament ) )
return var_0.balldrone.turret.killcament;
break;
case "ugv_missile_mp":
case "drone_assault_remote_turret_mp":
case "ugv_missile_mp":
if ( isdefined( var_1.killcament ) )
return var_1.killcament;
else
@ -1422,9 +1422,9 @@ getkillcamentity( var_0, var_1, var_2 )
return var_1;
else
return undefined;
case "killstreak_solar_mp":
case "dam_turret_mp":
case "warbird_missile_mp":
case "dam_turret_mp":
case "killstreak_solar_mp":
if ( isdefined( var_1 ) && isdefined( var_1.killcament ) )
return var_1.killcament;
@ -1436,9 +1436,9 @@ getkillcamentity( var_0, var_1, var_2 )
return undefined;
case "orbital_laser_fov_mp":
return undefined;
case "sentry_minigun_mp":
case "remote_energy_turret_mp":
case "killstreakmahem_mp":
case "remote_energy_turret_mp":
case "sentry_minigun_mp":
if ( isdefined( var_1 ) && isdefined( var_1.remotecontrolled ) )
return undefined;
@ -1448,13 +1448,13 @@ getkillcamentity( var_0, var_1, var_2 )
return var_1.killcament;
break;
case "ac130_25mm_mp":
case "ac130_105mm_mp":
case "ac130_40mm_mp":
case "ugv_turret_mp":
case "remote_turret_mp":
case "detroit_tram_turret_mp":
case "killstreak_terrace_mp":
case "detroit_tram_turret_mp":
case "remote_turret_mp":
case "ugv_turret_mp":
case "ac130_40mm_mp":
case "ac130_105mm_mp":
case "ac130_25mm_mp":
return undefined;
case "iw5_dlcgun12loot8_mp":
if ( isdefined( var_1.killcament ) )
@ -1592,8 +1592,8 @@ ishardwrireprotected( var_0 )
switch ( var_0 )
{
case "killstreak_strike_missile_gas_mp":
case "mp_lab_gas":
case "killstreak_strike_missile_gas_mp":
return 1;
}
@ -2144,8 +2144,8 @@ shouldweaponfeedback( var_0 )
{
switch ( var_0 )
{
case "artillery_mp":
case "stealth_bomb_mp":
case "artillery_mp":
return 0;
}
@ -2237,12 +2237,12 @@ is_countered_by_hardwired( var_0 )
{
switch ( var_0 )
{
case "stun_grenade_mp":
case "paint_grenade_mp":
case "emp_grenade_mp":
case "stun_grenade_var_mp":
case "emp_grenade_var_mp":
case "paint_grenade_var_mp":
case "emp_grenade_var_mp":
case "stun_grenade_var_mp":
case "emp_grenade_mp":
case "paint_grenade_mp":
case "stun_grenade_mp":
return 1;
}
@ -2267,7 +2267,7 @@ finishplayerdamagewrapper( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_
if ( var_11 || maps\mp\_utility::isrocketcorpse() )
{
if ( !isdefined( var_7 ) )
var_7 = ( 0.0, 0.0, 0.0 );
var_7 = ( 0, 0, 0 );
if ( !isdefined( var_1 ) && !isdefined( var_0 ) )
{
@ -2391,7 +2391,7 @@ callback_playerlaststand( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7
var_11.iconname = level.specialty_finalstand_icon;
}
var_11.glowcolor = ( 1.0, 0.0, 0.0 );
var_11.glowcolor = ( 1, 0, 0 );
var_11.sound = "mp_last_stand";
var_11.duration = 2.0;
self.health = 1;
@ -2573,14 +2573,14 @@ laststandtimer( var_0, var_1 )
}
wait(var_0 / 3);
var_3.color = ( 1.0, 0.64, 0.0 );
var_3.color = ( 1, 0.64, 0 );
while ( var_2.inuse )
wait 0.05;
maps\mp\_utility::playdeathsound();
wait(var_0 / 3);
var_3.color = ( 1.0, 0.0, 0.0 );
var_3.color = ( 1, 0, 0 );
while ( var_2.inuse )
wait 0.05;
@ -2731,29 +2731,29 @@ gethitlocheight( var_0 )
{
switch ( var_0 )
{
case "head":
case "helmet":
case "neck":
case "helmet":
case "head":
return 60;
case "gun":
case "torso_upper":
case "right_arm_upper":
case "left_arm_upper":
case "right_arm_lower":
case "left_arm_lower":
case "right_hand":
case "left_hand":
case "right_hand":
case "left_arm_lower":
case "right_arm_lower":
case "left_arm_upper":
case "right_arm_upper":
case "torso_upper":
case "gun":
return 48;
case "torso_lower":
return 40;
case "right_leg_upper":
case "left_leg_upper":
case "right_leg_upper":
return 32;
case "right_leg_lower":
case "left_leg_lower":
case "right_leg_lower":
return 10;
case "right_foot":
case "left_foot":
case "right_foot":
return 5;
}
@ -3058,7 +3058,7 @@ reviveholdthink_cleanup( var_0, var_1, var_2 )
{
common_scripts\utility::waittill_any_ents( self, "death", var_2, "death" );
if ( !_func_294( var_2 ) )
if ( !isremovedentity( var_2 ) )
var_2 delete();
if ( isdefined( var_0 ) && maps\mp\_utility::isreallyalive( var_0 ) )
@ -3240,17 +3240,17 @@ _obituary( var_0, var_1, var_2, var_3 )
if ( var_7 == "spectator" )
{
var_6 iclientprintln( &"MP_OBITUARY_NEUTRAL", var_1.name, var_0.name );
var_6 iprintln( &"MP_OBITUARY_NEUTRAL", var_1.name, var_0.name );
continue;
}
if ( var_7 == var_4 )
{
var_6 iclientprintln( &"MP_OBITUARY_ENEMY", var_1.name, var_0.name );
var_6 iprintln( &"MP_OBITUARY_ENEMY", var_1.name, var_0.name );
continue;
}
var_6 iclientprintln( &"MP_OBITUARY_FRIENDLY", var_1.name, var_0.name );
var_6 iprintln( &"MP_OBITUARY_FRIENDLY", var_1.name, var_0.name );
}
}
@ -3358,10 +3358,10 @@ processdamagetaken( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_
switch ( var_13 )
{
case "paint_grenade_mp":
case "smoke_grenade_mp":
case "paint_grenade_var_mp":
case "smoke_grenade_var_mp":
case "paint_grenade_var_mp":
case "smoke_grenade_mp":
case "paint_grenade_mp":
return;
}
@ -3467,23 +3467,23 @@ handlemissiledamage( var_0, var_1, var_2 )
switch ( var_0 )
{
case "bomb_site_mp":
case "remotemissile_projectile_mp":
case "remotemissile_projectile_cluster_parent_mp":
case "remotemissile_projectile_gas_mp":
case "orbital_carepackage_pod_mp":
case "orbital_carepackage_droppod_mp":
case "stinger_mp":
case "stealth_bomb_mp":
case "orbital_carepackage_pod_plane_mp":
case "remotemissile_projectile_cluster_child_mp":
case "dam_turret_mp":
case "warbird_missile_mp":
case "remotemissile_projectile_cluster_child_hellfire_mp":
case "remotemissile_projectile_secondary_mp":
case "airstrike_missile_mp":
case "orbitalsupport_105mm_mp":
case "orbitalsupport_missile_mp":
case "orbitalsupport_105mm_mp":
case "airstrike_missile_mp":
case "remotemissile_projectile_secondary_mp":
case "remotemissile_projectile_cluster_child_hellfire_mp":
case "warbird_missile_mp":
case "dam_turret_mp":
case "remotemissile_projectile_cluster_child_mp":
case "orbital_carepackage_pod_plane_mp":
case "stealth_bomb_mp":
case "stinger_mp":
case "orbital_carepackage_droppod_mp":
case "orbital_carepackage_pod_mp":
case "remotemissile_projectile_gas_mp":
case "remotemissile_projectile_cluster_parent_mp":
case "remotemissile_projectile_mp":
case "bomb_site_mp":
self.largeprojectiledamage = 1;
var_3 = self.maxhealth + 1;
break;
@ -3504,16 +3504,16 @@ handlemissiledamage( var_0, var_1, var_2 )
var_3 = self.maxhealth * var_5;
break;
case "turretheadrocket_mp":
case "ugv_missile_mp":
case "assaultdrone_c4_mp":
case "killstreakmahem_mp":
case "killstreak_orbital_laser_mp":
case "killstreakmahem_mp":
case "assaultdrone_c4_mp":
case "ugv_missile_mp":
case "turretheadrocket_mp":
self.largeprojectiledamage = 0;
var_3 = self.maxhealth + 1;
break;
case "orbitalsupport_40mm_mp":
case "orbitalsupport_40mmbuddy_mp":
case "orbitalsupport_40mm_mp":
self.largeprojectiledamage = 0;
var_3 *= 2;
break;
@ -3535,9 +3535,9 @@ handlegrenadedamage( var_0, var_1, var_2 )
{
switch ( var_3 )
{
case "frag_grenade_mp":
case "semtex_mp":
case "explosive_drone_mp":
case "semtex_mp":
case "frag_grenade_mp":
var_2 *= 4;
break;
default:
@ -3600,7 +3600,7 @@ onkillstreakkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 )
if ( var_0 == self.owner )
return;
if ( !_func_285( self.owner, var_0 ) )
if ( !isalliedsentient( self.owner, var_0 ) )
var_8 = var_0;
}

View File

@ -1,5 +1,5 @@
// S1 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
// Dumped by https://github.com/xensik/gsc-tool
onforfeit( var_0 )
{
@ -445,7 +445,7 @@ waittillfinalkillcamdone()
timelimitclock_intermission( var_0 )
{
setgameendtime( gettime() + int( var_0 * 1000 ) );
var_1 = spawn( "script_origin", ( 0.0, 0.0, 0.0 ) );
var_1 = spawn( "script_origin", ( 0, 0, 0 ) );
var_1 hide();
if ( var_0 >= 10.0 )
@ -527,7 +527,7 @@ graceperiod()
if ( !isdefined( game["clientActive"] ) )
{
while ( getplaylistid() == 0 )
while ( getactiveclientcount() == 0 )
wait 0.05;
game["clientActive"] = 1;
@ -675,8 +675,8 @@ updatewinstats( var_0 )
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_gun_crushing" );
break;
case "ctf":
case "twar":
case "ctf":
if ( game["shut_out"][var_0.team] )
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_crushing" );
@ -723,13 +723,13 @@ checkgameendchallenges()
{
case "_a":
var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_alphalock" );
continue;
break;
case "_b":
var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_bravolock" );
continue;
break;
case "_c":
var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_charlielock" );
continue;
break;
}
}
}
@ -897,7 +897,7 @@ updatematchbonusscores( var_0 )
}
if ( var_1 != "tie" )
clientannouncement( var_1 );
setwinningteam( var_1 );
foreach ( var_4 in level.players )
{
@ -1024,7 +1024,7 @@ setxenonranks( var_0 )
if ( maps\mp\_utility::getminutespassed() )
var_4 = var_3.score / maps\mp\_utility::getminutespassed();
_func_173( var_3, var_3.clientid, int( var_4 ) );
setplayerteamrank( var_3, var_3.clientid, int( var_4 ) );
}
}
@ -1059,7 +1059,7 @@ checktimelimit( var_0 )
return;
if ( maps\mp\_utility::gettimepassedpercentage() > level.timepercentagecutoff )
setnojipscore( 1 );
setnojiptime( 1 );
var_1 = gettimeremaining();
@ -1625,12 +1625,12 @@ callback_startgametype()
game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT";
game["colors"]["blue"] = ( 0.25, 0.25, 0.75 );
game["colors"]["red"] = ( 0.75, 0.25, 0.25 );
game["colors"]["white"] = ( 1.0, 1.0, 1.0 );
game["colors"]["black"] = ( 0.0, 0.0, 0.0 );
game["colors"]["white"] = ( 1, 1, 1 );
game["colors"]["black"] = ( 0, 0, 0 );
game["colors"]["grey"] = ( 0.5, 0.5, 0.5 );
game["colors"]["green"] = ( 0.25, 0.75, 0.25 );
game["colors"]["yellow"] = ( 0.65, 0.65, 0.0 );
game["colors"]["orange"] = ( 1.0, 0.45, 0.0 );
game["colors"]["yellow"] = ( 0.65, 0.65, 0 );
game["colors"]["orange"] = ( 1, 0.45, 0 );
game["colors"]["cyan"] = ( 0.35, 0.7, 0.9 );
game["strings"]["allies_name"] = maps\mp\gametypes\_teams::getteamname( "allies" );
game["icons"]["allies"] = maps\mp\gametypes\_teams::getteamicon( "allies" );
@ -1639,10 +1639,10 @@ callback_startgametype()
game["icons"]["axis"] = maps\mp\gametypes\_teams::getteamicon( "axis" );
game["colors"]["axis"] = maps\mp\gametypes\_teams::getteamcolor( "axis" );
if ( game["colors"]["allies"] == ( 0.0, 0.0, 0.0 ) )
if ( game["colors"]["allies"] == ( 0, 0, 0 ) )
game["colors"]["allies"] = ( 0.5, 0.5, 0.5 );
if ( game["colors"]["axis"] == ( 0.0, 0.0, 0.0 ) )
if ( game["colors"]["axis"] == ( 0, 0, 0 ) )
game["colors"]["axis"] = ( 0.5, 0.5, 0.5 );
[[ level.onprecachegametype ]]();
@ -1652,7 +1652,7 @@ callback_startgametype()
{
if ( !level.splitscreen )
{
if ( _func_27A() )
if ( isdedicatedserver() )
level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "graceperiod_ds" );
else
level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "graceperiod" );
@ -1662,7 +1662,7 @@ callback_startgametype()
}
else
{
if ( _func_27A() )
if ( isdedicatedserver() )
level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime_ds" );
else
level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime" );
@ -1910,7 +1910,7 @@ setattackingteam()
callback_codeendgame()
{
setplayerteamrank();
endparty();
if ( !level.gameended )
level thread forceend();
@ -2018,7 +2018,7 @@ timelimitclock()
{
level endon( "game_ended" );
wait 0.05;
var_0 = spawn( "script_origin", ( 0.0, 0.0, 0.0 ) );
var_0 = spawn( "script_origin", ( 0, 0, 0 ) );
var_0 hide();
while ( game["state"] == "playing" )
@ -2133,7 +2133,7 @@ startgame()
if ( var_0 || var_1 )
thread updategameduration();
_func_240();
lootserviceonstartgame();
}
wavespawntimer()
@ -2717,7 +2717,7 @@ endgame( var_0, var_1, var_2 )
setmatchdata( "alliesScore", game["teamScores"]["allies"] );
setmatchdata( "axisScore", game["teamScores"]["axis"] );
_func_242( var_0 );
tournamentreportwinningteam( var_0 );
}
else
setmatchdata( "victor", "none" );
@ -2736,9 +2736,9 @@ endgame( var_0, var_1, var_2 )
if ( maps\mp\_utility::matchmakinggame() )
{
setmatchdata( "playlistVersion", isdedicatedserver() );
setmatchdata( "playlistID", getplaylistversion() );
setmatchdata( "isDedicated", _func_27A() );
setmatchdata( "playlistVersion", getplaylistversion() );
setmatchdata( "playlistID", getplaylistid() );
setmatchdata( "isDedicated", isdedicatedserver() );
}
setmatchdata( "levelMaxClients", level.maxclients );
@ -2750,7 +2750,7 @@ endgame( var_0, var_1, var_2 )
var_5.pers["segments"] = var_5.segments;
}
tournamentreportwinningteam();
tournamentreportendofgame();
var_20 = 0;
if ( maps\mp\_utility::practiceroundgame() )
@ -2975,7 +2975,7 @@ getscoreperminute( var_0 )
if ( isplayer( self ) )
var_4 = self.score / var_3;
else
var_4 = setclientnamemode( var_0 ) / var_3;
var_4 = getteamscore( var_0 ) / var_3;
return var_4;
}
@ -2987,7 +2987,7 @@ getscoreremaining( var_0 )
if ( isplayer( self ) )
var_2 = var_1 - self.score;
else
var_2 = var_1 - setclientnamemode( var_0 );
var_2 = var_1 - getteamscore( var_0 );
return var_2;
}
@ -3039,7 +3039,7 @@ processlobbydata()
maps\mp\_awards::assignawards();
maps\mp\_scoreboard::processlobbyscoreboards();
sendclientmatchdata();
_func_23E();
lootserviceonendgame();
}
trackleaderboarddeathstats( var_0, var_1 )

View File

@ -1,5 +1,5 @@
// S1 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
// Dumped by https://github.com/xensik/gsc-tool
timeuntilwavespawn( var_0 )
{
@ -419,7 +419,7 @@ showspawnnotifies()
getspawnorigin( var_0 )
{
if ( !getstarttime( var_0.origin ) )
if ( !positionwouldtelefrag( var_0.origin ) )
return var_0.origin;
if ( !isdefined( var_0.alternates ) )
@ -427,7 +427,7 @@ getspawnorigin( var_0 )
foreach ( var_2 in var_0.alternates )
{
if ( !getstarttime( var_2 ) )
if ( !positionwouldtelefrag( var_2 ) )
return var_2;
}
@ -619,7 +619,7 @@ spawnplayer( var_0, var_1 )
foreach ( var_11 in level.ugvs )
{
if ( distancesquared( var_11.origin, var_2.playerspawnpos ) < 1024 )
var_11 notify( "damage", 5000, var_11.owner, ( 0.0, 0.0, 0.0 ), ( 0.0, 0.0, 0.0 ), "MOD_EXPLOSIVE", "", "", "", undefined, "killstreak_emp_mp" );
var_11 notify( "damage", 5000, var_11.owner, ( 0, 0, 0 ), ( 0, 0, 0 ), "MOD_EXPLOSIVE", "", "", "", undefined, "killstreak_emp_mp" );
}
var_5 = self.setspawnpoint.playerspawnpos;
@ -825,7 +825,7 @@ spawnplayer( var_0, var_1 )
var_17 = self.pers["team"];
if ( maps\mp\_utility::inovertime() )
thread maps\mp\gametypes\_hud_message::oldnotifymessage( game["strings"]["overtime"], game["strings"]["overtime_hint"], undefined, ( 1.0, 0.0, 0.0 ), "mp_last_stand" );
thread maps\mp\gametypes\_hud_message::oldnotifymessage( game["strings"]["overtime"], game["strings"]["overtime_hint"], undefined, ( 1, 0, 0 ), "mp_last_stand" );
thread showspawnnotifies();
}
@ -1169,15 +1169,13 @@ callback_playerdisconnect( var_0 )
if ( maps\mp\_utility::getminutespassed() )
var_4 = self.score / maps\mp\_utility::getminutespassed();
_func_173( self, self.clientid, int( var_4 ) );
setplayerteamrank( self, self.clientid, int( var_4 ) );
}
reconevent( "script_mp_playerquit: player_name %s, player %d, gameTime %d", self.name, self.clientid, gettime() );
var_5 = self getentitynumber();
var_6 = self.guid;
var_7 = "Q;" + var_6 + ";" + var_5 + ";" + self.name + "\n";
logprint( var_7 );
logprint( "Q;" + var_6 + ";" + var_5 + ";" + self.name + "\n" );
thread maps\mp\_events::disconnected();
if ( level.gameended )
@ -1283,7 +1281,7 @@ setupsavedactionslots()
logplayerconsoleidandonwifiinmatchdata()
{
var_0 = _func_2CE();
var_0 = getcodanywherecurrentplatform();
var_1 = self getcommonplayerdata( "consoleIDChunkLow", var_0 );
var_2 = self getcommonplayerdata( "consoleIDChunkHigh", var_0 );
@ -1426,7 +1424,7 @@ callback_playerconnect()
setmatchdata( "players", self.clientid, "isBot", isai( self ) );
var_4 = self getentitynumber();
setmatchdata( "players", self.clientid, "codeClientNum", maps\mp\_utility::clamptobyte( var_4 ) );
var_5 = _func_2CE();
var_5 = getcodanywherecurrentplatform();
var_3 = self getcommonplayerdata( "connectionIDChunkLow", var_5 );
var_2 = self getcommonplayerdata( "connectionIDChunkHigh", var_5 );
setmatchdata( "players", self.clientid, "connectionIDChunkLow", var_3 );

View File

@ -1,5 +1,5 @@
// S1 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
// Dumped by https://github.com/xensik/gsc-tool
main()
{
@ -7,10 +7,8 @@ main()
maps\mp\gametypes\_callbacksetup::setupcallbacks();
maps\mp\gametypes\_globallogic::setupcallbacks();
setguns();
maps\mp\_utility::registertimelimitdvar( level.gametype, 10 );
setDvar( "scr_gun_scorelimit", level.gun_guns.size );
setdvar( "scr_gun_scorelimit", level.gun_guns.size );
maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size );
level thread reinitializescorelimitonmigration();
maps\mp\_utility::registerroundlimitdvar( level.gametype, 1 );
@ -38,7 +36,7 @@ main()
if ( level.matchrules_damagemultiplier )
level.modifyplayerdamage = maps\mp\gametypes\_damage::gamemodemodifyplayerdamage;
setteamscore( "ffa" );
setteammode( "ffa" );
game["dialog"]["gametype"] = "gg_intro";
game["dialog"]["defense_obj"] = "gbl_start";
game["dialog"]["offense_obj"] = "gbl_start";
@ -53,40 +51,38 @@ initializematchrules()
{
maps\mp\_utility::setcommonrulesfrommatchrulesdata( 1 );
level.matchrules_randomize = getmatchrulesdata( "gunData", "randomize" );
setDvar( "scr_gun_scorelimit", level.gun_guns.size );
setdvar( "scr_gun_scorelimit", level.gun_guns.size );
maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size );
setDvar( "scr_gun_winlimit", 1 );
setdvar( "scr_gun_winlimit", 1 );
maps\mp\_utility::registerwinlimitdvar( "gun", 1 );
setDvar( "scr_gun_roundlimit", 1 );
setdvar( "scr_gun_roundlimit", 1 );
maps\mp\_utility::registerroundlimitdvar( "gun", 1 );
setDvar( "scr_gun_halftime", 0 );
setdvar( "scr_gun_halftime", 0 );
maps\mp\_utility::registerhalftimedvar( "gun", 0 );
setDvar( "scr_gun_playerrespawndelay", 0 );
setDvar( "scr_gun_waverespawndelay", 0 );
setDvar( "scr_player_forcerespawn", 1 );
setDvar( "scr_setback_levels", getmatchrulesdata( "gunData", "setbackLevels" ) );
setdvar( "scr_gun_playerrespawndelay", 0 );
setdvar( "scr_gun_waverespawndelay", 0 );
setdvar( "scr_player_forcerespawn", 1 );
setdvar( "scr_setback_levels", getmatchrulesdata( "gunData", "setbackLevels" ) );
}
reinitializescorelimitonmigration()
{
setDvar( "scr_gun_scorelimit", level.gun_guns.size );
setdvar( "scr_gun_scorelimit", level.gun_guns.size );
maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size );
}
onstartgametype()
{
getteamplayersalive( "auto_change" );
setclientnamemode( "auto_change" );
maps\mp\_utility::setobjectivetext( "allies", &"OBJECTIVES_DM" );
maps\mp\_utility::setobjectivetext( "axis", &"OBJECTIVES_DM" );
maps\mp\_utility::setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" );
maps\mp\_utility::setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" );
maps\mp\_utility::setobjectivehinttext( "allies", &"OBJECTIVES_DM_HINT" );
maps\mp\_utility::setobjectivehinttext( "axis", &"OBJECTIVES_DM_HINT" );
initspawns();
allowed = [];
maps\mp\gametypes\_gameobjects::main( allowed );
var_0 = [];
maps\mp\gametypes\_gameobjects::main( var_0 );
level.quickmessagetoall = 1;
level.blockweapondrops = 1;
level thread onplayerconnect();
@ -94,8 +90,8 @@ onstartgametype()
initspawns()
{
level.spawnmins = ( 0.0, 0.0, 0.0 );
level.spawnmaxs = ( 0.0, 0.0, 0.0 );
level.spawnmins = ( 0, 0, 0 );
level.spawnmaxs = ( 0, 0, 0 );
level.spawn_name = "mp_dm_spawn";
maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", level.spawn_name );
maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", level.spawn_name );
@ -199,17 +195,17 @@ onplayerscore( var_0, var_1, var_2 )
return 0;
}
onplayerkilled( var_0, attacker, var_2, sMeansOfDeath, sWeapon, var_5, var_6, var_7, var_8, var_9 )
onplayerkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !isdefined( attacker ) )
if ( !isdefined( var_1 ) )
return;
if ( sMeansOfDeath == "MOD_TRIGGER_HURT" && !isplayer( attacker ) )
attacker = self;
if ( var_3 == "MOD_TRIGGER_HURT" && !isplayer( var_1 ) )
var_1 = self;
if ( sMeansOfDeath == "MOD_FALLING" || isplayer( attacker ) )
if ( var_3 == "MOD_FALLING" || isplayer( var_1 ) )
{
if ( sMeansOfDeath == "MOD_FALLING" || attacker == self || maps\mp\_utility::ismeleemod( sMeansOfDeath ) && sWeapon != "riotshield_mp" || sWeapon == "boost_slam_mp" || sWeapon == "iw5_dlcgun12loot8_mp" )
if ( var_3 == "MOD_FALLING" || var_1 == self || maps\mp\_utility::ismeleemod( var_3 ) && var_4 != "riotshield_mp" || var_4 == "boost_slam_mp" || var_4 == "iw5_dlcgun12loot8_mp" )
{
self playlocalsound( "mp_war_objective_lost" );
self.gungameprevgunindex = self.gungamegunindex;
@ -222,53 +218,49 @@ onplayerkilled( var_0, attacker, var_2, sMeansOfDeath, sWeapon, var_5, var_6, va
maps\mp\_utility::setextrascore1( self.mysetbacks );
self.showsetbacksplash = 1;
if ( maps\mp\_utility::ismeleemod( sMeansOfDeath ) || sWeapon == "boost_slam_mp" || sWeapon == "iw5_dlcgun12loot8_mp" )
if ( maps\mp\_utility::ismeleemod( var_3 ) || var_4 == "boost_slam_mp" || var_4 == "iw5_dlcgun12loot8_mp" )
{
attacker.stabs++;
attacker.assists = attacker.stabs;
attacker thread maps\mp\_events::setbackenemygunlevelevent();
var_1.stabs++;
var_1.assists = var_1.stabs;
var_1 thread maps\mp\_events::setbackenemygunlevelevent();
if ( self.gungameprevgunindex == level.gun_guns.size - 1 )
{
attacker thread maps\mp\_events::setbackfirstplayergunlevelevent();
attacker maps\mp\_utility::leaderdialogonplayer( "humiliation", "status" );
var_1 thread maps\mp\_events::setbackfirstplayergunlevelevent();
var_1 maps\mp\_utility::leaderdialogonplayer( "humiliation", "status" );
}
}
}
}
else if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_HEAD_SHOT" || sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_EXPLOSIVE" || sMeansOfDeath == "MOD_IMPACT" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" || maps\mp\_utility::ismeleemod( sMeansOfDeath ) && sWeapon == "riotshield_mp" )
else if ( var_3 == "MOD_PISTOL_BULLET" || var_3 == "MOD_RIFLE_BULLET" || var_3 == "MOD_HEAD_SHOT" || var_3 == "MOD_PROJECTILE" || var_3 == "MOD_PROJECTILE_SPLASH" || var_3 == "MOD_EXPLOSIVE" || var_3 == "MOD_IMPACT" || var_3 == "MOD_GRENADE" || var_3 == "MOD_GRENADE_SPLASH" || maps\mp\_utility::ismeleemod( var_3 ) && var_4 == "riotshield_mp" )
{
if ( isdefined( attacker.lastkillweapon ) && attacker.lastkillweapon == sWeapon )
{
if ( isdefined( var_1.lastkillweapon ) && var_1.lastkillweapon == var_4 )
return;
}
var_10 = level.gun_guns;
if ( level.matchrules_randomize )
var_10 = attacker.gunlist;
var_10 = var_1.gunlist;
var_11 = var_10[attacker.gungamegunindex];
var_11 = var_10[var_1.gungamegunindex];
if ( !issubstr( sWeapon, maps\mp\_utility::getbaseweaponname( var_11 ) ) )
{
if ( !issubstr( var_4, maps\mp\_utility::getbaseweaponname( var_11 ) ) )
return;
}
attacker.lastkillweapon = sWeapon;
var_1.lastkillweapon = var_4;
if ( attacker.lastleveluptime + 3000 > gettime() )
attacker thread maps\mp\_events::quickgunlevelevent();
if ( var_1.lastleveluptime + 3000 > gettime() )
var_1 thread maps\mp\_events::quickgunlevelevent();
attacker.lastleveluptime = gettime();
attacker.gungameprevgunindex = attacker.gungamegunindex;
attacker.gungamegunindex++;
attacker thread maps\mp\_events::increasegunlevelevent();
var_1.lastleveluptime = gettime();
var_1.gungameprevgunindex = var_1.gungamegunindex;
var_1.gungamegunindex++;
var_1 thread maps\mp\_events::increasegunlevelevent();
if ( attacker.gungamegunindex == level.gun_guns.size - 1 )
if ( var_1.gungamegunindex == level.gun_guns.size - 1 )
{
maps\mp\_utility::playsoundonplayers( "mp_enemy_obj_captured" );
level thread maps\mp\_utility::teamplayercardsplash( "callout_top_gun_rank", attacker );
level thread maps\mp\_utility::teamplayercardsplash( "callout_top_gun_rank", var_1 );
var_12 = gettime();
if ( level.lastguntimevo + 4500 < var_12 )
@ -278,8 +270,8 @@ onplayerkilled( var_0, attacker, var_2, sMeansOfDeath, sWeapon, var_5, var_6, va
}
}
if ( attacker.gungamegunindex < level.gun_guns.size )
attacker givenextgun( 0, sWeapon );
if ( var_1.gungamegunindex < level.gun_guns.size )
var_1 givenextgun( 0, var_4 );
}
}
}
@ -292,9 +284,7 @@ givenextgun( var_0, var_1 )
var_2 = addattachments( var_2 );
while ( !self loadweapons( var_2 ) )
{
waitframe();
}
if ( isdefined( var_1 ) )
self takeweapon( var_1 );
@ -319,13 +309,13 @@ getnextgun()
{
var_0 = level.gun_guns;
var_1 = [];
newWeapon = undefined;
var_2 = undefined;
if ( level.matchrules_randomize )
var_0 = self.gunlist;
newWeapon = var_0[self.gungamegunindex];
var_1[var_1.size] = newWeapon;
var_2 = var_0[self.gungamegunindex];
var_1[var_1.size] = var_2;
if ( self.gungamegunindex + 1 < var_0.size )
var_1[var_1.size] = var_0[self.gungamegunindex + 1];
@ -334,22 +324,22 @@ getnextgun()
var_1[var_1.size] = var_0[self.gungamegunindex - 1];
self loadweapons( var_1 );
return newWeapon;
return var_2;
}
addattachments( weaponName )
addattachments( var_0 )
{
if ( getdvarint( "scr_gun_loot_variants", 0 ) == 1 )
{
var_1 = tablelookup( "mp/statstable.csv", 4, weaponName , 40 );
var_1 = tablelookup( "mp/statstable.csv", 4, var_0, 40 );
if ( isdefined( var_1 ) && var_1 != "" )
var_2 = maps\mp\gametypes\_class::buildweaponname( weaponName , var_1, "none", "none", 0, 0 );
var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, var_1, "none", "none", 0, 0 );
else
var_2 = maps\mp\gametypes\_class::buildweaponname( weaponName , "none", "none", "none", 0, 0 );
var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, "none", "none", "none", 0, 0 );
}
else
var_2 = maps\mp\gametypes\_class::buildweaponname( weaponName , "none", "none", "none", 0, 0 );
var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, "none", "none", "none", 0, 0 );
return var_2;
}
@ -357,14 +347,14 @@ addattachments( weaponName )
ontimelimit()
{
level.finalkillcam_winner = "none";
winners = gethighestprogressedplayers();
var_0 = gethighestprogressedplayers();
if ( !isdefined( winners ) || !winners.size )
if ( !isdefined( var_0 ) || !var_0.size )
thread maps\mp\gametypes\_gamelogic::endgame( "tie", game["end_reason"]["time_limit_reached"] );
else if ( winners.size == 1 )
thread maps\mp\gametypes\_gamelogic::endgame( winners[0], game["end_reason"]["time_limit_reached"] );
else if ( winners[winners.size - 1].gungamegunindex > winners[winners.size - 2].gungamegunindex )
thread maps\mp\gametypes\_gamelogic::endgame( winners[winners.size - 1], game["end_reason"]["time_limit_reached"] );
else if ( var_0.size == 1 )
thread maps\mp\gametypes\_gamelogic::endgame( var_0[0], game["end_reason"]["time_limit_reached"] );
else if ( var_0[var_0.size - 1].gungamegunindex > var_0[var_0.size - 2].gungamegunindex )
thread maps\mp\gametypes\_gamelogic::endgame( var_0[var_0.size - 1], game["end_reason"]["time_limit_reached"] );
else
thread maps\mp\gametypes\_gamelogic::endgame( "tie", game["end_reason"]["time_limit_reached"] );
}

2
deps/GSL vendored

@ -1 +1 @@
Subproject commit cbf5e664fc55cbcc33b10f3058ede325cd133a01
Subproject commit 49c88f27bd642b8d80371cbd0b8cffbfe5367c44

6
deps/extra/gsc-tool/gsc_interface.cpp vendored Normal file
View File

@ -0,0 +1,6 @@
#include "gsc_interface.hpp"
namespace gsc
{
std::unique_ptr<xsk::gsc::s1_pc::context> cxt;
}

15
deps/extra/gsc-tool/gsc_interface.hpp vendored Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#undef ERROR
#undef IN
#undef TRUE
#undef FALSE
#undef far
#include <stdinc.hpp>
#include <s1/s1_pc.hpp>
namespace gsc
{
extern std::unique_ptr<xsk::gsc::s1_pc::context> cxt;
}

View File

@ -1,28 +0,0 @@
#include <stdafx.hpp>
#include <xsk/s1.hpp>
#include "interface.hpp"
namespace gsc
{
std::unique_ptr<xsk::gsc::compiler> compiler()
{
auto compiler = std::make_unique<xsk::gsc::s1::compiler>();
compiler->mode(xsk::gsc::build::prod);
return compiler;
}
std::unique_ptr<xsk::gsc::decompiler> decompiler()
{
return std::make_unique<xsk::gsc::s1::decompiler>();
}
std::unique_ptr<xsk::gsc::assembler> assembler()
{
return std::make_unique<xsk::gsc::s1::assembler>();
}
std::unique_ptr<xsk::gsc::disassembler> disassembler()
{
return std::make_unique<xsk::gsc::s1::disassembler>();
}
}

View File

@ -1,9 +0,0 @@
#pragma once
namespace gsc
{
std::unique_ptr<xsk::gsc::compiler> compiler();
std::unique_ptr<xsk::gsc::decompiler> decompiler();
std::unique_ptr<xsk::gsc::assembler> assembler();
std::unique_ptr<xsk::gsc::disassembler> disassembler();
}

1
deps/fmt vendored Submodule

@ -0,0 +1 @@
Subproject commit e03753c4ac04d80517ec5fa92e78b0dc1f896a70

2
deps/gsc-tool vendored

@ -1 +1 @@
Subproject commit 7d374025b7675bada64c247ebe9378dd335a33da
Subproject commit adf88fc5c9e5f0ecf3a7743e82c95c4482822bf8

2
deps/lua vendored

@ -1 +1 @@
Subproject commit d69789da1ccfa4db7c241de6b471d6b729f1561e
Subproject commit cf08915d62e338c987b71c078b148490510e9fe7

34
deps/premake/fmt.lua vendored Normal file
View File

@ -0,0 +1,34 @@
fmt = {
source = path.join(dependencies.basePath, "fmt"),
}
function fmt.import()
links { "fmt" }
fmt.includes()
end
function fmt.includes()
includedirs {
path.join(fmt.source, "include"),
}
end
function fmt.project()
project "fmt"
kind "StaticLib"
language "C++"
fmt.includes()
files {
path.join(fmt.source, "include/fmt/*.h"),
path.join(fmt.source, "src/*.cc")
}
removefiles {
path.join(fmt.source, "src/fmt.cc")
}
end
table.insert(dependencies, fmt)

View File

@ -11,6 +11,9 @@ function gsc_tool.includes()
includedirs {
path.join(gsc_tool.source, "s1"),
path.join(gsc_tool.source, "utils"),
path.join(gsc_tool.source, "gsc"),
gsc_tool.source,
path.join(dependencies.basePath, "extra/gsc-tool"),
}
end
@ -20,9 +23,6 @@ function gsc_tool.project()
kind "StaticLib"
language "C++"
pchheader "stdafx.hpp"
pchsource (path.join(gsc_tool.source, "utils/stdafx.cpp"))
files {
path.join(gsc_tool.source, "utils/**.hpp"),
path.join(gsc_tool.source, "utils/**.cpp"),
@ -34,23 +34,30 @@ function gsc_tool.project()
}
zlib.includes()
fmt.includes()
project "xsk-gsc-s1"
kind "StaticLib"
language "C++"
filter "action:vs*"
buildoptions "/bigobj"
buildoptions "/Zc:__cplusplus"
filter {}
pchheader "stdafx.hpp"
pchsource (path.join(gsc_tool.source, "s1/stdafx.cpp"))
files {
path.join(gsc_tool.source, "s1/**.hpp"),
path.join(gsc_tool.source, "s1/**.cpp"),
path.join(dependencies.basePath, "extra/gsc-tool/interface.cpp"),
path.join(gsc_tool.source, "s1/s1_pc.hpp"),
path.join(gsc_tool.source, "s1/s1_pc.cpp"),
path.join(gsc_tool.source, "s1/s1_pc_code.cpp"),
path.join(gsc_tool.source, "s1/s1_pc_func.cpp"),
path.join(gsc_tool.source, "s1/s1_pc_meth.cpp"),
path.join(gsc_tool.source, "s1/s1_pc_token.cpp"),
path.join(gsc_tool.source, "gsc/misc/*.hpp"),
path.join(gsc_tool.source, "gsc/misc/*.cpp"),
path.join(gsc_tool.source, "gsc/*.hpp"),
path.join(gsc_tool.source, "gsc/*.cpp"),
path.join(dependencies.basePath, "extra/gsc-tool/gsc_interface.cpp"),
}
includedirs {
@ -58,6 +65,8 @@ function gsc_tool.project()
gsc_tool.source,
path.join(dependencies.basePath, "extra/gsc-tool"),
}
fmt.includes()
end
table.insert(dependencies, gsc_tool)

View File

@ -19,6 +19,8 @@ function libtomcrypt.includes()
"LTC_NO_FAST",
"LTC_NO_PROTOTYPES",
"LTC_NO_RSA_BLINDING",
"LTC_NO_FILE",
"ARGTYPE=4",
}
end
@ -34,6 +36,7 @@ function libtomcrypt.project()
}
removefiles {
path.join(libtomcrypt.source, "src/**/*_test.c"),
path.join(libtomcrypt.source, "src/**/*tab.c"),
path.join(libtomcrypt.source, "src/encauth/ocb3/**.c"),
}

2
deps/zlib vendored

@ -1 +1 @@
Subproject commit 02a6049eb3884c430268bb0fe3296d597a03174c
Subproject commit fa8cd50ada68b873c754766bc73b12080b7b309e

View File

@ -115,7 +115,7 @@ namespace demonware
namespace io
{
hostent* gethostbyname_stub(const char* name)
hostent* WINAPI gethostbyname_stub(const char* name)
{
#ifdef DEBUG
printf("[ network ]: [gethostbyname]: \"%s\"\n", name);
@ -152,7 +152,7 @@ namespace demonware
return &host;
}
int connect_stub(const SOCKET s, const struct sockaddr* addr, const int len)
int WINAPI connect_stub(const SOCKET s, const sockaddr* addr, const int len)
{
if (len == sizeof(sockaddr_in))
{
@ -163,7 +163,7 @@ namespace demonware
return connect(s, addr, len);
}
int closesocket_stub(const SOCKET s)
int WINAPI closesocket_stub(const SOCKET s)
{
remove_blocking_socket(s);
socket_unlink(s);
@ -171,7 +171,7 @@ namespace demonware
return closesocket(s);
}
int send_stub(const SOCKET s, const char* buf, const int len, const int flags)
int WINAPI send_stub(const SOCKET s, const char* buf, const int len, const int flags)
{
auto* server = find_server(s);
@ -184,7 +184,7 @@ namespace demonware
return send(s, buf, len, flags);
}
int recv_stub(const SOCKET s, char* buf, const int len, const int flags)
int WINAPI recv_stub(const SOCKET s, char* buf, const int len, const int flags)
{
auto* server = find_server(s);
@ -204,8 +204,8 @@ namespace demonware
return recv(s, buf, len, flags);
}
int sendto_stub(const SOCKET s, const char* buf, const int len, const int flags, const sockaddr* to,
const int tolen)
int WINAPI sendto_stub(const SOCKET s, const char* buf, const int len, const int flags, const sockaddr* to,
const int tolen)
{
const auto* in_addr = reinterpret_cast<const sockaddr_in*>(to);
auto* server = udp_servers.find(in_addr->sin_addr.s_addr);
@ -219,8 +219,8 @@ namespace demonware
return sendto(s, buf, len, flags, to, tolen);
}
int recvfrom_stub(const SOCKET s, char* buf, const int len, const int flags, struct sockaddr* from,
int* fromlen)
int WINAPI recvfrom_stub(const SOCKET s, char* buf, const int len, const int flags, sockaddr* from,
int* fromlen)
{
// Not supported yet
if (is_socket_blocking(s, UDP_BLOCKING))
@ -246,8 +246,8 @@ namespace demonware
return recvfrom(s, buf, len, flags, from, fromlen);
}
int select_stub(const int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
struct timeval* timeout)
int WINAPI select_stub(const int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
timeval* timeout)
{
if (exit_server)
{
@ -323,7 +323,7 @@ namespace demonware
return result;
}
int ioctlsocket_stub(const SOCKET s, const long cmd, u_long* argp)
int WINAPI ioctlsocket_stub(const SOCKET s, const long cmd, u_long* argp)
{
if (static_cast<unsigned long>(cmd) == (FIONBIO))
{
@ -358,12 +358,8 @@ namespace demonware
va_end(ap);
}
}
class component final : public component_interface
{
public:
component()
void startup_dw()
{
udp_servers.create<stun_server>("s1-stun.us.demonware.net");
udp_servers.create<stun_server>("s1-stun.eu.demonware.net");
@ -379,9 +375,15 @@ namespace demonware
tcp_servers.create<lobby_server>("aw-pc-lobby.prod.demonware.net");
tcp_servers.create<umbrella_server>("prod.umbrella.demonware.net");
}
}
class component final : public component_interface
{
public:
void post_load() override
{
startup_dw();
server_thread = utils::thread::create_named_thread("Demonware", server_main);
}

View File

@ -3,12 +3,12 @@
#include "game/game.hpp"
#include "console.hpp"
#include "command.hpp"
#include "network.hpp"
#include "party.hpp"
#include "scheduler.hpp"
#include <utils/string.hpp>
#include <utils/cryptography.hpp>
#include <discord_rpc.h>
@ -18,6 +18,19 @@ namespace discord
{
DiscordRichPresence discord_presence;
void join_game(const char* join_secret)
{
game::Cbuf_AddText(0, utils::string::va("connect %s\n", join_secret));
}
void join_request(const DiscordUser* request)
{
#ifdef _DEBUG
console::info("Discord: Join request from %s (%s)\n", request->username, request->userId);
#endif
Discord_Respond(request->userId, DISCORD_REPLY_IGNORE);
}
void update_discord()
{
Discord_RunCallbacks();
@ -70,6 +83,13 @@ namespace discord
{
discord_presence.state = host_name;
discord_presence.partyMax = party::server_client_count();
std::hash<game::netadr_s> hash_fn;
static const auto nonce = utils::cryptography::random::get_integer();
const auto& address = party::get_target();
discord_presence.partyId = utils::string::va("%zu", hash_fn(address) ^ nonce);
discord_presence.joinSecret = network::net_adr_to_string(address);
}
if (!discord_presence.startTimestamp)
@ -101,13 +121,13 @@ namespace discord
handlers.ready = ready;
handlers.errored = errored;
handlers.disconnected = errored;
handlers.joinGame = nullptr;
handlers.joinGame = join_game;
handlers.spectateGame = nullptr;
handlers.joinRequest = nullptr;
handlers.joinRequest = join_request;
Discord_Initialize("823223724013912124", &handlers, 1, nullptr);
scheduler::once([]()
scheduler::once([]
{
scheduler::once(update_discord, scheduler::pipeline::async);
scheduler::loop(update_discord, scheduler::pipeline::async, 15s);
@ -118,7 +138,7 @@ namespace discord
void pre_destroy() override
{
if (!initialized_ || game::environment::is_dedi())
if (!initialized_)
{
return;
}

View File

@ -170,7 +170,6 @@ namespace dvar_cheats
utils::hook::jump(0x1404C3A9A, dvar_flag_checks_stub, true); // check extra dvar flags when setting values
utils::hook::nop(0x1402E2E03, 5); // remove error in PlayerCmd_SetClientDvar if setting a non-network dvar
utils::hook::set<uint8_t>(0x1402E2DCF, 0xEB);
// don't check flags on the dvars, send any existing dvar instead
utils::hook::jump(0x1402E2E4A, player_cmd_set_client_dvar, true); // send non-network dvars as string
utils::hook::call(0x1401BB782, cg_set_client_dvar_from_server);

View File

@ -38,9 +38,9 @@ namespace fastfiles
std::string buffer;
buffer.append(header.scriptfile->name, std::strlen(header.scriptfile->name) + 1);
buffer.append(reinterpret_cast<char*>(&header.scriptfile->compressedLen), 4);
buffer.append(reinterpret_cast<char*>(&header.scriptfile->len), 4);
buffer.append(reinterpret_cast<char*>(&header.scriptfile->bytecodeLen), 4);
buffer.append(reinterpret_cast<char*>(&header.scriptfile->compressedLen), sizeof(int));
buffer.append(reinterpret_cast<char*>(&header.scriptfile->len), sizeof(int));
buffer.append(reinterpret_cast<char*>(&header.scriptfile->bytecodeLen), sizeof(int));
buffer.append(header.scriptfile->buffer, header.scriptfile->compressedLen);
buffer.append(reinterpret_cast<char*>(header.scriptfile->bytecode), header.scriptfile->bytecodeLen);

View File

@ -1,13 +1,12 @@
#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include "dvars.hpp"
#include "filesystem.hpp"
#include "game_module.hpp"
#include "console.hpp"
#include "game/game.hpp"
#include "dvars.hpp"
#include <utils/hook.hpp>
#include <utils/string.hpp>
#include <utils/io.hpp>
@ -49,19 +48,8 @@ namespace filesystem
{
console::info("[FS] Startup\n");
initialized = true;
custom_path_registered = false;
register_path(get_binary_directory() + "\\data");
register_path("s1x");
// game's search paths
register_path("devraw");
register_path("devraw_shared");
register_path("raw_shared");
register_path("raw");
register_path("main");
game::FS_Startup(gamename);
}
@ -73,6 +61,28 @@ namespace filesystem
return elem == path;
});
}
void startup()
{
register_path("s1x");
register_path(get_binary_directory() + "\\data");
// game's search paths
register_path("devraw");
register_path("devraw_shared");
register_path("raw_shared");
register_path("raw");
register_path("main");
}
void check_for_startup()
{
if (!initialized)
{
initialized = true;
startup();
}
}
}
file::file(std::string name)
@ -106,6 +116,8 @@ namespace filesystem
std::string read_file(const std::string& path)
{
check_for_startup();
for (const auto& search_path : get_search_paths_internal())
{
const auto path_ = search_path / path;
@ -120,6 +132,8 @@ namespace filesystem
bool read_file(const std::string& path, std::string* data, std::string* real_path)
{
check_for_startup();
for (const auto& search_path : get_search_paths_internal())
{
const auto path_ = search_path / path;
@ -139,6 +153,8 @@ namespace filesystem
bool find_file(const std::string& path, std::string* real_path)
{
check_for_startup();
for (const auto& search_path : get_search_paths_internal())
{
const auto path_ = search_path / path;
@ -154,6 +170,8 @@ namespace filesystem
bool exists(const std::string& path)
{
check_for_startup();
for (const auto& search_path : get_search_paths_internal())
{
const auto path_ = search_path / path;
@ -168,11 +186,6 @@ namespace filesystem
void register_path(const std::filesystem::path& path)
{
if (!initialized)
{
return;
}
if (can_insert_path(path))
{
console::info("[FS] Registering path '%s'\n", path.generic_string().data());

View File

@ -70,7 +70,7 @@ namespace game_log
class component final : public component_interface
{
public:
void post_load() override
void post_unpack() override
{
if (game::environment::is_sp())
{

View File

@ -13,8 +13,7 @@
#include <utils/string.hpp>
#include <xsk/gsc/types.hpp>
#include <xsk/resolver.hpp>
#include <gsc_interface.hpp>
namespace gsc
{
@ -96,11 +95,11 @@ namespace gsc
if (function_id > 0x1000)
{
console::warn("in call to builtin method \"%s\"%s", xsk::gsc::s1::resolver::method_name(function_id).data(), error.data());
console::warn("in call to builtin method \"%s\"%s", gsc::cxt->meth_name(function_id).data(), error.data());
}
else
{
console::warn("in call to builtin function \"%s\"%s", xsk::gsc::s1::resolver::function_name(function_id).data(), error.data());
console::warn("in call to builtin function \"%s\"%s", gsc::cxt->func_name(function_id).data(), error.data());
}
}
@ -108,7 +107,8 @@ namespace gsc
{
try
{
return {xsk::gsc::s1::resolver::opcode_name(opcode)};
const auto index = gsc::cxt->opcode_enum(opcode);
return {gsc::cxt->opcode_name(index)};
}
catch (...)
{
@ -232,7 +232,7 @@ namespace gsc
void override_function(const std::string& name, game::BuiltinFunction func)
{
const auto id = xsk::gsc::s1::resolver::function_id(name);
const auto id = gsc::cxt->func_id(name);
builtin_funcs_overrides.emplace(id, func);
}
@ -240,7 +240,7 @@ namespace gsc
{
++function_id_start;
functions[function_id_start] = function;
xsk::gsc::s1::resolver::add_function(name, function_id_start);
gsc::cxt->func_add(name, function_id_start);
}
class extension final : public component_interface

View File

@ -2,8 +2,10 @@
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include <utils/io.hpp>
#include <utils/compression.hpp>
#include <utils/hook.hpp>
#include <utils/io.hpp>
#include <utils/memory.hpp>
#include "component/filesystem.hpp"
#include "component/console.hpp"
@ -12,37 +14,29 @@
#include "script_loading.hpp"
#include <xsk/gsc/types.hpp>
#include <xsk/gsc/interfaces/compiler.hpp>
#include <xsk/gsc/interfaces/decompiler.hpp>
#include <xsk/gsc/interfaces/assembler.hpp>
#include <xsk/gsc/interfaces/disassembler.hpp>
#include <xsk/utils/compression.hpp>
#include <xsk/resolver.hpp>
#include <interface.hpp>
#include <gsc_interface.hpp>
namespace gsc
{
namespace
{
auto compiler = ::gsc::compiler();
auto decompiler = ::gsc::decompiler();
auto assembler = ::gsc::assembler();
auto disassembler = ::gsc::disassembler();
std::unordered_map<std::string, unsigned int> main_handles;
std::unordered_map<std::string, unsigned int> init_handles;
std::unordered_map<std::string, game::ScriptFile*> loaded_scripts;
utils::memory::allocator script_allocator;
const game::dvar_t* developer_script;
void clear()
{
main_handles.clear();
init_handles.clear();
loaded_scripts.clear();
script_allocator.clear();
}
bool read_script_file(const std::string& name, std::string* data)
bool read_raw_script_file(const std::string& name, std::string* data)
{
if (filesystem::read_file(name, data))
{
@ -86,18 +80,44 @@ namespace gsc
return itr->second;
}
std::string source_buffer{};
if (!read_script_file(real_name + ".gsc", &source_buffer))
{
return nullptr;
}
std::vector<std::uint8_t> data;
data.assign(source_buffer.begin(), source_buffer.end());
try
{
compiler->compile(real_name, data);
auto& compiler = gsc::cxt->compiler();
auto& assembler = gsc::cxt->assembler();
std::string source_buffer{};
if (!read_raw_script_file(real_name + ".gsc", &source_buffer))
{
return nullptr;
}
std::vector<std::uint8_t> data;
data.assign(source_buffer.begin(), source_buffer.end());
const auto assembly_ptr = compiler.compile(real_name, data);
// Pair of two buffers. First is the byte code and second is the stack
const auto output_script = assembler.assemble(*assembly_ptr);
const auto script_file_ptr = static_cast<game::ScriptFile*>(script_allocator.allocate(sizeof(game::ScriptFile)));
script_file_ptr->name = file_name;
script_file_ptr->len = static_cast<int>(output_script.second.size);
script_file_ptr->bytecodeLen = static_cast<int>(output_script.first.size);
const auto stack_size = static_cast<std::uint32_t>(output_script.second.size + 1);
const auto byte_code_size = static_cast<std::uint32_t>(output_script.first.size + 1);
script_file_ptr->buffer = static_cast<char*>(script_allocator.allocate(stack_size));
std::memcpy(const_cast<char*>(script_file_ptr->buffer), output_script.second.data, output_script.second.size);
script_file_ptr->bytecode = static_cast<std::uint8_t*>(game::PMem_AllocFromSource_NoDebug(byte_code_size, 4, 1, 5));
std::memcpy(script_file_ptr->bytecode, output_script.first.data, output_script.first.size);
script_file_ptr->compressedLen = 0;
loaded_scripts[real_name] = script_file_ptr;
return script_file_ptr;
}
catch (const std::exception& ex)
{
@ -106,49 +126,21 @@ namespace gsc
console::error("**********************************************\n");
return nullptr;
}
}
auto assembly = compiler->output();
try
std::string get_raw_script_file_name(const std::string& name)
{
if (name.ends_with(".gsh"))
{
assembler->assemble(real_name, assembly);
}
catch (const std::exception& ex)
{
console::error("*********** script compile error *************\n");
console::error("failed to assemble '%s':\n%s", real_name.data(), ex.what());
console::error("**********************************************\n");
return nullptr;
return name;
}
const auto script_file_ptr = static_cast<game::ScriptFile*>(game::Hunk_AllocateTempMemoryHighInternal(sizeof(game::ScriptFile)));
script_file_ptr->name = file_name;
const auto stack = assembler->output_stack();
script_file_ptr->len = static_cast<int>(stack.size());
const auto script = assembler->output_script();
script_file_ptr->bytecodeLen = static_cast<int>(script.size());
const auto stack_size = static_cast<std::uint32_t>(stack.size() + 1);
const auto byte_code_size = static_cast<std::uint32_t>(script.size() + 1);
script_file_ptr->buffer = static_cast<char*>(game::Hunk_AllocateTempMemoryHighInternal(stack_size));
std::memcpy(const_cast<char*>(script_file_ptr->buffer), stack.data(), stack.size());
script_file_ptr->bytecode = static_cast<std::uint8_t*>(game::PMem_AllocFromSource_NoDebug(byte_code_size, 4, 1, 5));
std::memcpy(script_file_ptr->bytecode, script.data(), script.size());
script_file_ptr->compressedLen = 0;
loaded_scripts[real_name] = script_file_ptr;
return script_file_ptr;
return name + ".gsc";
}
std::string get_script_file_name(const std::string& name)
{
const auto id = xsk::gsc::s1::resolver::token_id(name);
const auto id = gsc::cxt->token_id(name);
if (!id)
{
return name;
@ -157,7 +149,7 @@ namespace gsc
return std::to_string(id);
}
std::vector<std::uint8_t> decompile_script_file(const std::string& name, const std::string& real_name)
std::pair<xsk::gsc::buffer, std::vector<std::uint8_t>> read_compiled_script_file(const std::string& name, const std::string& real_name)
{
const auto* script_file = game::DB_FindXAssetHeader(game::ASSET_TYPE_SCRIPTFILE, name.data(), false).scriptfile;
if (!script_file)
@ -167,17 +159,14 @@ namespace gsc
console::info("Decompiling scriptfile '%s'\n", real_name.data());
std::vector<std::uint8_t> stack{script_file->buffer, script_file->buffer + script_file->len};
std::vector<std::uint8_t> bytecode{script_file->bytecode, script_file->bytecode + script_file->bytecodeLen};
const std::string stack{script_file->buffer, static_cast<std::uint32_t>(script_file->len)};
auto decompressed_stack = xsk::utils::zlib::decompress(stack, static_cast<std::uint32_t>(stack.size()));
const auto decompressed_stack = utils::compression::zlib::decompress(stack);
disassembler->disassemble(name, bytecode, decompressed_stack);
auto output = disassembler->output();
std::vector<std::uint8_t> stack_data;
stack_data.assign(decompressed_stack.begin(), decompressed_stack.end());
decompiler->decompile(name, output);
return decompiler->output();
return {{script_file->bytecode, static_cast<std::uint32_t>(script_file->bytecodeLen)}, stack_data};
}
void load_script(const std::string& name)
@ -187,8 +176,8 @@ namespace gsc
return;
}
const auto main_handle = game::Scr_GetFunctionHandle(name.data(), xsk::gsc::s1::resolver::token_id("main"));
const auto init_handle = game::Scr_GetFunctionHandle(name.data(), xsk::gsc::s1::resolver::token_id("init"));
const auto main_handle = game::Scr_GetFunctionHandle(name.data(), gsc::cxt->token_id("main"));
const auto init_handle = game::Scr_GetFunctionHandle(name.data(), gsc::cxt->token_id("init"));
if (main_handle)
{
@ -285,7 +274,7 @@ namespace gsc
for (auto& function_handle : main_handles)
{
console::info("Executing '%s::main'\n", function_handle.first.data());
const auto thread = game::Scr_ExecThread(function_handle.second, 0);
const auto thread = game::Scr_ExecThread(static_cast<int>(function_handle.second), 0);
game::RemoveRefToObject(thread);
}
}
@ -305,19 +294,58 @@ namespace gsc
for (auto& function_handle : init_handles)
{
console::info("Executing '%s::init'\n", function_handle.first.data());
const auto thread = game::Scr_ExecThread(function_handle.second, 0);
const auto thread = game::Scr_ExecThread(static_cast<int>(function_handle.second), 0);
game::RemoveRefToObject(thread);
}
}
void scr_begin_load_scripts_stub()
{
const auto comp_mode = developer_script->current.enabled ?
xsk::gsc::build::dev :
xsk::gsc::build::prod;
gsc::cxt->init(comp_mode, [](const std::string& include_name) -> std::pair<xsk::gsc::buffer, std::vector<std::uint8_t>>
{
const auto real_name = get_raw_script_file_name(include_name);
std::string file_buffer;
if (!read_raw_script_file(real_name, &file_buffer) || file_buffer.empty())
{
const auto name = get_script_file_name(include_name);
if (game::DB_XAssetExists(game::ASSET_TYPE_SCRIPTFILE, name.data()))
{
return read_compiled_script_file(name, real_name);
}
throw std::runtime_error(std::format("Could not load gsc file '{}'", real_name));
}
std::vector<std::uint8_t> script_data;
script_data.assign(file_buffer.begin(), file_buffer.end());
return {{}, script_data};
});
utils::hook::invoke<void>(SELECT_VALUE(0x1403118E0, 0x1403EDE60));
}
void scr_end_load_scripts_stub()
{
// Cleanup the compiler
gsc::cxt->cleanup();
utils::hook::invoke<void>(SELECT_VALUE(0x140243780, 0x1403EDF90));
}
}
game::ScriptFile* find_script(game::XAssetType type, const char* name, int allow_create_default)
{
std::string real_name = name;
const auto id = static_cast<std::uint16_t>(std::atoi(name));
const auto id = static_cast<std::uint16_t>(std::strtol(name, nullptr, 10));
if (id)
{
real_name = xsk::gsc::s1::resolver::token_name(id);
real_name = gsc::cxt->token_name(id);
}
auto* script = load_custom_script(name, real_name);
@ -332,39 +360,26 @@ namespace gsc
class loading final : public component_interface
{
public:
void post_load() override
{
gsc::cxt = std::make_unique<xsk::gsc::s1_pc::context>();
}
void post_unpack() override
{
// Load our scripts with an uncompressed stack
utils::hook::call(SELECT_VALUE(0x14031ABB0, 0x1403F7380), db_get_raw_buffer_stub);
utils::hook::call(SELECT_VALUE(0x1403309E9, 0x1403309E9), scr_begin_load_scripts_stub); // GScr_LoadScripts
utils::hook::call(SELECT_VALUE(0x14023DA84, 0x140330B9C), scr_end_load_scripts_stub); // GScr_LoadScripts
developer_script = game::Dvar_RegisterBool("developer_script", false, game::DVAR_FLAG_NONE, "Enable developer script comments");
if (game::environment::is_sp())
{
return;
}
// Allow custom scripts to include other custom scripts
xsk::gsc::s1::resolver::init([](const auto& include_name) -> std::vector<std::uint8_t>
{
const auto real_name = include_name + ".gsc";
std::string file_buffer;
if (!read_script_file(real_name, &file_buffer) || file_buffer.empty())
{
const auto name = get_script_file_name(include_name);
if (game::DB_XAssetExists(game::ASSET_TYPE_SCRIPTFILE, name.data()))
{
return decompile_script_file(name, real_name);
}
throw std::runtime_error(std::format("Could not load gsc file '{}'", real_name));
}
std::vector<std::uint8_t> result;
result.assign(file_buffer.begin(), file_buffer.end());
return result;
});
// ProcessScript
utils::hook::call(0x1403F7317, find_script);
utils::hook::call(0x1403F7327, db_is_x_asset_default);
@ -380,7 +395,6 @@ namespace gsc
{
if (free_scripts)
{
xsk::gsc::s1::resolver::cleanup();
clear();
}
});

View File

@ -26,7 +26,7 @@ namespace motd
{
return motd_future.get().value_or(motd_resource);
}
catch (std::exception&)
catch (...)
{
}

View File

@ -190,7 +190,7 @@ namespace notifies
scheduler::once([params, message, msg_index, client_num]
{
const scripting::entity level{*game::levelEntityId};
const auto player = scripting::call("getEntByNum", {client_num}).as<scripting::entity>();
const auto player = scripting::call("getentbynum", {client_num}).as<scripting::entity>();
// Remove \x1F before sending the notify only if present
const auto notify_msg = msg_index ? message.substr(1) : message;

View File

@ -204,6 +204,11 @@ namespace party
return count;
}
game::netadr_s& get_target()
{
return connect_state.host;
}
void connect(const game::netadr_s& target)
{
if (game::environment::is_sp())

View File

@ -10,8 +10,10 @@ namespace party
void clear_sv_motd();
int server_client_count();
int get_client_num_by_name(const std::string& name);
[[nodiscard]] int get_client_num_by_name(const std::string& name);
int get_client_count();
int get_bot_count();
[[nodiscard]] int get_client_count();
[[nodiscard]] int get_bot_count();
[[nodiscard]] game::netadr_s& get_target();
}

View File

@ -1,12 +1,14 @@
#include <std_include.hpp>
#include "game/game.hpp"
#include "../services.hpp"
#include <utils/nt.hpp>
#include <utils/io.hpp>
#include <utils/cryptography.hpp>
#include "game/game.hpp"
#include "component/motd.hpp"
#include <component/motd.hpp>
#include <component/filesystem.hpp>
namespace demonware
{
@ -19,18 +21,21 @@ namespace demonware
this->register_task(13, &bdStorage::unk13);
this->map_publisher_resource_variant(".*\\motd-.*\\.txt", motd::get_text);
this->map_publisher_resource("ffotd-.*\\.ff", DW_FASTFILE);
this->map_publisher_resource("playlists(_.+)?\\.aggr", DW_PLAYLISTS);
this->map_publisher_resource("social_[Tt][Uu][0-9]+\\.cfg", DW_SOCIAL_CONFIG);
this->map_publisher_resource("mm\\.cfg", DW_MM_CONFIG);
this->map_publisher_resource("entitlement_config\\.info", DW_ENTITLEMENT_CONFIG);
this->map_publisher_resource("lootConfig_[Tt][Uu][0-9]+\\.csv", DW_LOOT_CONFIG);
this->map_publisher_resource("winStoreConfig_[Tt][Uu][0-9]+\\.csv", DW_STORE_CONFIG);
this->map_publisher_resource("ffotd-.*\\.ff", "dw/ffotd-1.22.1.ff", DW_FASTFILE);
this->map_publisher_resource("playlists(_.+)?\\.aggr", "dw/playlists_tu22.aggr", DW_PLAYLISTS);
this->map_publisher_resource("social_[Tt][Uu][0-9]+\\.cfg", "dw/social_tu22.cfg", DW_SOCIAL_CONFIG);
this->map_publisher_resource("mm\\.cfg", "dw/mm.cfg", DW_MM_CONFIG);
this->map_publisher_resource("entitlement_config\\.info", "dw/entitlement_config.info", DW_ENTITLEMENT_CONFIG);
this->map_publisher_resource("lootConfig_[Tt][Uu][0-9]+\\.csv", "dw/lootConfig_tu22.csv", DW_LOOT_CONFIG);
this->map_publisher_resource("winStoreConfig_[Tt][Uu][0-9]+\\.csv", "dw/winStoreConfig_tu22.csv", DW_STORE_CONFIG);
}
void bdStorage::map_publisher_resource(const std::string& expression, const INT id)
void bdStorage::map_publisher_resource(const std::string& expression, const std::string& path, const int id)
{
auto data = utils::nt::load_resource(id);
auto data = filesystem::exists(path)
? filesystem::read_file(path)
: utils::nt::load_resource(id);
this->map_publisher_resource_variant(expression, std::move(data));
}
@ -44,7 +49,7 @@ namespace demonware
this->publisher_resources_.emplace_back(std::regex{expression}, std::move(resource));
}
bool bdStorage::load_publisher_resource(const std::string& name, std::string& buffer)
bool bdStorage::load_publisher_resource(const std::string& name, std::string& buffer) const
{
for (const auto& resource : this->publisher_resources_)
{

View File

@ -12,9 +12,9 @@ namespace demonware
using resource_variant = std::variant<std::string, callback>;
std::vector<std::pair<std::regex, resource_variant>> publisher_resources_;
void map_publisher_resource(const std::string& expression, INT id);
void map_publisher_resource(const std::string& expression, const std::string& path, int id);
void map_publisher_resource_variant(const std::string& expression, resource_variant resource);
bool load_publisher_resource(const std::string& name, std::string& buffer);
bool load_publisher_resource(const std::string& name, std::string& buffer) const;
void list_publisher_files(service_server* server, byte_buffer* buffer);
void get_publisher_file(service_server* server, byte_buffer* buffer);

View File

@ -5,33 +5,26 @@
#include "component/gsc/script_extension.hpp"
#include <xsk/gsc/types.hpp>
#include <xsk/resolver.hpp>
#include <gsc_interface.hpp>
namespace scripting
{
namespace
{
int find_function_index(const std::string& name, const bool prefer_global)
int find_function_index(const std::string& name, [[maybe_unused]] const bool prefer_global)
{
const auto target = utils::string::to_lower(name);
auto first = xsk::gsc::s1::resolver::function_id;
auto second = xsk::gsc::s1::resolver::method_id;
if (!prefer_global)
auto const& first = gsc::cxt->func_map();
auto const& second = gsc::cxt->meth_map();
if (const auto itr = first.find(name); itr != first.end())
{
std::swap(first, second);
return static_cast<int>(itr->second);
}
const auto first_res = first(target);
if (first_res)
if (const auto itr = second.find(name); itr != second.end())
{
return first_res;
}
const auto second_res = second(target);
if (second_res)
{
return second_res;
return static_cast<int>(itr->second);
}
return -1;
@ -50,17 +43,17 @@ namespace scripting
std::string find_token(std::uint32_t id)
{
return xsk::gsc::s1::resolver::token_name(static_cast<std::uint16_t>(id));
return gsc::cxt->token_name(id);
}
std::string find_token_single(std::uint32_t id)
{
return xsk::gsc::s1::resolver::token_name(static_cast<std::uint16_t>(id));
return gsc::cxt->token_name(id);
}
unsigned int find_token_id(const std::string& name)
{
const auto id = xsk::gsc::s1::resolver::token_id(name);
const auto id = gsc::cxt->token_id(name);
if (id)
{
return id;

View File

@ -11,8 +11,7 @@
#include <utils/string.hpp>
#include <xsk/gsc/types.hpp>
#include <xsk/resolver.hpp>
#include <gsc_interface.hpp>
namespace scripting::lua
{
@ -246,7 +245,7 @@ namespace scripting::lua
auto entity_type = state.new_usertype<entity>("entity");
for (const auto& func : xsk::gsc::s1::resolver::get_methods())
for (auto const& func : gsc::cxt->meth_map())
{
const auto name = std::string(func.first);
entity_type[name] = [name](const entity& entity, const sol::this_state s, sol::variadic_args va)
@ -378,7 +377,7 @@ namespace scripting::lua
auto game_type = state.new_usertype<game>("game_");
state["game"] = game();
for (const auto& func : xsk::gsc::s1::resolver::get_functions())
for (auto const& func : gsc::cxt->func_map())
{
const auto name = std::string(func.first);
game_type[name] = [name](const game&, const sol::this_state s, sol::variadic_args va)

View File

@ -236,7 +236,7 @@ int main()
return static_cast<int>(entry_point());
}
int __stdcall WinMain(HINSTANCE, HINSTANCE, PSTR, int)
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)
{
return main();
}

View File

@ -43,7 +43,7 @@ namespace utils
{
std::lock_guard _(this->mutex_);
const auto data = memory::allocate(length);
auto* data = memory::allocate(length);
this->pool_.push_back(data);
return data;
}
@ -57,7 +57,7 @@ namespace utils
{
std::lock_guard _(this->mutex_);
const auto data = memory::duplicate_string(string);
auto* data = memory::duplicate_string(string);
this->pool_.push_back(data);
return data;
}
@ -69,7 +69,7 @@ namespace utils
char* memory::duplicate_string(const std::string& string)
{
const auto new_string = allocate_array<char>(string.size() + 1);
auto* new_string = allocate_array<char>(string.size() + 1);
std::memcpy(new_string, string.data(), string.size());
return new_string;
}