func savePlayer(p *Player) { data := world.SaveConvert(p) f, err := os.Create(loginToFilename(p.login)) if err != nil { panic(err) } defer f.Close() g, err := gzip.NewWriterLevel(f, gzip.BestCompression) if err != nil { panic(err) } defer g.Close() err = gob.NewEncoder(g).Encode(&data) if err != nil { panic(err) } }
func (p *Player) Impersonate(o world.Visible) { if o == nil || o == p { if pos := p.Position(); pos != nil { pos.Zone().Impersonate(p, nil) } p.mtx.Lock() if p.impersonating != nil { p.impersonating = nil p.mtx.Unlock() if pos := p.Position(); pos != nil { pos.Zone().Update(pos, p) } } else { p.mtx.Unlock() } return } if other, ok := o.(*Player); ok { h := other.Hero o = &h } // copy the object o = world.LoadConvert(world.SaveConvert(o)).(world.Visible) if pos := p.Position(); pos != nil { pos.Zone().Impersonate(p, o) } p.mtx.Lock() p.impersonating = o p.mtx.Unlock() if pos := p.Position(); pos != nil { pos.Zone().Update(pos, p) } }