//============================================================================== // Mod Functions //============================================================================== //------------------------------------------------------------------------------ // Made by Blnukem. function AutoBan(%client) { MessageAll('MsgAdminForce', '\c3%1 \c2was automatically banned by the server.', %client.name); %client.player.scriptKill(0); %client.setDisconnectReason( "You have been automatically banned by the server." ); %client.schedule(0, "delete"); BanList::add(%client.guid, %client.getAddress(), $Host::BanTime); } //------------------------------------------------------------------------------ // Made by Blnukem and Dark Dragon DX. function applyskin(%obj,%skin,%name) { %obj.target = createTarget(%obj, %name, %skin, "Male1", '', 0, PlayerSensor); setTargetDataBlock(%obj.target, %obj.getDatablock()); setTargetSensorData(%obj.target, PlayerSensor); setTargetSensorGroup(%obj.target, 6); setTargetSkin(%obj.target, %skin); setTargetName(%obj.target, addtaggedstring(%name)); } //------------------------------------------------------------------------------ // Made by Blnukem. function LoadDefaultSettings() { $Host::Cascade = 0; Call("EnableVehicles"); } //------------------------------------------------------------------------------ // Made by Blnukem. function ClearBasicTimer(%obj) { if(isObject(%obj)) { if(%obj.BasicTimer > 0) { %obj.BasicTimer -= 1; %obj.BasicTimerSchedule = Schedule(1000, 0, "ClearBasicTimer", %obj); } } } //------------------------------------------------------------------------------ // Originally by Eolk, revised by Blnukem. function Cure(%args) { %args.player.infected = 0; cancel(%args.player.infectedDamage); %args.player.infectedDamage = ""; %args.player.beats = 0; %args.player.canZkill = 0; %args.player.hit = 0; cancel(%args.player.zombieAttackImpulse); } //------------------------------------------------------------------------------ // Unknown Author function plnametocid(%name) { %count = ClientGroup.getCount(); for(%i = 0; %i < %count; %i++) { %obj = ClientGroup.getObject(%i); %nametest = strlwr(%obj.namebase); %name = strlwr(%name); if(strstr(%nametest, %name) != -1) return %obj; } return 0; } //------------------------------------------------------------------------------ // Made by Eolk. function addToZombiePointGroup(%obj) { %grp = nameToId("MissionCleanup/ZombiePoints"); if(!isObject(%grp)) { %grp = new SimGroup("ZombiePoints"); MissionCleanup.add(%grp); } %grp.add(%obj); } //------------------------------------------------------------------------------ // Made by Eolk... Just supposed to make things pretty function ZombiePoint::setStatus(%this, %status) { %this.status = %status; } //------------------------------------------------------------------------------ // Made by Eolk... Long, isn't it? function ZombiePoint::StartSpawnLoop(%this) { if(%this.disabled) return; if(%this.maximumZombies != -1) %this.spawnedZombies++; if(%this.maximumZombies != -1 && (%this.spawnedZombies >= %this.maximumZombies)) { %this.disabled = 1; return; } if(%this.zombieLimit != -1 && (getwordcount(%this.zombieList) >= %this.zombieLimit)) { %this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop"); return; } if(ZombieGroup.getCount() >= $Host::MaxZombies && $Host::MaxZombies != -1) { %this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop"); return; } %test = %this.type; if(%this.type $= "random") { %num = getRandom(1, 5); if(%num == 2) %test = "ravenger"; else if(%num == 3) %test = "lord"; else if(%num == 4) %test = "demon"; else if(%num == 5) %test = "rapier"; else %test = "regular"; } switch$(%test) { case "regular": %zombie = new Player() { datablock = "ZombieArmor"; }; applyskin(%zombie,'Zombie',"Zombie"); %type = 1; case "ravenger": %zombie = new Player() { datablock = "FZombieArmor"; }; applyskin(%zombie,'Zombie',"Ravenger Zombie"); %type = 2; case "lord": %zombie = new player(){ datablock = "LordZombieArmor"; }; applyskin(%zombie,'ZLord',"Zombie Lord"); %zombie.client = $zombie::Lclient; %zombie.mountImage(ZHead, 3); %zombie.mountImage(ZBack, 4); %zombie.mountImage(ZDummyslotImg, 5); %zombie.mountImage(ZDummyslotImg2, 6); %zombie.firstFired = 0; %zombie.canmove = 1; %type = 3; case "demon": %zombie = new player(){ datablock = "DemonZombieArmor"; }; applyskin(%zombie,'Zombie',"Demon Zombie"); %zombie.mountImage(ZdummyslotImg, 4); %type = 4; case "rapier": %zombie = new player(){ datablock = "RapierZombieArmor"; }; applyskin(%zombie,'Zombie',"Rapier Zombie"); %zombie.mountImage(ZWingImage, 3); %zombie.mountImage(ZWingImage2, 4); %zombie.setActionThread("scoutRoot",true); %type = 5; } %zombie.type = %type; %zombie.setTransform(%this.spawnTransform); %zombie.team = 0; %zombie.canJump = 1; %zombie.hasTarget = 0; %zombie.isCompZomb = 1; if(%this.zombieLimit != -1) { %zombie.overwatcher = %this; %this.zombieList = listAdd(%this.zombieList, %zombie, -1); } AddToZombieGroup(%zombie); schedule(1000, %zombie, "ZSetRandomMove", %zombie); schedule(1000, %zombie, "ZombieLookforTarget", %zombie); %this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop"); %this.setStatus("Spawning zombies."); } //------------------------------------------------------------------------------ // Made by Eolk. function zombieSpawnByName(%name) { %name = strlwr(%name); %grp = nameToId("MissionCleanup/ZombiePoints"); if(!isObject(%grp)) return 0; for(%i = 0; %i < %grp.getCount(); %i++) { %obj = %grp.getObject(%i); %objname = strlwr(%obj.label); if(%name $= %objname) return %obj; } return 0; } //------------------------------------------------------------------------------ // Made by Eolk. function AssignStalkMonitor(%target, %ztype, %stype) { if(isObject(%target.stalkMonitor)) return; %s = new ScriptObject() { class = StalkMonitor; }; MissionCleanup.add(%s); // this kills any lingering ones at the mission end. // assign the necessary flags. %s.target = %target; // note: these are already strlwr()ed. %s.ztype = %ztype; %s.stype = %stype; // this is here mainly for a reminder... // %s.lastztype = ""; // %s.laststype = ""; %s.coolvar = "light"; %s.coolcount = 0; %s.coolup = 1; // tag 'em. %target.stalkMonitor = %s; } // This is for easy time adjusting. $SwarmLoopTime["heavy"] = 1000; // 1 second. $SwarmLoopTime["medium"] = 5000; // 5 seconds. $SwarmLoopTime["light"] = 10000; // 10 seconds. //------------------------------------------------------------------------------ // Made by Eolk. function StalkMonitor::StalkLoop(%this) { if(!%this) return; %target = %this.target; if(!isObject(%target)) { // Let's pack our bags and go. Our work is done here. %this.doneStalking(); return; } if(!isObject(%target.player)) { if(%this.stype !$= "cool") %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop"); else // don't update. They were in observer. %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop"); return; } if(ZombieGroup.getCount() >= $Host::MaxZombies && $Host::MaxZombies != -1) { if(%this.stype !$= "cool") %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop"); else // don't update. There isn't an available zombie spot. %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop"); return; } %monitor = %target.stalkMonitor; %test = %monitor.ztype; if(%test $= "random") { %num = getRandom(1, 5); if(%num == 2) %test = "ravenger"; else if(%num == 3) %test = "lord"; else if(%num == 4) %test = "demon"; else if(%num == 5) %test = "rapier"; else %test = "regular"; } switch$(%test) { case "regular": %zombie = new Player() { datablock = "ZombieArmor"; }; applyskin(%zombie,'Zombie',"Zombie"); %type = 1; case "ravenger": %zombie = new Player() { datablock = "FZombieArmor"; }; applyskin(%zombie,'Zombie',"Ravenger Zombie"); %type = 2; case "lord": %zombie = new player(){ datablock = "LordZombieArmor"; }; applyskin(%zombie,'ZLord',"Zombie Lord"); %zombie.client = $zombie::Lclient; %zombie.mountImage(ZHead, 3); %zombie.mountImage(ZBack, 4); %zombie.mountImage(ZDummyslotImg, 5); %zombie.mountImage(ZDummyslotImg2, 6); %zombie.firstFired = 0; %zombie.canmove = 1; %type = 3; case "demon": %zombie = new player(){ datablock = "DemonZombieArmor"; }; applyskin(%zombie,'Zombie',"Demon Zombie"); %zombie.mountImage(ZdummyslotImg, 4); %type = 4; case "rapier": %zombie = new player(){ datablock = "RapierZombieArmor"; }; applyskin(%zombie,'Zombie',"Rapier Zombie"); %zombie.mountImage(ZWingImage, 3); %zombie.mountImage(ZWingImage2, 4); %zombie.setActionThread("scoutRoot",true); %type = 5; } %zombie.type = %type; %pos = %target.player.position; // cheezy randomness. Should work. // TODO: Add a check for interior, etc. Look at alternateSpawn. %rand = getRandomB(); if(%rand) %x = getword(%pos, 0) + getRandom(25, 100); else %x = getword(%pos, 0) - getRandom(25, 100); %rand = getRandomB(); if(%rand) %y = getword(%pos, 1) + getRandom(25, 100); else %y = getword(%pos, 1) - getRandom(25, 100); %z = getTerrainHeight(%x SPC %y); %dapos = %x SPC %y SPC %z; %typeMasks = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType; InitContainerRadiusSearch(%dapos, 2, %typeMasks); if(ContainerSearchNext != 0) { // This position isn't valid, let's not spawn this round. if(%this.stype !$= "cool") %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop"); else // don't update. They were in observer. %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop"); return; } %zombie.setTransform(%dapos SPC "1 0 0 0"); %zombie.team = 0; %zombie.canJump = 1; %zombie.hasTarget = 0; %zombie.isCompZomb = 1; AddToZombieGroup(%zombie); schedule(1000, %zombie, "ZSetRandomMove", %zombie); schedule(1000, %zombie, "ZombieLookforTarget", %zombie); if(%this.stype !$= "cool") %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop"); else { %this.UpdateCoolVariables(); %this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop"); } } $StalkCoolTime["light"] = 10; // 100 seconds of boredom. :P $StalkCoolTime["medium"] = 15; // 75 seconds of balanced zombie invasions. $StalkCoolTime["heavy"] = 30; // 30 seconds of pure heck. :) //------------------------------------------------------------------------------ // Made by Eolk. function StalkMonitor::UpdateCoolVariables(%this) { %this.coolcount++; if(%this.coolcount >= ($StalkCoolTime[%this.coolvar] + 1)) // Add an extra to it so that the amount of times actually gets done. { %this.coolcount = 0; if(%this.coolvar $= "light") { %this.coolvar = "medium"; %this.coolup = 1; } else if(%this.coolvar $= "medium") { if(%this.coolup == 1) %this.coolvar = "heavy"; else %this.coolvar = "light"; } else if(%this.coolvar $= "heavy") { %this.coolvar = "medium"; %this.coolup = 0; } else error(%this @": Cannot update cooldown count. Unknown coolvar."); } } //------------------------------------------------------------------------------ // Made by Eolk. function StalkMonitor::doneStalking(%this) { // echo(%this @": Done stalking. Terminating..."); cancel(%this.stalkSchedule); %this.stalkSchedule = ""; %this.target.stalkMonitor = ""; %this.schedule(500, "delete"); } //------------------------------------------------------------------------------ // Made by Eolk. function opposite(%num) { return %num * -1; } //------------------------------------------------------------------------------ // Made by Eolk. function SimObject::isTSStaticObject(%obj) { // If it doesn't have a shape name, then it definately ain't. if(%obj.shapeName $= "") return 0; for(%i = 0; %i < $NumStaticTSObjects; %i++) { if(getword($StaticTSObjects[%i], 2) $= %obj.shapeName) return 1; } return 0; } //------------------------------------------------------------------------------ // Made by Eolk. function ZombieGetRandom() { %rand = getRandom(); if(%rand > 0.9) return 1; // Lord Zombie else if(%rand <= 0.8 && %rand >= 0.7) return 2; // Rapier else return 0; // Regular } //------------------------------------------------------------------------------ // Made by Eolk. function ClearSaveTimeout(%cl) { if(isObject(%cl)) { if(%cl.saveTimeout > 0) { %cl.saveTimeout -= 1; %cl.saveTimeoutSchedule = schedule(1000, 0, "ClearSaveTimeout", %cl); } } } //------------------------------------------------------------------------------ // Made by Eolk. function ClearLoadTimeout(%cl) { if(isObject(%cl)) { if(%cl.loadTimeout > 0) { %cl.loadTimeout -= 1; %cl.loadTimeoutSchedule = schedule(1000, 0, "ClearLoadTimeout", %cl); } } } //------------------------------------------------------------------------------ // Made by Eolk. function ReverseGetRot(%rot, %mult) { %x = getword(%rot, 0) / %mult; %y = getword(%rot, 1) / %mult; %z = getword(%rot, 2) / %mult; return %x SPC %y SPC %z SPC %mult; } //------------------------------------------------------------------------------ // Made by Eolk. function ACCMChatLog(%client, %msg, %type, %target) { if($Host::ACCMChatLogging != 1 && $Host::ACCMEchoChat != 1) return; %msg = stripChars(%msg, "\c0\c1\c2\c3\c4\c5\c6\c7\c8\c9\x10\x11"); switch$(%type) { case 0: %t = "[GLOBAL]"; case 1: %t = "[TEAM]"; case 2: %t = "[PRIVATE]"; } %logdate = formattimestring("m-d-y"); %dir = "ServerLogs/Chat/Log of "@%logdate@".log"; if($Host::ACCMChatLogging == 1) { %temp = new FileObject(); %temp.openforappend(%dir); %temp.writeline(%t @" ("@formattimestring("D m/d/y hh:nn a")@") "@%client.nameBase @""@ (%t $= "[PRIVATE]" ? " (to "@%target.nameBase@")" : "")@": "@%msg); %temp.close(); %temp.delete(); } if($Host::ACCMEchoChat == 1) echo(%t @" ("@formattimestring("D m/d/y hh:nn a")@") "@%client.nameBase @""@ (%t $= "[PRIVATE]" ? " (to "@%target.nameBase@")" : "")@": "@%msg); } //------------------------------------------------------------------------------ // Made by Eolk. function ACCMConnectionLog(%client, %type, %reason) { if($Host::ACCMConnectionLogging != 1) return; if(%client.nameBase $= "Sentinel" || %client.nameBase $= "Monitor") return; if(%reason $= "") %reason = "Successful manual disconnect."; switch$(%type) { case "connect": %t = "joined the server"; case "disconnect": %t = "disconnected from the server (reason: "@%reason@")"; default: error("ACCMConnectionLog: %type turned up unknown value. Report this!"); return; } %logdate = formattimestring("m-d-y"); %dir = "ServerLogs/Connections/Log of "@%logdate@".log"; %authInfo = %client.getAuthInfo(); if($playingonline) %str = "[ONLINE] "@formattimestring("D m/d/y hh:nn a")@" (GUID: "@%client.guid@", REAL NAME: "@getField(%authInfo, 0)@", SMURF: "@%client.isSmurf@", "@%client.getAddress()@") "@%client.nameBase@" "@%t@"."; else %str = "[OFFLINE] "@formattimestring("D m/d/y hh:nn a")@" ("@%client.getAddress()@") "@%client.nameBase@" "@%t@"."; %temp = new FileObject(); %temp.openforappend(%dir); %temp.writeline(%str); %temp.close(); %temp.delete(); logEcho(%str); } //------------------------------------------------------------------------------ // Made by Eolk. function VectorCheck(%vec) { if(getword(%vec, 0) > 0) %x = 1; else if(getword(%vec, 0) < 0) %x = -1; else %x = 0; if(getword(%vec, 1) > 0) %y = 1; else if(getword(%vec, 1) < 0) %y = -1; else %y = 0; if(getword(%vec, 2) > 0) %z = 1; else if(getword(%vec, 2) < 0) %z = -1; else %z = 0; return %x SPC %y SPC %z; } //------------------------------------------------------------------------------ // Made by Eolk. function VectorPositive(%vec) { if(getword(%vec, 0) < 0) %x = opposite(getword(%vec, 0)); else %x = getword(%vec, 0); if(getword(%vec, 1) < 0) %y = opposite(getword(%vec, 1)); else %y = getword(%vec, 1); if(getword(%vec, 2) < 0) %z = opposite(getword(%vec, 2)); else %z = getword(%vec, 2); return %x SPC %y SPC %z; } //------------------------------------------------------------------------------ // Made by Eolk. function VectorAdd2(%vec, %adder) { if(getword(%vec, 0) != 0) %new1 = getword(%vec, 0) + %adder; else %new1 = 0; if(getword(%vec, 1) != 0) %new2 = getword(%vec, 1) + %adder; else %new2 = 0; if(getword(%vec, 2) != 0) %new3 = getword(%vec, 2) + %adder; else %new3 = 0; return %new1 SPC %new2 SPC %new3; } //------------------------------------------------------------------------------ // Made by Eolk. function CheckGUID(%client) { if(!$playingonline) { error("CheckGUID: This does not work offline!"); return; } %authinfo = %client.getAuthInfo(); %guid = getField(%authinfo, 3); return %guid; } //------------------------------------------------------------------------------ // Made by Eolk. function CreateWaypoint(%pos, %name) { %w = new WayPoint() { datablock = WayPointMarker; name = %name; }; %w.setTransform(%pos SPC "0 0 1 0"); %w.team = 0; MissionCleanup.add(%w); %w.schedule(10000, "delete"); } //------------------------------------------------------------------------------ // Made by Eolk. function ChangeName(%client, %name) { if(%name $= "reset") { if(%client.oldName !$= "") { removeTaggedString(%client.name); %client.name = ""; %client.name = addTaggedString(%client.oldname); setTargetName(%client.target, addTaggedString(%client.oldName)); messageAll('MsgClientNameChanged', "", "", %client.name, %client); %client.oldname = ""; return; } } if(%client.oldName $= "") %client.oldName = getTaggedString(%client.name); removeTaggedString(%client.name); %client.name = ""; %realname = "\x10\c6"@%name@"\x11"; %client.name = addTaggedString(%realname); setTargetName(%client.target, addTaggedString(%realname)); messageAll('MsgClientNameChanged', "", %client.oldname, %client.name, %client); }