Skip to content

Commit 50a280a

Browse files
authored
Merge pull request #424 from markus-wa/bombsite-s2
fix: possible unknown bombsite in BombPlantBegin event
2 parents 05e2f04 + 7e299ca commit 50a280a

File tree

4 files changed

+72
-16
lines changed

4 files changed

+72
-16
lines changed

pkg/demoinfocs/common/player_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,8 @@ func TestPlayer_PositionEyes(t *testing.T) {
409409
}
410410

411411
func TestPlayer_PositionEyes_EntityNil(t *testing.T) {
412-
pl := new(Player)
412+
pl := &Player{}
413+
pl.demoInfoProvider = s1DemoInfoProvider
413414

414415
assert.Empty(t, pl.PositionEyes())
415416
}

pkg/demoinfocs/datatables.go

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package demoinfocs
22

33
import (
44
"fmt"
5+
"math"
56
"strings"
67

78
"github.com/golang/geo/r3"
@@ -122,6 +123,8 @@ func (p *parser) bindBomb() {
122123
site = events.BombsiteA
123124
case 2:
124125
site = events.BombsiteB
126+
case 0:
127+
site = p.getClosestBombsiteFromPosition(planter.Position())
125128
}
126129

127130
if !p.disableMimicSource1GameEvents {
@@ -305,18 +308,36 @@ func (p *parser) bindBombSites() {
305308
playerResource.BindProperty("m_bombsiteCenterB", &p.bombsiteB.center, st.ValTypeVector)
306309
})
307310

308-
p.stParser.ServerClasses().FindByName("CBaseTrigger").OnEntityCreated(func(baseTrigger st.Entity) {
311+
onBombTargetEntityCreated := func(target st.Entity) {
309312
t := new(boundingBoxInformation)
310-
p.triggers[baseTrigger.ID()] = t
313+
p.triggers[target.ID()] = t
311314

315+
var (
316+
minPropName string
317+
maxPropName string
318+
)
312319
if p.isSource2() {
313-
baseTrigger.BindProperty("m_vecMins", &t.min, st.ValTypeVector)
314-
baseTrigger.BindProperty("m_vecMaxs", &t.max, st.ValTypeVector)
320+
minPropName = "m_vecMins"
321+
maxPropName = "m_vecMaxs"
315322
} else {
316-
baseTrigger.BindProperty("m_Collision.m_vecMins", &t.min, st.ValTypeVector)
317-
baseTrigger.BindProperty("m_Collision.m_vecMaxs", &t.max, st.ValTypeVector)
323+
minPropName = "m_Collision.m_vecMins"
324+
maxPropName = "m_Collision.m_vecMaxs"
318325
}
319-
})
326+
327+
target.BindProperty(minPropName, &t.min, st.ValTypeVector)
328+
target.BindProperty(maxPropName, &t.max, st.ValTypeVector)
329+
}
330+
331+
if p.isSource2() {
332+
// CBombTarget is not available with CS2 demos created in the early days of the limited test.
333+
bombTargetClass := p.stParser.ServerClasses().FindByName("CBombTarget")
334+
if bombTargetClass != nil {
335+
bombTargetClass.OnEntityCreated(onBombTargetEntityCreated)
336+
return
337+
}
338+
}
339+
340+
p.stParser.ServerClasses().FindByName("CBaseTrigger").OnEntityCreated(onBombTargetEntityCreated)
320341
}
321342

322343
func (p *parser) bindPlayers() {
@@ -899,10 +920,10 @@ func (p *parser) bindWeaponS2(entity st.Entity) {
899920
// - The player is inside the buy zone
900921
// - The player's money has increased AND the weapon entity is destroyed at the same tick (unfortunately the money is updated first)
901922
var (
902-
owner *common.Player
903-
oldOwnerMoney int
923+
owner *common.Player
924+
oldOwnerMoney int
904925
lastMoneyUpdateTick int
905-
lastMoneyIncreased bool
926+
lastMoneyIncreased bool
906927
)
907928

908929
entity.Property("m_hOwnerEntity").OnUpdate(func(val st.PropertyValue) {
@@ -1300,3 +1321,18 @@ func (p *parser) bindHostages() {
13001321
})
13011322
})
13021323
}
1324+
1325+
func getDistanceBetweenVectors(vectorA r3.Vector, vectorB r3.Vector) float64 {
1326+
return math.Sqrt(math.Pow(vectorA.X-vectorB.X, 2) + math.Pow(vectorA.Y-vectorB.Y, 2) + math.Pow(vectorA.Z-vectorB.Z, 2))
1327+
}
1328+
1329+
func (p *parser) getClosestBombsiteFromPosition(position r3.Vector) events.Bombsite {
1330+
distanceFromBombsiteA := getDistanceBetweenVectors(position, p.bombsiteA.center)
1331+
distanceFromBombsiteB := getDistanceBetweenVectors(position, p.bombsiteB.center)
1332+
1333+
if distanceFromBombsiteA < distanceFromBombsiteB {
1334+
return events.BombsiteA
1335+
}
1336+
1337+
return events.BombsiteB
1338+
}

pkg/demoinfocs/datatables_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package demoinfocs
33
import (
44
"testing"
55

6+
"github.com/golang/geo/r3"
67
"github.com/stretchr/testify/assert"
78
"github.com/stretchr/testify/mock"
89

@@ -130,6 +131,24 @@ func fakePlayerEntity(id int) *stfake.Entity {
130131
return entity
131132
}
132133

134+
func TestParser_GetClosestBombsiteFromPosition(t *testing.T) {
135+
p := newParser()
136+
p.bombsiteA = bombsite{
137+
center: r3.Vector{X: 2, Y: 3, Z: 1},
138+
}
139+
p.bombsiteB = bombsite{
140+
center: r3.Vector{X: 4, Y: 5, Z: 7},
141+
}
142+
143+
site := p.getClosestBombsiteFromPosition(r3.Vector{X: -2, Y: 2, Z: 2})
144+
145+
assert.Equal(t, events.BombsiteA, site)
146+
147+
site = p.getClosestBombsiteFromPosition(r3.Vector{X: 3, Y: 6, Z: 5})
148+
149+
assert.Equal(t, events.BombsiteB, site)
150+
}
151+
133152
func configurePlayerEntityMock(id int, entity *stfake.Entity) {
134153
entity.On("ID").Return(id)
135154

pkg/demoinfocs/events/events.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -289,20 +289,20 @@ type BombEventIf interface {
289289
implementsBombEventIf()
290290
}
291291

292-
type bombsite rune
292+
type Bombsite rune
293293

294294
// Bombsite identifiers
295295
const (
296-
BomsiteUnknown bombsite = 0
297-
BombsiteA bombsite = 'A'
298-
BombsiteB bombsite = 'B'
296+
BomsiteUnknown Bombsite = 0
297+
BombsiteA Bombsite = 'A'
298+
BombsiteB Bombsite = 'B'
299299
)
300300

301301
// BombEvent contains the common attributes of bomb events. Dont register
302302
// handlers on this tho, you want BombEventIf for that.
303303
type BombEvent struct {
304304
Player *common.Player
305-
Site bombsite
305+
Site Bombsite
306306
}
307307

308308
// Make BombEvent implement BombEventIf

0 commit comments

Comments
 (0)