Beispiel #1
0
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)
	}
}
Beispiel #2
0
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)
	}
}