func (p *Player) OnCreatureMove(_creature interfaces.ICreature, _from position.Position, _to position.Position, _teleport bool) { // Call base function p.Creature.OnCreatureMove(_creature, _from, _to, _teleport) // Do nothing is creature is me if p.GetUID() == _creature.GetUID() { return } canSeeFromPosition := p.CanSeePosition(_from) canSeeToPosition := p.CanSeePosition(_to) if canSeeFromPosition && canSeeToPosition { // We can see both from and to positions, meaning the creature is moving inside the viewport p.netSendCreatureMove(_creature, _from, _to, _teleport) } else if canSeeFromPosition && !canSeeToPosition { // We can see the from position but not the to positioin, meaning the creature is leaving our viewport // Send CreatureMove message to client before removing the creature from the visible creatures list p.netSendCreatureMove(_creature, _from, _to, _teleport) p.RemoveVisibleCreature(_creature) _creature.RemoveVisibleCreature(p) } else if !canSeeFromPosition && canSeeToPosition { // We can't see the from position but we can see the to position, meaning the creature is entering our viewport // First add the creature to our visible creature list before sending the CreatureMove message to the client p.AddVisibleCreature(_creature) _creature.AddVisibleCreature(p) p.netSendCreatureMove(_creature, _from, _to, _teleport) } else { // Somehow it's impossible to see the creature, may this ever happen somehow p.RemoveVisibleCreature(_creature) _creature.RemoveVisibleCreature(p) } }
func (c *Creature) KnowsVisibleCreature(_creature interfaces.ICreature) bool { c.visibleCreaturesMutex.RLock() defer c.visibleCreaturesMutex.RUnlock() _, found := c.visibleCreatures[_creature.GetUID()] return found }
func (t *TilePointLayer) AddCreature(_creature interfaces.ICreature, _checkEvents bool) ReturnValue { ret := RET_NOERROR /*if _checkEvents && t.Events.Len() > 0 { for e := t.events.Front(); e != nil; e = e.Next() { event, valid := e.Value.(pulogic.ITileEvent) if valid { ret = event.OnCreatureEnter(_creature, ret) } if ret == RET_NOTPOSSIBLE { return } } }*/ t.creaturesMutex.Lock() defer t.creaturesMutex.Unlock() _, found := t.creatures[_creature.GetUID()] if !found { t.creatures[_creature.GetUID()] = _creature } return ret }
func (p *Player) OnCreatureTurn(_creature interfaces.ICreature) { p.Creature.OnCreatureTurn(_creature) // Do nothing is creature is me if p.GetUID() == _creature.GetUID() { return } p.netSendCreatureTurn(_creature) }
/*********************** Private Methods ************************/ func internalAddCreature(_creature interfaces.ICreature) bool { _, found := g.creatures[_creature.GetUID()] if !found { g.creatures[_creature.GetUID()] = _creature } else { log.Warning("Game", "AddCreature", "Could not add creature. Creature with UID '%d' already exists", _creature.GetUID()) } return !found }
func (c *Creature) RemoveVisibleCreature(_creature interfaces.ICreature) bool { if _creature.GetUID() != c.GetUID() { c.visibleCreaturesMutex.Lock() defer c.visibleCreaturesMutex.Unlock() delete(c.visibleCreatures, _creature.GetUID()) return true } return false }
// Methods for all creatures who need to see other creatures func (c *Creature) AddVisibleCreature(_creature interfaces.ICreature) bool { if _creature.GetUID() != c.GetUID() { c.visibleCreaturesMutex.Lock() defer c.visibleCreaturesMutex.Unlock() if _, found := c.visibleCreatures[_creature.GetUID()]; !found { c.visibleCreatures[_creature.GetUID()] = _creature return true } } return false }
// Methods for all moving creatures func (c *Creature) OnCreatureMove(_creature interfaces.ICreature, _from position.Position, _to position.Position, _teleport bool) { if _creature.GetUID() == c.GetUID() { c.lastStep = interfaces.PUSYS_TIME() } }