If you need help with the Wormbot – be it configuration troubles, INT file customization or creating custom handler classes – feel free to post your problems, suggestions and bug reports in Wormbo's Area on UnrealAdmin.org.
The Wormbot IRC Reporter (or just Wormbot
for short) is a mutator for Unreal Tournament 2004, which combines a reporter bot and a chat relay bot. The reporter bot sends ingame events (kills, captures and so on) to a channel in an IRC network, while the chat relay bot sends ingame Say messages to the channel (TeamSay messages are not sent to IRC) and can also send IRC chat back to the UT2004 server. Depending on the configuration, the two bots can either share a single connection or use two individual connections to the IRC network.
Please remember that many IRC networks only allow a certain number of connections from a single host. For example on Quakenet you are allowed to have five of these so-called clones
. Exceeding this number can result in a so-called G-line
(a ban from the IRC network) for the entire host. Also some networks may not allow you to use any bots, so check the network's MOTD first.
Some other features worth mentioning:
+x
, which hides an authed user's real host name.New Features:
Modified Features:
Bugfixes:
There might be other changes I can't remember anymore, but you'll find them out anyway.
The Wormbot comes in a simple ZIP archive containing the following files:
Anti TCCand its localization file.
Assaultand its localization file.
Mutantand
Last Man Standingand its localization file.
Invasionand its localization file.
Jailbreakand its localization file.
TDM4and
CTF4and its localization file.
UTCompmutator and its localization file.
Just extract the .U, .UCL and .INT files to your server's UT2004\System directory. You should restart your server afterwards so the Wormbot mutator is added to the list of available mutators.
Before you can use the Wormbot, you need to configure it. Go to the Current
→ Mutators
page, select the Wormbot mutator and click Set Selected Mutators
but do not restart the map or switch to a different map yet. Now go to the Defaults
→ Wormbot v1
page and configure the mutator the way you want.
To enable the Wormbot as soon as the server starts you have two options:
WormbotReporter.MutWormbot
) to the ?mutator=...
URL parameter in the server's startup command line so it reads e.g. like this:
ucc server DM-Antalus?game=xGame.xTeamGame?mutator=xGame.MutInstaGib,WormbotReporter.MutWormbot?minplayers=6This approach allows you to disable the mutator if you don't want to use it.
[Engine.GameEngine]
section of the server's INI file – usually this is UT2004.ini or Server.ini in the UT2004\System directory, ask your game server provider if you're not sure about this.ServerActors=IpDrv.MasterServerUplink ServerActors=UWeb.WebServer ServerActors=WormbotReporter.MutWormbotThis approach has the disadvantage of not being able to remove the mutator via webadmin. It will always automatically be reenabled after a map change.
The Wormbot doesn't have to be added to the ServerPackages list and won't be sent to clients anyway. In fact, I recommend not adding it in case a client for some reason has a different version.
The Wormbot is almost fully configurable from UT2004's webadmin interface.
The entire configuration is stored in your server's INI file. Most of the options can be found in the section [WormbotReporter.MutWormbot]
, exceptions will be mentioned separately.
This section describes settings specifically applying to the reporter bot. However, these values apply to the chat relay bot as well if it is configured to reuse the reporter bot's IRC connection.
%%userpart%%
placeholder. The bot's own message will be added at the location of the %%botpart%%
placeholder.%%game%%
and %%map%%
are supported and will be replaced with the name of the gametype and the map respectively.%%userpart%%
placeholder in the topic template if the channel topic is empty when the bot when the bot wants to update it.Configure Mutatorsbutton.
The chat relay bot's configuration options are similar to those of the reporter bot, except that it will not touch the channel topic.
!say. Users on IRC will have to prefix their messages with this trigger if they want to chat with the players on the server.
The Wormbot tries to mimic an IRC server's flood protection features with the first five of the following options. Basically an IRC server has a counter for each user which is increased by a certain amount for every message the user sends. The counter is decreased by 1 every second but will never go below zero. If the counter exceeds a certain amount, usually 10, additional messages are queued in a fixed-sized buffer until the counter drops below the allowed maximum value. Should a user send more or longer messages than there is space available in the buffer the user is kicked for Excess Flood
.
These options are stored separately for each game handler, not actually for each gametype.
2
), only important (INI value: 1
) or no (INI value: 0
) death messages.Important(INI value:
1
), only items marked as important in the Items list are reported.score updateagainst this interval. The scoreboard will not be sent again if scores didn't change in the mean time.
The Onslaught game handler has some additional options:
The game handlers are configured in the [WormbotReporter.WIR_GameHandler]
section, along with the gametype-specific options for unknown gametypes.
Each game handler is specified on its own line, like this:
GameHandler=(Game="xDeathMatch",Handler="WIR_GameHandler_DM")
Due to limitations of the default webadmin interface the game handler configuration is not available there, but it will show up in the mutator configuration if you add the Wormbot to the mutators list for a stand-alone game.
xDeathMatch
) or the full class name (e.g. xGame.xDeathMatch
) of the gametype class.WIR_GameHandler_DM
) or the full class name (e.g. WormbotReporter.WIR_GameHandler_DM
) of the handler class for this gametype. If the package name is omitted, WormbotReporteris asumed.
Currently the Wormbot supports all stock gametypes as well as TDM4, CTF4 and Jailbreak. Really basic support for Chaos UT is there as well, but don't expect too much yet. Other gametypes might be supported by default as well or if you configure the correct handler class for them. You can also reuse the same game handler for multiple gametypes, if the handler supports them. These gametypes will share the handler's gametype-specific configuration, though.
The mod handlers are configured in the [WormbotReporter.WIR_ModHandler]
section.
Each mod handler is specified on its own line, like this:
ModHandler=(ActorClass="MutAntiTCCFinal",Handler="WormbotHandlerAntiTCC.WIR_ModHandler_AntiTCC")
Due to limitations of the default webadmin interface the mod handler configuration is not available there, but it will show up in the mutator configuration if you add the Wormbot to the mutators list for a stand-alone game.
MutAntiTCCFinal
) or the full class name (e.g. AntiTCC118c.MutAntiTCCFinal
) of a class specific to this mod. Usually the mod's mutator class is the best choice here. If the mod doesn't have a mutator you can try its ServerActor class, though the author must have coded it as a subclass of Engine.Info
, otherwise the Wormbot won't find it.WormbotHandlerAntiTCC.WIR_ModHandler_AntiTCC
) of the handler class for this mod.You can reuse the same mod handler for multiple mods, if the handler supports them. For example the Anti TCC handler is configured for MutAntiTCC
and MutAntiTCCFinal
.
This section lists the Wormbot's default INI configuration. This is only for reference, you do not have to actually copy it to your INI file.
[WormbotHandlerAntiTCC.WIR_ModHandler_AntiTCC] bReportKickReason=True [WormbotReporter.WIR_ModHandler] ModHandler=(ActorClass="MutAntiTCC",Handler="WormbotHandlerAntiTCC.WIR_ModHandler_AntiTCC") ModHandler=(ActorClass="MutAntiTCCFinal",Handler="WormbotHandlerAntiTCC.WIR_ModHandler_AntiTCC") ModHandler=(ActorClass="MutUTComp",Handler="WormbotHandlerUTComp.WIR_ModHandler_UTComp") [WormbotReporter.WIR_GameHandler] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 GameHandler=(Game="xDeathMatch",Handler="WIR_GameHandler_DM") GameHandler=(Game="xTeamGame",Handler="WIR_GameHandler_TDM") GameHandler=(Game="xDoubleDom",Handler="WIR_GameHandler_DoubleDom") GameHandler=(Game="xCTFGame",Handler="WIR_GameHandler_CTF") GameHandler=(Game="InstaGibCTF",Handler="WIR_GameHandler_ICTF") GameHandler=(Game="xBombingRun",Handler="WIR_GameHandler_BombingRun") GameHandler=(Game="ONSOnslaughtGame",Handler="WIR_GameHandler_Onslaught") GameHandler=(Game="xVehicleCTFGame",Handler="WIR_GameHandler_VCTF") GameHandler=(Game="xMutantGame",Handler="WormbotHandlerBonuspack.WIR_GameHandler_Mutant") GameHandler=(Game="xLastManStandingGame",Handler="WormbotHandlerBonuspack.WIR_GameHandler_LMS") GameHandler=(Game="Invasion",Handler="WormbotHandlerInvasion.WIR_GameHandler_Invasion") GameHandler=(Game="OLTeamDeathmatch",Handler="WormbotHandlerOLTeamGames.WIR_GameHandler_OLTDM") GameHandler=(Game="OLCTFGame",Handler="WormbotHandlerOLTeamGames.WIR_GameHandler_OLCTF") GameHandler=(Game="ASGameInfo",Handler="WormbotHandlerAssault.WIR_GameHandler_Assault") GameHandler=(Game="Jailbreak",Handler="WormbotHandlerJailbreak.WIR_GameHandler_Jailbreak") GameHandler=(Game="ChaosxDeathMatch",Handler="WIR_GameHandler_DM") GameHandler=(Game="ChaosxTeamDeathMatch",Handler="WIR_GameHandler_TDM") GameHandler=(Game="ChaosxDoubleDom",Handler="WIR_GameHandler_DoubleDom") GameHandler=(Game="ChaosCTF",Handler="WIR_GameHandler_CTF") [WormbotHandlerAssault.WIR_GameHandler_Assault] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=1 bReportSpecial=True ScoreReportDelay=120 [WormbotHandlerBonuspack.WIR_GameHandler_LMS] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotHandlerBonuspack.WIR_GameHandler_Mutant] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotHandlerInvasion.WIR_GameHandler_Invasion] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=90 [WormbotHandlerJailbreak.WIR_GameHandler_Jailbreak] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotHandlerOLTeamGames.WIR_GameHandler_OLTDM] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotHandlerOLTeamGames.WIR_GameHandler_OLCTF] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_ICTF] ReportKills=1 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_TDM] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_VCTF] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_DM] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_DoubleDom] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_CTF] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_GameHandler_BombingRun] ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=2 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.WIR_IRCConnection] LastTopicTemplate= [WormbotReporter.WIR_GameHandler_Onslaught] bReportNodeLocations=True bReportNodesInScores=True CoreHealthReportInterval=15 CoreAttackReportInterval=10 ReportKills=2 bReportMultiKills=True bReportKillingSprees=True bReportLocations=True bReportWeapons=True ReportPickups=1 bReportSpecial=True ScoreReportDelay=120 [WormbotReporter.MutWormbot] bEnableReporter=False ReportServerName=irc.quakenet.org ReportServerPort=6667 ReportServerPassword= ReportUserNick= ReportUserIdent=wormbot ReportChannel= ReportChannelKey= bSetReportChannelTopic=False ReportChannelTopicTemplate=%%userpart%% | Reporting: %%botpart%% ReportChannelTopicBotPart=%%game%% on %%map%% ReportChannelTopicBotIdle=No match in progress. ReportChannelTopicUserPart=No user topic set. MaxLevelChangeDelay=60 bEnableChatbot=False bEnableTwoWayChat=False bChatThroughReporter=True ChatServerName=irc.quakenet.org ChatServerPort=6667 ChatServerPassword= ChatUserNick= ChatUserIdent=wormbot ChatChannel= ChatChannelKey= ChatTrigger= bChatReceiveOnlyText=True bAuth=False bChallengeAuth=True bHideRealHost=True AuthNick= AuthPassword= FloodProtectCommandPenalty=2000 FloodProtectMessagePenalty=2750 FloodProtectMaxPenalty=10 FloodProtectBytes=512 FloodProtectBytesDuration=10 MaxLenMessageQueue=30 bAutoReconnect=True ReconnectDelay=10 bAutoRejoin=True ConnectTimeout=60 items=(ItemClass="UDamagePack",ItemName="Double Damage",Important=True,IRCColor=13) items=(ItemClass="ShieldPack",ItemName="Shield Pack",Important=False,IRCColor=7) items=(ItemClass="SuperShieldPack",ItemName="Super Shield Pack",Important=True,IRCColor=7) items=(ItemClass="SuperHealthPack",ItemName="Big Keg O' Health",Important=True,IRCColor=12) items=(ItemClass="RedeemerPickup",ItemName="Redeemer",Important=True,IRCColor=10) items=(ItemClass="PainterPickup",ItemName="Ion Painter",Important=True,IRCColor=10) items=(ItemClass="GravBeltPickup",ItemName="Grav Belt",Important=True,IRCColor=14) items=(ItemClass="JumpbootsPickup",ItemName="Jump Boots",Important=True,IRCColor=12) items=(ItemClass="VortexPickup",ItemName="Gravity Vortex",Important=True,IRCColor=10) items=(ItemClass="ChaosRelicPickup_Armor",ItemName="Chaos Relic of Protection",Important=True,IRCColor=7) items=(ItemClass="ChaosRelicPickup_Damage",ItemName="Chaos Relic of Strength",Important=True,IRCColor=4) items=(ItemClass="ChaosRelicPickup_Regen",ItemName="Chaos Relic of Regeneration",Important=True,IRCColor=3) items=(ItemClass="ChaosRelicPickup_Speed",ItemName="Chaos Relic of Speed",Important=True,IRCColor=12) items=(ItemClass="ChaosRelicPickup_Vampire",ItemName="Chaos Relic of Vampirism",Important=True,IRCColor=6) items=(ItemClass="ChaosRelicPickup_Vengeance",ItemName="Chaos Relic of Vengeance",Important=True,IRCColor=7) DebugLogFileName= bDebugStartMatch=False
Almost everything the Wormbot will send to IRC is stored in .INT files, which can be edited with a plain text editor. Some strings are taken from the UT2004 INT files, so if you can't find something in the Wormbot INT files, try looking there.
If you feel that the INT files don't provide the modification options you were looking for and you know at least a little UnrealScript (or are willing to learn it) you can try to write new game or mod handler classes. Please don't modify any existing packages, though. Always create subclasses in your own package(s)!