@@ -32,7 +32,8 @@ type Player struct {
3232 IsDefusing bool
3333 IsPlanting bool
3434 IsReloading bool
35- IsUnknown bool // Used to identify unknown/broken players. see https://github.com/markus-wa/demoinfocs-golang/issues/162
35+ IsUnknown bool // Used to identify unknown/broken players. see https://github.com/markus-wa/demoinfocs-golang/issues/162
36+ LastPositions []r3.Vector // CS2 only, used to compute velocity as it's not networked in CS2 demos
3637}
3738
3839func (p * Player ) PlayerPawnEntity () st.Entity {
@@ -521,7 +522,17 @@ func (p *Player) PositionEyes() r3.Vector {
521522// Velocity returns the player's velocity.
522523func (p * Player ) Velocity () r3.Vector {
523524 if p .demoInfoProvider .IsSource2 () {
524- panic ("Velocity() is not supported for Source 2 demos" )
525+ if ! p .IsAlive () || len (p .LastPositions ) != 2 {
526+ return r3.Vector {}
527+ }
528+
529+ t := 64.0
530+ diff := p .LastPositions [1 ].Sub (p .LastPositions [0 ])
531+
532+ return r3.Vector {
533+ X : diff .X * t ,
534+ Y : diff .Y * t ,
535+ }
525536 }
526537
527538 if p .Entity == nil {
@@ -801,8 +812,9 @@ type demoInfoProvider interface {
801812// Intended for internal use only.
802813func NewPlayer (demoInfoProvider demoInfoProvider ) * Player {
803814 return & Player {
804- Inventory : make (map [int ]* Equipment ),
805- demoInfoProvider : demoInfoProvider ,
815+ Inventory : make (map [int ]* Equipment ),
816+ demoInfoProvider : demoInfoProvider ,
817+ LastAlivePosition : r3.Vector {},
806818 }
807819}
808820
0 commit comments