diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs index a7bfdef..7fa0535 100644 --- a/Classic/prefs/MapRotation.cs +++ b/Classic/prefs/MapRotation.cs @@ -55,13 +55,16 @@ addRotationMap("Minotaur", "CTF",1,0,-1,18); addRotationMap("SmallMelee", "CTF",1,0,-1,12); //addRotationMap("SuperHappyBouncyFunTime", "CTF",1,1,-1,12); addRotationMap("Machineeggs", "CTF",1,1,-1,8); -addRotationMap("Mac_FlagArena", "CTF",1,0,-1,18); +addRotationMap("Mac_FlagArena", "CTF",1,0,-1,14); addRotationMap("SmallTimeCTF", "CTF",1,1,-1,10); addRotationMap("TWL2_Hildebrand", "CTF",1,1,-1,18); -addRotationMap("ArenaDome", "CTF",1,1,-1,12); -addRotationMap("Firestorm", "CTF",1,1,-1,12); +addRotationMap("ArenaDome", "CTF",1,0,-1,12); +addRotationMap("Firestorm", "CTF",1,0,-1,12); addRotationMap("Bulwark", "CTF",1,1,-1,12); -addRotationMap("TWL_OsIris", "CTF",1,1,-1,12); +addRotationMap("TWL_OsIris", "CTF",1,0,8,18); +addRotationMap("FrostPipe", "CTF",1,0,-1,12); +addRotationMap("Blink", "CTF",1,1,-1,12); +addRotationMap("Discord", "CTF",1,1,6,16); //Medium Maps ///////////////////////////////////////////////////////////////////// @@ -70,25 +73,24 @@ addRotationMap("HighOctane", "CTF",1,1,8,24); addRotationMap("S5_Mordacity", "CTF",1,1,8,24); addRotationMap("S5_Damnation", "CTF",1,1,8,20); addRotationMap("TWL2_JaggedClaw", "CTF",1,1,8,24); -addRotationMap("S5_Massive", "CTF",1,1,8,26); +addRotationMap("S5_Massive", "CTF",1,1,10,26); addRotationMap("TWL_Stonehenge", "CTF",1,1,8,20); -addRotationMap("TWL_Feign", "CTF",1,0,12,24); -addRotationMap("TheFray", "CTF",1,1,8,20); +addRotationMap("TWL_Feign", "CTF",1,1,10,20); +addRotationMap("TheFray", "CTF",1,0,10,20); addRotationMap("DangerousCrossing_nef", "CTF",1,1,8,20); addRotationMap("TWL2_Skylight", "CTF",1,1,8,20); addRotationMap("TWL2_Ocular", "CTF",1,1,12,-1); -addRotationMap("Dire", "CTF",1,1,12,24); -addRotationMap("berlard", "CTF",1,1,12,24); -addRotationMap("S8_Opus", "CTF",1,1,8,24); -addRotationMap("BeggarsRun", "CTF",1,1,8,24); -addRotationMap("Headstone", "CTF",1,1,8,20); +addRotationMap("Dire", "CTF",1,1,10,24); +addRotationMap("berlard", "CTF",1,0,12,24); +addRotationMap("S8_Opus", "CTF",1,0,8,24); +addRotationMap("BeggarsRun", "CTF",1,0,8,24); +addRotationMap("Headstone", "CTF",1,0,8,20); addRotationMap("Signal", "CTF",1,0,8,26); addRotationMap("S5_Woodymyrk", "CTF",1,1,8,26); -addRotationMap("Discord", "CTF",1,1,8,20); -addRotationMap("TenebrousCTF", "CTF",1,1,8,20); +addRotationMap("TenebrousCTF", "CTF",1,1,8,12); addRotationMap("Pariah", "CTF",1,0,8,20); -addRotationMap("Prismatic", "CTF",1,0,12,26); -addRotationMap("TWL_WilderZone", "CTF",1,1,8,20); +addRotationMap("Prismatic", "CTF",1,1,12,26); +addRotationMap("TWL_WilderZone", "CTF",1,0,8,20); addRotationMap("Mirage", "CTF",1,0,8,20); addRotationMap("S5_Mimicry", "CTF",1,0,8,24); addRotationMap("TWL_Snowblind", "CTF",1,0,12,-1); @@ -96,7 +98,6 @@ addRotationMap("ShortFall", "CTF",1,0,12,24); addRotationMap("IceRidge_nef", "CTF",1,0,8,20); addRotationMap("Disjointed", "CTF",1,0,8,20); addRotationMap("TWL2_MuddySwamp", "CTF",1,0,8,20); -addRotationMap("Blink", "CTF",1,1,8,20); addRotationMap("HighAnxiety", "CTF",1,0,8,20); addRotationMap("S5_Centaur", "CTF",1,0,8,20); addRotationMap("S8_Cardiac", "CTF",1,1,12,-1); @@ -107,6 +108,8 @@ addRotationMap("TWL2_Drifts", "CTF",1,0,14,24); addRotationMap("TWL2_Drorck", "CTF",1,1,12,24); //addRotationMap("TWL2_Norty", "CTF",1,0,12,24); addRotationMap("S5_HawkingHeat", "CTF",1,0,16,24); +addRotationMap("StarFallCTF", "CTF",1,1,10,24); +addRotationMap("TWL2_Celerity", "CTF",1,1,8,24); //Voteable but Not in Rotation ///////////////////////////////////////////////////////////////////// @@ -128,9 +131,8 @@ addRotationMap("Confusco", "CTF",1,0,10,20); //addRotationMap("Fallout", "CTF",1,0,10,20); //addRotationMap("TheClocktower", "CTF",1,0,10,20); //addRotationMap("SoylentGreen", "CTF",1,0,10,20); -addRotationMap("TWL2_MidnightMayhemDeluxe", "CTF",1,0,8,18); +addRotationMap("TWL2_MidnightMayhemDeluxe", "CTF",1,1,8,18); //addRotationMap("Ramparts", "CTF",1,0,10,20); -addRotationMap("TWL2_Celerity", "CTF",1,1,8,24); //addRotationMap("Blastside_nef", "CTF",1,0,10,24); addRotationMap("Burstside", "CTF",1,0,10,20); addRotationMap("Infernus", "CTF",1,0,18,26); @@ -144,20 +146,20 @@ addRotationMap("TWL_Pandemonium", "CTF",1,0,10,24); //Vehicle Maps ///////////////////////////////////////////////////////////////////// +addRotationMap("Logans_Run", "CTF",1,1,8,28); +addRotationMap("Rollercoaster_nef", "CTF",1,1,8,28); addRotationMap("HostileLoch", "CTF",1,1,12,24); -addRotationMap("TWL_BeachBlitz", "CTF",1,0,12,24); +addRotationMap("TWL_BeachBlitz", "CTF",1,1,12,24); addRotationMap("TWL2_Magnum", "CTF",1,1,12,28); -addRotationMap("Logans_Run", "CTF",1,1,10,28); -addRotationMap("Rollercoaster_nef", "CTF",1,1,10,28); addRotationMap("MoonDance", "CTF",1,1,12,28); addRotationMap("Raindance_nef", "CTF",1,1,12,28); -addRotationMap("TWL_Magmatic", "CTF",1,1,18,28); +addRotationMap("TWL_Magmatic", "CTF",1,0,18,28); addRotationMap("TWL2_FrozenGlory", "CTF",1,1,12,24); -addRotationMap("LandingParty", "CTF",1,0,12,28); -addRotationMap("TitanV", "CTF",1,1,12,28); -addRotationMap("TWL_Crossfire", "CTF",1,1,18,-1); +addRotationMap("LandingParty", "CTF",1,1,12,28); +addRotationMap("TitanV", "CTF",1,0,12,28); +addRotationMap("TWL_Crossfire", "CTF",1,1,14,28); //addRotationMap("The_Calm", "CTF",1,0,12,24); -addRotationMap("TWL2_Dissention", "CTF",1,1,16,28); +addRotationMap("TWL2_Dissention", "CTF",1,0,16,28); //Vehicle Maps: Voteable, But Not in Rotation ///////////////////////////////////////////////////////////////////// @@ -169,7 +171,7 @@ addRotationMap("ShockRidge", "CTF",1,0,12,24); addRotationMap("TWL2_BlueMoon", "CTF",1,1,18,28); addRotationMap("TWL_Katabatic", "CTF",1,0,12,28); addRotationMap("TWL_Starfallen", "CTF",1,0,12,24); -addRotationMap("ConstructionYard", "CTF",1,0,12,24); +//addRotationMap("ConstructionYard", "CTF",1,0,12,24); //addRotationMap("AcidRain", "CTF",1,0,12,24); addRotationMap("SandOcean", "CTF",1,0,12,28); //addRotationMap("StarIce", "CTF",1,0,12,24); @@ -183,6 +185,7 @@ addRotationMap("TWL_Abaddon", "CTF",1,0,16,24); //BIG Vehicle Maps ///////////////////////////////////////////////////////////////////// +addRotationMap("Circleofstones", "CTF",1,1,12,-1); addRotationMap("TWL2_Ruined", "CTF",1,1,24,-1); addRotationMap("Agorazscium", "CTF",1,0,24,-1); addRotationMap("FullCircle", "CTF",1,0,18,30); @@ -199,9 +202,8 @@ addRotationMap("TWL_Frozen", "CTF",1,0,20,-1); addRotationMap("TWL_Harvester", "CTF",1,1,24,-1); addRotationMap("Archipelago", "CTF",1,0,20,-1); addRotationMap("TWL2_Bleed", "CTF",1,0,20,-1); -addRotationMap("Pantheon", "CTF",1,1,24,-1); -addRotationMap("Circleofstones", "CTF",1,1,18,-1); -addRotationMap("DeathBirdsFly1", "CTF",1,1,24,-1); +addRotationMap("Pantheon", "CTF",1,1,20,-1); +addRotationMap("DeathBirdsFly1", "CTF",1,1,20,-1); addRotationMap("Scarabrae_nef", "CTF",1,0,28,-1); addRotationMap("aabaa", "CTF",1,1,28,-1); addRotationMap("TWL_Reversion", "CTF",1,1,28,-1); @@ -287,17 +289,17 @@ addRotationMap("S8_CentralDogma", "CTF",1,0,-1,-1); //In Rotation ///////////////////////////////////////////////////////////////////// -addRotationMap("VaubanLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("VaubanLak", "Lakrabbit",1,1,8,-1); addRotationMap("MiniSunDried", "Lakrabbit",1,1,-1,12); addRotationMap("Sundance", "Lakrabbit",1,1,-1,-1); -addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("DesertofDeathLak", "Lakrabbit",1,0,-1,-1); +addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("DesertofDeathLak", "Lakrabbit",1,1,-1,-1); addRotationMap("Raindance_nefLak", "Lakrabbit",1,1,-1,-1); addRotationMap("SunDriedLak", "Lakrabbit",1,1,-1,-1); addRotationMap("SkinnyDipLak", "Lakrabbit",1,1,-1,-1); addRotationMap("SaddiesHill", "Lakrabbit",1,0,-1,-1); addRotationMap("HavenLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("LushLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("LushLak", "Lakrabbit",1,1,8,-1); addRotationMap("BoxLak", "Lakrabbit",1,1,-1,10); addRotationMap("TitaniaLak", "Lakrabbit",1,0,8,-1); addRotationMap("TibbawLak", "Lakrabbit",1,1,-1,-1); @@ -305,7 +307,8 @@ addRotationMap("InfernusLak", "Lakrabbit",1,1,-1,-1); addRotationMap("S8_GeothermalLak", "Lakrabbit",1,1,-1,-1); addRotationMap("CankerLak", "Lakrabbit",1,1,-1,-1); addRotationMap("DustRunLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("CrossfiredLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("CrossfiredLak", "Lakrabbit",1,0,-1,-1); +addRotationMap("CloakofLak", "Lakrabbit",1,1,-1,-1); //Voteable, But not in rotation ///////////////////////////////////////////////////////////////////// @@ -317,8 +320,8 @@ addRotationMap("Arrakis", "Lakrabbit",1,0,-1,-1); addRotationMap("EquinoxLak", "Lakrabbit",1,0,-1,-1); addRotationMap("PhasmaDustLak", "Lakrabbit",1,1,-1,12); addRotationMap("GodsRiftLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("SolsDescentLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("Crater71Lak", "Lakrabbit",1,0,-1,-1); +addRotationMap("SolsDescentLak", "Lakrabbit",1,0,-1,-1); +addRotationMap("Crater71Lak", "Lakrabbit",1,1,6,-1); //Not Voteable, Not in rotation ///////////////////////////////////////////////////////////////////// @@ -552,4 +555,4 @@ addRotationMap("PitsDM", "DM",1,1,-1,10); // |_| |_|\__,_|_| |_|\__\___|_| |___/ ///////////////////////////////////////////////////////////////////// -addRotationMap("MiniSunDried", "Hunters",1,1,-1,-1); +//addRotationMap("MiniSunDried", "Hunters",1,1,-1,-1); diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index e2e0b68..fd62eda 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -100,6 +100,7 @@ $Host::holoName4 = "DSword"; $Host::holoName5 = "BloodEagle"; $Host::holoName6 = "Harbinger"; $Host::Info = " "; +$Host::ItemRespawnTime = 30; $Host::KickBanTime = 600; $Host::KickObserverTimeout = 1200; $Host::LakRabbitDuelMode = 0; diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index b4143d8..f4af9ef 100644 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -648,16 +648,18 @@ function CTFGame::flagCap(%game, %player) if($Host::ClassicEvoStats) { - %held2 = getSimTime() - %game.totalFlagHeldTime[%flag]; - %realtime = %game.formatTime(%held2, true); %record = false; + if($TotalTeamPlayerCount >= $Host::MinFlagRecordPlayerCount) + %recordit = true; if(%game.totalFlagHeldTime[%flag]) { + %held2 = getSimTime() - %game.totalFlagHeldTime[%flag]; + %realtime = %game.formatTime(%held2, true); if(%client.team == 1) { if((%held2 < $flagstats::heldTeam1) || $flagstats::heldTeam1 == 0) { - if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + if(%recordit) { $flagstats::heldTeam1 = %held2; $flagstats::realTeam1 = %realTime; @@ -670,7 +672,7 @@ function CTFGame::flagCap(%game, %player) { if((%held2 < $flagstats::heldTeam2) || $flagstats::heldTeam2 == 0) { - if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + if(%recordit) { $flagstats::heldTeam2 = %held2; $flagstats::realTeam2 = %realTime; @@ -682,7 +684,7 @@ function CTFGame::flagCap(%game, %player) if(%record == true) { - if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + if(%recordit) { %fileOut = "stats/maps/classic/" @ $CurrentMissionType @ "/" @ $CurrentMission @ ".txt"; export("$flagstats::*", %fileOut, false); @@ -691,24 +693,24 @@ function CTFGame::flagCap(%game, %player) else schedule(4000, 0, "messageClient", %client, '', "\c2New flag records are disabled until" SPC $Host::MinFlagRecordPlayerCount SPC "players."); } + + if(!$Host::TournamentMode) + bottomprint(%client, "You captured the flag in " @ %realTime @ " seconds", 3); + + $stats::caps[%client]++; + if($stats::caps[%client] > $stats::caps_counter) + { + $stats::caps_counter = $stats::caps[%client]; + $stats::caps_client = getTaggedString(%client.name); + } + + if(%held2 < $stats::fastestCap || !$stats::fastestCap) + { + $stats::fastestCap = %held2; + $stats::fastcap_time = %realTime; + $stats::fastcap_client = getTaggedString(%client.name); + } } - - if(!$Host::TournamentMode) - bottomprint(%client, "You captured the flag in " @ %realTime @ " seconds", 3); - - $stats::caps[%client]++; - if($stats::caps[%client] > $stats::caps_counter) - { - $stats::caps_counter = $stats::caps[%client]; - $stats::caps_client = getTaggedString(%client.name); - } - - if(%held2 < $stats::fastestCap || !$stats::fastestCap) - { - $stats::fastestCap = %held2; - $stats::fastcap_time = %realTime; - $stats::fastcap_client = getTaggedString(%client.name); - } } //award points to player and team diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index 71772d7..54294f0 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -303,29 +303,29 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am if(%targetObject.invincible || %targetObject.getState() $= "Dead") return; - // rabbit can't DJ in duel mode - if(Game.duelMode && %targetObject.holdingFlag && %targetObject == %sourceObject - && %damageType == $DamageType::Disc - && getWord(%targetObject.getMuzzleVector(0),2) < -0.7 - && !TestForMA(%sourceObject, 5)) - { - %sound = '~wfx/misc/missed.wav'; - %amount = 2.0; - %targetObject.blowup(); - } + //rabbit can't DJ in duel mode + // if(Game.duelMode && %targetObject.holdingFlag && %targetObject == %sourceObject + // && %damageType == $DamageType::Disc + // && getWord(%targetObject.getMuzzleVector(0),2) < -0.7 + // && !TestForMA(%sourceObject, 5)) + // { + // %sound = '~wfx/misc/missed.wav'; + // %amount = 2.0; + // %targetObject.blowup(); + // } - // Zeph - PubPro no DJ + //Zeph - PubPro no DJ - if(Game.PubPro && %targetObject == %sourceObject - && %damageType == $DamageType::Disc - && getWord(%targetObject.getMuzzleVector(0),2) < -0.7 - && !TestForMA(%sourceObject, 5)) - { - %sound = '~wfx/misc/missed.wav'; - %amount = 2.0; - %targetObject.blowup(); - %targetObject.scriptKill(); - } + // if(Game.PubPro && %targetObject == %sourceObject + // && %damageType == $DamageType::Disc + // && getWord(%targetObject.getMuzzleVector(0),2) < -0.7 + // && !TestForMA(%sourceObject, 5)) + // { + // %sound = '~wfx/misc/missed.wav'; + // %amount = 2.0; + // %targetObject.blowup(); + // %targetObject.scriptKill(); + // } // hurting yourself, check for free DJ if( isObject(%sourceObject) @@ -1046,7 +1046,7 @@ function checkDuelTimer(%client) if(%client.duelSeconds == 10 || %client.duelSeconds == 5 || %client.duelSeconds <= 3) { %plural = (%client.duelSeconds != 1 ? 's' : ""); - messageClient(%client, 'MsgDuelTimer', '\c4[Duel Mode] You have %1 second%2 to kill someone, or die!~wfx/misc/red_alert_short.wav', %client.duelSeconds, %plural); + messageClient(%client, 'MsgDuelTimer', '\c4You have %1 second%2 to kill someone, or die!~wgui/launchMenuOver.wav', %client.duelSeconds, %plural); } } } diff --git a/Classic/scripts/autoexec/EnableLogs.cs b/Classic/scripts/autoexec/EnableLogs.cs index 885202d..685197e 100644 --- a/Classic/scripts/autoexec/EnableLogs.cs +++ b/Classic/scripts/autoexec/EnableLogs.cs @@ -90,20 +90,23 @@ function ClassicChatLog(%client, %id, %team, %msg) // Don't log voicepack stuff. if(strstr(%msg, "~w") != -1 || strstr(%msg, "flag") != -1) return; - - %team = getTaggedString(Game.getTeamName(%team)); - - if(%team $= "Unassigned") - %team = "Observer"; - else if($CurrentMissionType $= "LakRabbit" || $CurrentMissionType $= "DM") - %team = $dtStats::gtNameLong[%client.lgame]; //from zDarktigerStats.cs switch$(%id) { case 0: %team = "[Global]"; case 1: - %team = "[" @ %team @ "]"; + if($countdownStarted) + %team = getTaggedString(Game.getTeamName(%team)); + else + %team = "Debrief"; + + if(%team $= "Unassigned") + %team = "Observer"; + else if($CurrentMissionType $= "LakRabbit" || $CurrentMissionType $= "DM") + %team = $dtStats::gtNameLong[%client.lgame]; //from zDarktigerStats.cs + + %team = "[" @ %team @ "]"; case 2: %team = "[Admin]"; case 3: diff --git a/Classic/scripts/item.cs b/Classic/scripts/item.cs new file mode 100644 index 0000000..9112aad --- /dev/null +++ b/Classic/scripts/item.cs @@ -0,0 +1,758 @@ +//---------------------------------------------------------------------------- + +// When first mounted (assuming there is ammo): +// SingleShot activate -> ready +// Spinning activate -> idle (spin 0) +// Sustained activate -> ready +// DiscLauncher activate -> reload -> spinup -> ready +// +// Normal operation: +// SingleShot ready -> fire -> reload -> ready +// Spinning idle (spin 0) -> spinup -> ready -> fire -> spindown -> idle +// Sustained ready -> fire -> reload -> ready +// DiscLauncher ready -> fire -> reload -> spinup -> ready + +// Image properties +// emap +// preload +// shapeFile +// mountPoint +// offset +// rotation +// firstPerson +// mass +// usesEnergy +// minEnergy +// accuFire +// lightType +// lightTime +// lightRadius +// lightColor + +// Image state variables +// stateName +// stateTransitionOnLoaded +// stateTransitionOnNotLoaded +// stateTransitionOnAmmo +// stateTransitionOnNoAmmo +// stateTransitionOnTriggerUp +// stateTransitionOnTriggerDown +// stateTransitionOnTimeout +// stateTimeoutValue +// stateFire +// stateEnergyDrain +// stateAllowImageChange +// stateScaleAnimation +// stateDirection +// stateLoadedFlag +// stateSpinThread +// stateRecoil +// stateSequence +// stateSound +// stateScript +// stateEmitter +// stateEmitterTime +// stateEmitterNode + +//---------------------------------------------------------------------------- + +$ItemRespawnTime = $Host::ItemRespawnTime * 1000; +$ItemPopTime = 30 * 1000; // 30 seconds + +$WeaponSlot = 0; +$AuxiliarySlot = 1; +$BackpackSlot = 2; +$FlagSlot = 3; + +//---------------------------------------------------------------------------- +datablock EffectProfile(ItemPickupEffect) +{ + effectname = "packs/packs.pickupPack"; + minDistance = 2.5; +}; + +datablock AudioProfile(ItemPickupSound) +{ + filename = "fx/packs/packs.pickuppack.wav"; + description = AudioClosest3d; + effect = ItemPickupEffect; + preload = true; +}; + +datablock EffectProfile(ItemThrowEffect) +{ + effectname = "packs/packs.throwpack"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock AudioProfile(ItemThrowSound) +{ + filename = "fx/packs/packs.throwpack.wav"; + description = AudioClosest3d; + effect = ItemThrowEffect; + preload = true; +}; + +datablock AudioProfile(RepairPatchSound) +{ + filename = "fx/misc/health_patch.wav"; + description = AudioClosest3d; + preload = true; + effect = ItemPickupEffect; + preload = true; +}; + +function ItemData::create(%block) +{ + if(%block $= "flag") + %obj = new Item() { + className = FlagObj; + dataBlock = %block; + static = false; + rotate = false; + }; + else + %obj = new Item() { + dataBlock = %block; + static = true; + //rotate = true; + // don't make "placed items" rotate + rotate = false; + }; + return(%obj); +} + +//-------------------------------------------------------------------------- +function Item::schedulePop(%this) +{ + %itemFadeTime = 1000; // items will take 1 second (1000 milliseconds) to fade out + %this.startFade(%itemFadeTime, $ItemPopTime - %itemFadeTime, true); + %this.schedule($ItemPopTime, "delete"); +} + +function Item::respawn(%this) +{ + %this.startFade(0, 0, true); + %this.schedule($ItemRespawnTime + 100, "startFade", 1000, 0, false); + %this.hide(true); + %this.schedule($ItemRespawnTime, "hide", false); +} + +function ItemData::onThrow(%data,%obj,%shape) +{ + serverPlay3D(ItemThrowSound, %obj.getTransform()); + // don't schedule a delete for satchelCharges when they're deployed + if(!%data.noTimeout) + %obj.schedulePop(); +} + +function ItemData::onInventory(%data,%shape,%value) +{ + if (!%value) { + // If we don't have any more of these items, make sure + // we don't have an image mounted. + %slot = %shape.getMountSlot(%data.image); + if (%slot != -1) + %shape.unmountImage(%slot); + } +} + +// z0dd - ZOD - Founder, 5/18/03. ItemData pickup Parent. Streamline +// Function also servers as console spam fix related to item pickup +function ItemData::onPickup(%this, %pack, %player, %amount) +{ + // %this = Pack datablock + // %pack = Pack object number + // %player = player + // %amount = amount picked up (1) + + if(%pack.sensors !$= "") + { + // find out how many sensor were in the pack + %player.deploySensors = %pack.sensors; + %player.client.updateSensorPackText(%player.deploySensors); + } +} + +function ItemData::onEnterLiquid(%data, %obj, %coverage, %type) +{ + if(%data.isInvincible) + return; + + switch(%type) + { + case 0: + //Water + case 1: + //Ocean Water + case 2: + //River Water + case 3: + //Stagnant Water + case 4: + //Lava + %obj.delete(); + case 5: + //Hot Lava + %obj.delete(); + case 6: + //Crusty Lava + %obj.delete(); + case 7: + //Quick Sand + } +} + +function ItemData::onLeaveLiquid(%data, %obj, %type) +{ + // dummy +} + +function ItemData::onCollision(%data,%obj,%col) +{ + // Default behavior for items is to get picked + // by the colliding object. + if (%col.getDataBlock().className $= Armor && %col.getState() !$= "Dead") + { + if (%col.isMounted()) + return; + + if (%col.pickup(%obj, 1)) + { + if (%col.client) + { + messageClient(%col.client, 'MsgItemPickup', '\c0You picked up %1.', %data.pickUpName); + serverPlay3D(ItemPickupSound, %col.getTransform()); + } + if (%obj.isStatic()) + %obj.respawn(); + else + %obj.delete(); + } + } +} + +//---------------------------------------------------------------------------- +datablock ItemData(RepairKit) +{ + className = HandInventory; + catagory = "Misc"; + shapeFile = "repair_kit.dts"; + mass = 1; + elasticity = 0.2; + friction = 0.6; + pickupRadius = 2.0; + pickUpName = "a repair kit"; + alwaysAmbient = true; + + computeCRC = true; + emap = true; + +}; + +function RepairKit::onUse(%data,%obj) +{ + //---------------------------------------------------------------------------- + // z0dd - ZOD, 8/10/02. Let players use repair kit regardless of health status + // if they choose so via client $pref:: + if (%obj.client.wasteRepKit == 1) + { + %obj.decInventory(%data,1); + messageClient(%obj.client, 'MsgRepairKitUsed', '\c2Repair Kit Used.'); + if (%obj.getDamageLevel() != 0) + { + %obj.applyRepair(0.2); + } + } + else + { + // Don't use the kit unless we're damaged + if (%obj.getDamageLevel() != 0) + { + %obj.applyRepair(0.2); + %obj.decInventory(%data,1); + messageClient(%obj.client, 'MsgRepairKitUsed', '\c2Repair Kit Used.'); + } + } +} + +function serverCmdSetRepairKitWaste(%client, %value) +{ + %val = deTag(%value); + %client.wasteRepKit = %val; +} + +//---------------------------------------------------------------------------- + +datablock ItemData(RepairPatch) +{ + catagory = "Misc"; + shapeFile = "repair_patch.dts"; + mass = 1; + elasticity = 0.2; + friction = 0.6; + pickupRadius = 2.0; + pickUpName = "a repair patch"; + alwaysAmbient = true; + + computeCRC = true; + emap = true; + +}; + +function RepairPatch::onCollision(%data,%obj,%col) +{ + if ( %col.getDataBlock().className $= Armor + && %col.getDamageLevel() != 0 + && %col.getState() !$= "Dead" ) + { + if (%col.isMounted()) + return; + + %col.playAudio(0, RepairPatchSound); + %col.applyRepair(0.125); + %obj.respawn(); + if (%col.client > 0) + messageClient(%col.client, 'MsgItemPickup', '\c0You picked up %1.', %data.pickUpName); + } +} + +//---------------------------------------------------------------------------- +// Flag: +//---------------------------------------------------------------------------- +datablock ShapeBaseImageData(FlagImage) +{ + shapeFile = "flag.dts"; + item = Flag; + mountPoint = 2; + offset = "0 0 0"; + + lightType = "PulsingLight"; + lightColor = "0.5 0.5 0.5 1.0"; + lightTime = "1000"; + lightRadius = "3"; + cloakable = false; +}; + +datablock ItemData(Flag) +{ + catagory = "Objectives"; + shapefile = "flag.dts"; + mass = 80; // z0dd - ZOD, 3/27/02. Keep flag from flying all over when damaged. was 55. + elasticity = 0.2; + friction = 0.6; + pickupRadius = 4.0; // z0dd - ZOD, 8/11/02. Was 3 + pickUpName = "a flag"; + computeCRC = true; + + lightType = "PulsingLight"; + lightColor = "0.5 0.5 0.5 1.0"; + lightTime = "1000"; + lightRadius = "3"; + + isInvincible = true; + cmdCategory = "Objectives"; + cmdIcon = CMDFlagIcon; + cmdMiniIconName = "commander/MiniIcons/com_flag_grey"; + targetTypeTag = 'Flag'; + + //used in CTF to mark the flag during a stalemate... + hudImageNameFriendly[1] = "commander/MiniIcons/com_flag_grey"; + hudImageNameEnemy[1] = "commander/MiniIcons/com_flag_grey"; + hudRenderModulated[1] = true; + hudRenderAlways[1] = true; + hudRenderCenter[1] = true; + hudRenderDistance[1] = true; + hudRenderName[1] = true; +}; + +//---------------------------------------------------------------------------- +function Flag::onThrow(%data,%obj,%src) +{ + Game.playerDroppedFlag(%src); +} + +function Flag::onAdd(%this, %obj) +{ + // make sure flags play "flapping" ambient thread + Parent::onAdd(%this, %obj); + %obj.playThread($AmbientThread, "ambient"); + + %blocker = new VehicleBlocker() + { + position = %obj.position; + rotation = %obj.rotation; + dimensions = "2 2 4"; + }; + MissionCleanup.add(%blocker); +} + +function Flag::onCollision(%data,%obj,%col) +{ + if (%col.getDataBlock().className $= Armor) + { + if (%col.isMounted()) + return; + + // z0dd - ZOD, 6/13/02. Touch the flag and your invincibility and cloaking goes away. + if(%col.station $= "" && %col.isCloaked()) + { + if( %col.respawnCloakThread !$= "" ) + { + Cancel(%col.respawnCloakThread); + %col.setCloaked( false ); + %col.respawnCloakThread = ""; + } + } + if( %col.client > 0 ) + { + %col.setInvincibleMode(0, 0.00); + %col.setInvincible( false ); + } + + // a player hit the flag + Game.playerTouchFlag(%col, %obj); + } +} + +//---------------------------------------------------------------------------- +// HuntersFlag: +//---------------------------------------------------------------------------- +datablock ShapeBaseImageData(HuntersFlagImage) +{ + shapeFile = "Huntersflag.dts"; + item = Flag; + mountPoint = 2; + offset = "0 0 0"; + + lightType = "PulsingLight"; + lightColor = "0.5 0.5 0.5 1.0"; + lightTime = "1000"; + lightRadius = "3"; +}; + +// 1: red +// 2: blue +// 4: yellow +// 8: green +datablock ItemData(HuntersFlag1) +{ + className = HuntersFlag; + + shapefile = "Huntersflag.dts"; + mass = 80; // z0dd - ZOD, 3/27/02. Keep flag from flying all over when damaged. was 55. + elasticity = 0.2; + friction = 0.6; + pickupRadius = 4.0; // z0dd - ZOD, 8/11/02. Was 3 + isInvincible = true; + pickUpName = "a flag"; + //computeCRC = true; // z0dd - ZOD, 5/18/03. This causes several crc checks, moved. + + lightType = "PulsingLight"; + lightColor = "0.8 0.2 0.2 1.0"; + lightTime = "1000"; + lightRadius = "3"; +}; + +datablock ItemData(HuntersFlag2) : HuntersFlag1 +{ + lightColor = "0.2 0.2 0.8 1.0"; + computeCRC = true; // z0dd - ZOD, 5/18/03. Check this model just once. +}; + +datablock ItemData(HuntersFlag4) : HuntersFlag1 +{ + lightColor = "0.8 0.8 0.2 1.0"; +}; + +datablock ItemData(HuntersFlag8) : HuntersFlag1 +{ + lightColor = "0.2 0.8 0.2 1.0"; +}; + +function HuntersFlag::onRemove(%data, %obj) +{ + // dont want target removed... +} + +function HuntersFlag::onThrow(%data,%obj,%src) +{ + Game.playerDroppedFlag(%src); +} + +function HuntersFlag::onCollision(%data,%obj,%col) +{ + if (%col.getDataBlock().className $= Armor) + { + if (%col.isMounted()) + return; + + // a player hit the flag + Game.playerTouchFlag(%col, %obj); + } +} + +//---------------------------------------------------------------------------- +// Nexus: +//---------------------------------------------------------------------------- +datablock ItemData(Nexus) +{ + catagory = "Objectives"; + shapefile = "nexus_effect.dts"; + mass = 10; + elasticity = 0.2; + friction = 0.6; + pickupRadius = 2; + icon = "CMDNexusIcon"; + targetTypeTag = 'Nexus'; + + computeCRC = true; + +}; + +datablock ParticleData(NexusParticleDenied) +{ + dragCoeffiecient = 0.4; + gravityCoefficient = 3.0; + inheritedVelFactor = 0.0; + + lifetimeMS = 1200; + lifetimeVarianceMS = 400; + + textureName = "particleTest"; + + useInvAlpha = false; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.3 0.0 0.0 1.0"; + colors[1] = "0.5 0.0 0.0 0.5"; + colors[2] = "0.7 0.0 0.0 0.0"; + sizes[0] = 0.2; + sizes[1] = 0.1; + sizes[2] = 0.0; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(NexusParticleDeniedEmitter) +{ + ejectionPeriodMS = 2; + ejectionOffset = 0.2; + periodVarianceMS = 0.5; + ejectionVelocity = 10.0; + velocityVariance = 4.0; + thetaMin = 0.0; + thetaMax = 30.0; + lifetimeMS = 0; + + particles = "NexusParticleDenied"; +}; + +datablock ParticleData(NexusParticleCap) +{ + dragCoeffiecient = 0.4; + gravityCoefficient = 3.0; + inheritedVelFactor = 0.0; + + lifetimeMS = 1200; + lifetimeVarianceMS = 400; + + textureName = "particleTest"; + + useInvAlpha = false; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.5 0.8 0.2 1.0"; + colors[1] = "0.6 0.9 0.3 1.0"; + colors[2] = "0.7 1.0 0.4 1.0"; + sizes[0] = 0.2; + sizes[1] = 0.1; + sizes[2] = 0.0; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(NexusParticleCapEmitter) +{ + ejectionPeriodMS = 2; + ejectionOffset = 0.5; + periodVarianceMS = 0.5; + ejectionVelocity = 10.0; + velocityVariance = 4.0; + thetaMin = 0.0; + thetaMax = 30.0; + lifetimeMS = 0; + + particles = "NexusParticleCap"; +}; + +//---------------------------------------------------------------------------- + +function getVector(%string, %num) +{ + %start = %num * 3; + return getWords(%string,%start, %start + 2); +} + +// -------------------------------------------- +// explosion datablock +// -------------------------------------------- + +datablock ExplosionData(DeployablesExplosion) +{ + soundProfile = DeployablesExplosionSound; + faceViewer = true; + + explosionShape = "effect_plasma_explosion.dts"; + sizes[0] = "0.2 0.2 0.2"; + sizes[1] = "0.3 0.3 0.3"; +}; + +$TeamDeployableMax[TargetBeacon] = 10; +$TeamDeployableMax[MarkerBeacon] = 20; + +datablock ItemData(Beacon) +{ + className = HandInventory; + catagory = "Misc"; + shapeFile = "beacon.dts"; + mass = 1; + elasticity = 0.2; + friction = 0.8; + pickupRadius = 1; + pickUpName = "a deployable beacon"; + + computeCRC = true; + +}; + +datablock StaticShapeData(DeployedBeacon) : StaticShapeDamageProfile +{ + shapeFile = "beacon.dts"; + explosion = DeployablesExplosion; + maxDamage = 0.45; + disabledLevel = 0.45; + destroyedLevel = 0.45; + targetNameTag = 'beacon'; + deployedObject = true; + dynamicType = $TypeMasks::SensorObjectType; + debrisShapeName = "debris_generic_small.dts"; + debris = SmallShapeDebris; + damageScale[$DamageType::Mine] = 1.0; // z0dd - ZOD, 5/17/03. Kill beacons that mark mines. +}; + +function DeployedBeacon::onDestroyed(%data, %obj, %prevState) +{ + if(%obj.getBeaconType() $= "friend") + %bType = "MarkerBeacon"; + else + %bType = "TargetBeacon"; + $TeamDeployedCount[%obj.team, %bType]--; + %obj.schedule(500, delete); +} + +function Beacon::onUse(%data, %obj) +{ + // look for 3 meters along player's viewpoint for interior or terrain + %searchRange = 3.0; + %mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType; + // get the eye vector and eye transform of the player + %eyeVec = %obj.getEyeVector(); + %eyeTrans = %obj.getEyeTransform(); + // extract the position of the player's camera from the eye transform (first 3 words) + %eyePos = posFromTransform(%eyeTrans); + // normalize the eye vector + %nEyeVec = VectorNormalize(%eyeVec); + // scale (lengthen) the normalized eye vector according to the search range + %scEyeVec = VectorScale(%nEyeVec, %searchRange); + // add the scaled & normalized eye vector to the position of the camera + %eyeEnd = VectorAdd(%eyePos, %scEyeVec); + // see if anything gets hit + %searchResult = containerRayCast(%eyePos, %eyeEnd, %mask, 0); + if(!%searchResult ) + { + // no terrain/interior collision within search range + if(%obj.inv[%data.getName()] > 0) + messageClient(%obj.client, 'MsgBeaconNoSurface', '\c2Cannot place beacon. Too far from surface.'); + return 0; + } + else + { + %searchObj = GetWord(%searchResult, 0); + if(%searchObj.getType() & ($TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType) ) + { + // if there's already a beacon where player is aiming, switch its type + // otherwise, player can't deploy a beacon there + if(%searchObj.getDataBlock().getName() $= DeployedBeacon) + switchBeaconType(%searchObj); + else + messageClient(%obj.client, 'MsgBeaconNoSurface', '\c2Cannot place beacon. Not a valid surface.'); + return 0; + } + else if(%obj.inv[%data.getName()] <= 0) + return 0; + } + // newly deployed beacons default to "target" type + if($TeamDeployedCount[%obj.team, TargetBeacon] >= $TeamDeployableMax[TargetBeacon]) + { + messageClient(%obj.client, 'MsgDeployFailed', '\c2Your team\'s control network has reached its capacity for this item.~wfx/misc/misc.error.wav'); + return 0; + } + %terrPt = posFromRaycast(%searchResult); + %terrNrm = normalFromRaycast(%searchResult); + + %intAngle = getTerrainAngle(%terrNrm); // getTerrainAngle() function found in staticShape.cs + %rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 0 1")); + if (getWord(%terrNrm, 2) == 1 || getWord(%terrNrm, 2) == -1) + %rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 1 0")); + %rotation = %rotAxis @ " " @ %intAngle; + + %obj.decInventory(%data, 1); + %depBeac = new BeaconObject() { + dataBlock = "DeployedBeacon"; + position = VectorAdd(%terrPt, VectorScale(%terrNrm, 0.05)); + rotation = %rotation; + }; + $TeamDeployedCount[%obj.team, TargetBeacon]++; + + %depBeac.playThread($AmbientThread, "ambient"); + %depBeac.team = %obj.team; + %depBeac.sourceObject = %obj; + + // give it a team target + %depBeac.setTarget(%depBeac.team); + MissionCleanup.add(%depBeac); +} + +function switchBeaconType(%beacon) +{ + if(%beacon.getBeaconType() $= "friend") + { + // switch from marker beacon to target beacon + if($TeamDeployedCount[%beacon.team, TargetBeacon] >= $TeamDeployableMax[TargetBeacon]) + { + messageClient(%beacon.sourceObject.client, 'MsgDeployFailed', '\c2Your team\'s control network has reached its capacity for this item.~wfx/misc/misc.error.wav'); + return 0; + } + %beacon.setBeaconType(enemy); + $TeamDeployedCount[%beacon.team, MarkerBeacon]--; + $TeamDeployedCount[%beacon.team, TargetBeacon]++; + } + else + { + // switch from target beacon to marker beacon + if($TeamDeployedCount[%beacon.team, MarkerBeacon] >= $TeamDeployableMax[MarkerBeacon]) + { + messageClient(%beacon.sourceObject.client, 'MsgDeployFailed', '\c2Your team\'s control network has reached its capacity for this item.~wfx/misc/misc.error.wav'); + return 0; + } + %beacon.setBeaconType(friend); + $TeamDeployedCount[%beacon.team, TargetBeacon]--; + $TeamDeployedCount[%beacon.team, MarkerBeacon]++; + } +} \ No newline at end of file diff --git a/Classic/scripts/server.cs b/Classic/scripts/server.cs index b84cbdc..63d2704 100644 --- a/Classic/scripts/server.cs +++ b/Classic/scripts/server.cs @@ -974,15 +974,15 @@ function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %client.nameBase = %name; } // If we still don't have a GUID or name, time to boot the player (unless a local game). - if(%client.getIPAddress() !$= "Local" && (!%client.guid $= "" || %name $= "")) + if(getIPAddress(%client) !$= "Local" && (!%client.guid $= "" || %name $= "")) { - //statEchoInfo("No name/GUID kick for CID (" @ %client @ ") with IP (" @ getIPAddress(%client) @ ")"); + echo("No name/GUID kick for CID (" @ %client @ ") with IP (" @ getIPAddress(%client) @ ")"); KickByCID(%client, "You joined the server with a blank name and/or GUID. Try rejoining.",2); return; } } - %stuff = %client.getIPAddress(); + %stuff = getIPAddress(%client); if(strstr(%stuff, "70.240.") == 0) { %newPart = getSubStr(%stuff, 7, 255); diff --git a/Classic/scripts/serverDefaults.cs b/Classic/scripts/serverDefaults.cs index 6055f31..4cd8e51 100644 --- a/Classic/scripts/serverDefaults.cs +++ b/Classic/scripts/serverDefaults.cs @@ -192,6 +192,7 @@ $Host::NoBaseRapePlayerCount = 14; $Host::AveragePings = 1; $Host::GuidCheck = 1; $Host::MinFlagRecordPlayerCount = 6; +$Host::ItemRespawnTime = 30; //LakRabbit $Host::LakRabbitUnlimitedDJ = 1; //Unlimited disc-jumps if enabled diff --git a/Classic/scripts/supportClassic.cs b/Classic/scripts/supportClassic.cs index dcddc2a..9747417 100644 --- a/Classic/scripts/supportClassic.cs +++ b/Classic/scripts/supportClassic.cs @@ -231,7 +231,7 @@ function ClassicAddWhitelist(%label, %entry) function ClassicIsBanned(%client) { %guid = %client.guid; - %addr = %client.getIPAddress(); + %addr = getIPAddress(%client); %type = 0; for (%i = 0; %i < $ClassicPermaBans; %i++)