How to replace zone info?

Discussions about Coding and Scripting
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

How to replace zone info?

Post by Deepu »

I did some code for replacing zone info, it's replaced but not working.

Code: Select all

class SCRData extends Mutator;

function PreBeginPlay()
{
	local SoccerStart SSO;
	local SCRStart SSN;
	local SoccerGoal SGO;
	local SCRGoal SGN;
	local vector Loc;
	
 	ForEach AllActors(class'SoccerStart', SSO)
	{
		Loc = SSO.Location;
		SSN = Spawn(class'SCRStart', SSO.Owner, SSO.Tag, Loc, SSO.Rotation);
		SSN.ReturnWhenHurt = SSO.ReturnWhenHurt;
		SSO.Destroy();
	}
	ForEach AllActors(class'SoccerGoal', SGO) //Zone info
	{
		Loc = SGO.Location;
		SGN = Spawn(class'SCRGoal', SGO.Owner, SGO.Tag, Loc, SGO.Rotation);
		SGN.ScoreSound = SGO.ScoreSound;
		SGN.ScorePoints = SGO.ScorePoints;
		SGN.Team = SGO.Team;
		SGN.bDestroyBall = SGO.bDestroyBall;
		SGO.bNoDelete = False; //hacked engine.u for fixing const error!!!
		SGN.bNoDelete = True; //hacked engine.u for fixing const error!!!
		SGO.Destroy();
	}
}
Successfully deleted old class
User avatar
Feralidragon
Godlike
Posts: 5498
Joined: Wed Feb 27, 2008 6:24 pm
Personal rank: Work In Progress
Location: Liandri

Re: How to replace zone info?

Post by Feralidragon »

I am not sure if zone swapping even works, since the engine does not expect them to be swapped, but zones also have bStatic=True by default.

Therefore, your zone must be bStatic=False, as well as bNoDelete=False, in order to be spawned.
Your log probably shows an error complaining about this whenever you try to spawn one.
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

Re: How to replace zone info?

Post by Deepu »

New Class:

Code: Select all

class SCRGoal expands ZoneInfo;

var() Sound ScoreSound;						// sound to play on score
var() int ScorePoints;						// Points awarded for scoring in this goal
var() int Team;								// Team which should score here
var() bool bDestroyBall;					// Kill the ball as soon as a goal is made
var SCRStart S;							// Actor where ball spawns
var class<LocalMessage> ScoreMessageClass;
var Pawn Scorer;

simulated function PostBeginPlay()
{
	local SCRStart TempS;

	Super.PostBeginPlay();

	foreach AllActors(Class'SCRStart', TempS)
	{
		if (TempS != None)
			S = TempS;
	}
}

simulated event ActorEntered( actor Other )
{
	local SCRBall B;
	local int TeamNum;
	local Pawn P;
	local SoccerPlayerReplicationInfo SPRI;
	local PlayerReplicationInfo PRI;

	if(ROLE < ROLE_Authority)
	{
		Disable('ActorEntered');
		return;
	}

	super.ActorEntered(Other);

	if (Other.IsA('SCRBall'))
		B = SCRBall(Other);
	else
		return;

	if (B != None)
	{
		Scorer = B.Instigator;

		PRI=Scorer.PlayerReplicationInfo;
		foreach PRI.ChildActors(Class'SoccerPlayerReplicationInfo', SPRI) break;

		TeamNum = PRI.Team;
		if ( Level.Game.bTeamGame )
			if ( TeamNum == Team )
			{
				if(SPRI != None)
					SPRI.GoalsPlus++;
				PRI.Score+=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 0, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 2,Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[TeamNum].Score += ScorePoints;
			}
			else
			{
				if(SPRI != None)
					SPRI.GoalsMinus++;
				PRI.Score-=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 3, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 1, Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[Team].Score += ScorePoints;
			}

		if (bDestroyBall)
			B.Destroy();
		else
			B.bExpand = True;

		for ( P=Level.PawnList; P!=None; P=P.NextPawn )
			if ( P.bIsPlayer && P.IsA('PlayerPawn') )
				PlayerPawn(P).ClientPlaySound(ScoreSound, False);
			else if (P.IsA('Bot') && P.PlayerReplicationInfo.Team == Team)
			{
				Bot(P).Enemy = None;
				Bot(P).GotoState('VictoryDance');
			}

		if ( (TeamGamePlus(Level.Game).bOverTime || (TeamGamePlus(Level.Game).GoalTeamScore != 0)) && (TeamGamePlus(Level.Game).Teams[Scorer.PlayerReplicationInfo.Team].Score >= TeamGamePlus(Level.Game).GoalTeamScore) )
			TeamGamePlus(Level.Game).EndGame("teamscorelimit");
		else if ( TeamGamePlus(Level.Game).bOverTime )
			Level.Game.SetTimer(0, False);

		if ( (S != None) && !Level.Game.bGameEnded )
			SetTimer(3, False);

		Disable('ActorEntered');
	}
}

