package SlendLight { function serverCmdLight(%client) { if(%client.isSlender) { serverCMDWarpCloser(%client); %client.player.flenergy = 9999; return; } else { Parent::serverCmdLight(%client); } } }; activatePackage(SlendLight); datablock AudioProfile(Idle1) { filename = "./sound/idle1.wav"; description = AudioClose3D; preload = false; }; datablock AudioProfile(Scream1 : Idle1) { filename = "./sound/scream1.wav"; }; datablock AudioProfile(Scream2 : Idle1) { filename = "./sound/scream2.wav"; }; datablock AudioProfile(Stare) { filename = "./sound/stare2.wav"; description = Audio2D; }; datablock AudioProfile(TP : Idle1) { filename = "./sound/tp.wav"; }; datablock AudioProfile(TP2 : Idle1) { filename = "./sound/tp2.wav"; }; datablock AudioProfile(HeartBeat : Stare) { filename = "./sound/HeartBeat.wav"; }; datablock AudioProfile(Spot : Stare) { filename = "./sound/Spotted.wav"; }; $CREEPY_SOUNDS[1] = Idle1; $CREEPY_SOUNDS[2] = Scream1; $CREEPY_SOUNDS[3] = Scream2; $CREEPY_SOUNDS[4] = Stare; $CREEPY_SOUNDS[5] = TP; $CREEPY_SOUNDS[6] = TP2; $CREEPY_SOUNDS[1].dur = 4; $CREEPY_SOUNDS[2].dur = 4; $CREEPY_SOUNDS[3].dur = 4; $CREEPY_SOUNDS[4].dur = 4; $CREEPY_SOUNDS[5].dur = 4; $CREEPY_SOUNDS[6].dur = 4; datablock playerData( Slender : playerStandardArmor ) { maxDamage = 9999; uiName = "Slender"; maxForwardSpeed = playerStandardArmor.maxForwardSpeed / 3; }; datablock PlayerData(ScaredPlayerArmor : PlayerStandardArmor) { isScaredPlayer = 1; runForce = 50 * 90; runEnergyDrain = 0; minRunEnergy = 0; maxForwardSpeed = 8; maxBackwardSpeed = 5; maxSideSpeed = 5; firstPersonOnly = 1; maxForwardCrouchSpeed = 3; maxBackwardCrouchSpeed = 2; maxSideCrouchSpeed = 2; jumpForce = 9 * 90; //8.3 * 90; jumpEnergyDrain = 0; minJumpEnergy = 0; jumpDelay = 0; runSurfaceAngle = 55; jumpSurfaceAngle = 55; canJet = 0; uiName = "Scared Player"; rechargeRate = 0; showEnergyBar = true; }; function getRandomPlayer(%client) { if ( !( %cnt = clientGroup.getCount() ) ) { return -1; } %i = clientGroup.getObject( getRandom( 0, %cnt - 1 ) ); %mini = getMinigameFromObject(%client); if(!isObject(%mini)) { return; } for(%i = 0; %i < %mini.numMembers; %i++) { %t = %mini.member[getRandom( 0, %mini.numMembers)]; return %t; } } function serverCmdKillEveryone(%client) { if(%client.isSuperAdmin || %client.isAdmin) { %mini = getMinigameFromObject(%client); if(!isObject(%mini)) return; for(%i = 0; %i < %mini.numMembers; %i++) { %cl = %mini.member[%i]; if(isObject(%cl.player)) { %cl.player.kill(); } } } } $Slender::RandomShit = "You_hear_something_behind_you. Was_that_just_the_wind? You_feel_that_you_are_being_watched. You_hear_faint_breathing_noises_coming_from_somewhere_around_you. A_chill_has_come_over_you. You're_suddenly_very_cold. The_branches_creak_eerily. The_darkness_seems_to_be_closing_in_on_you. The_fog_is_getting_thicker."; function servercmdStartSlender(%client) { if(%client.isSuperAdmin||%client.isAdmin||%client.isSlender) { slender.applyAppearance(%client.player); echo("The games have begun"); %client.isSlender = 1; %client.player.setDatablock(Slender); %client.player.setShapeNameDistance(0); $CurSlender = %client; %mini = getMinigameFromObject(%client); canSee(%mini); } } function canSee(%mini) { //$maxdist = sky.visibleDistance - sky.fogDistance ; $maxdrain = $maxdist * $mult; cancel($CanSeeSched); if(!isObject(%mini)) return; for(%i = 0; %i < %mini.numMembers; %i++) { %cl = %mini.member[%i]; if(isObject(%cl.player) && $CurSlender.mini == %cl.mini) { sanity(%cl.player, %cl.player.objectInView($CurSlender.player)); //announce("Can they see me?" SPC %cl.player.objectInView(%cl.player,$curSlender)); } } $canSeeSched = schedule(33,0,CanSee,%mini); } $mult = 0.2; $rec = 0.45; $maxsan = 100; $maxdist = 20; function playStareSound(%player) { if($Sim::Time <= %player.client.NextEmit) { //announce("Next Emit Time:" SPC %player.client.nextEmit SPC "VS Cur Time:" SPC $Sim::Time); return; } //announce("Played sound!"); %player.client.play2d(Stare); %player.client.NextEmit = $Sim::Time + 4; //announce("Next Emit Time:" SPC %player.client.nextEmit SPC "VS" SPC $CurTime); } function playHeartSound(%player) { if($Sim::Time <= %player.client.NextHeartEmit) { //announce("Next Emit Time:" SPC %player.client.nextEmit SPC "VS Cur Time:" SPC $Sim::Time); return; } //announce("Played sound!"); %player.client.play2d(HeartBeat); %player.client.NextHeartEmit = $Sim::Time + 11; //announce("Next Emit Time:" SPC %player.client.nextHeartEmit SPC "VS" SPC $CurTime); } function playSpotSound(%player) { if($Sim::Time <= %player.client.NextSpotEmit) { //announce("Next Emit Time:" SPC %player.client.nextEmit SPC "VS Cur Time:" SPC $Sim::Time); return; } //announce("Played sound!"); %player.client.play2d(Spot); %player.client.NextSpotEmit = $Sim::Time + 25; } $NobodyHome = Sun; function serverCMDClearSlender(%client) { if(%client.isSuperAdmin||%client.isAdmin) { $Curslender.isSlender = 0; $CurSlender = $NobodyHome; cancel($CanSeeSched); } } function sanity(%player,%CanSee) { %dist = vectorDist(%player.getPosition(), $CurSlender.player.getPosition()); //announce(%dist SPC "Distance from player that can see me"); if(%canSee == 1 && %player.getDatablock().isScaredPlayer) { if(%dist <= $maxdist) { %mult = $maxdrain - (%dist * $mult); //announce( %player.getShapeName() SPC "'s Multiplier Value:" SPC %mult); %sanity = %player.getEnergyLevel() - %mult; if(%player.hasSpotted == 0) { playSpotSound(%player); %player.hasSpotted = 1; } if(%sanity < 100) { schedule(4000,0,'playStareSound',%player); %whiteoutval = 1 / (%dist * $mult); //announce( %player.getShapeName() SPC "'s White Out Value:" SPC %whiteoutval); %player.setWhiteOut(%whiteoutval); } if(%sanity <= 50) { playHeartSound(%player); } if(%sanity <= 0) { announce(%player.getShapeName() SPC "died of sanity loss!"); %player.kill(); } //announce( %player.getShapeName() SPC "'s Sanity Value:" SPC %sanity); %player.SetEnergyLevel( %sanity ); } else if (%player.getEnergyLevel() < $maxsan) { %player.SetEnergylevel(%player.GetEnergyLevel() + $rec); %player.hasSpotted = 0; if (%player.getEnergyLevel() > $maxsan) { %player.SetEnergylevel($maxsan); %player.hasSpotted = 0; } } } else if (%player.getEnergyLevel() < $maxsan) { %player.SetEnergylevel(%player.GetEnergyLevel() + $rec); %player.hasSpotted = 0; if (%player.getEnergyLevel() > $maxsan) { %player.SetEnergylevel($maxsan); %player.hasSpotted = 0; } } } function serverCmdWarpRand(%client) { if(%client.isSlender) { %i = getRandomPlayer(%client); if(%i != %client && isObject(%i.player) && $lastrand != %i.player) { //pick a random word from our stalk variable %ms = getWord($Slender::RandomShit,getRandom(0,getWordCount($Slender::RandomShit)-1)); %ms = strReplace(%ms,"_"," "); // Players caught onto this messageClient(%i,0,"\c6" SPC %ms); //messageClient(%client,0,"\c6You whispered:" SPC %ms); //Get targets forward vector %forward = getWords(%i.player.getEyeVector(),0,1); %ForNorm = vectorNormalize(%forward); %pos = vectorSub(%i.player.getPosition(),vectorScale(%forNorm,$maxdist + 50)); %client.player.position = %pos; lookAtTarget(%client.player, %i.player); messageClient(%client,0,"\c2" SPC %i.getPlayerName() SPC "\c6is the random choice!"); $lastRand = %i.player; %client.warpRand = 0; //echo("I shouldn't even be fucking called right now"); return; } else { warpRandRand(%client); } } } //BECAUSE I COULDNT FIGURE OUT IFS AND ELSES FUCK function warpRandRand(%client) { if(%client.WarpRand >= 25) { %client.warpRand = 0; return; } //echo(%client.getPlayerName()); %client.warpRand++; serverCmdWarpRand(%client); } $CreepSpeed = 0.3; $EMITSOUND_COOLDOWN = 4; $EMITSOUND_PROB = 0.08; function clearTimeOut(%client) { %client.timeout = 0; } function serverCMDWarpCloser( %client) { if(%client.isSlender) { %randnum = getRandom(); //announce(%randnum SPC "Random number VS" SPC $EMITSOUND_PROB SPC "playsound probability!"); %target = $lastRand; if(%client.timeout >= 10) { cancel(%client.timeoutsched); %client.timeout++; messageClient(%client,0,"\c6Wait a moment before warping again!"); %client.timeoutsched = schedule(3000,0,clearTimeOut,%client); return; } if(%client != %target) { if(isObject(%target)) { %client.timeout++; %client = %client.player; %disp = vectorSub(%target.GetPosition(), %client.GetPosition()); //announce(%disp SPC "Displacement"); %client.position = vectorAdd(%client.GetPosition(), vectorScale(%disp, $CreepSpeed)); //announce(%client.position SPC "new position"); lookAtTarget(%client, %target); //echo("Vector Distance between players:" SPC vectorDist(%client.getEyePoint(), %target.getEyepoint())); if(vectorDist(%client.getEyePoint(), %target.getEyepoint()) < 22 && $EMITSOUND_PROB > %randnum) { emitCreepySounds(%client.player.position); } } else { serverCMDWarpRand(%client); } } } } function emitCreepySounds(%pos) { if($Sim::Time < $NextEmit) { return; } %tSnd = $CREEPY_SOUNDS[getRandom(1, 6)]; //echo(%tsnd SPC "Sound name?"); serverplay3d(%tSnd, %pos SPC "0 0 1 0"); $NextEmit = $Sim::Time + $EMITSOUND_COOLDOWN + 4; //echo($NextEmit SPC "next emit time"); } function lookAtTarget( %this, %target ) { %forward = VectorSub(%target.getPosition(), %this.getPosition()); %x = getWord(%forward, 0); %y = getWord(%forward, 1); %angle = -mAtan(-%x, %y); //announce(%angle SPC "look angle"); // make trans from position, axis and angle %trans = %this.getPosition(); %trans = %trans SPC "0 0 1" SPC %angle; %this.setTransform(%trans); } function Slender::applyAppearance( %this, %obj ) { %obj.setScale("1 1 1.3"); %obj.isSlender = 1; } function Player::objectInView(%player,%object) { if(!isObject(%object)) { //announce("Object doesn't exist!"); return 0; } //The eye point is the position of the players camera %eye = %player.getEyePoint(); //The position of the object //%to = posFromTransform(%object.getTransform()); %to = %object.getEyePoint(); // if(vectorDist(%eye,%to) < %range) // return 0; //Cast a raycast to try and collide with the object %ray = containerRaycast(%eye,%to,$TypeMasks::StaticShapeObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::VehicleObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::FxBrickObjectType | $TypeMasks::InteriorObjectType,%player); %col = getWord(%ray,0); //announce(%col); if(isObject(%col) && %col == %object) { //The position of the collision %pos = posFromRaycast(%ray); //Super Maths C skills go B) %resultant = vectorSub(%pos,%eye); %normal = vectorNormalize(%resultant); //Find the yaw from the resultant %resultRadians = mAtan(getWord(%normal,1),getWord(%normal,0)); //Find the yaw from the eye vector %eyeVec = %player.getEyeVector(); %eyeRadians = mAtan(getWord(%eyeVec,1),getWord(%eyeVec,0)); //Convert both of them to degrees for easier understanding %resultDegrees = mRadToDeg(%resultRadians); %eyeDegrees = mRadToDeg(%eyeRadians); //Now the tricky part. In order for the object to be in sight, lets say that the object needs to be within 90 degrees of the players view //Change 90 to something smaller if you don't like how wide the view is if(%resultDegrees >= %eyeDegrees - 50 && %resultDegrees <= %eyeDegrees + 50) //announce("Should be returning 1 right here!"); return 1; } //No object hit, or not the target object, return 0/false //announce("No object hit, or not the target object, return 0/false"); return 0; }