Here we have a great sever side mod! worth the download to make gameplay on your sever the best. Read the read me for the benefits :)
Installation: Unzip the PsychoMod.zip file into your "Soldier of Fortune II - Double Helix" folder. In the command line to launch your server it should look something like this: SoF2MP.exe +set fs_game Psycho +set net_noipx 1 +set dedicated 2 +exec server.cfg This is a server-side only mod! One of the servers currently running the mod is a dedicated TeamLtk server that can be found at 188.8.131.52 (Team<Ltk>PsychoMod). This server is running a damage mod in addition to the Psycho Mod, so don't be taken aback by the weapons config! A sample PSYCHO mod config is included in the zip file, so you could just add a line to your current config, such as 'exec Psycho', or you could just copy and paste the lines in Psycho.cfg into your server.cfg file. This document is intended to introduce the Psycho Mod and its various features. It will be broken into four parts, namely: Overview, Features Not Seen in Other SOF2 Mods, Credit for Ideas taken from other mods, and finally, Detailed Overview of all mod functionality. Where I have praise for another mod, I will mention the mod by name. Where I have criticism, the name will not be mentioned. It is very easy to pick apart someone else's work. *****I will give credit where I have used or modified the ideas of others, I ask the same be done in regards to my work.***** Overview: This mod was written for several reasons: #1) I wanted to understand how a mod works (in particular SOF2 and how the qvms communicate with the underlying game engine) #2) I liked some of the things that I saw in the Sneaky Mod, and I liked some of the things that I saw in the OSP Mod, and I figured that since I was mucking about with the code anyway, I might as well create something fun and useful for SOF2 server administrators and players #3) I was layed off a few months ago (Systems Level Software Engineer by Trade) and this was a way to keep me coding (or at least add a little fun coding in to the mix). There were a number of objectives that I wanted to meet in designing and building this mod: #1) That it be server-side only #2) That it have features that both admins and the GP (general public) would want and find useful #3) That it be reliable. By reliable, I mean that I wanted it to be suitable for administering clan matches, ladder matches etc. There are mods out there for example, that offer a 'Game Pause' functionality. When I was trying to incorporate this feature into my own mod, I realized that when some mods 'pause' the game, they lose track of the total time elapsed. As an example, let's say you pause a ctf game 10 minutes and 12 seconds into the game. Further, let's assume you pause the game for 1 minute and 30 seconds. When the game is fully 'unpaused', you should be at 10 minutes and 12 seconds, correct? However, this is not the case with some mods out there, you end up *resetting* the game timer when you pause, which is not what is wanted (meaning your gametimer would now be at 1 minute and 30 seconds after resuming gameplay). I have tested, retested and tested again, the game pausing functionality in this mod with various gametypes (ctf, inf, dem, dm, elim) and the gametime is accurate to within 1 second, perhaps 2. One mod that had a 'pause' functionality still allowed people to walk around and even capture the flag while the game was pause. Hmm. Additionally, some mods have a team locking functionality. I've noticed that if you lock the team (say blue) with two players, people still can join sometimes and therefore increase the number. As an administrator, I found that to be irritating. When I lock a team, I want no one to be able to join it. I believe I have reached that objective in the Psycho Mod. #4) That if offer features to admins that day-to-day administrators will find practical and *useful*. Sure, I could have given you 297 commands and let you become gods, or give yourself or other players health, speed, ammo, etc. But I don't feel that a mod that offers 'everything' is very useful (or trustworthy for competiton for that matter). Plus, it is generally ridden with bugs. My purpose with this mod is not to negate the usefulness of /rcon, nor is it to negate the use of mapcycle files. As an example, there is a mod that someone introduced me to just last week after they heard about the Psycho mod. I tried it out and it was a nightmare of inefficiency and bugs. I hope that the Psycho mod is not this. #5) This is really a corollary to #3, but I'll give it it's own number. Admins should be able to be invisible if they want. *But* when it's time for a serious match, a visiting clan should be assured that there is no deception at hand. If admins are operating in stealth mode, the /listadmins command only works for admins. Period. *Any* admin action is done anonymously, whether it be via the standard admin voting mechanism, the various punishments, muting, etc. All are displayed to clients as "An Admin did this or that." However, when an admin executes /adm stealthmode, this means that /listadmins now works for all clients and shows the connected admins suspended/unsuspended status. This is especially important for clan matches, so all parties concerned can be assured of a fair game. Also, when the admins come out of stealth mode a general message is sent to all connected clients with a sound cue notifying them of such. (Even the various tokens will only display 'An Admin' if a person is killed via one of the admin punishment commands. :) ) #6) I wanted admins to be able to be held accountable for their actions. Although it is rare, occasionally a member will be granted admin privileges and then abuse them. As a consequence of this, every admin action is recorded into the log file. Each admin action results in a line that details the admin, the action and the client affected (if applicable). #7) I wanted it to be configurable. I can't think of everything that someone out there might want, but I left it as what I saw need of and what I thought others might want control over. Features Not Seen in Other SOF2 Mods: #1) When wanting to talk to admins exclusively or wanting to talk as an admin, I have always found it a bit irritating at the need to drop down the console and type in the whole command line stuff for it to work. Every mod I've seen does it like this. It seems that in order to have messagemode capabilities (i.e. press a key on the keyboard and the 'say:' prompt appears) that a client-side solution was required. On the 'last' day of coding, a potential server-side only solution occurred to me. I gave it a try and it worked. So, in order to utilize the /adm chat, /adm say, and /clanchat functionality, you have two choices: you can drop down the console and proceed as normal, *or* you can merely press your messagmode key (usually T) and type 'aac', 'aas', or 'cc' then whatever message you want, and it will be interpreted correctly. An example would be to press the messagemode key (usually T), which would present you with the 'say:' prompt, at which you could type if you are an admin: aac this message is only for admins. All admins would receive the message: this message is only for admins. It doesn't get any easier than this. ? No more need to drop down the console for adm chat and say functionality! #2) If g_pwByPassForAdmins is set to 1, admins do not have to supply a password on a passworded server. This was motivated by my testing my mod on a publicly visible server. Every time I connected, I had to supply a password. It dawned on me around the 270th time, that an individual trusted with admin rights would very rarely ever want to be kept off the server. Why make an admin hunt down people via group messaging boards, or instant messenging to retrieve a password that shouldn't be necessary in the first place? #3) The concept of a clan member list. This is a separate list and file from the admins list. This was motivated by members of my clan occasionally being voted off of our own servers merely because they are extremely good players and have a very good ratio. Therefore, members that are in the clan member list can not be kicked from their own server, except by an admin. #4) This is related to #2. With a clan member list comes the functionality of having 'ClanChat'. Using the command /clanchat (or 'cc' when utilizing messagemode), a clan member can send a message that will only be seen by fellow clan members and admins. This way, clan members can communicate privately (private in the sense that the GP won't be privy). The feedback on this so far has been very positive. #5) Other mods have the /adm strike functionality for punishing a player before perhaps eventually kicking/banning them. I have included this functionality, but I have added three more: /adm tearup, /adm invade and /adm boot. The first one very graphically dismembers a player and plays one kind of siren. The second teleports the admin to the player's location and then rips the client to shreds while playing another siren. It emulates the admin 'wearing' the other client's skin briefly before tearing out of it.The third places an imaginary boot through the misbehaving client's face (again graphically) and plays yet another siren. #6) Unique punishments for campers and spawnkillers. I like the Sneaky Mod's attention to spawnkillers. Unfortunately, what I noticed on our own servers is that people placed in the penalty box usually just disconnected then came back. I thought about adding in a spawn kill engine, but by and large, I feel that admins make the best decision on when and how to punish someone, and if an admin is not connected, players will usually vote to kick a spawnkiller. With that in mind, I created the /adm punishSK command. In creating this command, I wanted the punishment to be appropriate to the crime. If a spawn killing player likes killing in spawn so much, why not place him in his enemie's spawn and *plant* him there with no weapons. It has to be seen to be believed, but this command transports the offending player (wherever he may be) into the enemy spawn, strips him of *all* weapons (not even a knife), leaves him holding a smoke grenade that he cannot utilize, and plants his legs in the ground so he is immobile and completely helpless. I figure the players getting spawnkilled can take it from there. ? As regards campers, again, I took the approach, if they like the spot so much, why not *plant* them there? So, /adm plant takes the camping cheap-shot player and immobilizes him. Leaves him with ammo, but he will stay there until killed or he kills himself. I have found this to be very effective. With all of these, the offending player is notified via a screen message as to the reason, and all clients are alerted of the punishment via a standard message. #7) Sound chatting is customizable. The idea for sound chats came to me from the Sneaky Mod. I wanted it so that players could choose their own colors for the text that displays with a certain sound. As an example, in a bind you could have @171 which would display in the standard messaging color, or you could have in your bind @^S171 for a flourescent green color. You can make the chat sound text any color you wish. Additionally, I didn't add ending punctuation, so if you added a name after a sound token, it wouldn't look awkward. i.e. @84 # D! would give 'Nice shot <playerName>!' not 'Nice Shot! <playerName>!'. And of course that text could be any color of your choosing. The sounds generated by the sound tokens can be either global or local on a dynamic basis. I have them set to local by default, but if an admin comes on that wants them global, he utilizes /adm globalChat (which acts as a toggle, use the same syntax to turn off again). Also, the chat sounds are controlled by the same mechanism that controls team chat flooding. But, if an admin doesn't want players to have any limits, he can do so by /adm chatflood, which again is a toggle. And of course, the chat sounds can be eliminated entirely via the g_soundTokensAllowed Cvar. Only one sound token can be utilized per bind, which means that a player can't come up with an annoying bind that creates horribly garbled and loud sound. Furthermore, ghosts and spectators are not allowed to utilize the sound tokens ?, which can become quite annoying. Plus, there's 175 available sounds with indexes ranging from 0 – 174. #8) Death/Kill/Damage/Headshot tokens. First off, I've noticed in all the mods that I've played on or investigated, that some of the tokens don't work until the player has respawned. All of my chat tokens work in a manner that you don't have to wait to respawn to use them. #T is the last player you killed, #t is the last player you damaged, #D is the last player that killed you, #d is the last player that damaged you, #H is the last player you got a headshot on, #h is the last player that shot you in the head. Theoretically, these can all refer to different players. I usually am only interested in who actually *killed* me for congratulations, or who I actually *killed* for playful taunting. Most mods out there just have damaged variants, and I've never seen one that offers a headshot token. Unless there's a *great* demand, I'm not going to put armor / health / weapon tokens in because I find them to be totally useless. Serious players in serious matches communicate via voice, not via health/weapon binds. #9) Headshot sounds are psuedo-random from a list of a possible 5. Additionally the headshot text displayed is more descriptive and informative. Certain headshots with alt or unconventional weapons generate their own totally unique sounds. Experiment and see. The headshot sound can also be made global or local via the /adm globalHS command toggle. #10) If a connecting client is in the admin list or clan list, the MOTD displayed indicates their status right under the Mod Info line. If the connecting client is not in either list, the line under the Mod Info line is blank. #11) Every admin action is logged to the log file, with the admins name, the action and the client affected (if applicable). This is independent of whether admins are operating in stealth mode or not. #12) A /listadmins command available to clients. If admins are operating in stealthmode, the client (unless an admin) receives a message informing them of such, but no listing. If stealthmode is off, then the client sees a list of admins and their status (whether they have suspended their privileges or not). #13) Admins can transport players, but not themselves. Most admin actions can be done to the admin themselves, but this one could easily misused, so I made it that admins can't transport themselves. If their powers are suspended, they can't transport anyone. #14) Only clan members may be voted in as referees. I added the /callvote makeref and and /callvote removeref votes so that in the absence of an admin, a clan member can take on certain powers. I limited this to clan members because occasionally I have seen it where a clan 'invades' a server, votes themselves as referees and then wreaks havoc on the server and/or players (this all occurring without an admin present). This way, that possibility is eliminated from the equation. #15) Admin stealthmode. When stealthmode is activated, admins are *completely* anonymous, and any and all actions list only that 'An admin' did such and such an action. The stealthmode can be toggled on/off via the /adm stealthmode command. Even if a client is killed via an admin action, the admin that did it will not appear to the client (i.e. the 'Killed by' message will not show the admin's name). Other mods claim anonymous activity, yet list the admin's name for kill actions as well as others. Additionally, if the player killed tries to utilize the #D or #d token to list the name of the player that killed them or damaged them last, only 'An Admin' will be displayed. True anonymity is here at last (if you want it). #16) Via the /adm allowvote command, an admin can turn off *all* voting in the event they are getting tired of canceling votes continually. #17) Other mods have the ability to hit a client with various appliances. I have added similar functionality, but made it so that the horizontal direction vectors are not the same everytime. #18) Some admins like friendly fire on (I do, because it makes me a more skilled player) and some like it off. By utilizing the /adm friend command, an admin can toggle friendly fire on/off. #19) Occasionally, in our clan we like to 'haze' new members. Unfortunately, without rcon, and without properly working team lock functionality, it has been very frustrating (impossible, in fact) to get it so that one player (the initiate) is on a locked team by themselves, and other clan members, say 5 or 6 are on the other team. Between the properly working team lock functionality and the /adm teambalance command, the g_forceTeamBalance Cvar can be negated. #20) If a vote is called to kick either admins or clan members, the vote is immediately canceled, and the client that called the vote has 20 health points deducted. #21) #z is a chat token that contains the name of the player who most recently signed on. I came up with this because it's nice to greet people by name, and I have combined #z with some of the sound tokens for various kinds of greetings. #22) With the use of the g_adminsImmune Cvar, admins can be made completely invulnerable to any harmful actions by other admins. #23) Ghosts and spectators are immune to most of the admin actions (i.e. what's the point in dismembering a ghost, or striking a spectator, etc. ?) #24) For the admin actions that kill a player, there is *no* respawn invulnerability for the player which means the admin can execute the action as soon as the player respawns. #25) When the mapcycle is disabled via the /adm togglecycle command, the mapcycle is *truly* disabled. Admins can select, or players can vote for different maps with no problems, but votes or admin actions to go to the next map are rerouted to restart the current map. Additionally, the effect of the /adm togglecycle command stays throughout all map changes, restarts and gametype changes. Some mods claim to disable the mapcycle, but allow clients to cycle to the next map via a vote, or if the map and/or gametype change, the mapcycle is back in effect. True mapcycle disabling is here. #26) Admins can utlize the Punkbuster ban, kick and screenshot features via the /adm pbpermban <clientID> <reason>, /adm pbkick <clientID> <duration> <reason>, and /adm pbscreenie <clientID> commands. *All of these work using the SOF2 Ids without having to know the Punkbuster slot numbers*. Credit for Ideas (from other mods): This is a listing of features that I saw in other mods and incorporated into my own mod. I neither had, nor do I have access to any source code, so the implementation of all functionality is mine. Feature First Seen ------------------------------------------------ Message of the Day OSP Game pause OSP Team Lock/Unlock OSP Chat Tokens OSP Cancel Vote OSP Admin Concept OSP Admin Chat OSP Admin Say OSP Admin Strip OSP Admin Strike OSP Admin Suspend OSP Referee Concept OSP Coloured Names OSP Sound Tokens Sneaky Server Settings Sneaky Spawnkill Penalties Sneaky Mapcycle Disabling Sneaky Utilizing PB in Mod RTW Mod Detailed Overview of Mod Functions and Syntax: (NOTE: all commands must start with the forward slash character / <> indicates that the argument contained within can be one or several values) General User Commands and Features: ? -this displays all available user commands motd -this brings up the message of the day for the client sounds1 -lists sounds 0 - 43 sounds2 -lists sounds 44 - 87 sounds3 -lists sounds 88 – 131 sounds4 -lists sounds 132 – 174 settings -this lists relevant gameplay and server information listadmins -if admins aren't in stealthmode, lists admins and their status credits -gives mod credit and also lists my email address for bug reports -the following two enhance existing voting functionality- callvote makeref <clientId> -vote to make a clan member a referee callvote removeref <clientId> -vote to remove a clan member as referee #T Name of last player you killed #t Name of last player you hurt #D Name of last player that killed you #d Name of last player that hurt you #H Name of last player you shot in the head #h Name of last player that shot you in the head #u Own player's name #z Name of most recently connected client @T,t Generate a random sound @n Generate a sound where n is any number between 0 and 174 inclusive All sound tokens can be further modified to change the color of the output text. Valid examples are: @^(T @^/t @74 @^&74 @^%74 etc. If a player is a clan member (i.e. in the clan member list), he can utilize the /clanchat command to speak exclusively to other clan members and admins. The /clanchat capability is *great* for exclusive binds, but if the player just wants to chat with other clan members and admins on the fly, it is much easier to use the built in messaging functionality via messagemode (usually the T key) and type cc and then whatever the message is. No more need to drop down the console! This functionality (i.e. cc) does *not* work with binds. If you want to bind something for clan chat use /clanchat in your binds. Referee Commands: ref cancel -cancel the current vote in progress ref pause -pause the current game ref lock -lock both red and blue teams ref lock <t> -lock either red or blue team (t can be either 'red' or 'blue') ref unlock -unlock both red and blue teams ref unlock <t> -unlock either red or blue team (t can be either 'red' or 'blue') ref helpone -display information about the various referee commands Furthermore, if a clan member is a referee, that status stays with them as long as they aren't voted out and they stay connected to the server. When utilizing the existing Callvote HUD interface, referee 'votes' are not really votes at all, but are interpreted as commands. A wide variety of 'votes' are interpreted as commands (same goes for admins, but they can call any vote regardless of whether the vote is disabled or not). Specifically, a referee cannot make another clan member a referee (i.e. it will proceed via the normal voting process). Admin Commands: - *** means admin name will *not* be shown if stealthmode is active - -local vs. global means that only clients in the vicinity will hear the sound vs. everyone connected hearing the sound- adm cancel -cancel the current vote in progress adm chat -chat exclusively with other admins adm say -talk as an admin to all clients *** adm mute <Id> -mute the client matching Id *** adm strip <Id> -remove all weapons from the client matching Id *** adm smack <Id> -randomly knock about the client matching Id *** adm teleport <Id> -teleport the client matching the Id to an undisclosed location *** adm plant <Id> -plant a camping client matching Id where he stands *** adm punishSk <Id> -strip client matching Id and plant him in his enemy's spawn *** adm tearup <Id> -kill the client matching Id via total dismemberment *** adm strike <Id> -kill the client matching Id with lightning *** adm invade <Id> -kill the client matching Id by wearing their skin briefly *** adm boot <Id> -kill the client matching Id via a boot through the face *** adm stealthmode -toggles stealthmode for all admins adm suspend -toggles the calling admin's advantage giving priviliges adm pause -toggles game pausing and resumption adm friend -toggles friendly fire on/off adm chatflood -toggles sound token flooding control on/off adm globalHS -toggles whether headshot sounds are local or global adm globalChat -toggles whether the sound tokens are sounded locally or globally adm lock -lock both red and blue teams adm lock <t> -lock either red or blue team (t can be either 'red' or 'blue') adm unlock -unlock both red and blue teams adm unlock <t> -unlock either red or blue team (t can be either 'red' or 'blue') adm teamBalance -toggles the g_forceteambalance Cvar adm allowVote -turns on or off all voting privileges adm freezeCycle -mapcycling on or off (same map will repeat) adm helpOne -help page number one adm helpTwo -help page number two adm helpThree -help page number three adm forceTeam <Id> <t> -forces the client matching Id to another team (t can be 'red', 'r', 'blue', 'b', 'spectator', or 's') adm pbpermban <Id> <reason> -permanently bans the client matching Id from the server by GUID. The reason, if more than one word (i.e. if it contains spaces) *must* be in quotes, as in: /adm pbpermban 0 "you cheat and no one likes you!" adm pbkick <Id> <duration> <reason> -kicks the client matching Id for duration minutes. The reason, if more than one word (i.e. if it contains spaces) *must* be in quotes, as in: /adm pbkick 0 5 "nobody here likes you" would kick client 0 for 5 minutes. adm pbscreenie <Id> -this takes a Punkbuster screenshot of the client matching Id and stores it in the Punkbuster screenshot folder for review by senior admins at a later time. If an admin is suspicious of a player, he can utilize this functionality without needing rcon privileges. adm pbCommandHelp -lists online help for the Punkbuster related commands Admin particulars: - %% indicates loss of the privilege when an admin suspends their powers - Can't be voted or kicked off of the server Do not aquire Team Kill percentage points %% Follow *any* player on either team and free float, irregardless of server settings %% All votes called by an admin are interpreted as commands Admin votes can be called within the first minute of a map change Admin votes can be called during an intermission An admin's suspend status stays throughout all level and gametype changes If a player is an admin, he can utilize the /adm chat command to speak exclusively to other clan members and admins, and the /adm say command to speak as an admin to all players. The /adm chat and /adm say capabilities are *great* for binds, but if the player just wants to chat with other admins or talk as an admin to all players on the fly, it is much easier to use the built in messaging functionality via messagemode (usually the T key) and type aac or aas and then whatever the message is. No more need to drop down the console! This functionality (i.e. aac and aas) does *not* work with binds. If you want to bind something for adm chat or adm say use /adm chat and /adm say in your binds. New Rcon commands: addadmin <Id> - adds client matching Id to the admin's file removeadmin <Id> - removes client matching Id from the admin's file addclanmember <Id> - adds client matching Id to the clan member's file removeclanmember <Id> -removes client matching Id from the clan member's file Various Cvars: g_soundTokensAllowed -allow/disallow user generated sounds (@t, @n) g_headShotSound -turn on/off the head shot sounds g_headShotText -show or hide the head shot text displayed g_globalHSSound -global or local headshots generated sounds g_globalChatSound -global or local user generated sounds (@t, @n) g_chatFloodControl -limited/unlimited user generated sounds (@t, @n) g_messageOfTheDay -message of the day text (see example following) g_modifiedDamage -does the server run modified damage? g_pwByPassForAdmins -allow admins to bypass password entry on server g_adminsEnabled -all admin functionality on/off g_refsEnabled -allow/disallow referees on the server g_clanListEnabled -clan members recognized or not g_allowColoredNames -coloured names for team games on/off g_adminsImmune -are admins immune to another admin's action? g_adminStealthMode -whether admins are visible/invisible Summing Up: The tokens are made for bind use. Not for people using messagemode and typing in various tokens. This means that I don't have too look at every single byte of every single buffer coming through as chat/say/talk commands. I did this because I know most people use binds anyway. What follows are just a few examples of what I am talking about. I wanted it to allow for individual player's creativity as much as possible. For people that killed me- bind f7 "say @^27 #D." bind f7 "say @^@8 #D." bind f7 "say @^%74 #D!" For people I killed- bind f7 "@109 #T?" bind f7 "#u is @127 #T!" bind f7 "@65 #T." bind f7 "@95 #T!" Saying hello to someone who just signed on- bind f7 "@21 #z!" bind f7 "@29 #z." bind f7 "@123 #z?" An example message of the day: (The maximum length of the MOTD is 256 characters. This includes any space utilized for colorizing the text. Therefore, ^$Welcome ^&To ^#Our ^PServer uses up 29 characters. The sequence \n is interpreted as a new line of output.) set g_messageOfTheDay "Welcome to^4Our^7Server\nThis is the second line.\nThis is the third line\nThis is the fourth line\nThis is the fifth line" Please let me know of any problems or errors you encounter in the use of this mod. If I have left out an 'essential', please let me know as well. I can be reached at PsychicWarVet@teamltk.com I'd like to thank all the members of TeamLtk that stopped by while I was testing and helped me to debug and test various scenarios. During the writing of 6,000 lines of code in a frenetic 6 week development period it was a nice break to put the mod through it's paces and get some frags in as well. Thank you, PsychicWarVet www.TeamLtk.com Team Ltk is Unstoppable!
There are no comments yet. Be the first!