Not a single time MH2 was loading relics set in MH and MH was loading what MH2 has defined due to prefix and game-type confused by MapVote when it doesn't handle travel correctly - actually there is no travel when server starts. When MapVote it's triggering server-travel, it will set all game types correctly even if you have 3 MonsterHunt games running and 2 DM types + CTF and others.
ActorCLP did not help me in this problem too much and looking at logs probably I was not fascinated at all - I repeat I'm talking about multi-servers already done and functional.
In order to prevent Another load of a a new file I'm starting server using default UT-Logo-Map, not dedicated for game-play and running for whatever 4-8 seconds, ending "match" and letting MapVote to do its task correctly. By using this way, mutators for MH will not run randomly under MH2 MH3 and you can use this way regarding to what others are saying. How to trigger this quick travel ? I wrote a server-start actor some time ago which I changed a few times over time and can be changed anytime because it's not a package. Speaking about packages I find completely USELESS loading all ServerPackages in start-map which has only one purpose: Making MapVoteLA any to handle server over Run-Line - and for such a server running XC_Engine, loading all packages for playing a single game/map over there, for me doesn't make any sense. That's why I wrote those things in that Packager and reason for using/having "packager" tool working as Server-Side.
Paranoia (according to some opinions around but which are already set in reality and they are functional for 3-4 years) goes below:
Code: Select all
class TheStart expands Mutator config;
var config float stDelay;
var float fInterval;
var config bool bStartGames;
var String Map;
var bool bFirstTime, bCheckedMap, bProcessing;
event PreBeginPlay()
{
log (Self$" waiting "$stDelay$" seconds for travel check");
// SetTimer(stDelay,False);
if (stDelay == 0)
stDelay = 3;
fInterval = stDelay;
}
function Timeing()
{
local Pawn P;
local StatLog SL;
if (!bCheckedmap)
{
SL = Spawn(class'StatLog');
if ( SL != None )
{
Map = Caps(SL.GetMapFileName());
SL.Disable('Timer');
SL.Destroy();
}
// Map=Caps(Level.GetURLMap());
bCheckedMap = True;
}
// if ( Map ~= RefMap)
if ( Left(Map,11)=="UT-LOGO-MAP")
{
if ( DeathMatchPlus(Level.Game) != None )
{
DeathMatchPlus(Level.Game).MinPlayers = 2;
if (!bFirstTime)
{
DeathMatchPlus(Level.Game).NetWait=0;
DeathMatchPlus(Level.Game).RestartWait=0;
DeathMatchPlus(Level.Game).bRequireReady=False;
DeathMatchPlus(Level.Game).bNetReady=False;
DeathMatchPlus(Level.Game).TimeLimit=4;
DeathMatchPlus(Level.Game).StartMatch();
DeathMatchPlus(Level.Game).RemainingTime=3;
log ("Awaiting end"@Self.Name);
}
if (!bFirstTime)
{
bFirstTime = True;
// SetTimer(stDelay/2,False);
fInterval = stDelay/2;
bProcessing=True;
GoTo EndChapter;
}
foreach AllActors (class 'Pawn', P)
{
if ( P.PlayerReplicationInfo != None && P.bIsPlayer )
{
P.PlayerReplicationInfo.Score += 2;
log (P.GetHumanName()@has new score.);
bProcessing=False;
break;
}
}
}
}
else
{
log (Self$" won't react.");
log (Self$" has detected being loaded"@Map);
if ( bStartGames )
{
if ( DeathMatchPlus(Level.Game) != None )
{
DeathMatchPlus(Level.Game).NetWait=0;
DeathMatchPlus(Level.Game).RestartWait=0;
DeathMatchPlus(Level.Game).bRequireReady=False;
DeathMatchPlus(Level.Game).bNetReady=False;
DeathMatchPlus(Level.Game).StartMatch();
}
}
LifeSpan=1.000000;
Goto EndChapter;
}
EndChapter:
}
Auto State STracking
{
Begin:
Sleep(0.00);
ALooping:
Sleep(fInterval);
Timeing();
if (bProcessing)
GoTo('ALooping');
End:
}
defaultproperties
{
stDelay=3.000000
}
In mean-time here might go other toys which others did not do- part of "Testing/Debugging hacks & Tips" chapter.