de.pewpewproject.lasertag.lasertaggame.state.synced.implementation.TeamsState   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 51
dl 0
loc 120
rs 10
c 0
b 0
f 0
wmc 17

10 Methods

Rating   Name   Duplication   Size   Complexity  
A updateTeamOfPlayer(UUID,TeamDto) 0 19 3
A forEachPlayer(BiConsumer) 0 8 3
A TeamsState(ITeamsConfigState) 0 6 2
A toJson() 0 8 1
A getPlayersOfTeam(TeamDto) 0 3 1
A fromJson(String) 0 7 1
A getTeamOfPlayer(UUID) 0 3 1
A reset(ITeamsConfigState) 0 11 2
A isPlayerInTeam(UUID) 0 3 1
A removePlayerFromTeam(UUID) 0 19 2
1
package de.pewpewproject.lasertag.lasertaggame.state.synced.implementation;
2
3
import com.google.common.reflect.TypeToken;
4
import com.google.gson.GsonBuilder;
5
import de.pewpewproject.lasertag.lasertaggame.state.synced.ITeamsConfigState;
6
import de.pewpewproject.lasertag.lasertaggame.state.synced.ITeamsState;
7
import de.pewpewproject.lasertag.lasertaggame.team.TeamDto;
8
import de.pewpewproject.lasertag.lasertaggame.team.serialize.TeamConfigManagerDeserializer;
9
import de.pewpewproject.lasertag.lasertaggame.team.serialize.TeamDtoSerializer;
10
11
import java.util.*;
12
import java.util.function.BiConsumer;
13
14
/**
15
 * Implementation of ITeamsState for the lasertag game.
16
 *
17
 * @author Étienne Muser
18
 */
19
public class TeamsState implements ITeamsState {
20
21
    /**
22
     * Map every teams id to the set of uuids of the players this team contains
23
     */
24
    private final HashMap<Integer, Set<UUID>> teamMap = new HashMap<>();
25
26
    /**
27
     * Map every players uuid to the team id of the team they are in
28
     */
29
    private final HashMap<UUID, Integer> playerTeamMap = new HashMap<>();
30
31
    public TeamsState(ITeamsConfigState teamsConfigState) {
32
33
        // Initialize team map
34
        for (TeamDto teamDto : teamsConfigState.getTeams()) {
35
36
            teamMap.put(teamDto.id(), new HashSet<>());
37
        }
38
    }
39
40
    @Override
41
    public synchronized void updateTeamOfPlayer(UUID playerUuid, TeamDto newTeamDto) {
42
43
        // Get the id of the team the player is currently in
44
        var oldTeamIdOptional = Optional.ofNullable(playerTeamMap.get(playerUuid));
45
46
        // If the player is already in the team
47
        if (oldTeamIdOptional.isPresent() && oldTeamIdOptional.get() == newTeamDto.id()) {
48
49
            // Nothing to do
50
            return;
51
        }
52
53
        // Set the player to the new team
54
        playerTeamMap.put(playerUuid, newTeamDto.id());
55
        teamMap.get(newTeamDto.id()).add(playerUuid);
56
57
        // Remove the player from the old team, if he was in a team
58
        oldTeamIdOptional.ifPresent(oldTeamId -> teamMap.get(oldTeamId).remove(playerUuid));
59
    }
60
61
    @Override
62
    public synchronized void removePlayerFromTeam(UUID playerUuid) {
63
64
        // Get the id of the team the player is currently in
65
        var oldTeamIdOptional = Optional.ofNullable(playerTeamMap.get(playerUuid));
66
67
        // If the player was not in a team
68
        if (oldTeamIdOptional.isEmpty()) {
69
70
            // Nothing to do
71
            return;
72
        }
73
74
        // Extract the old team id from the optional
75
        var oldTeamId = oldTeamIdOptional.get();
76
77
        // Remove the player from his team
78
        playerTeamMap.remove(playerUuid);
79
        teamMap.get(oldTeamId).remove(playerUuid);
80
    }
81
82
    @Override
83
    public synchronized List<UUID> getPlayersOfTeam(TeamDto team) {
84
        return teamMap.get(team.id()).stream().toList();
85
    }
86
87
    @Override
88
    public synchronized Optional<Integer> getTeamOfPlayer(UUID playerUuid) {
89
        return Optional.ofNullable(playerTeamMap.get(playerUuid));
90
    }
91
92
    @Override
93
    public synchronized void forEachPlayer(BiConsumer<Integer, UUID> callback) {
94
95
        for (var entry : teamMap.entrySet()) {
96
97
            for (var playerUuid : entry.getValue()) {
98
99
                callback.accept(entry.getKey(), playerUuid);
100
            }
101
        }
102
    }
103
104
    @Override
105
    public synchronized boolean isPlayerInTeam(UUID playerUuid) {
106
        return playerTeamMap.containsKey(playerUuid);
107
    }
108
109
    @Override
110
    public synchronized void reset(ITeamsConfigState teamsConfigState) {
111
112
        teamMap.clear();
113
114
        for (TeamDto teamDto : teamsConfigState.getTeams()) {
115
116
            teamMap.put(teamDto.id(), new HashSet<>());
117
        }
118
119
        playerTeamMap.clear();
120
    }
121
122
    @Override
123
    public String toJson() {
124
        var builder = new GsonBuilder();
125
126
        // Register team serializer
127
        builder.registerTypeAdapter(TeamDto.class, TeamDtoSerializer.getSerializer());
128
129
        return builder.create().toJson(this);
130
    }
131
132
    public static TeamsState fromJson(String jsonString) {
133
        var builder = new GsonBuilder();
134
135
        // Register team serializer
136
        builder.registerTypeAdapter(new TypeToken<HashMap<String, TeamDto>>() {}.getType(), TeamConfigManagerDeserializer.getDeserializer());
137
138
        return builder.create().fromJson(jsonString, TeamsState.class);
139
    }
140
}
141