Skip to content

Commit 18f1838

Browse files
committed
fix: possible unknown bombsite in BombPlantBegin event
1 parent 05e2f04 commit 18f1838

File tree

3 files changed

+59
-17
lines changed

3 files changed

+59
-17
lines changed

pkg/demoinfocs/datatables.go

Lines changed: 35 additions & 12 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,23 @@ 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) {
309-
t := new(boundingBoxInformation)
310-
p.triggers[baseTrigger.ID()] = t
311+
if p.isSource2() {
312+
p.stParser.ServerClasses().FindByName("CBombTarget").OnEntityCreated(func(target st.Entity) {
313+
t := new(boundingBoxInformation)
314+
p.triggers[target.ID()] = t
315+
316+
target.BindProperty("m_vecMins", &t.min, st.ValTypeVector)
317+
target.BindProperty("m_vecMaxs", &t.max, st.ValTypeVector)
318+
})
319+
} else {
320+
p.stParser.ServerClasses().FindByName("CBaseTrigger").OnEntityCreated(func(baseTrigger st.Entity) {
321+
t := new(boundingBoxInformation)
322+
p.triggers[baseTrigger.ID()] = t
311323

312-
if p.isSource2() {
313-
baseTrigger.BindProperty("m_vecMins", &t.min, st.ValTypeVector)
314-
baseTrigger.BindProperty("m_vecMaxs", &t.max, st.ValTypeVector)
315-
} else {
316324
baseTrigger.BindProperty("m_Collision.m_vecMins", &t.min, st.ValTypeVector)
317325
baseTrigger.BindProperty("m_Collision.m_vecMaxs", &t.max, st.ValTypeVector)
318-
}
319-
})
326+
})
327+
}
320328
}
321329

322330
func (p *parser) bindPlayers() {
@@ -899,10 +907,10 @@ func (p *parser) bindWeaponS2(entity st.Entity) {
899907
// - The player is inside the buy zone
900908
// - The player's money has increased AND the weapon entity is destroyed at the same tick (unfortunately the money is updated first)
901909
var (
902-
owner *common.Player
903-
oldOwnerMoney int
910+
owner *common.Player
911+
oldOwnerMoney int
904912
lastMoneyUpdateTick int
905-
lastMoneyIncreased bool
913+
lastMoneyIncreased bool
906914
)
907915

908916
entity.Property("m_hOwnerEntity").OnUpdate(func(val st.PropertyValue) {
@@ -1300,3 +1308,18 @@ func (p *parser) bindHostages() {
13001308
})
13011309
})
13021310
}
1311+
1312+
func getDistanceBetweenVectors(vectorA r3.Vector, vectorB r3.Vector) float64 {
1313+
return math.Sqrt(math.Pow(vectorA.X-vectorB.X, 2) + math.Pow(vectorA.Y-vectorB.Y, 2) + math.Pow(vectorA.Z-vectorB.Z, 2))
1314+
}
1315+
1316+
func (p *parser) getClosestBombsiteFromPosition(position r3.Vector) events.Bombsite {
1317+
distanceFromBombsiteA := getDistanceBetweenVectors(position, p.bombsiteA.center)
1318+
distanceFromBombsiteB := getDistanceBetweenVectors(position, p.bombsiteB.center)
1319+
1320+
if distanceFromBombsiteA < distanceFromBombsiteB {
1321+
return events.BombsiteA
1322+
}
1323+
1324+
return events.BombsiteB
1325+
}

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)