mirror of
https://github.com/XLabsProject/s1x-client.git
synced 2023-08-02 15:02:12 +02:00
commit
ad0301d770
5
.gitmodules
vendored
5
.gitmodules
vendored
@ -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
|
||||
|
228
data/dw/entitlement_config.info
Normal file
228
data/dw/entitlement_config.info
Normal 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
BIN
data/dw/ffotd-1.22.1.ff
Normal file
Binary file not shown.
1050
data/dw/lootConfig_tu22.csv
Normal file
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
1
data/dw/mm.cfg
Normal 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
BIN
data/dw/playlists_tu22.aggr
Normal file
Binary file not shown.
172
data/dw/social_tu22.cfg
Normal file
172
data/dw/social_tu22.cfg
Normal 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
|
206
data/dw/winStoreConfig_tu22.csv
Normal file
206
data/dw/winStoreConfig_tu22.csv
Normal 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,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;
|
||||
}
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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 );
|
||||
|
@ -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
2
deps/GSL
vendored
@ -1 +1 @@
|
||||
Subproject commit cbf5e664fc55cbcc33b10f3058ede325cd133a01
|
||||
Subproject commit 49c88f27bd642b8d80371cbd0b8cffbfe5367c44
|
6
deps/extra/gsc-tool/gsc_interface.cpp
vendored
Normal file
6
deps/extra/gsc-tool/gsc_interface.cpp
vendored
Normal 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
15
deps/extra/gsc-tool/gsc_interface.hpp
vendored
Normal 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;
|
||||
}
|
28
deps/extra/gsc-tool/interface.cpp
vendored
28
deps/extra/gsc-tool/interface.cpp
vendored
@ -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>();
|
||||
}
|
||||
}
|
9
deps/extra/gsc-tool/interface.hpp
vendored
9
deps/extra/gsc-tool/interface.hpp
vendored
@ -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
1
deps/fmt
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit e03753c4ac04d80517ec5fa92e78b0dc1f896a70
|
2
deps/gsc-tool
vendored
2
deps/gsc-tool
vendored
@ -1 +1 @@
|
||||
Subproject commit 7d374025b7675bada64c247ebe9378dd335a33da
|
||||
Subproject commit adf88fc5c9e5f0ecf3a7743e82c95c4482822bf8
|
2
deps/lua
vendored
2
deps/lua
vendored
@ -1 +1 @@
|
||||
Subproject commit d69789da1ccfa4db7c241de6b471d6b729f1561e
|
||||
Subproject commit cf08915d62e338c987b71c078b148490510e9fe7
|
34
deps/premake/fmt.lua
vendored
Normal file
34
deps/premake/fmt.lua
vendored
Normal 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)
|
29
deps/premake/gsc-tool.lua
vendored
29
deps/premake/gsc-tool.lua
vendored
@ -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)
|
||||
|
3
deps/premake/libtomcrypt.lua
vendored
3
deps/premake/libtomcrypt.lua
vendored
@ -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
2
deps/zlib
vendored
@ -1 +1 @@
|
||||
Subproject commit 02a6049eb3884c430268bb0fe3296d597a03174c
|
||||
Subproject commit fa8cd50ada68b873c754766bc73b12080b7b309e
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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())
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
});
|
||||
|
@ -26,7 +26,7 @@ namespace motd
|
||||
{
|
||||
return motd_future.get().value_or(motd_resource);
|
||||
}
|
||||
catch (std::exception&)
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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())
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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_)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user