Netcode Tweaks

[PCF]Adrian has been reading the boards and has noted the frustration over netcode. He has written the following on the official DreamCatcher forums:
———————————
We have made some tweaking possible in mp, eg. if you look at your config file in /Bin, you will find these lines:

Cfg.NetUpdateClass00 = {0.0222222,0.02,0.02,0.03,}
Cfg.NetUpdateClass01 = {0.0666667,0.2,0.2,0.2,}
Cfg.NetUpdateClass02 = {0.1,0.01,0.01,0.02,}
Cfg.NetUpdateClass03 = {0.01,0.01,0.01,0.01,}
Cfg.NetUpdateMaxPacketSize = 500
Cfg.NetUpdateSendPeriod = 10

But of course tweaking that is pain in the ass, so heres what you can do from the console (results are written to config when you exit the game):
==============================================
When youre connected and playing, bring on the console.

Console Commands:
==============================================
netstats

Gives lots of info of whats going in the network. Its a summary of the last 5 seconds.
==============================================
netstats overall

Gives lots of info of whats going in the network. Its a summary of
everything from the beginning of your connection.
==============================================
netstats help

Info about the command.
==============================================
maxpacketsize

Shows how big is the size of the packet that your game sends. Sometimes the game needs to send something undividable and bigger than this size – and it will do it – but generally the game tries to avoid such situation.
==============================================
maxpacketsize

Sets the maximum size of a packet.

Rumor has it that smaller packets have priority in overcrowded networks. On the other hand, they may get lost easier (because there more of them). Its a good command to play with and see whats happening with larger/smaller packets.
==============================================
maxpacketsize help

Shows info about the command.
==============================================
updateparams_myplayer

Shows current parameters for our player (eg. the camera)
==============================================
updateparams_myplayer help

Shows info about the command.
==============================================
updateparams_myplayer

First parameter is how often the server should send out new data of the player.

Second parameter says that server should not send the players new velocity info if its not different by from the last one sent

Third paremeter says that server should not send the players new angular velocity info if its not different by from the last one sent

Fourth parameter says that server should not send the players new position info if its not different by from the last one sent

Example:
updateparams_myplayer 0.5

In this example players new position will be send from server every 0.5 sec. Note that in this example we ignored last 3 parameters, as they are for hardcore experts only and dont change that much anyway I think.
==============================================
Similiar commands (like those for the player) are available for other things:

updateparams_players – other players and some objects
updateparams_physicsitems – physical items, eg. barrels
updateparams_projectiles – rockets, grenades, stakes, etc.

Generally the frequency of the update has direct input on the size of the data stream from server to client. If you want to decrease the size of this stream, increase the delays. If you want smoother gameplay, decrease the delays.

DO NOT set any delay to 0 – that will reset all other parameters (linVel,angVel, pos).
==============================================
Changed parameters are written to config.ini when you exit the game, so pelase remember what you had originally before tweaking, if you dont want to loose it (backing up config.ini is a good idea).
——————————

Let us know if you find good values to use that help at all. Thanks to Adrian for this and listening. Catch the full thread here: http://dreamcatcherinteractive.com/forums/showthread.php?s=&postid=82734#post82734

First impressions?

Plz reply to this column post with your first impressions of the game. Does it suck? Do you love it? Netcode good or bad? etc etc. No responses to others comments please. Just your own views of the game.

Upcoming Patch

I understand that PCF are working hard on producing the first Patch for Painkiller. I understand that there are a lot of tweaks and fixes. Here are the main ones I could glean from talking to some of the guys:

Fix: Pentagram on Illuminati causing all players to be disconnected
Fix: Lava kills players on FFA mode
Fix: Allow LAN play with no Internet connection
Add: Voting (not sure params that will be votable)
Add: Spectating
Add: Different sounds per player
Add: Recording Demos
Add: Recording movies (not 100% on this one)
Add: New Map
Change: Weapon balancing (ElectroDriver combo in Voosh changed as is Electrodriver damage)

If any of the PCF guys read this, I would appreciate an update as to the contents. Thanks in advance 🙂

I also understand that tests are being carried out this Friday. Hopefully we will see this additional functionality soon 🙂

Movement summary

In response to the many questions around “movement”, I’ve written up a little synopsis. Bear in mind that the time I’ve had to try all things out has been limited and hence this is my first view of the situation. Hope you find it interesting……

Many people have asked me what the movement is like in Painkiller. This is a tough question for me to answer as everyone is from different backgrounds. As I’ve not played QuakeWorld for the last 4 years, my bunnyhopping and air movement skills have changed to match the Quake3 requirements. Rocket Jumping methods have changed and the lack of air movement has meant a different skill set has been required to master the jumps.

