Skip to content

Commit 31b54b4

Browse files
committed
fix: hostage leader possibly nil
akiver/cs-demo-manager#839
1 parent a58c851 commit 31b54b4

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

pkg/demoinfocs/common/hostage.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package common
33
import (
44
"github.com/golang/geo/r3"
55

6+
"github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/constants"
67
st "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/sendtables"
78
)
89

@@ -54,7 +55,12 @@ func (hostage *Hostage) Health() int {
5455
// Returns nil if the hostage is not following a player.
5556
func (hostage *Hostage) Leader() *Player {
5657
if hostage.demoInfoProvider.IsSource2() {
57-
return hostage.demoInfoProvider.FindPlayerByPawnHandle(getUInt64(hostage.Entity, "m_leader"))
58+
leaderHandle := getUInt64(hostage.Entity, "m_leader")
59+
if leaderHandle != constants.InvalidEntityHandleSource2 {
60+
return hostage.demoInfoProvider.FindPlayerByPawnHandle(leaderHandle)
61+
}
62+
63+
return hostage.demoInfoProvider.FindPlayerByPawnHandle(getUInt64(hostage.Entity, "m_hHostageGrabber"))
5864
}
5965

6066
return hostage.demoInfoProvider.FindPlayerByHandle(uint64(getInt(hostage.Entity, "m_leader")))

pkg/demoinfocs/common/hostage_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/stretchr/testify/assert"
77

8+
"github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/constants"
89
st "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/sendtables"
910
)
1011

@@ -19,6 +20,29 @@ func TestHostage_Leader(t *testing.T) {
1920
assert.Equal(t, player, hostage.Leader())
2021
}
2122

23+
func TestHostage_LeaderWithInvalidHandleS2(t *testing.T) {
24+
player := new(Player)
25+
player.EntityID = 10
26+
provider := demoInfoProviderMock{
27+
playersByHandle: map[uint64]*Player{10: player},
28+
isSource2: true,
29+
}
30+
hostage := hostageWithProperties([]fakeProp{
31+
{
32+
propName: "m_leader",
33+
value: st.PropertyValue{Any: uint64(constants.InvalidEntityHandleSource2)},
34+
isNil: false,
35+
},
36+
{
37+
propName: "m_hHostageGrabber",
38+
value: st.PropertyValue{Any: uint64(10)},
39+
isNil: false,
40+
},
41+
}, provider)
42+
43+
assert.Equal(t, player, hostage.Leader())
44+
}
45+
2246
func TestHostage_State(t *testing.T) {
2347
hostage := hostageWithProperty("m_nHostageState", st.PropertyValue{IntVal: int(HostageStateFollowingPlayer)}, demoInfoProviderMock{})
2448

@@ -34,3 +58,7 @@ func TestHostage_Health(t *testing.T) {
3458
func hostageWithProperty(propName string, value st.PropertyValue, provider demoInfoProviderMock) *Hostage {
3559
return &Hostage{Entity: entityWithProperty(propName, value), demoInfoProvider: provider}
3660
}
61+
62+
func hostageWithProperties(properties []fakeProp, provider demoInfoProviderMock) *Hostage {
63+
return &Hostage{Entity: entityWithProperties(properties), demoInfoProvider: provider}
64+
}

0 commit comments

Comments
 (0)