simulated function Timer()
{
	S.B = None;
	S.Trigger(Self, Scorer);
}

defaultproperties
{
     ScoreSound=Sound'Score'
     ScorePoints=1
     ScoreMessageClass=Class'SoccerMessage'
     bStatic=False
     bNoDelete=False
}
Old Class:

Code: Select all

// ============================================================
// SoccerGoal
// ============================================================
//                     === UT Soccer ===
//
//        Copyright 2000 - 2002 Kenneth "Shrimp" Watson
//          For more info, www.shrimp.barrysworld.net
//     Not to be modified without permission from the author
// ============================================================

class SoccerGoal expands ZoneInfo;

#exec AUDIO IMPORT FILE="Sounds\Score.wav" NAME="Score" GROUP="SoundEffects"

var() Sound ScoreSound;						// sound to play on score
var() int ScorePoints;						// Points awarded for scoring in this goal
var() int Team;								// Team which should score here
var() bool bDestroyBall;					// Kill the ball as soon as a goal is made
var SoccerStart S;							// Actor where ball spawns
var class<LocalMessage> ScoreMessageClass;
var Pawn Scorer;

simulated function PostBeginPlay()
{
	local SoccerStart TempS;

	Super.PostBeginPlay();

	foreach AllActors(Class'SoccerStart', TempS)
	{
		if (TempS != None)
			S = TempS;
	}
}

simulated event ActorEntered( actor Other )
{
	local SoccerBall B;
	local int TeamNum;
	local Pawn P;
	local SoccerPlayerReplicationInfo SPRI;
	local PlayerReplicationInfo PRI;

	if(ROLE < ROLE_Authority)
	{
		Disable('ActorEntered');
		return;
	}

	super.ActorEntered(Other);

	if (Other.IsA('SoccerBall'))
		B = SoccerBall(Other);
	else
		return;

	if (B != None)
	{
		Scorer = B.Instigator;

		PRI=Scorer.PlayerReplicationInfo;
		foreach PRI.ChildActors(Class'SoccerPlayerReplicationInfo', SPRI) break;

		TeamNum = PRI.Team;
		if ( Level.Game.bTeamGame )
			if ( TeamNum == Team )
			{
				if(SPRI != None)
					SPRI.GoalsPlus++;
				PRI.Score+=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 0, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 2,Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[TeamNum].Score += ScorePoints;
			}
			else
			{
				if(SPRI != None)
					SPRI.GoalsMinus++;
				PRI.Score-=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 3, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 1, Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[Team].Score += ScorePoints;
			}

		if (bDestroyBall)
			B.Destroy();
		else
			B.bExpand = True;

		for ( P=Level.PawnList; P!=None; P=P.NextPawn )
			if ( P.bIsPlayer && P.IsA('PlayerPawn') )
				PlayerPawn(P).ClientPlaySound(ScoreSound, False);
			else if (P.IsA('Bot') && P.PlayerReplicationInfo.Team == Team)
			{
				Bot(P).Enemy = None;
				Bot(P).GotoState('VictoryDance');
			}

		if ( TeamGamePlus(Level.Game).bOverTime && (TeamGamePlus(Level.Game).GoalTeamScore > 0) )
			TeamGamePlus(Level.Game).EndGame("teamscorelimit");
		else
			Level.Game.SetTimer(0, False);


		if ( (S != None) && !Level.Game.bGameEnded )
			SetTimer(3, False);

		Disable('ActorEntered');
	}
}

simulated function Timer()
{
	S.B = None;
	S.Trigger(Self, Scorer);
}

defaultproperties
{
     ScoreSound=Sound'Soccer.SoundEffects.Score'
     ScorePoints=1
     ScoreMessageClass=Class'Soccer.SoccerMessage'
     bStatic=False
}
Therefore, your zone must be bStatic=False, as well as bNoDelete=False, in order to be spawned.
Your log probably shows an error complaining about this whenever you try to spawn one.
by default the old class contain "bStatic=False" value so the problem is "bNoDelete", i think zone info's needs a map rebuild right? any way to fix this zone info replacement? or quit?
User avatar
Feralidragon
Godlike
Posts: 5498
Joined: Wed Feb 27, 2008 6:24 pm
Personal rank: Work In Progress
Location: Liandri

Re: How to replace zone info?

