#include maps\mp\_utility; #include maps\mp\gametypes\_hud_util; #include common_scripts\utility; init() { /* level.lootColors = []; level.lootColors["epic"] = (0.63, 0.2, 0.7) * 1.2; level.lootColors["rare"] = (0, 0.43, 0.76) * 1.2; level.lootColors["common"] = (0.11, 1, 0) * 1.0; level.lootColors["none"] = (1, 1, 0.5); */ /* level.lootColors["epic"] = (0.75, 1, 0.73) * 1.0; level.lootColors["rare"] = (0.75, 1, 0.73) * 1.0; level.lootColors["common"] = (0.75, 1, 0.73) * 1.0; level.lootColors["none"] = (1, 1, 0.5); */ precacheString( &"MP_DOLLAR" ); level._effect["money"] = loadfx ("props/cash_player_drop"); maps\mp\gametypes\_rank::registerScoreInfo( "gear", 1000 ); maps\mp\gametypes\_rank::registerScoreInfo( "money", 1000 ); maps\mp\gametypes\_rank::registerScoreInfo( "common", 500 ); maps\mp\gametypes\_rank::registerScoreInfo( "rare", 1000 ); maps\mp\gametypes\_rank::registerScoreInfo( "epic", 2000 ); level.lootMins["epic"] = 90; level.lootMins["rare"] = 70; //level.lootMins["common"] = 95; level.lootIndices["epic"] = 2; level.lootIndices["rare"] = 1; level.lootIndices["common"] = 0; level.lootBaseChance = 0.05; level.lootIdealTime = (15*60); /# thread updateLootDvars(); #/ thread onPlayerConnect(); } onPlayerConnect() { for ( ;; ) { level waittill( "connected", player ); player.pers["money"] = player maps\mp\gametypes\_persistence::statGet( "money" ); player.displayMoney = player.pers["money"]; player.moneyUpdateTotal = 0; player.timeSinceLastLoot = player maps\mp\gametypes\_persistence::statGet( "timeSinceLastLoot" ); player thread initLootDisplay(); player thread onPlayerSpawned(); player thread onGameEnded(); } } onPlayerSpawned() { for ( ;; ) { self waittill( "spawned_player" ); self thread trackLastLootTime(); } } onGameEnded() { self endon ( "disconnect" ); level waittill ( "game_ended" ); self maps\mp\gametypes\_persistence::statSet( "timeSinceLastLoot", self.timeSinceLastLoot ); } trackLastLootTime() { self endon ( "death" ); self endon ( "disconnect" ); level endon ( "game_ended" ); for ( ;; ) { wait ( 1.0 ); self.timeSinceLastLoot += 1; } } initLootDisplay() { self.totalMoney = createFontString( "bigfixed", 0.8 ); self.totalMoney setPoint( "TOPRIGHT" ); self.totalMoney setValue( self.pers["money"] ); self.totalMoney.label = &"MP_DOLLAR"; self.totalMoney.glowColor = (0.3, 0.8, 0.3); self.totalMoney.glowAlpha = 1; self.totalMoney.alpha = 0; self.earnedMoney = createFontString( "bigfixed", 0.7 ); self.earnedMoney setParent( self.totalMoney ); self.earnedMoney setPoint( "TOPRIGHT", "BOTTOMRIGHT", 0, 10 ); self.earnedMoney setValue( 0 ); self.earnedMoney.label = &"MP_PLUS"; self.earnedMoney.glowColor = (0.3, 0.8, 0.3); self.earnedMoney.glowAlpha = 0.1; self.earnedMoney.alpha = 0; } moMoney() { self endon ( "disconnect" ); for ( ;; ) { wait ( randomFloatRange( 8.0, 10.0 ) ); self thread giveMoney( "asdf", randomIntRange( 100, 5000 ) ); } } giveMoney( type, amount ) { if ( !self rankingEnabled() ) return; self endon ( "disconnect" ); self notify( "giveMoney" ); self endon( "giveMoney" ); self.displayMoney = self.pers["money"]; self.pers["money"] += amount; self maps\mp\gametypes\_persistence::statSet( "money", self.pers["money"] ); self.moneyUpdateTotal += amount; self.totalMoney fadeOverTime( 0.5 ); self.totalMoney.alpha = 1; self.earnedMoney fadeOverTime( 0.5 ); self.earnedMoney.alpha = 1; self.earnedMoney setValue( self.moneyUpdateTotal ); wait ( 1.0 ); increment = max( int( self.moneyUpdateTotal / 30 ), 1 ); while ( self.moneyUpdateTotal > 0 ) { addMoney = min( self.moneyUpdateTotal, increment ); self.moneyUpdateTotal -= addMoney; self.displayMoney += addMoney; self.totalMoney setValue( self.displayMoney ); self.earnedMoney setValue( self.moneyUpdateTotal ); wait ( 0.05 ); } self.earnedMoney fadeOverTime( 1.0 ); self.earnedMoney.alpha = 0; wait ( 2.0 ); self.totalMoney fadeOverTime( 1.0 ); self.totalMoney.alpha = 0; } updateLootDvars() { if ( getDvar( "scr_loot_epicMin" ) == "" ) setDvar( "scr_loot_epicMin", level.lootMins["epic"] ); if ( getDvar( "scr_loot_rareMin" ) == "" ) setDvar( "scr_loot_rareMin", level.lootMins["rare"] ); //if ( getDvar( "scr_loot_commonMin" ) == "" ) // setDvar( "scr_loot_commonMin", level.lootMins["common"] ); if ( getDvar( "scr_loot_baseChance" ) == "" ) setDvar( "scr_loot_baseChance", level.lootBaseChance ); if ( getDvar( "scr_loot_idealTime" ) == "" ) setDvar( "scr_loot_idealTime", level.lootIdealTime ); /# if ( getDvar( "scr_forceloot" ) == "" ) setDvar( "scr_forceloot", "0" ); #/ for ( ;; ) { /# if ( getDvar( "scr_forceloot" ) != "" && getDvar( "scr_forceloot" ) != "0" ) { setDvar( "scr_loot_baseChance", 1 ); } #/ level.lootMins["epic"] = getDvarFloat( "scr_loot_epicMin" ); level.lootMins["rare"] = getDvarFloat( "scr_loot_rareMin" ); //level.lootMins["common"] = getDvarFloat( "scr_loot_commonMin" ); level.lootBaseChance = getDvarFloat( "scr_loot_baseChance" ); level.lootIdealTime = getDvarFloat( "scr_loot_idealTime" ); wait ( 1.0 ); } } unlockedCaC() { return self isItemUnlocked( "cac" ); } gotLoot() { if ( !self rankingEnabled() ) return false; if ( !self unlockedCaC() ) { returnfalse = true; /# if ( getDvar( "scr_forceloot" ) != "" && getDvar( "scr_forceloot" ) != "0" ) returnfalse = false; #/ if ( returnfalse ) return false; } baseChance = level.lootBaseChance; idealLootTime = level.lootIdealTime; maxLootChance = 0.50; // 50% chanceMod = min( self.timeSinceLastLoot / idealLootTime, 1 ); chanceMod = chanceMod * chanceMod; lootChance = baseChance + (maxLootChance - baseChance) * chanceMod; return randomFloat( 1 ) < lootChance; } getLootTier( lootRoll ) { if ( lootRoll >= level.lootMins["epic"] ) return "epic"; else if ( lootRoll >= level.lootMins["rare"] ) return "rare"; else return "common"; } getLootName( tier ) { if ( !isDefined( self.droppedLootNames ) ) self.droppedLootNames = []; for ( try = 0; try < 10; try++ ) { lootName = self GetRandomLoot( tier ); if ( !isDefined( lootName ) ) return undefined; for ( i = 0; i < self.droppedLootNames.size; i++ ) { if ( lootName == self.droppedLootNames[i] ) break; } if ( i < self.droppedLootNames.size ) continue; return lootName; } return undefined; } giveLoot( victim ) { if ( !gotLoot() ) return false; lootTier = getLootTier( randomFloat( 100.0 ) ); tierInt = level.lootIndices[lootTier]; lootName = self getLootName( tierInt ); if ( !isDefined( lootName ) ) return false; self maps\mp\gametypes\_persistence::statSet( "timeSinceLastLoot", 0 ); self.timeSinceLastLoot = 0; thread maps\mp\_loot::playMoneyFx( victim, self ); if ( lootTier == "epic" ) { self CreateLootMail( lootName ); self thread showLootNotify( lootTier ); } else { self thread dropLoot( lootTier, lootName, victim ); } return true; } showLootNotify( lootTier ) { /* notifyData = spawnStruct(); if ( lootTier == "epic" ) { notifyData.titleText = "Target of Opportunity!"; notifyData.iconName = "skull_black_plain"; notifyData.iconOverlay = "skull_crosshair_white"; } else { notifyData.titleText = "You've got mail!"; } //notifyData.sound = "loot_drop_" + lootTier; notifyData.sound = "mp_last_stand"; notifyData.glowColor = (1, 0, 0); notifyData.duration = 3.0; thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); */ } playMoneyFx( victim, attacker, sMeansOfDeath ) { /* victim endon ( "disconnect" ); origin = victim getTagOrigin( "j_spine4" ); victim.fxModel.origin = origin; wait ( 0.05 ); */ //playFxOnTag( level._effect["money"], victim.fxModel, "tag_origin" ); //playFxOnTagForClients ( level._effect["money"], victim.fxModel, "tag_origin", attacker ); } dropLoot( lootTier, lootName, dropEnt ) { trace = playerPhysicsTrace( dropEnt.origin + (0,0,20), dropEnt.origin - (0,0,2000), false, dropEnt); angleTrace = bulletTrace( dropEnt.origin + (0,0,20), dropEnt.origin - (0,0,2000), false, dropEnt ); if ( !isDefined( trace ) ) return; println( "dropping loot" ); tempAngle = randomfloat( 360 ); dropOrigin = trace; assert( isdefined( self.droppedLootNames ) ); /# foreach ( droppedLootName in self.droppedLootNames ) { assert( droppedLootName != lootName ); } #/ if ( lootName[0] != "$" ) self.droppedLootNames[ self.droppedLootNames.size ] = lootName; fxEnt = spawn( "script_model", dropOrigin ); //fxEnt.angles = (-90,0,0); lootIcon = newClientHudElem( self ); lootIcon.x = dropOrigin[0]; lootIcon.y = dropOrigin[1]; lootIcon.z = dropOrigin[2]; lootIcon.alpha = 1; lootTrigger = spawn( "trigger_radius", dropOrigin, 0, 32, 128 ); //lootTrigger.angles = (-90,0,0); lootTrigger.fxEnt = fxEnt; lootTrigger.icon = lootIcon; lootTrigger.owner = self; lootTrigger thread lootPickupWaiter( lootTier, lootName ); lootTrigger thread lootDeleteOnDisconnect(); /# if ( getdvarint( "scr_lootdebug" ) ) lootTrigger thread lootDebugPrint( lootTier, lootName ); #/ lootTrigger endon ( "death" ); wait ( 0.05 ); self playLocalSound( "loot_drop_" + lootTier ); switch ( lootTier ) { case "epic": case "rare": default: fxEnt setModel( "gamestation_box" ); lootIcon setShader( "hud_overlay_random", 10, 10 ); lootIcon setWaypoint( true, false ); lootIcon.alpha = 0.81; //playFxOnTagForClients( level._effect["gears"], fxEnt, "tag_origin", self ); break; } } lootDebugPrint( lootTier, lootName ) { self endon("death"); while ( 1 ) { print3d( self.origin, "(" + lootTier + ") " + lootName ); wait .05; } } lootPickupWaiter( lootTier, lootName ) { self endon ( "death" ); self.owner endon ( "disconnect" ); for ( ;; ) { self waittill ( "trigger", player ); if ( player != self.owner ) continue; //self.owner playLocalSound( "loot_pickup_" + lootTier ); // need better sound self.owner playLocalSound( "mp_last_stand" ); /* switch ( lootTier ) { case "epic": streakName = getRandomKillstreak( 7 ); self.owner thread [[level.onXPEvent]]( "gear" ); break; case "rare": streakName = getRandomKillstreak( 5 ); self.owner thread [[level.onXPEvent]]( "gear" ); break; default: streakName = getRandomKillstreak( 3 ); self.owner thread [[level.onXPEvent]]( "money" ); break; } self.owner thread randomKillstreakNotify( streakName ); self.owner maps\mp\killstreaks\_killstreaks::giveKillstreak( streakName ); */ self.owner pickupLoot( lootTier, lootName ); self.fxEnt delete(); self.icon destroy(); self delete(); } } pickupLoot( lootTier, lootName ) { self thread showLootNotify( lootTier ); self thread [[level.onXPEvent]]( lootTier ); self CreateLootMail( lootName ); if ( lootName[0] != "$" ) { for ( i = 0; i < self.droppedLootNames.size; i++ ) { if ( self.droppedLootNames[i] == lootName ) { break; } } assert( i < self.droppedLootNames.size ); for ( ; i < self.droppedLootNames.size; i++ ) { self.droppedLootNames[i] = self.droppedLootNames[i + 1]; } } } lootDeleteOnDisconnect() { self endon ( "death" ); self.owner waittill ( "disconnect" ); self.fxEnt delete(); //self.icon destroy(); // code seems to take care of this automatically self delete(); } getRandomKillstreak( minKillCount ) { killStreakNames = getArrayKeys( level.killstreakFuncs ); killStreaks = []; foreach ( streakName in killStreakNames ) { if ( maps\mp\killstreaks\_killstreaks::getStreakCost( streakName ) < minKillCount ) continue; killStreaks[killStreaks.size] = streakName; } return killStreaks[randomInt( killStreaks.size )]; } randomKillstreakNotify( streakName ) { self endon("disconnect"); notifyData = spawnStruct(); notifyData.titleText = "Killstreak In a Box!"; notifyData.notifyText = maps\mp\killstreaks\_killstreaks::getKillstreakHint( streakName ); notifyData.textIsString = true; notifyData.sound = maps\mp\killstreaks\_killstreaks::getKillstreakSound( streakName ); notifyData.leaderSound = streakName; notifyData.glowColor = (1, 0.76, 0.35); notifyData.textGlowColor = (1, 1, 0.5); self maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); }