Now enter Painkiller. Air movement that’s a step up from Quake 3 (though maybe not quite QuakeWorld), bunnyhopping that is controlled as per Quake3 but has the speed of QuakeWorld (almost) and Rocket Jumping that differs from any other game I have come across (I didn’t play CPMA). In order to answer the question, I have broken down movement into 3 areas:

Jumping (unassisted)

In order to pick up speed around the map in Painkiller, you must employ a technique called Bunnyhopping. In Painkiller, this consists of holding down the forward key whilst timing the press of the jump button to coincide with just before you land from the previous jump, or just after. As each jump is executed within a given timeframe of landing, your acceleration forward is boosted and higher speeds can be reached.

If the command Speedmeter 1 is applied in the console, your current speed is displayed at the bottom of the screen. So far by using the bunny hop technique; I have achieved a maximum speed of high 26’s. This I am sure is not the fastest that can be achieved but its pretty close.

One of the great things about bunnyhopping is that you can literally swing round the player 180˚ and if you keep the timing correct on the jumps, you keep your speed in the new direction. Very handy for keeping speed up in corridors and in tight areas. I’m sure that the hardened QuakeWorld fans will not appreciate the change from the Bunnyhopping style employed in QuakeWorld, nor will they appreciate the lack of Strafe Jumping. They will consider this n00bifying the jumping methods required to get the most speed out of the game. Personally, I prefer this method. Probably because I’ve played Quake3 for the last few years and have become accustomed to the movement physics in that game.

Air Movement

The air movement in Painkiller will take some getting used to for the majority of us. For those people that transition across from QuakeWorld, the feel is going to be very similar. Smooth movement of the mouse whilst in the air glides the player in whatever direction you point them. None of the movement keys including forward have an effect whilst in the air with the exception of backwards which stunts your progression forward virtually instantaneously. Whatever speed you take into the jump is maintained in the air. Bunnyhop onto a jump pad and find yourself catapulted far further than you would have been if you had merely walked up to it and took off.

Rocket Jumping

This is probably the area where I will have to shift my skills the most. Rocket jumping in Quake3 is all about the angle and direction of rocket fire in relation to where you want to travel. One of my most used rocket jumps is the quick flick from forwards to backwards, fire the rocket at a lowish angle whilst jumping and in my own time point forwards to check if I hit the area I was planning too. With Painkiller this isn’t going to work the same way.

As air movement is highly dependant on the position you are facing. You will reach further distances by doing Rocket jumps while facing down and in the direction of travel, than if you were to flick backwards, fire and then look immediately forwards. This means that the use of this type of rocket jump will have to be rethought based upon the lack of distance that is travelled. This is a shame as I enjoy the propellant physics that is provided in Quake3 with firing your rocket against walls to the side or behind you.

The height vs. distance of rocket jumps will be determined by the angle at which you fire in front of yourself. Although saying this, it seems that there isn’t much in it height wise from firing the rocket at a shallow angle to firing it while pointing straight down. The main benefit comes from taking more speed into the Rocket Jump, rather than the angle of fire. Having some decent speed prior to Rocket jumping really extends the distance travelled as it works as an extension of the bunnyhop but just with some extra height.

Powerup assists

Just as a check, I performed some Rocket jumps with 2 of the powerups. Quad and Rage (Anger?). Quad made some difference although not to the extent that Quake3 bounces you around 🙂 The Rage made absolutely no difference.

Moving up the map

As a final example, I recorded moving up an incline in DM_Fragenstein and also the stairs in the same map. You will lose virtually all of your speed gained whilst bunnyhopping once you hit these points, but if you time the jumps right you can still get a boost up the stairs or ramp.

I’ve prepped a few small clips to assist in understanding. I’m no trick jumper and fraps doesn’t help much either (whinge whinge 😉 ) so please don’t flame 🙂

See you on the servers soon!

Find the movement examples here: http://www.gorefiles.co.uk/movement_examples.rar

They show:
Air_Ramp_Jump: ramp jump without bunny and then with
Bunnyhopping
Various Rocket Jumps (with and without Quad/Rage)(Off wall)(in front and behind rocket)
Movement up incline and stairs on DM_Fragenstein

Standard Config.

Minus one or two params. here is the standard cfg the game I recieved came with. Note, no tweak.ini only config.ini.