Post by Feralidragon »

Deepak O V wrote: i think zone info's needs a map rebuild right? any way to fix this zone info replacement? or quit?
It may be, that's why I mentioned: "I am not sure if zone swapping even works, since the engine does not expect them to be swapped...".

However, to be absolutely sure, what you can do is to make a much simpler test:
1 - Create an empty zone class, with just low or no gravity in its default properties;
2 - Do the replacement.

First you must ensure if the existing zone is being removed, and that your zone is actually being spawned (which you can do through explicit logging).
After you are sure that you have removed the previous zone and you spawned yours, and if the zone doesn't become low gravity, then it indeed means that you cannot do that switch.

If this simple test works however, then the problem is somewhere else in your zone code.
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

Re: How to replace zone info?

Post by Deepu »

I will try!
User avatar
sektor2111
Godlike
Posts: 6438
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: How to replace zone info?

Post by sektor2111 »

We were "chatting" in private about this problem. Yeah, I know, we have questions... but we can quit thinking at the last point of problem we can take a look at begin of the problem.

What do we have ? Answer: (my assumptions):
- That's probably Soccer game and we want to recreate another replacement - it does include some bugs I guess;
- By chance we have to deal with a sort of stuff intended to not be deleted but we want it removed. And here we go with what I would do (blindly at moment because I don't see the map) ----

Zone has to be removed because it has bugged codes ? All right, how about NOT trying to remove it but happily rewriting the bugged code and leaving it ORIGINAL in a good package, else how about a subclass of Soccer and NOT TeamGamePlus because this way was not the best proved over years in more works done by the same Shrimp, just RUIN package in your favor. You can have that zone with different properties in the same map by simply loading it from elsewhere - other Soccer and game fired by a child of original Soccer game.

Of course if this is only bNoDelete but not bStatic you can even go jerky and send the crap into the void and leave it to stupidly call ActorEntered next century. As I recall, So far I was able to slap that DistanceLightning garbage doing sucks in servers, all these Soccer things needs some... working and testing. I see that you don't use XCGE, the task would be more helpful with ReplaceFunction add-on.
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

Re: How to replace zone info?

Post by Deepu »

http://ut-files.com/index.php?dir=GameT ... Soccer.rar

Code: Select all

class SCRGoal expands ZoneInfo;

var() Sound ScoreSound;						// sound to play on score
var() int ScorePoints;						// Points awarded for scoring in this goal
var() int Team;								// Team which should score here
var() bool bDestroyBall;					// Kill the ball as soon as a goal is made
var SCRStart S;							// Actor where ball spawns
var class<LocalMessage> ScoreMessageClass;
var Pawn Scorer;

simulated function PostBeginPlay()
{
	local SCRStart TempS;

	Super.PostBeginPlay();

	foreach AllActors(Class'SCRStart', TempS)
	{
		if (TempS != None)
			S = TempS;
	}
}

simulated event ActorEntered( actor Other )
{
	local SCRBall B;
	local int TeamNum;
	local Pawn P;
	local SoccerPlayerReplicationInfo SPRI;
	local PlayerReplicationInfo PRI;

	if(ROLE < ROLE_Authority)
	{
		Disable('ActorEntered');
		return;
	}

	super.ActorEntered(Other);

	if (Other.IsA('SCRBall'))
		B = SCRBall(Other);
	else
		return;

	if (B != None)
	{
		Scorer = B.Instigator;

		PRI=Scorer.PlayerReplicationInfo;
		foreach PRI.ChildActors(Class'SoccerPlayerReplicationInfo', SPRI) break;

		TeamNum = PRI.Team;
		if ( Level.Game.bTeamGame )
			if ( TeamNum == Team )
			{
				if(SPRI != None)
					SPRI.GoalsPlus++;
				PRI.Score+=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 0, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 2,Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[TeamNum].Score += ScorePoints;
			}
			else
			{
				if(SPRI != None)
					SPRI.GoalsMinus++;
				PRI.Score-=10;
				if (Team == 0)
					BroadcastLocalizedMessage(ScoreMessageClass, 3, Scorer.PlayerReplicationInfo);
				if (Team == 1)
					BroadcastLocalizedMessage(ScoreMessageClass, 1, Scorer.PlayerReplicationInfo);
				TeamGamePlus(Level.Game).Teams[Team].Score += ScorePoints;
			}

		if (bDestroyBall)
			B.Destroy();
		else
			B.bExpand = True;

		for ( P=Level.PawnList; P!=None; P=P.NextPawn )
			if ( P.bIsPlayer && P.IsA('PlayerPawn') )
				PlayerPawn(P).ClientPlaySound(ScoreSound, False);
			else if (P.IsA('Bot') && P.PlayerReplicationInfo.Team == Team)
			{
				Bot(P).Enemy = None;
				Bot(P).GotoState('VictoryDance');
			}

		if ( (TeamGamePlus(Level.Game).bOverTime || (TeamGamePlus(Level.Game).GoalTeamScore != 0)) && (TeamGamePlus(Level.Game).Teams[Scorer.PlayerReplicationInfo.Team].Score >= TeamGamePlus(Level.Game).GoalTeamScore) )
			TeamGamePlus(Level.Game).EndGame("teamscorelimit");
		else if ( TeamGamePlus(Level.Game).bOverTime )
			Level.Game.SetTimer(0, False); // this is my fix, in original soccergoal will not ends the game also the goal limit is not working...

		if ( (S != None) && !Level.Game.bGameEnded )
			SetTimer(3, False);

		Disable('ActorEntered');
	}
}

simulated function Timer()
{
	S.B = None;
	S.Trigger(Self, Scorer);
}

defaultproperties
{
     ScoreSound=Sound'Score'
     ScorePoints=1
     ScoreMessageClass=Class'SoccerMessage'
     bStatic=False
     bNoDelete=False
}
User avatar
sektor2111
Godlike
Posts: 6438
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: How to replace zone info?

Post by sektor2111 »

Okay, I downloaded package, let me take a look at how do it works, I'll post conclusions later.

Edit: First dumb bork in read-me: a GAME-TYPE doesn't really need to be Mentioned as ServerPackages, such things are mapped automatically by engine including their dependencies :P .
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

Re: How to replace zone info?

Post by Deepu »

Nice...
User avatar
sektor2111
Godlike
Posts: 6438
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: How to replace zone info?

Post by sektor2111 »

Nice ?
Let's see next. That zone says "simulated function ActorEntered" and then code returns if we speak about client.
The question is: Why do we need simulated function then ? It was the age of stupid simulated functions ? Definitely more stuff here has to be rewritten because is pointless...

Code: Select all

   if(ROLE < ROLE_Authority)
   {
      Disable('ActorEntered');
      return;
   }
Not the last thing, for sure this game is for ME and MBot :lol: , as long as default Bot is a mess in here with no weaponry... Did they do any other Bot class ? I guess not, probably it was "impossible" to wrap all bot related problems (very easy with NotePad++). However, playing with MBot console has only logs for no weapon but no errors, so to speak my MBot never tested with this game-type, do works flawless.

Definitely I have to look well at package structure to see all dependencies because that is the only hard task here, I'm convinced that it can be conformed into a better one WITHOUT any zone replacement - that's not the right answer.
Higor
Godlike
Posts: 1866
Joined: Sun Mar 04, 2012 6:47 pm

Re: How to replace zone info?

Post by Higor »

No, you can't.
You need to work around it, while at the same time shutting down the game-affecting code in the original zone infos.

PD:
Good coding is sending a notification to the game info.
Bad coding is altering it's state directly from the zone info.
What we're seeing here is a total aberration.

The workaround is gonna have to cache the ball(s) and check it's zone on every tick.
User avatar
Feralidragon
Godlike
Posts: 5498
Joined: Wed Feb 27, 2008 6:24 pm
Personal rank: Work In Progress
Location: Liandri

Re: How to replace zone info?

Post by Feralidragon »

There's also "great coding" consisting of using an interface package to have the placeable actors for maps, and an engine package which can be freely updated and customized to implement those interfaces.
And then it wouldn't matter what the zones themselves did or what they sent to what, since the implementation would be the one taking care of all of that.
User avatar
sektor2111
Godlike
Posts: 6438
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: How to replace zone info?

Post by sektor2111 »

I will not claim that a new Soccer will be perfect but it might go improved if actors mapped have a different execution. Another package will have a few fixes, the most of fixes won't be possible without a new architecture. With a new architecture we cannot have a conformed package compatible with original but some fine tuning is better than nothing.
First condition is checking all dependent files/packages. New package does need the same way else we might have "forged object" at random. For a clean and a valid package probably the best way is working with a text editor not UT's Editor, and we have to gain source-code or something like an original source-code.
In my bits of free time I'll drop a hand in here - probably a conformed soccer will need another stuff based on it (like I did with Chaos) in order to gain more fixing.
Definitely controller has no definition for Bot Attitude (they attempt to fight each-other), I don't see the null weapon load for preventing Bot to do garbage, it's really poorly coded and those adds will screw up compatibility with old version so it needs a child game firing up the stage.
Higor wrote: You need to work around it, while at the same time shutting down the game-affecting code in the original zone infos.
Umm, while a MH map has a MonsterWaypoint. That code is executed... depending on who did the package. Higor said that is a trigger, sektor2111 said that is a keypoint but reacting different, Shrimp said that is a keypoint but... poorly coded without a simple wrapper turning MH Bot attack into a messed up junk. That's the point, actor there is reacting depending on what package is saying because that zone is not a stock one is mapped from Soccer package and this Soccer can be other thing, another package with a code running other stuff. As other sample some coder said that predator is a monster, other one said that predator is a player, imagine what happened, crashing a Linux 436 server while predator player joined into a predator monster server - an exploit based on too much development addiction...

Of course the ball can check where is located each tick but... I think there are other solutions as well. Getting rid of a zone is a very last thing which I would do, first I would need to test other solutions before trying to inject a new zone in an already done zone - a mapped zone, never supposed to be deleted.

EDIT: I got source-code. So far Game happily ends correctly if has a deal with game itself not TeamGamePlus as follows:

Code: Select all

/*
	THIS IS TEAMGAMEPLUS and not other jokes
		if ( (bOverTime || (GoalTeamScore > 0)) && Killer.bIsPlayer
			&& (Teams[killer.PlayerReplicationInfo.Team].Score >= GoalTeamScore) )
				EndGame("teamscorelimit");
*/
		if ( SoccerMatch(Level.Game) != None )
		{
			if ( SoccerMatch(Level.Game).bOverTime || ( SoccerMatch(Level.Game).GoalTeamScore > 0 
			&& Scorer != None && Scorer.PlayerReplicationInfo != None
			&& SoccerMatch(Level.Game).Teams[Scorer.PlayerReplicationInfo.Team].Score >= SoccerMatch(Level.Game).GoalTeamScore ) )
				SoccerMatch(Level.Game).EndGame("teamscorelimit");
			else
				Level.Game.SetTimer(0, False);
		}
Not gonna waste time with Monsters here... On-Line, with that null weapon, MBot goes in aiming position doing nothing interesting. And that's all...
Edit2:
Finally I got something - Soccer Gen2 tested in a LAN server with reduced simulations because... were USELESS is working with no issues + a mapvote. Yeah, the zone is able to demand ending game, after wrapping some Accessed Nones I see game running normally. Bot will ignore other Bot - THERE IS NO REASON TO ATTACK in this game-type, maybe I have to write some funky code when ball is far away from Bot, I have to see those maps first - if I can count on playerstart actors or I have to "brute-force" path tracking because in some maps, when Bot is far from ball, it simply does nothing - indeed is less engine stress but it do looks like a retarded moron. For an advanced stuff we have to expand this mod, maybe using some spatial work for tracking a good shot rather than scoring for the other team... and blindly run to the ball ignoring direction...
User avatar
sektor2111
Godlike
Posts: 6438
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: How to replace zone info?

Post by sektor2111 »

I do not get the average problem here. My grammar is not good but probably Deepak has a heavier language barrier. Dude, get the package which I sent you, launch a server fired with Soccer game using Package which I sent you and Use original package in client. Join to server with new package, see what's the deal. If Bot is a trouble maker use a last MBot type - in server, of course. They are more relaxed than blabbering around with no purpose. You can quit using your "replacements", those are not helping. Game-type used is "Soccer.SoccerMatch" from NEW package. Of course, I tested it because as you know me, I don't like to talk crap.
[attachment=0]Soccer_Gen2.zip[/attachment]


PD:
And yes, a zone can end game as long as a pawn is able to end game by calling "Level.Game.Killed(...)" so yes, an external factor can do a game state change because this is the way in how UT was working for 19 years and no one was crying... MonsterHunt as another sample having a Trigger in map, intended for ending the game (or more useless triggers based on retarded mapping...)
Here was a mater of what that zone was saying in a package correctly messed up with way too many simulated functions for no purpose... For other bugs will need more study. Given the year of coding this thing, this is probably another *functional thing through the collection of 70% Garbage hosted at ModDB aka trash-box where noobs are spreading manure for years using different BS excuses rather than learning first how to build an UT server... extremely useful for testing Net stuff :loool: .

Topic not solved - A ZoneInfo doesn't need replacement because it might be GOOD as it is :lol2: .
You do not have the required permissions to view the files attached to this post.
User avatar
Deepu
Adept
Posts: 388
Joined: Mon Nov 11, 2013 7:56 am
Personal rank: Average
Location: India

Re: How to replace zone info?

Post by Deepu »

Thanks man you did a great job, it worked without version mismatch also i added to my dev server = 62.141.39.226:1111