global function Sh_GamemodeGG_Init global function GetGunGameWeapons global const string GAMEMODE_GG = "gg" global struct GunGameWeapon { string weapon array mods = [] int offhandSlot = -1 } struct { array weapons } file void function Sh_GamemodeGG_Init() { // create custom gamemode AddCallback_OnCustomGamemodesInit( CreateGamemodeGG ) Sh_GGEarnMeter_Init(GAMEMODE_GG) } void function CreateGamemodeGG() { GameMode_Create( GAMEMODE_GG ) GameMode_SetName( GAMEMODE_GG, "#GAMEMODE_GG" ) GameMode_SetDesc( GAMEMODE_GG, "#PL_gg_desc" ) GameMode_SetGameModeAnnouncement( GAMEMODE_GG, "ffa_modeDesc" ) GameMode_SetDefaultTimeLimits( GAMEMODE_GG, 10, 0.0 ) GameMode_AddScoreboardColumnData( GAMEMODE_GG, "#SCOREBOARD_SCORE", PGS_ASSAULT_SCORE, 2 ) GameMode_AddScoreboardColumnData( GAMEMODE_GG, "#SCOREBOARD_PILOT_KILLS", PGS_PILOT_KILLS, 2 ) GameMode_SetColor( GAMEMODE_GG, [147, 204, 57, 255] ) AddPrivateMatchMode( GAMEMODE_GG ) // add to private lobby modes AddPrivateMatchModeSettingArbitrary( "#GAMEMODE_gg", "gg_kill_reward", "1.0" ) AddPrivateMatchModeSettingArbitrary( "#GAMEMODE_gg", "gg_assist_reward", "0.0" ) AddPrivateMatchModeSettingArbitrary( "#GAMEMODE_gg", "gg_execution_reward", "1.0" ) // Custom Weapons int index = 0 while ( GetCurrentPlaylistVarString( "gg_weapon_" + index, "NOPE" ) != "NOPE" ) { file.weapons.append( StringToGGWeapon( GetCurrentPlaylistVarString( "gg_weapon_" + index, "" ) ) ) index++ } // Default Weapons - Don't edit this to make custom lists anymore, please try to use playlist vars so that everything gets synced correctly. if ( file.weapons.len() == 0 ) { // SMGs GunGameWeapon ggCar = { weapon = "mp_weapon_car", mods = [ "pas_run_and_gun" ], ... } // CAR GunGameWeapon ggAlternator = { weapon = "mp_weapon_alternator_smg", mods = [ "pas_run_and_gun" ], ... } // Alternator GunGameWeapon ggVolt = { weapon = "mp_weapon_hemlok_smg", ... } // Volt // Rifles GunGameWeapon ggHemlok = { weapon = "mp_weapon_hemlok", ... } // Hemlok GunGameWeapon ggFlatline = { weapon = "mp_weapon_vinson", mods = [ "hcog" ], ... } // Flatline GunGameWeapon ggR201 = { weapon = "mp_weapon_rspn101", ... } // R201 // LMGs GunGameWeapon ggDevotion = { weapon = "mp_weapon_esaw", ... } // Devotion GunGameWeapon ggLstar = { weapon = "mp_weapon_lstar", mods = [ "pas_run_and_gun" ], ... } // L-Star // Shotguns GunGameWeapon ggEva = { weapon = "mp_weapon_shotgun", ... } // Eva-8 GunGameWeapon ggMastiff = { weapon = "mp_weapon_mastiff", ... } // Mastiff // Grenadiers GunGameWeapon ggSoftball = { weapon = "mp_weapon_softball", ... } // Softball GunGameWeapon ggEpg = { weapon = "mp_weapon_epg", mods = [ "jump_kit" ], ... } // EPG // Primary Pistols GunGameWeapon ggMozam = { weapon = "mp_weapon_shotgun_pistol", mods = [ "pas_run_and_gun" ], ... } // Mozambique GunGameWeapon ggWme = { weapon = "mp_weapon_wingman_n", mods = [ "pas_run_and_gun", "ricochet" ], ... } // Wingman Elite // Snipers GunGameWeapon ggTaketake = { weapon = "mp_weapon_doubletake", ... } // Double Take GunGameWeapon ggKraber = { weapon = "mp_weapon_sniper", mods = [ "pas_fast_ads", "ricochet" ], ... } // Kraber // Secondary Pistols GunGameWeapon ggRe45 = { weapon = "mp_weapon_autopistol", mods = [ "pas_run_and_gun", "temp_sight" ], ... } // RE-45 GunGameWeapon ggP2016 = { weapon = "mp_weapon_semipistol", mods = [ "pas_run_and_gun" ], ... } // P2016 GunGameWeapon ggWingman = { weapon = "mp_weapon_wingman", mods = [ "pas_run_and_gun" ], ... } // Wingman // Final/Special GunGameWeapon ggChargeRifle = { weapon = "mp_weapon_defender", ... } // Charge Rifle GunGameWeapon ggPulseBlade = { weapon = "mp_weapon_grenade_sonar", mods = [ "pas_power_cell", "amped_tacticals" ], offhandSlot = OFFHAND_SPECIAL } // Pulse Blade file.weapons.append( ggCar ) file.weapons.append( ggAlternator ) file.weapons.append( ggVolt ) file.weapons.append( ggHemlok ) file.weapons.append( ggFlatline ) file.weapons.append( ggR201 ) file.weapons.append( ggDevotion ) file.weapons.append( ggLstar ) file.weapons.append( ggEva ) file.weapons.append( ggMastiff ) file.weapons.append( ggSoftball ) file.weapons.append( ggEpg ) file.weapons.append( ggMozam ) file.weapons.append( ggWme ) file.weapons.append( ggTaketake ) file.weapons.append( ggKraber ) file.weapons.append( ggRe45 ) file.weapons.append( ggP2016 ) file.weapons.append( ggWingman ) file.weapons.append( ggChargeRifle ) file.weapons.append( ggPulseBlade ) } foreach ( ggWeapon in file.weapons ) if ( ggWeapon.weapon == "mp_weapon_lstar" ) if ( RandomInt( 100 ) <= 5 ) ggWeapon.mods.append( "rcee" ) // Easter egg mod that changes the screen of the lstar. // Set this to the number of guns. GameMode_SetDefaultScoreLimits( GAMEMODE_GG, file.weapons.len(), 0 ) #if SERVER GameMode_AddServerInit( GAMEMODE_GG, GamemodeGG_Init ) GameMode_AddServerInit( GAMEMODE_GG, GamemodeFFAShared_Init ) GameMode_SetPilotSpawnpointsRatingFunc( GAMEMODE_GG, RateSpawnpoints_Generic ) GameMode_SetTitanSpawnpointsRatingFunc( GAMEMODE_GG, RateSpawnpoints_Generic ) #elseif CLIENT GameMode_AddClientInit( GAMEMODE_GG, ClGamemodeGG_Init ) GameMode_AddClientInit( GAMEMODE_GG, GamemodeFFAShared_Init ) GameMode_AddClientInit( GAMEMODE_GG, ClGamemodeFFA_Init ) #endif #if !UI GameMode_SetScoreCompareFunc( GAMEMODE_GG, CompareAssaultScore ) GameMode_AddSharedInit( GAMEMODE_GG, GamemodeFFA_Dialogue_Init ) #endif } array function GetGunGameWeapons() { return file.weapons } string function GGWeaponToString( GunGameWeapon ggWeapon ) { // We do it in this order because split works weirdly and won't return empty strings for gaps :c return ggWeapon.offhandSlot + "|" + ggWeapon.weapon + "|" + JoinStringArray( ggWeapon.mods, "," ) } GunGameWeapon function StringToGGWeapon( string ggWeaponString ) { array ggWeaponStringSplit = split( ggWeaponString, "|" ) GunGameWeapon ggWeapon ggWeapon.offhandSlot = int(ggWeaponStringSplit[0]) ggWeapon.weapon = ggWeaponStringSplit[1] if ( ggWeaponStringSplit.len() > 2 ) ggWeapon.mods = split( ggWeaponStringSplit[2], "," ) return ggWeapon }