@@ -25,6 +25,7 @@ type Entity struct {
2525 onCreateFinished []func ()
2626 onDestroy []func ()
2727 updateHandlers map [string ][]st.PropertyUpdateHandler
28+ propCache map [string ]st.Property
2829}
2930
3031func (e * Entity ) ServerClass () st.ServerClass {
@@ -126,15 +127,19 @@ func (p property) Bind(variable any, t st.PropertyValueType) {
126127}
127128
128129func (e * Entity ) Property (name string ) st.Property {
129- ok := e .class .serializer .checkFieldName (name )
130- if ! ok {
131- return nil
132- }
130+ if e .propCache [name ] == nil {
131+ ok := e .class .serializer .checkFieldName (name )
132+ if ! ok {
133+ return nil
134+ }
133135
134- return property {
135- entity : e ,
136- name : name ,
136+ e .propCache [name ] = property {
137+ entity : e ,
138+ name : name ,
139+ }
137140 }
141+
142+ return e .propCache [name ]
138143}
139144
140145func (e * Entity ) BindProperty (prop string , variable any , t st.PropertyValueType ) {
@@ -258,6 +263,7 @@ func newEntity(index, serial int32, class *class) *Entity {
258263 onCreateFinished : nil ,
259264 onDestroy : nil ,
260265 updateHandlers : make (map [string ][]st.PropertyUpdateHandler ),
266+ propCache : map [string ]st.Property {},
261267 }
262268}
263269
@@ -406,10 +412,10 @@ func (p *Parser) FilterEntity(fb func(*Entity) bool) []*Entity {
406412 return entities
407413}
408414
409- func (e * Entity ) readFields (r * reader ) {
410- fps := readFieldPaths (r )
415+ func (e * Entity ) readFields (r * reader , paths * [] * fieldPath ) {
416+ readFieldPaths (r , paths )
411417
412- for _ , fp := range fps {
418+ for _ , fp := range * paths {
413419 decoder := e .class .serializer .getDecoderForFieldPath (fp , 0 )
414420
415421 val := decoder (r )
@@ -456,7 +462,10 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
456462 op st.EntityOp
457463 }
458464
459- var tuples []tuple
465+ var (
466+ tuples []tuple
467+ paths = make ([]* fieldPath , 0 )
468+ )
460469
461470 for ; updates > 0 ; updates -- {
462471 var (
@@ -487,8 +496,11 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
487496 e = newEntity (index , serial , class )
488497 p .entities [index ] = e
489498
490- e .readFields (newReader (baseline ))
491- e .readFields (r )
499+ e .readFields (newReader (baseline ), & paths )
500+ paths = paths [:0 ]
501+
502+ e .readFields (r , & paths )
503+ paths = paths [:0 ]
492504
493505 // Fire created-handlers so update-handlers can be registered
494506 for _ , h := range class .createdHandlers {
@@ -512,7 +524,8 @@ func (p *Parser) OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error {
512524 op |= st .EntityOpEntered
513525 }
514526
515- e .readFields (r )
527+ e .readFields (r , & paths )
528+ paths = paths [:0 ]
516529 }
517530 } else {
518531 e = p .entities [index ]
0 commit comments