1 module artemisd.managers.playermanager; 2 3 import artemisd.entity; 4 import artemisd.manager; 5 import artemisd.utils.bag; 6 import artemisd.utils.type; 7 import artemisd.utils.ext; 8 9 class PlayerManager : Manager 10 { 11 mixin TypeDecl; 12 13 private string[Entity] playerByEntity; 14 private Bag!Entity[string] entitiesByPlayer; 15 16 public void setPlayer(Entity e, string player) 17 { 18 removeFromPlayer(e); 19 playerByEntity[e]=player; 20 auto entities = entitiesByPlayer.getWithDefault(player, new Bag!Entity); 21 entities.add(e); 22 } 23 24 public Bag!Entity getEntitiesOfPlayer(string player) 25 { 26 return entitiesByPlayer.getWithDefault(player, new Bag!Entity); 27 } 28 29 public void removeFromPlayer(Entity e) 30 { 31 auto player = e in playerByEntity; 32 if(player) 33 { 34 Bag!Entity* entities = (*player) in entitiesByPlayer; 35 if(entities) 36 { 37 entities.remove(e); 38 } 39 } 40 } 41 42 public string getPlayer(Entity e) 43 { 44 return playerByEntity[e]; 45 } 46 47 protected override void initialize() 48 { 49 } 50 51 public override void deleted(Entity e) 52 { 53 removeFromPlayer(e); 54 } 55 } 56 57 unittest 58 { 59 import std.stdio; 60 61 PlayerManager m = new PlayerManager; 62 import artemisd.world; 63 World w = new World; 64 Entity e = w.createEntity(); 65 66 m.setPlayer(e,"g1"); 67 assert(m.getPlayer(e) == "g1"); 68 m.setPlayer(e,"g2"); 69 assert(m.getPlayer(e) == "g2"); 70 assert(m.getEntitiesOfPlayer("g2").size == 1 ); 71 assert(m.getEntitiesOfPlayer("g1").size == 0); 72 }