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 }