Cfg.AllowBrightskins = false
Cfg.AllowBunnyhopping = true
Cfg.AllowForwardRJ = true
Cfg.AmbientSounds = true
Cfg.AmbientVolume = 0
Cfg.AutoChangeWeapon = false
Cfg.BestExplosives = {0,41,32,}
Cfg.BestNonExplosives = {51,52,42,31,22,21,12,11,0,}
Cfg.BestWeapons1 = {32,0,51,52,41,42,31,22,21,12,11,}
Cfg.BestWeapons2 = {12,0,51,52,41,42,32,31,22,21,11,}
Cfg.Brightness = 0.5
Cfg.BrightskinEnemy = “Red”
Cfg.BrightskinTeam = “White”
Cfg.CameraInterpolation = true
Cfg.CharacterShadow = “Off”
Cfg.ClipPlane = 100
Cfg.ConnectionSpeed = 3
Cfg.Contrast = 0.5
Cfg.Coronas = true
Cfg.Credits = false
Cfg.Crosshair = 1
Cfg.CrosshairB = 255
Cfg.CrosshairG = 255
Cfg.CrosshairR = 255
Cfg.CrosshairTrans = 100
Cfg.Decals = false
Cfg.DecalsStayTime = 0.4
Cfg.DedicatedServer = false
Cfg.DetailTextures = true
Cfg.DisturbSound3DFreq = 0.1
Cfg.DynamicLights = true
Cfg.EAXAcoustics = true
Cfg.FOV = 110
Cfg.FPS = 30
Cfg.FragLimit = 20
Cfg.Fullscreen = true
Cfg.GameMode = “Free For All”
Cfg.Gamma = 1.57
Cfg.GraphicsQuality = 0
Cfg.HUDSize = 1
Cfg.HUDTransparency = 25
Cfg.HeadBob = 100
Cfg.InvertMouse = false
Cfg.KeyAlternativeAlternativeFire = “V”
Cfg.KeyAlternativeBulletTime = “Return”
Cfg.KeyAlternativeFire = “C”
Cfg.KeyAlternativeFireBestWeapon1 = “None”
Cfg.KeyAlternativeFireBestWeapon2 = “None”
Cfg.KeyAlternativeFireSwitch = “None”
Cfg.KeyAlternativeFireSwitchToggle = “None”
Cfg.KeyAlternativeFlashlight = “None”
Cfg.KeyAlternativeForwardRocketJump = “None”
Cfg.KeyAlternativeJump = “None”
Cfg.KeyAlternativeMenu = “None”
Cfg.KeyAlternativeMoveBackward = “Cursor Down”
Cfg.KeyAlternativeMoveForward = “Cursor Up”
Cfg.KeyAlternativeNextWeapon = “None”
Cfg.KeyAlternativePause = “P”
Cfg.KeyAlternativePreviousWeapon = “None”
Cfg.KeyAlternativeQuickLoad = “None”
Cfg.KeyAlternativeQuickSave = “None”
Cfg.KeyAlternativeRocketJump = “None”
Cfg.KeyAlternativeSayToAll = “None”
Cfg.KeyAlternativeSayToTeam = “None”
Cfg.KeyAlternativeScoreboard = “None”
Cfg.KeyAlternativeScreenshot = “None”
Cfg.KeyAlternativeSelectBestWeapon1 = “None”
Cfg.KeyAlternativeSelectBestWeapon2 = “None”
Cfg.KeyAlternativeStrafeLeft = “Cursor Left”
Cfg.KeyAlternativeStrafeRight = “Cursor Right”
Cfg.KeyAlternativeUseCards = “None”
Cfg.KeyAlternativeWeapon1 = “Delete”
Cfg.KeyAlternativeWeapon2 = “None”
Cfg.KeyAlternativeWeapon3 = “End”
Cfg.KeyAlternativeWeapon4 = “B”
Cfg.KeyAlternativeWeapon5 = “None”
Cfg.KeyPrimaryAlternativeFire = “Middle Mouse Button”
Cfg.KeyPrimaryBulletTime = “None”
Cfg.KeyPrimaryFire = “Left Mouse Button”
Cfg.KeyPrimaryFireBestWeapon1 = “Right Shift”
Cfg.KeyPrimaryFireBestWeapon2 = “Left Ctrl”
Cfg.KeyPrimaryFireSwitch = “R”
Cfg.KeyPrimaryFireSwitchToggle = “T”
Cfg.KeyPrimaryFlashlight = “L”
Cfg.KeyPrimaryForwardRocketJump = “None”
Cfg.KeyPrimaryJump = “Right Mouse Button”
Cfg.KeyPrimaryMenu = “None”
Cfg.KeyPrimaryMoveBackward = “S”
Cfg.KeyPrimaryMoveForward = “W”
Cfg.KeyPrimaryNextWeapon = “Mouse Wheel Forward”
Cfg.KeyPrimaryPause = “P”
Cfg.KeyPrimaryPreviousWeapon = “Mouse Wheel Back”
Cfg.KeyPrimaryQuickLoad = “F9”
Cfg.KeyPrimaryQuickSave = “F5”
Cfg.KeyPrimaryRocketJump = “None”
Cfg.KeyPrimarySayToAll = “None”
Cfg.KeyPrimarySayToTeam = “None”
Cfg.KeyPrimaryScoreboard = “Tab”
Cfg.KeyPrimaryScreenshot = “F12”
Cfg.KeyPrimarySelectBestWeapon1 = “O”
Cfg.KeyPrimarySelectBestWeapon2 = “I”
Cfg.KeyPrimaryStrafeLeft = “A”
Cfg.KeyPrimaryStrafeRight = “D”
Cfg.KeyPrimaryUseCards = “E”
Cfg.KeyPrimaryWeapon1 = “1”
Cfg.KeyPrimaryWeapon2 = “2”
Cfg.KeyPrimaryWeapon3 = “3”
Cfg.KeyPrimaryWeapon4 = “None”
Cfg.KeyPrimaryWeapon5 = “5”
Cfg.LimitServerFPS = false
Cfg.ManualIP = “127.0.0.1”
Cfg.MasterVolume = 100
Cfg.MaxPlayers = 8
Cfg.MaxSpectators = 0
Cfg.MessagesKeys = {“None”,”None”,”None”,”None”,”None”,”None”,”None”,”None”,”None”,”None”,
“None”,”None”,”None”,”None”,”None”,”None”,”None”,”None”,}
Cfg.MessagesSayAll = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}
Cfg.MessagesTexts = {“[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,”[custom message/taunt]”,}
Cfg.MouseSensitivity = 40
Cfg.Multisample = “x0”
Cfg.MusicVolume = 100
Cfg.NetUpdateClass00 = {0.0222222,0.02,0.02,0.03,}
Cfg.NetUpdateClass01 = {0.0666667,0.2,0.2,0.2,}
Cfg.NetUpdateClass02 = {0.1,0.01,0.01,0.02,}
Cfg.NetUpdateClass03 = {0.01,0.01,0.01,0.01,}
Cfg.NetUpdateMaxPacketSize = 300
Cfg.NetUpdateSendPeriod = 10
Cfg.ParticlesDetail = 2
Cfg.PlayerModel = “mp-model-fallenangel”
Cfg.PlayerName = “#4w#0#4h#0#8*#0#4s#0#4E#0#4r#0#4A#0#4p#0#4H#0#0”
Cfg.PlayerPrediction = true
Cfg.PowerupDrop = false
Cfg.Powerups = true
Cfg.PrecacheData = 0
Cfg.Projectors = false
Cfg.PublicServer = false
Cfg.RenderSky = 2
Cfg.Resolution = “800X600”
Cfg.ReverseStereo = false
Cfg.ServerFPS = 90
Cfg.ServerMaps = {“DM_Fragenstein”,}
Cfg.ServerMapsFFA = {“DM_Fragenstein”,}
Cfg.ServerMapsPCF = {“DMPCF_Tower”,}
Cfg.ServerMapsTDM = {“DM_Fragenstein”,}
Cfg.ServerMapsTLB = {}
Cfg.ServerMapsVSH = {}
Cfg.ServerName = “Painkiller v1.00”
Cfg.ServerPassword = “”
Cfg.ServerPort = 3455
Cfg.SfxVolume = 100
Cfg.Shadows = 0
Cfg.ShowDaydreamWarning = true
Cfg.SmoothMouse = true
Cfg.SoundFalloffSpeed = 6
Cfg.SoundPan = 50
Cfg.SoundProvider3D = “Miles Fast 2D Positional Audio”
Cfg.SoundQuality = “High”
Cfg.SpeakersSetup = “Two Speakers”
Cfg.SwitchFire = {false,false,false,false,false,}
Cfg.Team = 0
Cfg.TeamDamage = false
Cfg.TextureFiltering = “Bilinear”
Cfg.TextureQuality = 0
Cfg.TextureQualityArchitecture = 1
Cfg.TextureQualityCharacters = 1
Cfg.TextureQualitySkies = 1
Cfg.TextureQualityWeapons = 1
Cfg.TimeLimit = 100
Cfg.UseGamespy = false
Cfg.ViewWeaponModel = true
Cfg.WeaponBob = 0
Cfg.WeaponNormalMap = true
Cfg.WeaponPriority = {51,52,41,42,32,31,22,21,12,11,0,}
Cfg.WeaponSpecular = true
Cfg.WeaponsStay = true
Cfg.WeatherEffects = true
Cfg.WheelSensitivity = 2